using Application.Classes; using Application.DataTransferObjects.Squad; 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 SquadRepository(ApplicationContext dbContext, IMapper mapper, ILogger logger) : ISquadRepository { public async Task>> GetPlayerSquadsAsync(Guid playerId, CancellationToken cancellationToken = default) { var playerSquads = await dbContext.Squads .Where(squad => squad.PlayerId == playerId) .ProjectTo(mapper.ConfigurationProvider) .OrderBy(squad => squad.Position) .AsNoTracking() .ToListAsync(cancellationToken); return Result.Success(playerSquads); } public async Task> CreateSquadAsync(CreateSquadDto createSquadDto, CancellationToken cancellationToken = default) { try { var newSuad = mapper.Map(createSquadDto); await dbContext.Squads.AddAsync(newSuad, cancellationToken); await dbContext.SaveChangesAsync(cancellationToken); return Result.Success(mapper.Map(newSuad)); } catch (Exception e) { logger.LogError(e, "{DatabaseException}", e.Message); return Result.Failure(GeneralErrors.DatabaseError); } } public async Task> UpdateSquadAsync(UpdateSquadDto updateSquadDto, CancellationToken cancellationToken = default) { try { var squadToUpdate = await dbContext.Squads .FirstOrDefaultAsync(squad => squad.Id == updateSquadDto.Id, cancellationToken); if (squadToUpdate is null) return Result.Failure(SquadErrors.NotFound); mapper.Map(updateSquadDto, squadToUpdate); await dbContext.SaveChangesAsync(cancellationToken); return Result.Success(mapper.Map(squadToUpdate)); } catch (Exception e) { logger.LogError(e, "{DatabaseException}", e.Message); return Result.Failure(GeneralErrors.DatabaseError); } } public async Task> DeleteSquadAsync(Guid squadId, CancellationToken cancellationToken = default) { try { var squadToDelete = await dbContext.Squads .FirstOrDefaultAsync(squad => squad.Id == squadId, cancellationToken); if (squadToDelete is null) return Result.Failure(SquadErrors.NotFound); dbContext.Squads.Remove(squadToDelete); await dbContext.SaveChangesAsync(cancellationToken); return Result.Success(mapper.Map(true)); } catch (Exception e) { logger.LogError(e, "{DatabaseException}", e.Message); return Result.Failure(GeneralErrors.DatabaseError); } } }