diff --git a/LiberIncantamentum.Application/Authentification/DTOs/Request/LoginRequestDto.cs b/LiberIncantamentum.Application/Authentification/DTOs/Request/LoginRequestDto.cs new file mode 100644 index 0000000..6d13794 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/DTOs/Request/LoginRequestDto.cs @@ -0,0 +1,9 @@ +namespace Liber_Incantamentum.Application.Authentification.DTOs.Request +{ + public class LoginRequestDto + { + public string? Username { get; set; } + public string? Email { get; set; } + public required string Password { get; set; } + } +} diff --git a/LiberIncantamentum.Application/Authentification/DTOs/Request/RefreshTokenRequestDto.cs b/LiberIncantamentum.Application/Authentification/DTOs/Request/RefreshTokenRequestDto.cs new file mode 100644 index 0000000..236b8a5 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/DTOs/Request/RefreshTokenRequestDto.cs @@ -0,0 +1,8 @@ +namespace Liber_Incantamentum.Application.Authentification.DTOs.Request +{ + public class RefreshTokenRequestDto + { + public Guid UserId { get; set; } + public required string RefreshToken { get; set; } + } +} diff --git a/LiberIncantamentum.Application/Authentification/DTOs/Request/RegisterRequestDto.cs b/LiberIncantamentum.Application/Authentification/DTOs/Request/RegisterRequestDto.cs new file mode 100644 index 0000000..eeb9ffd --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/DTOs/Request/RegisterRequestDto.cs @@ -0,0 +1,9 @@ +namespace Liber_Incantamentum.Application.Authentification.DTOs.Request +{ + public class RegisterRequestDto + { + public required string Username { get; set; } + public required string Email { get; set; } + public required string Password { get; set; } + } +} diff --git a/LiberIncantamentum.Application/Authentification/DTOs/Request/UserFilterDto.cs b/LiberIncantamentum.Application/Authentification/DTOs/Request/UserFilterDto.cs new file mode 100644 index 0000000..d36f35c --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/DTOs/Request/UserFilterDto.cs @@ -0,0 +1,9 @@ +namespace Liber_Incantamentum.Application.Authentification.DTOs.Request +{ + public class UserFilterDto + { + public Guid? Id { get; set; } + public string? UserName { get; set; } + public string? Email { get; set; } + } +} diff --git a/LiberIncantamentum.Application/Authentification/DTOs/Response/AuthResponseDto.cs b/LiberIncantamentum.Application/Authentification/DTOs/Response/AuthResponseDto.cs new file mode 100644 index 0000000..171434f --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/DTOs/Response/AuthResponseDto.cs @@ -0,0 +1,9 @@ +namespace Liber_Incantamentum.Application.Authentification.DTOs.Response +{ + public class AuthResponseDto + { + public UserResponseDto UserResponse { get; set; } = null!; + public string AccessToken { get; set; } = string.Empty; + public string Refreshtoken { get; set; } = string.Empty; + } +} diff --git a/LiberIncantamentum.Application/Authentification/DTOs/Response/UserResponseDto.cs b/LiberIncantamentum.Application/Authentification/DTOs/Response/UserResponseDto.cs new file mode 100644 index 0000000..216bde9 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/DTOs/Response/UserResponseDto.cs @@ -0,0 +1,10 @@ +namespace Liber_Incantamentum.Application.Authentification.DTOs.Response +{ + public class UserResponseDto + { + public Guid Id { get; set; } + public string Username { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string Role { get; set; } = string.Empty; + } +} diff --git a/LiberIncantamentum.Application/Authentification/Interfaces/IAuthentificationService.cs b/LiberIncantamentum.Application/Authentification/Interfaces/IAuthentificationService.cs new file mode 100644 index 0000000..0f4f384 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/Interfaces/IAuthentificationService.cs @@ -0,0 +1,12 @@ +using Liber_Incantamentum.Application.Authentification.DTOs.Request; +using Liber_Incantamentum.Application.Authentification.DTOs.Response; + +namespace Liber_Incantamentum.Application.Authentification.Interfaces +{ + public interface IAuthentificationService + { + Task RegisterUserAsync(RegisterRequestDto user); + Task> GetAllUsersAsync(UserFilterDto filter); + Task LoginUserAsync(LoginRequestDto user); + } +} diff --git a/LiberIncantamentum.Application/Authentification/Interfaces/ITokenService.cs b/LiberIncantamentum.Application/Authentification/Interfaces/ITokenService.cs new file mode 100644 index 0000000..3fb7d52 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/Interfaces/ITokenService.cs @@ -0,0 +1,12 @@ +using Liber_Incantamentum.Application.Authentification.DTOs.Request; +using Liber_Incantamentum.Application.Authentification.DTOs.Response; +using Liber_Incantamentum.Domain.Authentification.Entities; + +namespace Liber_Incantamentum.Application.Authentification.Interfaces +{ + public interface ITokenService + { + Task GenerateTokensAsync(User user); // génère et stocke refresh token + Task RefreshTokensAsync(RefreshTokenRequestDto request); // vérifie et renouvelle + } +} diff --git a/LiberIncantamentum.Application/Authentification/Services/Generals/AuthentificationService.cs b/LiberIncantamentum.Application/Authentification/Services/Generals/AuthentificationService.cs new file mode 100644 index 0000000..5fe91b8 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/Services/Generals/AuthentificationService.cs @@ -0,0 +1,23 @@ +using Liber_Incantamentum.Application.Authentification.DTOs.Request; +using Liber_Incantamentum.Application.Authentification.DTOs.Response; +using Liber_Incantamentum.Application.Authentification.Interfaces; + +namespace Liber_Incantamentum.Application.Authentification.Services.Generals +{ + public class AuthentificationService : IAuthentificationService + { + public Task RegisterUserAsync(RegisterRequestDto user) + { + throw new NotImplementedException(); + } + + public Task LoginUserAsync(LoginRequestDto user) + { + throw new NotImplementedException(); + } + public Task> GetAllUsersAsync(UserFilterDto filter) + { + throw new NotImplementedException(); + } + } +} diff --git a/LiberIncantamentum.Application/Authentification/Services/Generals/TokenService.cs b/LiberIncantamentum.Application/Authentification/Services/Generals/TokenService.cs new file mode 100644 index 0000000..ad243f3 --- /dev/null +++ b/LiberIncantamentum.Application/Authentification/Services/Generals/TokenService.cs @@ -0,0 +1,21 @@ +using Liber_Incantamentum.Application.Authentification.DTOs.Request; +using Liber_Incantamentum.Application.Authentification.DTOs.Response; +using Liber_Incantamentum.Application.Authentification.Interfaces; +using Liber_Incantamentum.Domain.Authentification.Entities; +using System.Security.Cryptography; + +namespace Liber_Incantamentum.Application.Authentification.Services.Generals +{ + public class TokenService : ITokenService + { + public Task GenerateTokensAsync(User user) + { + throw new NotImplementedException(); + } + + public Task RefreshTokensAsync(RefreshTokenRequestDto request) + { + throw new NotImplementedException(); + } + } +} diff --git a/LiberIncantamentum.Application/Liber_Incantamentum.Application.csproj b/LiberIncantamentum.Application/Liber_Incantamentum.Application.csproj index 125f4c9..2ff823c 100644 --- a/LiberIncantamentum.Application/Liber_Incantamentum.Application.csproj +++ b/LiberIncantamentum.Application/Liber_Incantamentum.Application.csproj @@ -6,4 +6,14 @@ enable + + + + + + + + + + diff --git a/LiberIncantamentum.Domain/Authentification/Entities/RefreshToken.cs b/LiberIncantamentum.Domain/Authentification/Entities/RefreshToken.cs new file mode 100644 index 0000000..9631cd7 --- /dev/null +++ b/LiberIncantamentum.Domain/Authentification/Entities/RefreshToken.cs @@ -0,0 +1,13 @@ +namespace Liber_Incantamentum.Domain.Authentification.Entities +{ + public class RefreshToken + { + public Guid Id { get; set; } + public required string Token { get; set; } + public DateTime ExpiresAt { get; set; } + public bool IsRevoked { get; set; } + + public Guid UserId { get; set; } + public User User { get; set; } = null!; + } +} diff --git a/LiberIncantamentum.Domain/Authentification/Entities/User.cs b/LiberIncantamentum.Domain/Authentification/Entities/User.cs new file mode 100644 index 0000000..e6708df --- /dev/null +++ b/LiberIncantamentum.Domain/Authentification/Entities/User.cs @@ -0,0 +1,13 @@ +namespace Liber_Incantamentum.Domain.Authentification.Entities +{ + public class User + { + public Guid Id { get; set; } + public string Username { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string PasswordHash { get; set; } = string.Empty; + public string Role { get; set; } = string.Empty; + public string? RefreshToken { get; set; } + public DateTime? RefreshTokenExpiryTime { get; set; } + } +} diff --git a/LiberIncantamentum.Domain/Authentification/Filters/UserFilter.cs b/LiberIncantamentum.Domain/Authentification/Filters/UserFilter.cs new file mode 100644 index 0000000..93cab76 --- /dev/null +++ b/LiberIncantamentum.Domain/Authentification/Filters/UserFilter.cs @@ -0,0 +1,9 @@ +namespace Liber_Incantamentum.Domain.Authentification.Filters +{ + public class UserFilter + { + public Guid? Id { get; set; } + public string? Username { get; set; } + public string? Email { get; set; } + } +} diff --git a/LiberIncantamentum.Domain/Authentification/Repositories/IAuthentificationRepository.cs b/LiberIncantamentum.Domain/Authentification/Repositories/IAuthentificationRepository.cs new file mode 100644 index 0000000..c03cf41 --- /dev/null +++ b/LiberIncantamentum.Domain/Authentification/Repositories/IAuthentificationRepository.cs @@ -0,0 +1,13 @@ +using Liber_Incantamentum.Domain.Authentification.Entities; +using Liber_Incantamentum.Domain.Authentification.Filters; + +namespace Liber_Incantamentum.Domain.Authentification.Repositories +{ + public interface IAuthentificationRepository + { + Task ListUsersAsync(UserFilter datasOnUser); // Usage : Récuperer un/des users à partir d'infos + Task AddAsync(User user); // Usage : Créer un user + Task UpdateAsync(User user); // Usage : Mettre à jour un user + Task RemoveUserAsync(Guid id); // Usage : Supprimer un user + } +} diff --git a/LiberIncantamentum.Domain/Authentification/Repositories/IRefreshTokenRepository.cs b/LiberIncantamentum.Domain/Authentification/Repositories/IRefreshTokenRepository.cs new file mode 100644 index 0000000..ba1d8ef --- /dev/null +++ b/LiberIncantamentum.Domain/Authentification/Repositories/IRefreshTokenRepository.cs @@ -0,0 +1,13 @@ +using Liber_Incantamentum.Domain.Authentification.Entities; + +namespace Liber_Incantamentum.Domain.Authentification.Repositories +{ + public interface IRefreshTokenRepository + { + Task GetRefreshTokenByIdAsync(string token); //Usage : quand l’utilisateur envoie un refresh token pour obtenir un nouveau JWT, on doit vérifier qu’il est valide et non révoqué. + Task> GetRefreshTokenByUserIdAsync(Guid userId); // Usage : afficher les sessions actives d’un utilisateur & révoquer certains tokens manuellement + Task AddRefreshTokenAsyn(RefreshToken refreshToken); // Usage : après un login réussi ou une génération de refresh token. + Task UpdateRefreshTokenAsync(RefreshToken refreshToken); // Usage : marquer un token comme révoqué (IsRevoked = true) & prolonger la date d’expiration si tu veux étendre la validité + Task RevokeAllRefreshTokenAsync(Guid userId); // Usage : l’utilisateur se déconnecte de tous les appareils & le compte a été compromis + } +}