Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Setup integration tests using SpecFlow #76

Open
wants to merge 74 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
6fb007b
Setup integration tests using SpecFlow
idormenco Aug 7, 2021
8b36f4c
Update docker-compose.yml
idormenco Aug 7, 2021
a51e405
add & refactor backpack update tests
idormenco Aug 7, 2021
9107cb9
Merge branch 'feature/add-integration-tests' of https://github.com/co…
idormenco Aug 7, 2021
e48f4fc
Add backpack delete tests
idormenco Aug 9, 2021
8607e4c
Cover with tests backpack items
idormenco Aug 17, 2021
1dd32fd
Merge pull request #8 from code4romania/feature/add-integration-tests
idormenco Aug 18, 2021
bbace29
Create dotnet.yml
idormenco Aug 18, 2021
57503c3
Update dotnet.yml
idormenco Aug 18, 2021
970cd8d
Update dotnet.yml
idormenco Aug 18, 2021
c7ab517
Update dotnet.yml
idormenco Aug 18, 2021
759cd4b
Update dotnet.yml
idormenco Aug 18, 2021
bb0ab04
Update dotnet.yml
idormenco Aug 18, 2021
694094b
Update DeUrgenta.Tests.Helpers.csproj
idormenco Aug 19, 2021
69e2bf2
Merge pull request #9 from code4romania/feature/add-integration-tests
idormenco Aug 19, 2021
a8ff5e1
Rework solution
idormenco Aug 19, 2021
6bd090b
Merge pull request #10 from code4romania/feature/add-integration-tests
idormenco Aug 19, 2021
955c1eb
Update dotnet.yml
idormenco Aug 19, 2021
2e5328f
Update dotnet.yml
idormenco Aug 19, 2021
614bb7c
Update dotnet.yml
idormenco Aug 19, 2021
3300a8f
Update dotnet.yml
idormenco Aug 19, 2021
6a434d9
Update dotnet.yml
idormenco Aug 19, 2021
4dc16e8
Update dotnet.yml
idormenco Aug 19, 2021
316a042
Update DbExtensions.cs
idormenco Aug 19, 2021
92874ba
Merge pull request #11 from code4romania/feature/add-integration-tests
idormenco Aug 19, 2021
a4c7ce6
Update dotnet.yml
idormenco Aug 19, 2021
d0c5148
Update dotnet.yml
idormenco Aug 19, 2021
ac86c80
Update dotnet.yml
idormenco Aug 19, 2021
684226f
Update dotnet.yml
idormenco Aug 19, 2021
bbfcb13
Update dotnet.yml
idormenco Aug 19, 2021
6634627
Update dotnet.yml
idormenco Aug 19, 2021
a7b22fe
Update dotnet.yml
idormenco Aug 19, 2021
6bf4e7c
Update dotnet.yml
idormenco Aug 19, 2021
961b1b5
Update dotnet.yml
idormenco Aug 19, 2021
bb8edcc
rework setup
idormenco Aug 19, 2021
c0a9cad
Merge pull request #12 from code4romania/feature/add-integration-tests
idormenco Aug 19, 2021
7b175af
Update dotnet.yml
idormenco Aug 19, 2021
30b696c
Update dotnet.yml
idormenco Aug 19, 2021
2eb4b32
Update dotnet.yml
idormenco Aug 19, 2021
5adfbfb
Update dotnet.yml
idormenco Aug 19, 2021
9231f23
Update dotnet.yml
idormenco Aug 19, 2021
2d18258
Update dotnet.yml
idormenco Aug 19, 2021
9697b65
Update dotnet.yml
idormenco Aug 19, 2021
8e0c05e
Update dotnet.yml
idormenco Aug 19, 2021
16c9810
Update dotnet.yml
idormenco Aug 19, 2021
2061b80
Update Backpack-Delete.feature
idormenco Aug 19, 2021
cfc6b82
add living doc
idormenco Aug 19, 2021
0c92f56
Merge pull request #13 from code4romania/feature/add-integration-tests
idormenco Aug 19, 2021
0cb01a8
Update scenario
idormenco Aug 19, 2021
8e85276
Merge pull request #14 from code4romania/feature/add-integration-tests
idormenco Aug 19, 2021
d2a5134
Update docs add vercel.json
idormenco Aug 19, 2021
a271901
Update vercel.json
idormenco Aug 19, 2021
ee883e8
Merge pull request #15 from idormenco/idormenco-patch-1
idormenco Aug 19, 2021
1846048
Update Backpack-Delete.feature
idormenco Aug 19, 2021
50d88d3
Update Backpack-Delete.feature.cs
idormenco Aug 19, 2021
e420a96
Merge branch 'main' of https://github.com/idormenco/de-urgenta-backen…
idormenco Aug 19, 2021
9e4d0da
Update Backpack-Delete.feature
idormenco Aug 19, 2021
6eccba5
Update appsettings.specs.json
idormenco Sep 23, 2021
5375810
Add Group Edit and Safe Location features
catileptic Sep 24, 2021
a895ffb
Merge branch 'main' into feature/add-integration-tests
idormenco Sep 25, 2021
2ee3330
merge main
idormenco Sep 25, 2021
200dec7
Update CertificationController.cs
idormenco Sep 25, 2021
c0868a8
update packages
idormenco Sep 25, 2021
d0e1f35
Cleanup
idormenco Sep 25, 2021
f1d859e
Implement newly added features+cleanup
idormenco Sep 25, 2021
83d2fc4
remove unused stuff
idormenco Sep 25, 2021
7ab8e53
Split group safe location
idormenco Oct 5, 2021
72208bc
Merge branch 'develop' into feature/add-integration-tests
idormenco Jan 29, 2022
000d6d0
Update UpdateBackpackItemHandler.cs
idormenco Jan 29, 2022
fb2ac68
Merge branch 'develop' into feature/add-integration-tests
idormenco Jan 29, 2022
9b9ed8b
Consolidate packages
idormenco Jan 29, 2022
4763c51
Update DeUrgenta.Specs.sln
idormenco Jan 29, 2022
3604380
Add missing feature files
idormenco Apr 30, 2022
a986be9
Update JobsDatabaseFixture.cs
idormenco Apr 30, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: .NET

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

