Skip to content

Commit 9dcb013

Browse files
Add endpoint to replace groupId for claims (#182)
1 parent 0a12ee7 commit 9dcb013

File tree

11 files changed

+271
-2
lines changed

11 files changed

+271
-2
lines changed

.config/dotnet-tools.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
"commands": [
88
"swagger"
99
]
10+
},
11+
"dotnet-format": {
12+
"version": "5.1.225507",
13+
"commands": [
14+
"dotnet-format"
15+
]
1016
}
1117
}
12-
}
18+
}

DocumentsApi.Tests/V1/E2ETests/ClaimsTest.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,5 +669,77 @@ public async Task Returns400WhenUnableToDecodeBeforeToken()
669669

670670
response.StatusCode.Should().Be(400);
671671
}
672+
673+
[Test]
674+
public async Task Returns200WhenItCanUpdateClaimsGroupId()
675+
{
676+
var oldGroupId = Guid.NewGuid();
677+
var newGroupId = Guid.NewGuid();
678+
var claim1 = TestDataHelper.CreateClaim().ToEntity();
679+
var claim2 = TestDataHelper.CreateClaim().ToEntity();
680+
var claim3 = TestDataHelper.CreateClaim().ToEntity();
681+
claim1.GroupId = oldGroupId;
682+
claim2.GroupId = oldGroupId;
683+
claim3.GroupId = oldGroupId;
684+
DatabaseContext.Add(claim1);
685+
DatabaseContext.Add(claim2);
686+
DatabaseContext.Add(claim3);
687+
DatabaseContext.SaveChanges();
688+
689+
var uri = new Uri("api/v1/claims/update", UriKind.Relative);
690+
Client.DefaultRequestHeaders.Add("Authorization", TestToken.Value);
691+
string body = "{" +
692+
$"\"oldGroupId\": \"{oldGroupId}\"," +
693+
$"\"newGroupId\": \"{newGroupId}\"" +
694+
"}";
695+
696+
var jsonString = new StringContent(body, Encoding.UTF8, "application/json");
697+
var response = await Client.PostAsync(uri, jsonString).ConfigureAwait(true);
698+
699+
response.StatusCode.Should().Be(200);
700+
}
701+
702+
[Test]
703+
public async Task Returns400WithInvalidParameters()
704+
{
705+
var oldGroupId = Guid.NewGuid();
706+
var newGroupId = "abc";
707+
var uri = new Uri("api/v1/claims/update", UriKind.Relative);
708+
Client.DefaultRequestHeaders.Add("Authorization", TestToken.Value);
709+
string body = "{" +
710+
$"\"oldGroupId\": \"{oldGroupId}\"," +
711+
$"\"newGroupId\": \"{newGroupId}\"" +
712+
"}";
713+
714+
var jsonString = new StringContent(body, Encoding.UTF8, "application/json");
715+
var response = await Client.PostAsync(uri, jsonString).ConfigureAwait(true);
716+
717+
response.StatusCode.Should().Be(400);
718+
}
719+
720+
[Test]
721+
public async Task Returns200ButEmptyCollectionWhenCannotFindClaimsForGroupId()
722+
{
723+
var oldGroupId = Guid.NewGuid();
724+
var newGroupId = Guid.NewGuid();
725+
var claim1 = TestDataHelper.CreateClaim().ToEntity();
726+
var claim2 = TestDataHelper.CreateClaim().ToEntity();
727+
DatabaseContext.Add(claim1);
728+
DatabaseContext.Add(claim2);
729+
DatabaseContext.SaveChanges();
730+
731+
var uri = new Uri("api/v1/claims/update", UriKind.Relative);
732+
Client.DefaultRequestHeaders.Add("Authorization", TestToken.Value);
733+
string body = "{" +
734+
$"\"oldGroupId\": \"{oldGroupId}\"," +
735+
$"\"newGroupId\": \"{newGroupId}\"" +
736+
"}";
737+
738+
var jsonString = new StringContent(body, Encoding.UTF8, "application/json");
739+
var response = await Client.PostAsync(uri, jsonString).ConfigureAwait(true);
740+
var json = await response.Content.ReadAsStringAsync();
741+
response.StatusCode.Should().Be(200);
742+
json.Should().Be("[]");
743+
}
672744
}
673745
}

DocumentsApi.Tests/V1/Gateways/DocumentsGatewayTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,5 +326,50 @@ public void ReturnsEmptyClaimsCollectionIfGroupIdDoesNotMatch()
326326

