/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/Gridient.Core/Features/FieldValues/Commands/CreateElementCommandHandler.cs
82 строки
4 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
using Gridient.Core.Exceptions; using Gridient.Core.Extensions; using Gridient.Core.Mapping; using Gridient.Core.Models; using Gridient.Core.Repositories; using Gridient.Core.Services.Interfaces; using MediatR; using Microsoft.Extensions.Logging; namespace Gridient.Core.Features.FieldValues.Commands { /// <summary> /// Обработчик команды для создания элемента списка /// </summary> public class CreateElementCommandHandler : IRequestHandler<CreateElementCommand> { private readonly ListsRepositoryFactory _factory; private readonly IUserService _usersService; private readonly IListsService _listsService; private readonly ILogger<CreateElementCommandHandler> _logger; public CreateElementCommandHandler( ListsRepositoryFactory factory, IUserService usersService, IListsService listsService, ILogger<CreateElementCommandHandler> logger) { _factory = factory; _usersService = usersService; _listsService = listsService; _logger = logger; } public async Task Handle(CreateElementCommand request, CancellationToken cancellationToken) { // Авторизация элемента списка уже проверена в AuthorizationBehavior через IRequiresListItemAuthorization await CheckUniqueValues(request.ListId, request.Values, cancellationToken); int itemId = await _listsService.GenerateNewItemIdAsync(request.ListId, cancellationToken); var currentUser = await _usersService.GetByLoginAsync(request.UserLogin, cancellationToken); if (currentUser == null) throw ListsException.Error("Пользователь не найден"); await _factory.UnitOfWork.ExecuteInTransactionAsync(async transaction => { bool listExists = await _factory.ListsRepository.ExistsAsync(request.ListId, cancellationToken); if (!listExists) throw ListsException.EntityNotFound(request.ListId); FieldValue[] addedFieldValueEntities = await _factory.FieldValuesRepository.CreateElement(request.ListId, itemId, request.Values, cancellationToken); var dateTimeUtc = DateTime.UtcNow; await _factory.ListItemsSysInfoRepository.OnAdded(request.ListId, itemId, currentUser.Id, dateTimeUtc, cancellationToken); await _factory.ListItemVersionsRepository.Add(request.ListId, itemId, currentUser.Id, dateTimeUtc, FieldValueMapper.MapToSimpleFieldValueArray(addedFieldValueEntities), cancellationToken); }, _logger, cancellationToken); } private async Task CheckUniqueValues(int listId, FieldValue[] values, CancellationToken cancellationToken) { var updatingFields = values.Select(e => e.FieldName).ToArray(); var uniqueFields = await _factory.FieldsRepository .GetEntitiesByQueryAsync(f => f.ListId == listId && f.UniqueValues == true && updatingFields.Contains(f.Name), cancellationToken); if (uniqueFields.Length > 0) { foreach (var uniqueField in uniqueFields) { var fieldValue = values.FirstOrDefault(f => f.FieldName == uniqueField.Name); if (fieldValue != null) { bool hasSameValue = await _factory.FieldValuesRepository.CheckUniqueValue(listId, uniqueField, fieldValue, cancellationToken); if (hasSameValue) throw ListsException.Error($"Изменения не сохранены, т.к. нарушается уникальность поля '{uniqueField.Title}'"); } } } } } }