defaults:
run:
working-directory: ./Src

jobs:
build:
runs-on: ubuntu-latest

# Service containers to run with `container-job`
services:
# Label used to access the service container
postgres:
# Docker Hub image
image: postgres
# Provide the password for postgres
env:
POSTGRES_PASSWORD: git-ci-pass
POSTGRES_USER: git-ci
POSTGRES_DB: postgres
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.x
- name: Restore dependencies
run: dotnet restore DeUrgenta.sln
- name: Build
run: dotnet build --no-restore /p:ContinuousIntegrationBuild=true DeUrgenta.sln
- name: Apply migrations for test db
run: |
dotnet tool install --global dotnet-ef
dotnet ef database update --no-build --project DeUrgenta.Domain --startup-project DeUrgenta.Api --context DeUrgentaContext --connection "Server=localhost;Port=5432;Database=de-urgenta-specs-db;User Id=git-ci;Password=git-ci-pass;"
dotnet ef database update --no-build --project DeUrgenta.User.Api --startup-project DeUrgenta.Api --context UserDbContext --connection "Server=localhost;Port=5432;Database=de-urgenta-specs-db;User Id=git-ci;Password=git-ci-pass;"
- name: Run unit & integration tests
run: dotnet test --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover DeUrgenta.sln
env:
# Connection string
ConnectionStrings__TestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-specs-db;User Id=git-ci;Password=git-ci-pass;
- name: Upload dotnet test results
uses: codecov/codecov-action@v1
- name: Run specs
run: |
dotnet tool install --global SpecFlow.Plus.LivingDoc.CLI
dotnet test DeUrgenta.Specs.sln
env:
# Connection strings
ConnectionStrings__DbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-specs-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__IdentityDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-specs-db;User Id=git-ci;Password=git-ci-pass;

- name: Generate living doc
run: |
cd ./Specs/DeUrgenta.Specs/bin/Debug/net5.0
livingdoc test-assembly DeUrgenta.Specs.dll -t TestExecution.json
if: always()

- uses: actions/upload-artifact@v2
with:
name: living-doc
path: ./Src/Specs/DeUrgenta.Specs/bin/Debug/net5.0/LivingDoc.html
if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
if: always()