327327
found.Should().BeEmpty();
328328
}
329+
330+
[Test]
331+
public void CanUpdateCLaimsGroupId()
332+
{
333+
var oldGroupId = Guid.NewGuid();
334+
var newGroupId = Guid.NewGuid();
335+
var claim1 = TestDataHelper.CreateClaim().ToEntity();
336+
var claim2 = TestDataHelper.CreateClaim().ToEntity();
337+
var claim3 = TestDataHelper.CreateClaim().ToEntity();
338+
claim1.GroupId = oldGroupId;
339+
claim2.GroupId = oldGroupId;
340+
claim3.GroupId = oldGroupId;
341+
DatabaseContext.Add(claim1);
342+
DatabaseContext.Add(claim2);
343+
DatabaseContext.Add(claim3);
344+
DatabaseContext.SaveChanges();
345+
346+
var result = _classUnderTest.UpdateClaimsGroupId(oldGroupId, newGroupId);
347+
348+
result[0].GroupId.Should().Be(newGroupId);
349+
result[1].GroupId.Should().Be(newGroupId);
350+
result[2].GroupId.Should().Be(newGroupId);
351+
}
352+
353+
[Test]
354+
public void ReturnsEmptyIfNoClaimContainsTheGroupId()
355+
{
356+
var oldGroupId = Guid.NewGuid();
357+
var newGroupId = Guid.NewGuid();
358+
var randomGroupId = Guid.NewGuid();
359+
var claim1 = TestDataHelper.CreateClaim().ToEntity();
360+
var claim2 = TestDataHelper.CreateClaim().ToEntity();
361+
var claim3 = TestDataHelper.CreateClaim().ToEntity();
362+
claim1.GroupId = randomGroupId;
363+
claim2.GroupId = randomGroupId;
364+
claim3.GroupId = randomGroupId;
365+
DatabaseContext.Add(claim1);
366+
DatabaseContext.Add(claim2);
367+
DatabaseContext.Add(claim3);
368+
DatabaseContext.SaveChanges();
369+
370+
var result = _classUnderTest.UpdateClaimsGroupId(oldGroupId, newGroupId);
371+
372+
result.Count.Should().Be(0);
373+
}
329374
}
330375
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using AutoFixture;
3+
using FluentAssertions;
4+
using NUnit.Framework;
5+
using DocumentsApi.V1.UseCase;
6+
using DocumentsApi.V1.Gateways.Interfaces;
7+
using DocumentsApi.V1.Domain;
8+
using DocumentsApi.V1.Boundary.Request;
9+
using System.Collections.Generic;
10+
using Moq;
11+
12+
namespace DocumentsApi.Tests.V1.UseCase
13+
{
14+
[TestFixture]
15+
public class UpdateClaimsGroupIdUseCaseTests
16+
{
17+
private readonly UpdateClaimsGroupIdUseCase _classUnderTest;
18+
private readonly Mock<IDocumentsGateway> _documentsGateway = new Mock<IDocumentsGateway>();
19+
private readonly Fixture _fixture = new Fixture();
20+
21+
public UpdateClaimsGroupIdUseCaseTests()
22+
{
23+
_classUnderTest = new UpdateClaimsGroupIdUseCase(_documentsGateway.Object);
24+
}
25+
26+
[Test]
27+
public void CanUpdateClaimsGroupId()
28+
{
29+
SetupMocks();
30+
var oldGroupId = Guid.NewGuid();
31+
var newGroupId = Guid.NewGuid();
32+
var request = new ClaimsUpdateRequest() { OldGroupId = oldGroupId, NewGroupId = newGroupId };
33+
_classUnderTest.Execute(request);
34+
_documentsGateway.Verify(dg => dg.UpdateClaimsGroupId(oldGroupId, newGroupId));
35+
}
36+
37+
private void SetupMocks()
38+
{
39+
var claim1 = TestDataHelper.CreateClaim();
40+
var claim2 = TestDataHelper.CreateClaim();
41+
var claim3 = TestDataHelper.CreateClaim();
42+
var claims = new List<Claim>() { claim1, claim2, claim3 };
43+
_documentsGateway
44+
.Setup(x => x.UpdateClaimsGroupId(It.IsAny<Guid>(), It.IsAny<Guid>()))
45+
.Returns(claims);
46+
}
47+
}
48+
}

DocumentsApi/ServiceConfigurator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public static void ConfigureServices(IServiceCollection services)
5151
services.AddScoped<ICreateUploadPolicyUseCase, CreateUploadPolicyUseCase>();
5252
services.AddScoped<IGeneratePreSignedDownloadUrlUseCase, GeneratePreSignedDownloadUrlUseCase>();
5353
services.AddScoped<IGetClaimsByGroupIdUseCase, GetClaimsByGroupIdUseCase>();
54+
services.AddScoped<IUpdateClaimsGroupIdUseCase, UpdateClaimsGroupIdUseCase>();
5455
}
5556
}
5657
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace DocumentsApi.V1.Boundary.Request
4+
{
5+
public class ClaimsUpdateRequest
6+
{
7+
public Guid OldGroupId { get; set; }
8+
public Guid NewGroupId { get; set; }
9+
}
10+
}

