using JSMR.Application.VoiceWorks.Commands.Delete; using JSMR.Application.VoiceWorks.Commands.SetFavorite; using JSMR.Application.VoiceWorks.Ports; using JSMR.Domain.Entities; using Microsoft.EntityFrameworkCore; namespace JSMR.Infrastructure.Data.Repositories.VoiceWorks; public class VoiceWorkWriter(AppDbContext dbContext) : IVoiceWorkWriter { public async Task SetFavoriteAsync(SetVoiceWorkFavoriteRequest request, CancellationToken cancellationToken) { VoiceWork voiceWork = await GetVoiceWorkAsync(request.VoiceWorkId, cancellationToken); voiceWork.Favorite = request.IsFavorite; await dbContext.SaveChangesAsync(cancellationToken); return new SetVoiceWorkFavoriteResponse(request.VoiceWorkId, request.IsFavorite); } public async Task DeleteAsync(DeleteVoiceWorkRequest request, CancellationToken cancellationToken) { Dictionary isSuccess = []; VoiceWork[] voiceWorks = [.. dbContext.VoiceWorks.Where(voiceWork => request.VoiceWorkIds.Contains(voiceWork.VoiceWorkId)) .Include(x => x.Circle)]; foreach (VoiceWork voiceWork in voiceWorks) { isSuccess.Add(voiceWork.VoiceWorkId, false); if (voiceWork.Circle is null) continue; if (voiceWork.IsValid == true && voiceWork.Circle.Spam == false) continue; dbContext.Remove(voiceWork); isSuccess[voiceWork.VoiceWorkId] = true; } dbContext.SaveChanges(); return new DeleteVoiceWorkResponse(isSuccess); } private async Task GetVoiceWorkAsync(int voiceWorkId, CancellationToken cancellationToken) { return await dbContext.VoiceWorks.FirstOrDefaultAsync(voiceWork => voiceWork.VoiceWorkId == voiceWorkId, cancellationToken) ?? throw new KeyNotFoundException($"Voice Work {voiceWorkId} not found."); } }