| 320 | } |
| 321 | |
| 322 | public async Task<BoardSummaryDto> CreateBoardAsync(CreateBoardDto dto, int userId) |
| 323 | { |
| 324 | // Check if user is workspace owner or admin |
| 325 | var workspaceMember = await _db.WorkspaceMembers |
| 326 | .FirstOrDefaultAsync(wm => wm.WorkspaceId == dto.WorkspaceId && wm.UserId == userId && wm.Status == "Accepted"); |
| 327 | |
| 328 | var workspace = await _db.Workspaces.FindAsync(dto.WorkspaceId); |
| 329 | |
| 330 | bool isAuthorized = (workspace != null && workspace.OwnerId == userId) || |
| 331 | (workspaceMember != null && workspaceMember.Role == "Admin"); |
| 332 | |
| 333 | if (!isAuthorized) |
| 334 | throw new UnauthorizedAccessException("Only workspace owners or admins can create new boards."); |
| 335 | |
| 336 | var board = new Board |
| 337 | { |
| 338 | Name = dto.Name, |
| 339 | OwnerId = userId, |
| 340 | WorkspaceId = dto.WorkspaceId, |
| 341 | ThemeColor = dto.ThemeColor ?? "blue" |
| 342 | }; |
| 343 | |
| 344 | _db.Boards.Add(board); |
| 345 | await _db.SaveChangesAsync(); |
| 346 | |
| 347 | if (!dto.SkipDefaultColumns) |
| 348 | { |
| 349 | // Create 3 default columns |
| 350 | var defaultColumns = new List<Column> |
| 351 | { |
| 352 | new() { Name = "To Do", Order = 0, BoardId = board.Id }, |
| 353 | new() { Name = "In Progress", Order = 1, BoardId = board.Id }, |
| 354 | new() { Name = "Done", Order = 2, BoardId = board.Id } |
| 355 | }; |
| 356 | |
| 357 | _db.Columns.AddRange(defaultColumns); |
| 358 | await _db.SaveChangesAsync(); |
| 359 | } |
| 360 | |
| 361 | return new BoardSummaryDto |
| 362 | { |
| 363 | Id = board.Id, |
| 364 | Name = board.Name, |
| 365 | CreatedAt = board.CreatedAt, |
| 366 | Role = "Owner", |
| 367 | ThemeColor = board.ThemeColor, |
| 368 | WorkspaceId = board.WorkspaceId |
| 369 | }; |
| 370 | } |
| 371 | |
| 372 | public async Task<List<BoardMemberDto>> GetBoardMembersAsync(int boardId, int userId) |
| 373 | { |