Skip to content

Commit 926ec21

Browse files
committed
feat(api): align task delete authorization with role/assignee rules and update integration tests
1 parent d49d13f commit 926ec21

2 files changed

Lines changed: 6 additions & 6 deletions

File tree

src/TaskManagement.Api/Features/TaskItems/Commands/Handlers/DeleteTaskItemCommandHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ public async Task Handle(DeleteTaskItemCommand request, CancellationToken cancel
4545

4646
var isAdmin = _currentUserService.IsInRole(Roles.Administrator);
4747
var isProjectManager = _currentUserService.IsInRole(Roles.ProjectManager);
48+
var isAssignee = taskItem.AssignedUserId == currentUserId;
4849
var isProjectMember = await _dbContext.ProjectMembers
4950
.AnyAsync(pm => pm.ProjectId == taskItem.ProjectId && pm.UserId == currentUserId, cancellationToken);
5051
bool isProjectOwner = taskItem.Project.OwnerUserId == currentUserId;
5152
var canDeleteAsProjectManager = isProjectManager && (isProjectOwner || isProjectMember);
5253

53-
// Keep user deletes stricter: owner-only unless elevated role.
54-
if (!isAdmin && !canDeleteAsProjectManager && !isProjectOwner)
54+
if (!isAdmin && !canDeleteAsProjectManager && !isProjectOwner && !isAssignee)
5555
{
5656
throw new ForbiddenAccessException("User is not authorized to delete this task item.");
5757
}

tests/TaskManagement.Api.Tests/IntegrationTests/Features/TaskItems/DeleteTaskItemEndpointTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public async Task DeleteTaskItem_WhenUserIsAdministrator_ShouldReturnNoContentAn
169169
}
170170

171171
[Fact]
172-
public async Task DeleteTaskItem_WhenUserIsAssigneeButNotOwner_ShouldReturnForbidden()
172+
public async Task DeleteTaskItem_WhenUserIsAssigneeButNotOwner_ShouldReturnNoContentAndDeleteTask()
173173
{
174174
// Arrange
175175
SetAuthenticatedUser(_taskAssigneeId);
@@ -184,15 +184,15 @@ public async Task DeleteTaskItem_WhenUserIsAssigneeButNotOwner_ShouldReturnForbi
184184
var response = await _client.DeleteAsync($"/api/taskitems/{_taskToDeleteId}");
185185

186186
// Assert Response
187-
response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
187+
response.StatusCode.Should().Be(HttpStatusCode.NoContent);
188188

189189
// Assert Database State
190190
using (var scope = _factory.Services.CreateScope())
191191
{
192192
var dbContext = scope.ServiceProvider.GetRequiredService<TaskManagementDbContext>();
193193
var taskInDb = await dbContext.TaskItems.FindAsync(_taskToDeleteId);
194-
taskInDb.Should().NotBeNull();
195-
(await dbContext.TaskItems.Where(t => t.ProjectId == _projectId).CountAsync()).Should().Be(initialTaskCount);
194+
taskInDb.Should().BeNull();
195+
(await dbContext.TaskItems.Where(t => t.ProjectId == _projectId).CountAsync()).Should().Be(initialTaskCount - 1);
196196
}
197197
}
198198

0 commit comments

Comments
 (0)