Skip to content

Commit 6890ddb

Browse files
author
Maxence COEUR
committed
fix: postgresql plus optimisation
1 parent bccbf7a commit 6890ddb

27 files changed

Lines changed: 579 additions & 401 deletions

‎TableMasterApi.Tests/Controllers/AuthControllerTests.cs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public async Task Login_ShouldReturnOk_AndPersistRefreshToken_WhenCredentialsAre
2020
var userDal = new Mock<IUserDAL>();
2121
var authDal = new Mock<IAuthDAL>();
2222

23-
var user = new UserOut
23+
var user = new UserDb
2424
{
2525
Id = 17,
2626
Email = "chef@example.com",
@@ -76,7 +76,7 @@ public async Task Login_ShouldReturn404_WhenPasswordIsInvalid()
7676
var userDal = new Mock<IUserDAL>();
7777
var authDal = new Mock<IAuthDAL>();
7878

79-
var user = new UserOut
79+
var user = new UserDb
8080
{
8181
Id = 18,
8282
Email = "chef@example.com",
@@ -98,7 +98,7 @@ public async Task Login_ShouldReturn404_WhenPasswordIsInvalid()
9898
Password = "wrong-password"
9999
});
100100

101-
var error = result.Result.Should().BeOfType<ObjectResult>().Subject;
101+
var error = result.Result.Should().BeOfType<NotFoundObjectResult>().Subject;
102102
error.StatusCode.Should().Be(404);
103103
error.Value.Should().Be("Mot de passe incorecte");
104104

@@ -113,7 +113,7 @@ public async Task Refresh_ShouldRotateTokens_WhenRefreshTokenIsValid()
113113
var refreshToken = _jwtService.GenerateRefreshToken();
114114
var hashedInput = _jwtService.HashToken(refreshToken);
115115

116-
var user = new UserOut
116+
var user = new UserDb
117117
{
118118
Id = 27,
119119
Email = "refresh@example.com",
@@ -177,4 +177,4 @@ public async Task Refresh_ShouldReturnUnauthorized_WhenRefreshTokenDoesNotExist(
177177
userDal.Verify(x => x.SaveRefreshToken(It.IsAny<long>(), It.IsAny<string>(), It.IsAny<DateTime>()), Times.Never);
178178
}
179179
}
180-
}
180+
}

‎TableMasterApi.Tests/Controllers/UserControllerTests.cs‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public async Task AddUser_ShouldReturnOk_AndStoreRefreshTokenHash()
3434
{
3535
Id = 42,
3636
Email = input.Email,
37-
Password = input.Password,
3837
FirstName = input.FirstName,
3938
LastName = input.LastName,
4039
AccountType = input.AccountType,
@@ -59,7 +58,7 @@ public async Task AddUser_ShouldReturnOk_AndStoreRefreshTokenHash()
5958
payload.User.Email.Should().Be(createdUser.Email);
6059
payload.AccessToken.Should().NotBeNullOrWhiteSpace();
6160
payload.RefreshToken.Should().NotBeNullOrWhiteSpace();
62-
savedHash.Should().Be(payload.RefreshToken);
61+
savedHash.Should().Be(_jwtService.HashToken(payload.RefreshToken));
6362
_jwtService.ExtractUserIdFromToken(payload.AccessToken).Should().Be(createdUser.Id);
6463

6564
userDal.Verify(x => x.AddUser(input), Times.Once);
@@ -77,7 +76,7 @@ public async Task PutPassword_ShouldReturnOk_WhenOldPasswordIsValid()
7776

7877
ControllerTestHelper.SetBearerToken(controller, token);
7978

80-
var storedUser = new UserOut
79+
var storedUser = new UserDb
8180
{
8281
Id = userId,
8382
Email = "password@example.com",
@@ -90,7 +89,7 @@ public async Task PutPassword_ShouldReturnOk_WhenOldPasswordIsValid()
9089

9190
userDal.Setup(x => x.GetUserById(userId)).ReturnsAsync(storedUser);
9291
authDal.Setup(x => x.VerifyPassword(storedUser.Password, "OldPassword!1")).Returns(true);
93-
userDal.Setup(x => x.PutPassword(storedUser, "NewPassword!2")).ReturnsAsync(true);
92+
userDal.Setup(x => x.PutPassword(storedUser.Id, "NewPassword!2")).ReturnsAsync(true);
9493

9594
var result = await controller.PutPassword(new PasswordEntity
9695
{
@@ -103,7 +102,7 @@ public async Task PutPassword_ShouldReturnOk_WhenOldPasswordIsValid()
103102

104103
userDal.Verify(x => x.GetUserById(userId), Times.Once);
105104
authDal.Verify(x => x.VerifyPassword(storedUser.Password, "OldPassword!1"), Times.Once);
106-
userDal.Verify(x => x.PutPassword(storedUser, "NewPassword!2"), Times.Once);
105+
userDal.Verify(x => x.PutPassword(storedUser.Id, "NewPassword!2"), Times.Once);
107106
}
108107

109108
[Fact]
@@ -127,4 +126,4 @@ public async Task DeleteUser_ShouldReturnOk_WhenPasswordDeletionSucceeds()
127126
userDal.Verify(x => x.DeletePassword(userId), Times.Once);
128127
}
129128
}
130-
}
129+
}

