using Application.Classes; using Application.DataTransferObjects.Player; using Application.Errors; using Application.Interfaces; using AutoMapper; using AutoMapper.QueryableExtensions; using Database; using Database.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace Application.Repositories; public class PlayerRepository(ApplicationContext context, IMapper mapper, ILogger logger) : IPlayerRepository { public async Task> GetPlayerAsync(Guid playerId, CancellationToken cancellationToken) { var playerById = await context.Players .ProjectTo(mapper.ConfigurationProvider) .AsNoTracking() .FirstOrDefaultAsync(player => player.Id == playerId, cancellationToken); return playerById is null ? Result.Failure(PlayerErrors.NotFound) : Result.Success(playerById); } public async Task>> GetAlliancePlayersAsync(Guid allianceId, CancellationToken cancellationToken) { var alliancePlayers = await context.Players .Where(player => player.AllianceId == allianceId) .ProjectTo(mapper.ConfigurationProvider) .AsNoTracking() .ToListAsync(cancellationToken); return Result.Success(alliancePlayers); } public async Task> CreatePlayerAsync(CreatePlayerDto createPlayerDto, CancellationToken cancellationToken) { var newPlayer = mapper.Map(createPlayerDto); await context.Players.AddAsync(newPlayer, cancellationToken); try { await context.SaveChangesAsync(cancellationToken); return Result.Success(mapper.Map(newPlayer)); } catch (Exception e) { logger.LogError(e, e.Message); return Result.Failure(GeneralErrors.DatabaseError); } } public async Task> UpdatePlayerAsync(UpdatePlayerDto updatePlayerDto, CancellationToken cancellationToken) { var playerToUpdate = await context.Players .FirstOrDefaultAsync(player => player.Id == updatePlayerDto.Id, cancellationToken); if (playerToUpdate is null) return Result.Failure(PlayerErrors.NotFound); mapper.Map(updatePlayerDto, playerToUpdate); try { await context.SaveChangesAsync(cancellationToken); return Result.Success(mapper.Map(playerToUpdate)); } catch (Exception e) { logger.LogError(e, e.Message); return Result.Failure(GeneralErrors.DatabaseError); } } public async Task> DeletePlayerAsync(Guid playerIId, CancellationToken cancellationToken) { var playerToDelete = await context.Players .FirstOrDefaultAsync(player => player.Id == playerIId, cancellationToken); if (playerToDelete is null) return Result.Failure(PlayerErrors.NotFound); context.Players.Remove(playerToDelete); try { await context.SaveChangesAsync(cancellationToken); return Result.Success(true); } catch (Exception e) { logger.LogError(e, e.Message); return Result.Failure(GeneralErrors.DatabaseError); } } }