Handler.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Store;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Admin.Store.GameCatalog.Create;
  7. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  8. {
  9. public async Task<Result> Handle(Command request, CancellationToken ct)
  10. {
  11. if (string.IsNullOrWhiteSpace(request.ProductID))
  12. {
  13. return Result.Failure(Error.Problem("GameCatalog.ProductIDRequired", "SKU(상품 ID)는 필수입니다."));
  14. }
  15. if (request.Price <= 0)
  16. {
  17. return Result.Failure(Error.Problem("GameCatalog.PriceInvalid", "정가는 1 이상이어야 합니다."));
  18. }
  19. if (!await db.Game.AnyAsync(c => c.ID == request.GameID, ct))
  20. {
  21. return Result.Failure(Error.NotFound("Game.NotFound", "게임을 찾을 수 없습니다."));
  22. }
  23. var productID = request.ProductID.Trim();
  24. if (await db.GameProductCatalog.AnyAsync(c => c.GameID == request.GameID && c.ProductID == productID, ct))
  25. {
  26. return Result.Failure(Error.Conflict("GameCatalog.Duplicate", "이미 등록된 SKU 입니다."));
  27. }
  28. db.GameProductCatalog.Add(GameProductCatalog.Create(request.GameID, productID, request.Price));
  29. await db.SaveChangesAsync(ct);
  30. return Result.Success();
  31. }
  32. }