‎TableMasterApi.Tests/Fixtures/JwtConfigFixture.cs‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public UserOut CreateTestUserOut(long id = 1, string email = "test@example.com",
3939
Email = email,
4040
FirstName = firstName,
4141
LastName = lastName,
42-
Password = "Password123!",
4342
CreatedAt = DateTime.UtcNow,
4443
RestaurantId = null,
4544
AccountType = 1

‎TableMasterApi.Tests/TableMasterApi.Tests.csproj‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
</PackageReference>
1717
<PackageReference Include="Moq" Version="4.20.70" />
1818
<PackageReference Include="FluentAssertions" Version="6.12.0" />
19-
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.11" />
20-
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.13" />
21-
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.3.1" />
19+
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.7" />
20+
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.7" />
21+
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.18.0" />
2222
</ItemGroup>
2323

2424
<ItemGroup>
Lines changed: 48 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
using Microsoft.AspNetCore.Mvc;
2-
using System.Security.Cryptography;
3-
using System.Text;
41
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Mvc;
3+
using Microsoft.AspNetCore.RateLimiting;
54
using TableMasterApi.DAL.Interfaces;
65
using TableMasterApi.Model;
76
using TableMasterApi.Service;
@@ -24,76 +23,73 @@ public AuthController(IUserDAL userDAL, IAuthDAL authDAL, JwtService jwtService)
2423
_authDAL = authDAL;
2524
}
2625

