using Application.Abstractions.Messaging; using Application.Abstractions.Data; using Application.Abstractions.Cache; using SharedKernel.Results; using SharedKernel.Storage; namespace Application.Features.Admin.Popup.Create; public sealed class Handler(IAppDbContext db, IEditorImageService editorImage, ICacheService cache) : ICommandHandler> { public async Task> Handle(Command request, CancellationToken ct) { if (request.StartAt > request.EndAt) { return Result.Failure(Error.Problem("Popup.InvalidDateRange", "팝업의 종료일은 시작일보다 이전일 수 없습니다.")); } var popup = Domain.Entities.Page.Popup.Popup.Create( request.PositionID, request.Subject, null, request.Link, request.StartAt, request.EndAt, request.Order, request.IsActive ); await db.Popup.AddAsync(popup); await db.SaveChangesAsync(ct); var path = new FileStoragePath(UploadTarget.Editor, UploadFolder.Popup, popup.ID); var html = await editorImage.UploadAsync(request.Content, path, ct); popup.SetContent(html); await db.SaveChangesAsync(ct); await cache.RemoveByPrefixAsync("popup:", ct); return Result.Success(popup.ID); } }