4 changes: 2 additions & 2 deletions Src/DeUrgenta.Admin.Api/DeUrgenta.Admin.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CSharpFunctionalExtensions" Version="2.15.1" />
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="CSharpFunctionalExtensions" Version="2.20.4" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="6.1.0" />
Expand Down
8 changes: 4 additions & 4 deletions Src/DeUrgenta.Api/DeUrgenta.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@

<ItemGroup>
<PackageReference Include="AspNetCoreRateLimit" Version="4.0.1" />
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.0" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.6" />
<PackageReference Include="Hellang.Middleware.ProblemDetails" Version="5.3.0" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="9.0.0" />
<PackageReference Include="MicroElements.Swashbuckle.FluentValidation" Version="5.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.4">
<PackageReference Include="MicroElements.Swashbuckle.FluentValidation" Version="5.4.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
12 changes: 10 additions & 2 deletions Src/DeUrgenta.Api/Extensions/SwaggerExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Filters;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;

namespace DeUrgenta.Api.Extensions
Expand All @@ -26,13 +27,20 @@ public static IServiceCollection AddSwaggerFor(this IServiceCollection services,
In = ParameterLocation.Header,
Name = "Authorization",
BearerFormat = "JWT",
Description = "JWT Authorization header using the Bearer scheme."
Description = "JWT Authorization header using the Bearer scheme.",
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
},
};

c.AddSecurityDefinition("Bearer", jwtSecurityScheme);
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{ jwtSecurityScheme, Array.Empty<string>() }
});
c.CustomOperationIds(apiDesc => apiDesc.TryGetMethodInfo(out var methodInfo) ? methodInfo.Name : $"{apiDesc.ActionDescriptor.RouteValues["controller"]}_{apiDesc.ActionDescriptor.RouteValues["action"]}_{apiDesc.HttpMethod}");

