using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Application.Features.Api.Feed.Shared; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Feed.GetByUser; public sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { var member = await db.Member.AsNoTracking() .Where(m => m.SID == request.MemberSID && !m.IsWithdraw) .Select(m => new { m.ID, m.SID, m.Name }) .FirstOrDefaultAsync(ct); if (member is null) { return Result.Failure(Error.NotFound("Feed.MemberNotFound", "회원을 찾을 수 없습니다.")); } var query = db.FeedPost.AsNoTracking().Where(p => p.MemberID == member.ID && !p.IsDeleted); var total = await query.LongCountAsync(ct); var skip = (request.Page - 1) * request.PerPage; var rows = await query .OrderByDescending(p => p.CreatedAt) .Skip(skip) .Take(request.PerPage) .Select(p => new { p.ID, AuthorSID = p.Member.SID, AuthorName = p.Member.Name, AuthorThumb = p.Member.Thumb, AuthorSummary = p.Member.Summary, IsCreator = p.Member.IsCreator, ChannelSID = p.Member.Channel != null ? p.Member.Channel.SID : null, p.Content, p.Thumbnail, p.Images, p.Medias, p.Likes, p.Comments, p.Bookmarks, p.Views, Tags = p.FeedPostTag.Select(pt => new { pt.FeedTag.Name, pt.FeedTag.Slug }).ToList(), p.CreatedAt }) .ToListAsync(ct); return new Response { AuthorSID = member.SID, AuthorName = member.Name ?? string.Empty, Total = total, List = [..rows.Select(r => new FeedCardRow { PostID = r.ID, AuthorSID = r.AuthorSID, AuthorName = r.AuthorName, AuthorThumb = r.AuthorThumb, AuthorSummary = r.AuthorSummary, IsCreator = r.IsCreator, ChannelSID = r.ChannelSID, Subject = FeedContent.Excerpt(r.Content, 60), ContentExcerpt = FeedContent.Excerpt(r.Content, 200), Thumbnail = r.Thumbnail, Images = r.Images, Medias = r.Medias, Likes = r.Likes, Comments = r.Comments, Bookmarks = r.Bookmarks, Views = r.Views, Tags = [..r.Tags.Select(t => new FeedCardRow.TagRef { Name = t.Name, Slug = t.Slug })], CreatedAt = r.CreatedAt })] }; } }