/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/Gridient.Core/Features/FieldValues/Queries/GetValuesByIdQueryHandler.cs
70 строк
4 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
using Gridient.Core.Authorization; using Gridient.Core.Authorization.Exceptions; using Gridient.Core.Exceptions; using Gridient.Core.Mapping; using Gridient.Core.Models; using Gridient.Core.Repositories; using Gridient.Core.Services.Interfaces; using MediatR; namespace Gridient.Core.Features.FieldValues.Queries { /// <summary> /// Обработчик запроса для получения значений поля элемента списка /// Авторизация элемента списка выполняется в AuthorizationBehavior /// Для удаленных элементов требуется дополнительная системная авторизация /// </summary> public class GetValuesByIdQueryHandler : IRequestHandler<GetValuesByIdQuery, FieldValue[]> { private readonly ListsRepositoryFactory _factory; private readonly ICoreAuthorization _coreAuthorization; private readonly ICurrentUserContext _currentUserContext; public GetValuesByIdQueryHandler( ListsRepositoryFactory factory, ICoreAuthorization coreAuthorization, ICurrentUserContext currentUserContext) { _factory = factory; _coreAuthorization = coreAuthorization; _currentUserContext = currentUserContext; } public async Task<FieldValue[]> Handle(GetValuesByIdQuery request, CancellationToken cancellationToken) { // Проверяем, удален ли элемент var sysInfoItem = await _factory.ListItemsSysInfoRepository .GetFirstOrDefaultAsync(e => e.ListId == request.ListId && e.ItemId == request.ItemId, cancellationToken); var isDeleted = sysInfoItem?.Id > 0 && sysInfoItem.IsDeleted; if (isDeleted) { // Для удаленных элементов требуется системная операция var principal = _currentUserContext.GetCurrentPrincipal() ?? throw new UnauthorizedOperationException("Пользователь не аутентифицирован"); await _coreAuthorization.EnsureSystemOperationAsync("manage-system", principal, cancellationToken); } // Авторизация элемента списка уже проверена в AuthorizationBehavior через IRequiresListItemAuthorization await ValidateItemBelongsToList(request.ListId, request.ItemId, cancellationToken); var entities = await _factory.FieldValuesRepository.GetValuesByItemId(request.ListId, request.ItemId, cancellationToken); return FieldValueMapper.MapToGenericArray<FieldValue>(entities); } private async Task ValidateItemBelongsToList(int listId, int itemId, CancellationToken cancellationToken) { var values = await _factory.FieldValuesRepository.GetValuesByItemId(listId, itemId, cancellationToken); if (values.Length == 0) { // Проверяем через ListItemsSysInfo, возможно элемент существует, но не имеет значений var sysInfo = await _factory.ListItemsSysInfoRepository.GetEntitiesByQueryAsync( e => e.ListId == listId && e.ItemId == itemId, cancellationToken); if (sysInfo.Length == 0) { throw ListsException.Error($"Элемент с ID {itemId} не принадлежит списку с ID {listId} или не существует"); } } } } }