using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Domain.Entities.Feed; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Feed.ToggleLike; 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", "게시글을 찾을 수 없습니다.")); } var existing = await db.FeedLike.FirstOrDefaultAsync(l => l.FeedPostID == request.PostID && l.MemberID == request.MemberID, ct); bool hasLike; if (existing is null) { await db.FeedLike.AddAsync(new FeedLike { FeedPostID = request.PostID, MemberID = request.MemberID }, ct); post.Likes++; hasLike = true; } else { db.FeedLike.Remove(existing); post.Likes = post.Likes > 0 ? post.Likes - 1 : 0; hasLike = false; } await db.SaveChangesAsync(ct); return new Response(hasLike, post.Likes); } }