| 6 | namespace Backend.Services; |
| 7 | |
| 8 | public class BoardService : IBoardService |
| 9 | { |
| 10 | private readonly AppDbContext _db; |
| 11 | |
| 12 | public BoardService(AppDbContext db) |
| 13 | { |
| 14 | _db = db; |
| 15 | } |
| 16 | |
| 17 | public async Task<List<BoardSummaryDto>> GetBoardsAsync(int userId) |
| 18 | { |
| 19 | var boards = await _db.Boards |
| 20 | .AsNoTracking() |
| 21 | .Where(b => b.OwnerId == userId |
| 22 | || b.Members.Any(m => m.UserId == userId && m.Status == "Accepted") |
| 23 | || (b.Workspace.Members.Any(wm => wm.UserId == userId && wm.Status == "Accepted"))) |
| 24 | .Select(b => new BoardSummaryDto |
| 25 | { |
| 26 | Id = b.Id, |
| 27 | Name = b.Name, |
| 28 | CreatedAt = b.CreatedAt, |
| 29 | Role = b.OwnerId == userId ? "Owner" : "Member", |
| 30 | ThemeColor = b.ThemeColor, |
| 31 | WorkspaceId = b.WorkspaceId, |
| 32 | WorkspaceName = b.Workspace.Name, |
| 33 | IsClosed = b.IsClosed, |
| 34 | OpenTasksCount = b.Columns.SelectMany(c => c.TaskCards) |
| 35 | .Count(t => !t.Column.Name.ToLower().Contains("done") && !t.Column.Name.ToLower().Contains("complete")), |
| 36 | Members = b.Members |
| 37 | .Where(m => m.Status == "Accepted") |
| 38 | .Select(m => new BoardMemberDto |
| 39 | { |
| 40 | Id = m.Id, |
| 41 | UserId = m.UserId, |
| 42 | Username = m.User.Username, |
| 43 | AvatarUrl = m.User.AvatarUrl, |
| 44 | Role = m.Role |
| 45 | }).ToList() |
| 46 | }) |
| 47 | .ToListAsync(); |
| 48 | |
| 49 | // Populate members and override roles based on workspace permissions |
| 50 | foreach (var board in boards) |
| 51 | { |
| 52 | var b = await _db.Boards |
| 53 | .AsNoTracking() |
| 54 | .Include(x => x.Owner) |
| 55 | .Include(x => x.Workspace) |
| 56 | .ThenInclude(w => w.Members) |
| 57 | .FirstOrDefaultAsync(x => x.Id == board.Id); |
| 58 | |
| 59 | if (b == null) continue; |
| 60 | |
| 61 | // Determine if requester is workspace admin |
| 62 | bool isWsAdmin = b.Workspace.OwnerId == userId || |
| 63 | b.Workspace.Members.Any(wm => wm.UserId == userId && wm.Role == "Admin" && wm.Status == "Accepted"); |
| 64 | |
| 65 | if (isWsAdmin) |
nothing calls this directly
no outgoing calls
no test coverage detected