Handler.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Store.ValueObject;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Admin.Store.Product.Get;
  7. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  8. {
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var product = await db.Product
  12. .AsNoTracking()
  13. .Include(c => c.Game)
  14. .Where(c => c.ID == request.ID)
  15. .Select(c => new Response(
  16. c.ID,
  17. c.GameID ?? 0,
  18. c.Game!.KorName,
  19. c.Name,
  20. c.Description,
  21. c.Thumbnail,
  22. c.Type,
  23. c.Price,
  24. c.DiscountType,
  25. c.DiscountValue,
  26. c.DiscountType == DiscountType.Percent
  27. ? (c.Price - (c.Price * c.DiscountValue / 100) < 0 ? 0 : c.Price - (c.Price * c.DiscountValue / 100))
  28. : c.DiscountType == DiscountType.Amount
  29. ? (c.Price - c.DiscountValue < 0 ? 0 : c.Price - c.DiscountValue)
  30. : c.Price,
  31. c.Stock,
  32. c.MinPurchase,
  33. c.MaxPurchase,
  34. c.IsActive,
  35. c.Order,
  36. c.SaleStartAt,
  37. c.SaleEndAt,
  38. c.CreatedAt,
  39. c.UpdatedAt,
  40. c.RequireDonationChannel
  41. ))
  42. .FirstOrDefaultAsync(ct);
  43. if (product is null)
  44. {
  45. return Result.Failure<Response>(Error.NotFound("Product.NotFound", "상품을 찾을 수 없습니다."));
  46. }
  47. return Result.Success(product);
  48. }
  49. }