using AppContext.Entities; using Converters; using Microsoft.EntityFrameworkCore; using Model; using Services; namespace DbServices; public class DbTeamService(AppContext.AppContext context) : ITeamService { public Task> ListTeamsOf(int userId) { return Task.FromResult( context.Teams .Include(t => t.Members) .Where(t => t.Members.Any(m => m.UserId == userId)) .AsEnumerable() .Select(t => t.ToModel()) ); } public Task> ListTeams(int start, int count) { return Task.FromResult( context.Teams .Skip(start) .Take(count) .AsEnumerable() .Select(e => e.ToModel()) ); } public async Task CountTotalTeams() { return await context.Teams.CountAsync(); } public async Task AddTeam(string name, string picture, string firstColor, string secondColor) { var entity = new TeamEntity { Name = name, Picture = picture, MainColor = firstColor, SecondColor = secondColor }; await context.Teams.AddAsync(entity); await context.SaveChangesAsync(); return entity.ToModel(); } public async Task RemoveTeams(params int[] teams) { await context.Teams .Where(t => teams.Contains(t.Id)) .ExecuteDeleteAsync(); } public async Task UpdateTeam(Team team) { var entity = await context.Teams.FirstOrDefaultAsync(t => t.Id == team.Id); if (entity == null) return false; entity.Name = team.Name; entity.MainColor = team.MainColor; entity.SecondColor = team.SecondColor; entity.Picture = team.Picture; return await context.SaveChangesAsync() > 0; } public Task> GetMembersOf(int teamId) { return Task.FromResult(context.Members .Where(m => m.TeamId == teamId) .AsEnumerable() .Select(e => e.ToModel())); } public async Task AddMember(int teamId, int userId, MemberRole role) { if (await context.Members.AnyAsync(m => m.TeamId == teamId && m.UserId == userId)) { return null; } await context.Members.AddAsync(new MemberEntity { TeamId = teamId, UserId = userId, Role = role }); await context.SaveChangesAsync(); return new Member(teamId, userId, role); } public async Task UpdateMember(Member member) { var entity = await context.Members.FirstOrDefaultAsync(e => e.TeamId == member.TeamId && e.UserId == member.UserId); if (entity == null) return false; entity.Role = member.Role; return await context.SaveChangesAsync() > 0; } public async Task RemoveMember(int teamId, int userId) { return await context.Members .Where(e => e.TeamId == teamId && e.UserId == userId) .ExecuteDeleteAsync() > 0; } public async Task EnsureAccessibility(int userId, int teamId, MemberRole role) { var member = await context.Members.FirstOrDefaultAsync(e => e.TeamId == teamId && e.UserId == userId); if (member == null) return ITeamService.TeamAccessibility.NotFound; if (member.Role == role || role == MemberRole.Player) return ITeamService.TeamAccessibility.Authorized; return role == MemberRole.Coach ? ITeamService.TeamAccessibility.Authorized : ITeamService.TeamAccessibility.Unauthorized; } }