using Application.Common.Extensions; using Application.Common.Models; using Application.Dto; using Application.Interfaces; using Application.Mappers; using Domain.Enums; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace Application.Game.Card.Write; public record WriteCardDetailCommand(long CardId, string Data) : IRequestWrapper; public class WriteCardDetailCommandHandler : CardRequestHandlerBase { private readonly ILogger logger; public WriteCardDetailCommandHandler(ICardDependencyAggregate aggregate, ILogger logger) : base(aggregate) { this.logger = logger; } public override async Task> Handle(WriteCardDetailCommand request, CancellationToken cancellationToken) { var exists = await CardDbContext.CardMains.AnyAsync(card => card.CardId == request.CardId, cancellationToken: cancellationToken); if (!exists) { logger.LogWarning("Card id: {CardId} does not exist!", request.CardId); return ServiceResult.Failed( new ServiceError($"Card id: {request.CardId} does not exist!", (int)CardReturnCode.CardNotRegistered)); } var dto = request.Data.DeserializeCardData(); var detail = dto.DtoToCardDetail(); detail.CardId = request.CardId; detail.LastPlayTime = DateTime.Now; await CardDbContext.CardDetails.Upsert(detail).RunAsync(cancellationToken); await CardDbContext.SaveChangesAsync(cancellationToken); return new ServiceResult(request.Data); } }