Skip to content

Commit bf122d4

Browse files
author
GLOBALREFUND\lcervelin02
committed
feat: small improvements
1 parent 514aff2 commit bf122d4

File tree

29 files changed

+670
-612
lines changed

29 files changed

+670
-612
lines changed

src/CF.Api.UnitTest/CustomerControllerTest.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ namespace CF.Api.UnitTest;
1515

1616
public class CustomerControllerTest
1717
{
18+
private readonly CancellationTokenSource _cancellationTokenSource = new();
1819
private readonly Mock<ICorrelationContextAccessor> _correlationContext = new();
1920
private readonly Mock<ICustomerFacade> _customerFacade = new();
2021
private readonly Mock<ILogger<CustomerController>> _logger = new();
21-
private readonly CancellationTokenSource _cancellationTokenSource = new();
2222

2323
public CustomerControllerTest()
2424
{
@@ -35,15 +35,15 @@ public async Task GetListTestAsync()
3535
Count = 2,
3636
Result =
3737
[
38-
new()
38+
new CustomerResponseDto
3939
{
4040
Email = "tarnished@test.com",
4141
FirstName = "Elden",
4242
Surname = "Ring",
4343
FullName = "Elden Ring",
4444
Id = 1
4545
},
46-
new()
46+
new CustomerResponseDto
4747
{
4848
Email = "nameless_king@test.com",
4949
FirstName = "Elden",
@@ -54,7 +54,9 @@ public async Task GetListTestAsync()
5454
]
5555
};
5656

57-
_customerFacade.Setup(x => x.GetListByFilterAsync(It.IsAny<CustomerFilterDto>(), _cancellationTokenSource.Token)).ReturnsAsync(facadeResult);
57+
_customerFacade
58+
.Setup(x => x.GetListByFilterAsync(It.IsAny<CustomerFilterDto>(), _cancellationTokenSource.Token))
59+
.ReturnsAsync(facadeResult);
5860

5961
var controller = new CustomerController(_correlationContext.Object, _logger.Object, _customerFacade.Object);
6062

@@ -68,8 +70,8 @@ public async Task GetListTestAsync()
6870

6971
//Assert
7072
Assert.NotNull(actionResult);
71-
Assert.Equal(2, actionResult?.Value?.Count);
72-
Assert.Equal(2, actionResult?.Value?.Result.Count(x => x.FirstName == "Elden"));
73+
Assert.Equal(2, actionResult.Value?.Count);
74+
Assert.Equal(2, actionResult.Value?.Result.Count(x => x.FirstName == "Elden"));
7375
}
7476

7577
[Fact]
@@ -85,7 +87,8 @@ public async Task GetByIdTestAsync()
8587
Id = 1
8688
};
8789

88-
_customerFacade.Setup(x => x.GetByFilterAsync(It.IsAny<CustomerFilterDto>(), _cancellationTokenSource.Token)).ReturnsAsync(facadeResult);
90+
_customerFacade.Setup(x => x.GetByFilterAsync(It.IsAny<CustomerFilterDto>(), _cancellationTokenSource.Token))
91+
.ReturnsAsync(facadeResult);
8992

9093
var controller = new CustomerController(_correlationContext.Object, _logger.Object, _customerFacade.Object);
9194

@@ -94,15 +97,16 @@ public async Task GetByIdTestAsync()
9497

9598
//Assert
9699
Assert.NotNull(actionResult);
97-
Assert.Equal(1, actionResult?.Value?.Id);
98-
Assert.Equal("tarnished@test.com", actionResult?.Value?.Email);
100+
Assert.Equal(1, actionResult.Value?.Id);
101+
Assert.Equal("tarnished@test.com", actionResult.Value?.Email);
99102
}
100103

