using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Domain.Entities.Store; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Admin.Store.GameCatalog.Create; internal sealed class Handler(IAppDbContext db) : ICommandHandler { public async Task Handle(Command request, CancellationToken ct) { if (string.IsNullOrWhiteSpace(request.ProductID)) { return Result.Failure(Error.Problem("GameCatalog.ProductIDRequired", "SKU(상품 ID)는 필수입니다.")); } if (request.Price <= 0) { return Result.Failure(Error.Problem("GameCatalog.PriceInvalid", "정가는 1 이상이어야 합니다.")); } if (!await db.Game.AnyAsync(c => c.ID == request.GameID, ct)) { return Result.Failure(Error.NotFound("Game.NotFound", "게임을 찾을 수 없습니다.")); } var productID = request.ProductID.Trim(); if (await db.GameProductCatalog.AnyAsync(c => c.GameID == request.GameID && c.ProductID == productID, ct)) { return Result.Failure(Error.Conflict("GameCatalog.Duplicate", "이미 등록된 SKU 입니다.")); } db.GameProductCatalog.Add(GameProductCatalog.Create(request.GameID, productID, request.Price)); await db.SaveChangesAsync(ct); return Result.Success(); } }