Примечание
Функция доступна по запросу в поддержку: 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();
}
Перейти на русскую версию?