using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Feed.Delete; public sealed class Handler(IAppDbContext db) : ICommandHandler { public async Task Handle(Command request, CancellationToken ct) { var post = await db.FeedPost.FirstOrDefaultAsync(p => p.ID == request.PostID && !p.IsDeleted, ct); if (post is null) { return Result.Failure(Error.NotFound("Feed.PostNotFound", "게시글을 찾을 수 없습니다.")); } if (post.MemberID != request.MemberID) { return Result.Failure(Error.Forbidden("Feed.NotOwner", "삭제 권한이 없습니다.")); } // 소프트 삭제 post.IsDeleted = true; post.DeletedAt = DateTime.UtcNow; // 태그 UsageCount 차감 var tagLinks = await db.FeedPostTag.Where(pt => pt.FeedPostID == post.ID).Select(pt => pt.FeedTagID).ToListAsync(ct); if (tagLinks.Count > 0) { var tags = await db.FeedTag.Where(t => tagLinks.Contains(t.ID)).ToListAsync(ct); foreach (var tag in tags) { tag.UsageCount = tag.UsageCount > 0 ? tag.UsageCount - 1 : 0; tag.UpdatedAt = DateTime.UtcNow; } } await db.SaveChangesAsync(ct); return Result.Success(); } }