26+
[EnableRateLimiting("AuthPolicy")]
2727
[HttpPost]
2828
public async Task<ActionResult<LoginUserOut>> Login([FromBody] LoginUserIn loginUser)
2929
{
30-
try
30+
if (string.IsNullOrWhiteSpace(loginUser.Email) || string.IsNullOrWhiteSpace(loginUser.Password))
3131
{
32-
if (loginUser == null || loginUser.Password == null || loginUser.Email == null)
33-
{
34-
return BadRequest();
35-
}
36-
37-
var user = await _userDAL.GetUserByEmail(loginUser.Email);
38-
39-
if (user == null)
40-
{
41-
return StatusCode(404, "Email non existant");
42-
}
43-
44-
var result = _authDAL.VerifyPassword(user.Password, loginUser.Password);
32+
return BadRequest();
33+
}
4534

46-
if (!result)
47-
{
48-
return StatusCode(404, "Mot de passe incorecte");
49-
}
35+
var user = await _userDAL.GetUserByEmail(loginUser.Email);
36+
if (user == null)
37+
{
38+
return NotFound("Email non existant");
39+
}
5040

51-
string refreshToken = _jwtService.GenerateRefreshToken();
52-
string hashedRefreshToken = _jwtService.HashToken(refreshToken);
41+
if (!_authDAL.VerifyPassword(user.Password, loginUser.Password))
42+
{
43+
return NotFound("Mot de passe incorecte");
44+
}
5345

54-
await _userDAL.SaveRefreshToken(user.Id, hashedRefreshToken, DateTime.UtcNow.AddDays(30));
46+
var refreshToken = _jwtService.GenerateRefreshToken();
47+
var hashedRefreshToken = _jwtService.HashToken(refreshToken);
5548

56-
LoginUserOut loginUserOut = new LoginUserOut();
57-
loginUserOut.User = user;
58-
loginUserOut.AccessToken = _jwtService.GenerateAccessToken(user.Id);
59-
loginUserOut.RefreshToken = refreshToken;
60-
49+
await _userDAL.SaveRefreshToken(user.Id, hashedRefreshToken, DateTime.UtcNow.AddDays(30));
6150

62-
return Ok(loginUserOut);
63-
}
64-
catch (Exception e)
51+
return Ok(new LoginUserOut
6552
{
66-
return StatusCode(500, e.Message);
67-
}
53+
User = user.ToPublicUser(),
54+
AccessToken = _jwtService.GenerateAccessToken(user.Id),
55+
RefreshToken = refreshToken
56+
});
6857
}
6958

59+
[EnableRateLimiting("AuthPolicy")]
7060
[HttpPost("refresh")]
7161
public async Task<ActionResult<LoginUserOut>> Refresh([FromBody] LoginTokenIn model)
7262
{
73-
try
63+
if (string.IsNullOrWhiteSpace(model.RefreshToken))
7464
{
75-
if (string.IsNullOrEmpty(model.RefreshToken)) return BadRequest();
65+
return BadRequest();
66+
}
7667

77-
string hashedInput = _jwtService.HashToken(model.RefreshToken);
68+
var hashedInput = _jwtService.HashToken(model.RefreshToken);
69+
var userId = await _userDAL.GetUserIdByRefreshToken(hashedInput);
70+
if (userId == null)
71+
{
72+
return Unauthorized("Session expirée");
73+
}
7874

79-
var userId = await _userDAL.GetUserIdByRefreshToken(hashedInput);
80-
if (userId == null) return Unauthorized("Session expirée");
75+
var user = await _userDAL.GetUserById(userId.Value);
76+
if (user == null)
77+
{
78+
return Unauthorized("Session expirée");
79+
}
8180

82-
var user = await _userDAL.GetUserById(userId.Value);
83-
84-
string newRefreshToken = _jwtService.GenerateRefreshToken();
85-
string newHashed = _jwtService.HashToken(newRefreshToken);
81+
var newRefreshToken = _jwtService.GenerateRefreshToken();
82+
var newHashed = _jwtService.HashToken(newRefreshToken);
8683

87-
await _userDAL.DeleteRefreshToken(hashedInput);
88-
await _userDAL.SaveRefreshToken(user.Id, newHashed, DateTime.UtcNow.AddDays(30));
84+
await _userDAL.DeleteRefreshToken(hashedInput);
85+
await _userDAL.SaveRefreshToken(user.Id, newHashed, DateTime.UtcNow.AddDays(30));
8986

90-
return Ok(new LoginUserOut {
91-
User = user,
92-
AccessToken = _jwtService.GenerateAccessToken(user.Id),
93-
RefreshToken = newRefreshToken
94-
});
95-
}
96-
catch (Exception e) { return StatusCode(500, e.Message); }
87+
return Ok(new LoginUserOut
88+
{
89+
User = user.ToPublicUser(),
90+
AccessToken = _jwtService.GenerateAccessToken(user.Id),
91+
RefreshToken = newRefreshToken
92+
});
9793
}
9894
}
9995
}

0 commit comments

Comments
 (0)