Примечание
Функция доступна по запросу в поддержку: support@timetta.com.
Важно
Компонента позволяет кастомизировать логику работы с данными:
Если вам нужно переопределение логики, рекомендуем обратиться в поддержку support@timetta.com для платной консультации.
Основные сценарии применения обработчика:
Обработчик представляет собой класс на C# для каждого типа сущности. В нём доступны четыре переопределяемых метода (хука):
BeforeUpsert
— вызывается до операции вставки или обновления сущности. Используется для выполнения базовых проверок сущности. Имеет detachedEntity
.AfterUpsert
— вызывается после операции вставки или обновления сущности. Предназначен для добавления бизнес-логики — например, предзаполнение свойств, добавление исходящих интеграций. Имеет contextEntity
и detachedEntity
.BeforeDelete
— вызывается до удаления сущности. Имеет detachedEntity
.AfterDelete
— вызывается после удаления сущности. Имеет contextEntity
.В методы передаются параметры:
context
— контекст обработчика. Представляет собой SDK для ограниченной работы с приложением.detachedEntity
— сущность, переданная через API пользователем.contextEntity
— сущность, извлечённая из БД для обновления. При вставке идентична detachedEntity
.Примечание
Для доступа требуются права на гранулу Настройки менеджера объектов
.
Чтобы изменить обработчик, следует:
Объект предоставляет доступ к базовому API системы:
public interface DynamicCodeContext
{
/// <summary>
/// Gets Entity service instance.
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public IContextEntityService<TEntity> GetEntityService<TEntity>();
/// <summary>
/// Logs message.
/// </summary>
public void Log(string msg);
}
public interface IContextEntityService<TEntity>
where TEntity : Entity
{
/// <summary>
/// Inserts detached entity into context.
/// </summary>
/// <param name="detachedEntity">New detached entity.</param>
/// <param name="checkRights">Determines whether to check the current user's permissions.</param>
/// <returns>Inserted context entity.</returns>
Task<TEntity> InsertAsync(TEntity detachedEntity, bool checkRights = true);
/// <summary>
/// Updates existing entity in context by detached entity.
/// </summary>
/// <param name="detachedEntity">Detached entity.</param>
/// <param name="checkRights">Determines whether to check the current user's permissions.</param>
/// <returns>Updated context entity.</returns>
Task<TEntity> UpdateAsync(TEntity detachedEntity, bool checkRights = true);
/// <summary>
/// Deletes context entity.
/// </summary>
/// <param name="entityId">Entity Id.</param>
/// <param name="checkRights">Determines whether to check the current user's permissions.</param>
/// <returns></returns>
Task<TEntity> DeleteAsync(Guid entityId, bool checkRights = true);
/// <summary>
/// Gets context entity.
/// </summary>
/// <param name="entityId">Entity Id.</param>
/// <param name="checkRights">Determines whether to check the current user's permissions.</param>
/// <returns>Context entity</returns>
Task<TEntity> GetAsync(Guid entityId, bool checkRights = true);
/// <summary>
/// Get Non Tracking IQueryable to context filtered by condition.
/// </summary>
/// <param name="condition">Predicate to filter.</param>
/// <param name="checkRights">Determines whether to check the current user's permissions.</param>
/// <returns>Context entity</returns>
IQueryable<TEntity> Get(
Expression<Func<TEntity, bool>> condition = null,
bool checkRights = true
);
}
public override async Task AfterUpsert(CustomHooksContext context, Activity contextEntity, Activity detachedEntity)
{
const string url = "https://api.timetta.com/odata";
const string token = "***";
using var httClient = new HttpClient();
httClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var newActivity = new { Name = "New Activity" };
var payload = JsonContent.Create(newActivity);
var response = await httClient.PostAsync($"{url}/Activities", payload);
var responseContent = await response.Content.ReadFromJsonAsync<JsonElement>();
var idOfCreatedEntity = responseContent.GetProperty("id").GetGuid();
}
Перейти на русскую версию?