using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Admin.Store.Game.Get; public sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { var game = await db.Game .AsNoTracking() .Where(c => c.ID == request.ID) .Select(c => new { c.ID, c.Code, c.KorName, c.EngName, c.Publisher, c.Thumbnail, c.BigImage, c.Description, c.CommissionRate, c.Link, c.IsActive, c.Order, c.CreatedAt, c.UpdatedAt, c.TrailerUrl, c.MinSpec, c.RecommendedSpec, c.ReleaseDate }) .FirstOrDefaultAsync(ct); if (game is null) { return Result.Failure(Error.NotFound("Game.NotFound", "게임을 찾을 수 없습니다.")); } var genreIds = await db.GameGenreMap.AsNoTracking().Where(m => m.GameID == game.ID).Select(m => m.GameGenreID).ToListAsync(ct); var categoryIds = await db.GameCategoryMap.AsNoTracking().Where(m => m.GameID == game.ID).Select(m => m.GameCategoryID).ToListAsync(ct); var images = await db.GameImage.AsNoTracking().Where(i => i.GameID == game.ID && !i.IsDisabled).OrderBy(i => i.Order).ThenBy(i => i.ID).Select(i => new Response.ImageRow(i.ID, i.Url)).ToListAsync(ct); var languages = await db.GameLanguageSupport.AsNoTracking().Where(s => s.GameID == game.ID).Select(s => new Response.LanguageSupportRow(s.GameLanguageID, s.Interface, s.FullAudio, s.Subtitles)).ToListAsync(ct); return Result.Success(new Response( game.ID, game.Code, game.KorName, game.EngName, game.Publisher, game.Thumbnail, game.BigImage, game.Description, game.CommissionRate, game.Link, game.IsActive, game.Order, game.CreatedAt, game.UpdatedAt, game.TrailerUrl, game.MinSpec, game.RecommendedSpec, game.ReleaseDate, genreIds, categoryIds, images, languages )); } }