67 lines
2.2 KiB
C#
67 lines
2.2 KiB
C#
using LiteCqrs;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using TeleWave.Application.Common.Interfaces;
|
|
using TeleWave.Application.Common.Models;
|
|
|
|
namespace TeleWave.Application.Programming.Groups.GetGroup;
|
|
|
|
public sealed class GetGroupQueryHandler(IAppDbContext dbContext, GroupElementResolver resolver)
|
|
: IQueryHandler<GetGroupQuery, Result<GroupDto>>
|
|
{
|
|
public async Task<Result<GroupDto>> Handle(
|
|
GetGroupQuery query,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var group = await dbContext
|
|
.Groups.AsNoTracking()
|
|
.Include(g => g.Items)
|
|
.FirstOrDefaultAsync(g => g.Id == query.Id, cancellationToken);
|
|
if (group is null)
|
|
return Result.Failure<GroupDto>(GroupErrors.NotFound);
|
|
|
|
var info = await resolver.ResolveAsync(
|
|
group.Items.Select(i => (i.ElementKind, i.ElementId)),
|
|
cancellationToken
|
|
);
|
|
|
|
var items = group
|
|
.Items.OrderBy(i => i.Position)
|
|
.Select(i =>
|
|
{
|
|
info.TryGetValue((i.ElementKind, i.ElementId), out var element);
|
|
return new GroupItemDto(
|
|
i.Id,
|
|
i.ElementKind,
|
|
i.ElementId,
|
|
// Элемент мог исчезнуть из библиотеки между чисткой и чтением — показываем прочерк,
|
|
// а не роняем весь экран группы.
|
|
element?.Name
|
|
?? "—",
|
|
i.Weight,
|
|
i.Position,
|
|
element?.UnitCount ?? 0,
|
|
element?.ShowKind,
|
|
element?.Audience,
|
|
element?.Year,
|
|
element?.PosterImageId
|
|
);
|
|
})
|
|
.ToList();
|
|
|
|
return Result.Success(
|
|
new GroupDto(
|
|
group.Id,
|
|
group.Name,
|
|
group.Description,
|
|
GroupFilter.FromJson(group.FilterJson),
|
|
group.ItemCount,
|
|
group.UnitCount,
|
|
group.TotalDuration.TotalSeconds,
|
|
group.StatsComputedAt,
|
|
items
|
|
)
|
|
);
|
|
}
|
|
}
|