(int userId)
| 87 | } |
| 88 | |
| 89 | public async Task<List<BoardSummaryDto>> GetPendingInvitationsAsync(int userId) |
| 90 | { |
| 91 | var boards = await _db.Boards |
| 92 | .AsNoTracking() |
| 93 | .Where(b => b.Members.Any(m => m.UserId == userId && m.Status == "Pending")) |
| 94 | .Select(b => new BoardSummaryDto |
| 95 | { |
| 96 | Id = b.Id, |
| 97 | Name = b.Name, |
| 98 | CreatedAt = b.CreatedAt, |
| 99 | Role = "Invited", |
| 100 | ThemeColor = b.ThemeColor, |
| 101 | WorkspaceId = b.WorkspaceId, |
| 102 | WorkspaceName = b.Workspace.Name, |
| 103 | IsClosed = b.IsClosed, |
| 104 | OpenTasksCount = b.Columns.SelectMany(c => c.TaskCards) |
| 105 | .Count(t => !t.Column.Name.ToLower().Contains("done") && !t.Column.Name.ToLower().Contains("complete")), |
| 106 | Members = b.Members |
| 107 | .Where(m => m.Status == "Accepted") |
| 108 | .Select(m => new BoardMemberDto |
| 109 | { |
| 110 | Id = m.Id, |
| 111 | UserId = m.UserId, |
| 112 | Username = m.User.Username, |
| 113 | AvatarUrl = m.User.AvatarUrl, |
| 114 | Role = m.Role |
| 115 | }).ToList() |
| 116 | }) |
| 117 | .ToListAsync(); |
| 118 | |
| 119 | foreach (var board in boards) |
| 120 | { |
| 121 | var b = await _db.Boards |
| 122 | .AsNoTracking() |
| 123 | .Include(x => x.Owner) |
| 124 | .FirstOrDefaultAsync(x => x.Id == board.Id); |
| 125 | |
| 126 | if (b?.Owner != null && !board.Members.Any(m => m.UserId == b.OwnerId)) |
| 127 | { |
| 128 | board.Members.Insert(0, new BoardMemberDto |
| 129 | { |
| 130 | UserId = b.OwnerId, |
| 131 | Username = b.Owner.Username, |
| 132 | AvatarUrl = b.Owner.AvatarUrl, |
| 133 | Role = "Owner" |
| 134 | }); |
| 135 | } |
| 136 | } |
| 137 | return boards; |
| 138 | } |
| 139 | |
| 140 | public async Task<BoardDetailDto?> GetBoardDetailAsync(int boardId, int userId) |
| 141 | { |
no outgoing calls
no test coverage detected