c.OperationFilter<AuthorizeCheckOperationFilter>();
c.OperationFilter<AcceptLanguageHeaderParameterOperationFilter>();
Expand All @@ -46,7 +54,7 @@ public static IServiceCollection AddSwaggerFor(this IServiceCollection services,
Contact = new OpenApiContact
{
Name = "Code4Romania",
Email = string.Empty,
Email = "code4ro@code4.ro",
Url = new Uri("https://code4.ro/"),
},
License = new OpenApiLicense
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ public UpdateBackpackItemHandler(IValidateRequest<UpdateBackpackItem> validator,
{
Id = backpackItem.Id,
BackpackId = backpackItem.BackpackId,
Name = backpackItem.Name,
Amount = backpackItem.Amount,
Name = backpackItem.Name,
Category = backpackItem.Category,
ExpirationDate = backpackItem.ExpirationDate,
Version = backpackItem.Version
Expand Down
4 changes: 2 additions & 2 deletions Src/DeUrgenta.Backpack.Api/DeUrgenta.Backpack.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CSharpFunctionalExtensions" Version="2.15.1" />
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="CSharpFunctionalExtensions" Version="2.20.4" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="6.1.0" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

<ItemGroup>
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.1" />
<PackageReference Include="AWSSDK.S3" Version="3.7.3.1" />
<PackageReference Include="CSharpFunctionalExtensions" Version="2.15.3" />
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="AWSSDK.S3" Version="3.7.3.4" />
<PackageReference Include="CSharpFunctionalExtensions" Version="2.20.4" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="6.1.0" />
</ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions Src/DeUrgenta.Common/DeUrgenta.Common.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@


<ItemGroup>
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="6.1.0" />
<PackageReference Include="CSharpFunctionalExtensions" Version="2.15.1" />

Expand Down
2 changes: 1 addition & 1 deletion Src/DeUrgenta.Content.Api/DeUrgenta.Content.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

<ItemGroup>
<PackageReference Include="CSharpFunctionalExtensions" Version="2.15.1" />
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="6.1.0" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.2" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.4" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.10" />
</ItemGroup>

</Project>
4 changes: 2 additions & 2 deletions Src/DeUrgenta.Events.Api/DeUrgenta.Events.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CSharpFunctionalExtensions" Version="2.15.3" />
<PackageReference Include="FluentValidation" Version="10.3.0" />
<PackageReference Include="CSharpFunctionalExtensions" Version="2.20.4" />
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="6.1.0" />
</ItemGroup>
Expand Down
149 changes: 0 additions & 149 deletions Src/DeUrgenta.Group.Api/Controllers/GroupController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,67 +115,6 @@ public async Task<ActionResult<GroupModel>> UpdateGroupAsync([FromRoute] Guid gr
return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Gets a list of group members
/// </summary>
[HttpGet]
[Route("{groupId:guid}/members")]
[SwaggerResponse(StatusCodes.Status200OK, "List of group members", typeof(IImmutableList<GroupMemberModel>))]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerResponseExample(StatusCodes.Status200OK, typeof(GetGroupMembersResponseExample))]
[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<ActionResult<IImmutableList<GroupMemberModel>>> GetGroupMembersAsync([FromRoute] Guid groupId)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var query = new GetGroupMembers(sub, groupId);
var result = await _mediator.Send(query);

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Removes a user from group members
/// </summary>
[HttpDelete]
[Route("{groupId:guid}/member/{userId:guid}")]
[SwaggerResponse(StatusCodes.Status204NoContent, "User removed from members")]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<ActionResult> RemoveMemberAsync([FromRoute] Guid groupId, [FromRoute] Guid userId)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var command = new RemoveFromGroup(sub, groupId, userId);
var result = await _mediator.Send(command);

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Removes current user from group members
/// </summary>
[HttpPut]
[Route("{groupId:guid}/member/leave")]
[SwaggerResponse(StatusCodes.Status204NoContent, "User removed from members")]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<IActionResult> LeaveGroupAsync([FromRoute] Guid groupId)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var command = new LeaveGroup(sub, groupId);
var result = await _mediator.Send(command);

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Delete a group
/// </summary>
Expand All @@ -196,93 +135,5 @@ public async Task<IActionResult> DeleteGroupAsync([FromRoute] Guid groupId)

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Gets group safe location
/// </summary>
/// <returns></returns>
[HttpGet("{groupId:guid}/safe-locations")]
[SwaggerResponse(StatusCodes.Status200OK, "Get safe locations of a group", typeof(IImmutableList<SafeLocationResponseModel>))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerResponseExample(StatusCodes.Status200OK, typeof(GetGroupSafeLocationsResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<ActionResult<IImmutableList<SafeLocationResponseModel>>> GetGroupSafeLocationsAsync([FromRoute] Guid groupId)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var query = new GetGroupSafeLocations(sub, groupId);
var result = await _mediator.Send(query);

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Adds a new group safe location
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("{groupId:guid}/safe-location")]
[SwaggerResponse(StatusCodes.Status200OK, "New group safe location", typeof(SafeLocationModel))]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerRequestExample(typeof(SafeLocationRequest), typeof(AddOrUpdateSafeLocationRequestExample))]
[SwaggerResponseExample(StatusCodes.Status200OK, typeof(AddOrUpdateSafeLocationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<ActionResult<SafeLocationResponseModel>> CreateNewSafeLocationAsync([FromRoute] Guid groupId, [FromBody] SafeLocationRequest safeLocation)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var query = new AddSafeLocation(sub, groupId, safeLocation);
var result = await _mediator.Send(query);

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Updates a group safe location
/// </summary>
/// <returns></returns>
[HttpPut]
[Route("safe-location/{locationId:guid}")]

[SwaggerResponse(StatusCodes.Status200OK, "Updated group safe location", typeof(SafeLocationResponseModel))]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerRequestExample(typeof(SafeLocationRequest), typeof(AddOrUpdateSafeLocationRequestExample))]
[SwaggerResponseExample(StatusCodes.Status200OK, typeof(AddOrUpdateSafeLocationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<ActionResult<SafeLocationResponseModel>> UpdateSafeLocationAsync([FromRoute] Guid locationId, [FromBody] SafeLocationRequest safeLocation)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var query = new UpdateSafeLocation(sub, locationId, safeLocation);
var result = await _mediator.Send(query);

return await _mapper.MapToActionResult(result);
}

/// <summary>
/// Delete a group safe location
/// </summary>
/// <returns></returns>
[HttpDelete]
[Route("safe-location/{locationId:guid}")]

[SwaggerResponse(StatusCodes.Status204NoContent, "Group safe location was deleted")]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
public async Task<IActionResult> DeleteSafeLocationAsync([FromRoute] Guid locationId)
{
var sub = User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
var command = new DeleteSafeLocation(sub, locationId);
var result = await _mediator.Send(command);

return await _mapper.MapToActionResult(result);
}
}
}
Loading