DocumentsApi/V1/Controllers/ClaimsController.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ClaimsController : BaseController
2222
private readonly IGetClaimAndPreSignedDownloadUrlUseCase _getClaimAndPreSignedDownloadUrlUseCase;
2323
private readonly IGeneratePreSignedDownloadUrlUseCase _generatePreSignedDownloadUrlUseCase;
2424
private readonly IGetClaimsByGroupIdUseCase _getClaimsByGroupIdUseCase;
25+
private readonly IUpdateClaimsGroupIdUseCase _updateClaimsGroupIdUseCase;
2526

2627
public ClaimsController(
2728
ICreateClaimUseCase createClaimUseCase,
@@ -30,7 +31,8 @@ public ClaimsController(
3031
ICreateClaimAndS3UploadPolicyUseCase createClaimAndS3UploadPolicyUseCase,
3132
IGetClaimAndPreSignedDownloadUrlUseCase getClaimAndPreSignedDownloadUrlUseCase,
3233
IGeneratePreSignedDownloadUrlUseCase generatePreSignedDownloadUrlUseCase,
33-
IGetClaimsByGroupIdUseCase getClaimsByGroupIdUseCase
34+
IGetClaimsByGroupIdUseCase getClaimsByGroupIdUseCase,
35+
IUpdateClaimsGroupIdUseCase updateClaimsGroupIdUseCase
3436
)
3537
{
3638
_createClaimUseCase = createClaimUseCase;
@@ -40,6 +42,7 @@ IGetClaimsByGroupIdUseCase getClaimsByGroupIdUseCase
4042
_getClaimAndPreSignedDownloadUrlUseCase = getClaimAndPreSignedDownloadUrlUseCase;
4143
_generatePreSignedDownloadUrlUseCase = generatePreSignedDownloadUrlUseCase;
4244
_getClaimsByGroupIdUseCase = getClaimsByGroupIdUseCase;
45+
_updateClaimsGroupIdUseCase = updateClaimsGroupIdUseCase;
4346
}
4447

4548
/// <summary>
@@ -208,5 +211,30 @@ public IActionResult GetClaimsByGroupId([FromQuery] PaginatedClaimRequest reques
208211
return BadRequest(ex.ValidationResponse.Errors);
209212
}
210213
}
214+
215+
/// <summary>
216+
/// Update claims group ID
217+
/// </summary>
218+
/// <response code="200">Update successful</response>
219+
/// <response code="400">Request contains invalid parameters</response>
220+
/// <response code="401">Request lacks valid API token</response>
221+
[HttpPost]
222+
[Route("update")]
223+
public IActionResult UpdateClaimsGroupId([FromBody] ClaimsUpdateRequest request)
224+
{
225+
try
226+
{
227+
var result = _updateClaimsGroupIdUseCase.Execute(request);
228+
return Ok(result);
229+
}
230+
catch (BadRequestException ex)
231+
{
232+
return BadRequest(ex.Message);
233+
}
234+
catch (NotFoundException ex)
235+
{
236+
return NotFound(ex.Message);
237+
}
238+
}
211239
}
212240
}

DocumentsApi/V1/Gateways/DocumentsGateway.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,21 @@ public Claim SaveClaim(Claim request)
149149

150150
return entity.ToDomain();
151151
}
152+
153+
public List<Claim> UpdateClaimsGroupId(Guid oldGroupId, Guid newGroupId)
154+
{
155+
var entities = _databaseContext.Claims
156+
.Where(claimEntity =>
157+
claimEntity.GroupId == oldGroupId)
158+
.ToList();
159+
var claims = new List<Claim>();
160+
for (int i = 0; i < entities.Count(); ++i)
161+
{
162+
entities[i].GroupId = newGroupId;
163+
claims.Add(entities[i].ToDomain());
164+
}
165+
_databaseContext.SaveChanges();
166+
return claims;
167+
}
152168
}
153169
}

DocumentsApi/V1/Gateways/Interfaces/IDocumentsGateway.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public interface IDocumentsGateway
1212
public Claim FindClaim(Guid id);
1313
public List<Claim> FindPaginatedClaimsByGroupId(Guid groupId, int? limit, Guid? cursor, bool? isNextPage);
1414
public Claim SaveClaim(Claim request);
15+
public List<Claim> UpdateClaimsGroupId(Guid oldGroupId, Guid newGroupId);
1516
}
1617
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using DocumentsApi.V1.Boundary.Response;
4+
using DocumentsApi.V1.Boundary.Request;
5+
6+
namespace DocumentsApi.V1.UseCase.Interfaces
7+
{
8+
public interface IUpdateClaimsGroupIdUseCase
9+
{
10+
public List<ClaimResponse> Execute(ClaimsUpdateRequest request);
11+
}
12+
}

0 commit comments

Comments
 (0)