101104
[Fact]
102105
public async Task PostTestAsync()
103106
{
104107
//Arrange
105-
_customerFacade.Setup(x => x.CreateAsync(It.IsAny<CustomerRequestDto>(), _cancellationTokenSource.Token)).ReturnsAsync(1);
108+
_customerFacade.Setup(x => x.CreateAsync(It.IsAny<CustomerRequestDto>(), _cancellationTokenSource.Token))
109+
.ReturnsAsync(1);
106110

107111
var controller = new CustomerController(_correlationContext.Object, _logger.Object, _customerFacade.Object);
108112

@@ -126,7 +130,8 @@ public async Task PostTestAsync()
126130
public async Task PutTestAsync()
127131
{
128132
//Arrange
129-
_customerFacade.Setup(x => x.UpdateAsync(It.IsAny<long>(), It.IsAny<CustomerRequestDto>(), _cancellationTokenSource.Token));
133+
_customerFacade.Setup(x =>
134+
x.UpdateAsync(It.IsAny<long>(), It.IsAny<CustomerRequestDto>(), _cancellationTokenSource.Token));
130135

131136
var controller = new CustomerController(_correlationContext.Object, _logger.Object, _customerFacade.Object);
132137

src/CF.Api/Controllers/CustomerController.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ namespace CF.Api.Controllers;
1111

1212
[ApiController]
1313
[Route("api/v1/customer")]
14-
public class CustomerController(ICorrelationContextAccessor correlationContext, ILogger<CustomerController> logger,
14+
public class CustomerController(
15+
ICorrelationContextAccessor correlationContext,
16+
ILogger<CustomerController> logger,
1517
ICustomerFacade customerFacade) : ControllerBase
1618
{
1719
[HttpGet]
@@ -63,7 +65,8 @@ public async Task<ActionResult<CustomerResponseDto>> Get(long id, CancellationTo
6365
[HttpPost]
6466
[SwaggerResponse((int)HttpStatusCode.BadRequest, "Invalid Request.")]
6567
[SwaggerResponse((int)HttpStatusCode.Created, "Customer has been created successfully.")]
66-
public async Task<IActionResult> Post([FromBody] CustomerRequestDto customerRequestDto, CancellationToken cancellationToken)
68+
public async Task<IActionResult> Post([FromBody] CustomerRequestDto customerRequestDto,
69+
CancellationToken cancellationToken)
6770
{
6871
if (!ModelState.IsValid) return BadRequest(ModelState);
6972

@@ -76,7 +79,8 @@ public async Task<IActionResult> Post([FromBody] CustomerRequestDto customerRequ
7679
[SwaggerResponse((int)HttpStatusCode.BadRequest, "Invalid id.")]
7780
[SwaggerResponse((int)HttpStatusCode.NotFound, "Customer not found")]
7881
[SwaggerResponse((int)HttpStatusCode.NoContent, "Customer has been updated successfully.")]
79-
public async Task<IActionResult> Put(long id, [FromBody] CustomerRequestDto customerRequestDto, CancellationToken cancellationToken)
82+
public async Task<IActionResult> Put(long id, [FromBody] CustomerRequestDto customerRequestDto,
83+
CancellationToken cancellationToken)
8084
{
8185
try
8286
{

src/CF.Api/Filters/ExceptionFilter.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ public class ExceptionFilter : IExceptionFilter
88
{
99
public void OnException(ExceptionContext context)
1010
{
11-
if (context is null) return;
12-
1311
context.ExceptionHandled = context.Exception switch
1412
{
1513
ValidationException => HandleValidationException(context),
@@ -29,13 +27,13 @@ private static bool HandleValidationException(ExceptionContext context)
2927
{
3028
var error = new KeyValuePair<string, object>("Errors", new Dictionary<string, List<string>>
3129
{
32-
{"Validation", new List<string> {context.Exception.Message}}
30+
{ "Validation", [context.Exception.Message] }
3331
}
3432
);
3533

3634
var details = new ProblemDetails
3735
{
38-
Extensions = {error},
36+
Extensions = { error },
3937
Title = "One validation error occurred.",
4038
Status = StatusCodes.Status400BadRequest,
4139
Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1"
Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
using Microsoft.AspNetCore.Mvc;
22

3-
namespace CF.Api.Helpers
3+
namespace CF.Api.Helpers;
4+
5+
internal static class ControllerHelper
46
{
5-
internal static class ControllerHelper
7+
public static ProblemDetails CreateProblemDetails(string property, string errorMessage)
68
{
7-
8-
public static ProblemDetails CreateProblemDetails(string property, string errorMessage)
9-
{
10-
var error = new KeyValuePair<string, object>("Errors", new Dictionary<string, List<string>>
9+
var error = new KeyValuePair<string, object>("Errors", new Dictionary<string, List<string>>
1110
{
12-
{property, new List<string> {errorMessage}}
11+
{ property, [errorMessage] }
1312
}
14-
);
13+
);
1514

16-
return new ProblemDetails
17-
{
18-
Extensions = { error },
19-
Title = "An error occurred.",
20-
Status = StatusCodes.Status400BadRequest,
21-
Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1"
22-
};
23-
}
15+
return new ProblemDetails
16+
{
17+
Extensions = { error },
18+
Title = "An error occurred.",
19+
Status = StatusCodes.Status400BadRequest,
20+
Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1"
21+
};
2422
}
2523
}

src/CF.Api/Middleware/LogExceptionMiddleware.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace CF.Api.Middleware;
44

5-
public class LogExceptionMiddleware(RequestDelegate next, ILogger<LogExceptionMiddleware> logger,
5+
public class LogExceptionMiddleware(
6+
RequestDelegate next,
7+
ILogger<LogExceptionMiddleware> logger,
68
ICorrelationContextAccessor correlationContext)
79
{
810
public async Task InvokeAsync(HttpContext httpContext)

src/CF.Api/Middleware/LogRequestMiddleware.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
namespace CF.Api.Middleware;
55

6-
public class LogRequestMiddleware(RequestDelegate next, ILogger<LogRequestMiddleware> logger,
6+
public class LogRequestMiddleware(
7+
RequestDelegate next,
8+
ILogger<LogRequestMiddleware> logger,
79
ICorrelationContextAccessor correlationContext)
810
{
911
public async Task Invoke(HttpContext context)

src/CF.Api/Middleware/LogResponseMiddleware.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace CF.Api.Middleware;
44

5-
public class LogResponseMiddleware(RequestDelegate next, ILogger<LogResponseMiddleware> logger,
5+
public class LogResponseMiddleware(
6+
RequestDelegate next,
7+
ILogger<LogResponseMiddleware> logger,
68
ICorrelationContextAccessor correlationContext)
79
{
810
public async Task Invoke(HttpContext context)

src/CF.Api/Program.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ Action<SwaggerGenOptions> SetupSwagger()
8080
{
8181
return c =>
8282
{
83-
c.SwaggerDoc("v1", new OpenApiInfo {Title = "CF API", Version = "v1"});
83+
c.SwaggerDoc("v1", new OpenApiInfo { Title = "CF API", Version = "v1" });
8484

8585
c.CustomSchemaIds(x => x.FullName);
8686

@@ -141,13 +141,12 @@ void RunMigration()
141141
{
142142
using var serviceScope = app.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
143143

144-
if (!serviceScope.ServiceProvider.GetRequiredService<CustomerContext>().Database.GetPendingMigrations().Any())
145-
{
146-
return;
147-
}
144+
if (!serviceScope.ServiceProvider.GetRequiredService<CustomerContext>().Database.GetPendingMigrations()
145+
.Any()) return;
148146

149147
serviceScope.ServiceProvider.GetRequiredService<CustomerContext>().Database.Migrate();
150148
}
149+
151150
public partial class Program
152151
{
153152
}

src/CF.Customer.Application/Dtos/CustomerFilterDto.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace CF.Customer.Application.Dtos;
22

3-
public record class CustomerFilterDto
3+
public record CustomerFilterDto
44
{
55
public long Id { get; set; }
66
public string Email { get; set; }
Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
11
using System.ComponentModel.DataAnnotations;
22

3-
namespace CF.Customer.Application.Dtos
3+
namespace CF.Customer.Application.Dtos;
4+
5+
public record CustomerRequestDto
46
{
5-
public record class CustomerRequestDto
6-
{
7-
[Required(ErrorMessage = "The Email field is required.")]
8-
[EmailAddress(ErrorMessage = "The Email field is not a valid email address.")]
9-
[MaxLength(100, ErrorMessage = "The Email field must not exceed 100 characters.")]
10-
[Display(Name = "Email")]
11-
public string Email { get; set; }
7+
[Required(ErrorMessage = "The Email field is required.")]
8+
[EmailAddress(ErrorMessage = "The Email field is not a valid email address.")]
9+
[MaxLength(100, ErrorMessage = "The Email field must not exceed 100 characters.")]
10+
[Display(Name = "Email")]
11+
public string Email { get; set; }
1212

13-
[Required(ErrorMessage = "The First Name field is required.")]
14-
[StringLength(100, MinimumLength = 2, ErrorMessage = "The First Name field must be between 2 and 100 characters.")]
15-
[Display(Name = "First Name")]
16-
public string FirstName { get; set; }
13+
[Required(ErrorMessage = "The First Name field is required.")]
14+
[StringLength(100, MinimumLength = 2, ErrorMessage = "The First Name field must be between 2 and 100 characters.")]
15+
[Display(Name = "First Name")]
16+
public string FirstName { get; set; }
1717

18-
[Required(ErrorMessage = "The Password field is required.")]
19-
[DataType(DataType.Password)]
20-
[Display(Name = "Password")]
21-
[RegularExpression(
22-
"^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])).{8,}$",
23-
ErrorMessage =
24-
"Passwords must be at least 8 characters and contain at least 3 of the following: upper case (A-Z), lower case (a-z), number (0-9), and special character (e.g. !@#$%^&*).")]
25-
public string Password { get; set; }
18+
[Required(ErrorMessage = "The Password field is required.")]
19+
[DataType(DataType.Password)]
20+
[Display(Name = "Password")]
21+
[RegularExpression(
22+
"^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])).{8,}$",
23+
ErrorMessage =
24+
"Passwords must be at least 8 characters and contain at least 3 of the following: upper case (A-Z), lower case (a-z), number (0-9), and special character (e.g. !@#$%^&*).")]
25+
public string Password { get; set; }
2626

27-
[DataType(DataType.Password)]
28-
[Display(Name = "Confirm password")]
29-
[Compare("Password", ErrorMessage = "The passwords do not match.")]
30-
public string ConfirmPassword { get; set; }
27+
[DataType(DataType.Password)]
28+
[Display(Name = "Confirm password")]
29+
[Compare("Password", ErrorMessage = "The passwords do not match.")]
30+
public string ConfirmPassword { get; set; }
3131

32-
[Required(ErrorMessage = "The Surname field is required.")]
33-
[StringLength(100, MinimumLength = 2, ErrorMessage = "The Surname field must be between 2 and 100 characters.")]
34-
[Display(Name = "Surname")]
35-
public string Surname { get; set; }
36-
}
37-
}
32+
[Required(ErrorMessage = "The Surname field is required.")]
33+
[StringLength(100, MinimumLength = 2, ErrorMessage = "The Surname field must be between 2 and 100 characters.")]
34+
[Display(Name = "Surname")]
35+
public string Surname { get; set; }
36+
}

0 commit comments

Comments
 (0)