| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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<Query, Result<Response>>
- {
- public async Task<Result<Response>> 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<Response>(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
- })]
- };
- }
- }
|