Примечание
Функция включается по запросу в поддержку support@timetta.com.
Важно
Компонента предназначена для кастомизации логики работы с данными. Предполагает понимание языка C# и структуры данных Timetta. Предназначена только для прикладных разработчиков. Находится в стадии активного развития. Если вам требуется переопределение логики, то рекомендуется обратиться в поддержку support@timetta.com для платной консультации.
Основные сценарии применения:
Обработчик представляет собой класс на C# для каждого типа сущности. В классе доступны четыре переопределяемых метода (хука):
BeforeUpsert
— вызывается до операции вставки или обновления сущности. Предназначен для выполнения базовых проверок сущности. Имеет detachedEntity
.AfterUpsert
— вызывается после операции вставки или обновления сущности. Предназначен для добавления бизнес-логики — предзаполнение свойств, добавление исходящих интеграций и пр. Имеет contextEntity
и detachedEntity
.BeforeDelete
— вызывается до удаления сущности. Имеет detachedEntity
.AfterDelete
— вызывается до удаления сущности. Имеет contextEntity
.В методы передаются параметры:
Примечание
Для доступа требуются права на гранулу Настройки менеджера объектов
.
Для изменения обработчика перейдите в компоненту Менеджер сущностей, найдите требуемую сущность и перейдите на вкладку Обработчик:
Объект предоставляет доступ к базовому 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();
}
Перейти на русскую версию?