Merge pull request '- Ajout de fluent validator' (#4) from feat/add-fluent-validator into dev

Reviewed-on: http://192.168.1.94:3000/Yoann/ldap-cesi/pulls/4
This commit is contained in:
Yoann 2025-03-02 17:19:10 +01:00
commit fe7d50971f
7 changed files with 46 additions and 11 deletions

View File

@ -27,6 +27,7 @@ public static class Conf
builder.AddSerilog(); builder.AddSerilog();
builder.AddJwt(); builder.AddJwt();
builder.Services.AddAutoMapper(typeof(Program)); builder.Services.AddAutoMapper(typeof(Program));
} }
public static void AddRepositories(this WebApplicationBuilder builder) public static void AddRepositories(this WebApplicationBuilder builder)

View File

@ -3,5 +3,4 @@ namespace ldap_cesi.Models;
public class ResponseDataModel<T> : ResponseModel, IResponseDataModel<T> where T : class public class ResponseDataModel<T> : ResponseModel, IResponseDataModel<T> where T : class
{ {
public T Data { get; set; } = null!; public T Data { get; set; } = null!;
public string Token { get; set; }
} }

View File

@ -4,7 +4,7 @@ public class ResponseModel : IResponseModel
{ {
public bool Success { get; set; } public bool Success { get; set; }
public string? Message { get; set; } public string? Message { get; set; }
public string? TokenJWT { get; set; } public string? Token { get; set; }
public int StatusCode { get; set; } public int StatusCode { get; set; }
} }

View File

@ -7,7 +7,7 @@ namespace ldap_cesi.Services.Interfaces;
public interface IUtilisateurService public interface IUtilisateurService
{ {
Task<IResponseDataModel<List<Utilisateur>>> GetAll(); Task<IResponseDataModel<List<UtilisateurOutputDto>>> GetAll();
Task<IResponseDataModel<Utilisateur>> GetById(int id); Task<IResponseDataModel<UtilisateurOutputDto>> GetById(int id);
Task<IResponseDataModel<UtilisateurOutputDto>> Login(UtilisateurLoginDto utilisateurInput); Task<IResponseDataModel<UtilisateurOutputDto>> Login(UtilisateurLoginDto utilisateurInput);
} }

View File

@ -5,6 +5,7 @@ using ldap_cesi.Entities;
using ldap_cesi.Models; using ldap_cesi.Models;
using ldap_cesi.Repository.Services; using ldap_cesi.Repository.Services;
using ldap_cesi.Services.Interfaces; using ldap_cesi.Services.Interfaces;
using ldap_cesi.Validator.Utilisateur;
namespace ldap_cesi.Services; namespace ldap_cesi.Services;
@ -20,30 +21,44 @@ public class UtilisateurService : IUtilisateurService
_mapper = mapper; _mapper = mapper;
} }
public async Task<IResponseDataModel<List<Utilisateur>>> GetAll() public async Task<IResponseDataModel<List<UtilisateurOutputDto>>> GetAll()
{ {
var utilisateurs = await _repositoryUtilisateur.GetAllAsync(); var utilisateurs = await _repositoryUtilisateur.GetAllAsync();
return new ResponseDataModel<List<Utilisateur>> var utilisateursOutputDto = _mapper.Map<List<UtilisateurOutputDto>>(utilisateurs);
return new ResponseDataModel<List<UtilisateurOutputDto>>
{ {
Success = true, Success = true,
StatusCode = 200, StatusCode = 200,
Data = utilisateurs, Data = utilisateursOutputDto,
}; };
} }
public async Task<IResponseDataModel<Utilisateur>> GetById(int id) public async Task<IResponseDataModel<UtilisateurOutputDto>> GetById(int id)
{ {
var utililisateur = await _repositoryUtilisateur.GetByIdAsync(id); var utililisateur = await _repositoryUtilisateur.GetByIdAsync(id);
return new ResponseDataModel<Utilisateur> var utilisateurOutput = _mapper.Map<UtilisateurOutputDto>(utililisateur);
return new ResponseDataModel<UtilisateurOutputDto>
{ {
Success = true, Success = true,
StatusCode = 200, StatusCode = 200,
Data = utililisateur, Data = utilisateurOutput,
}; };
} }
public async Task<IResponseDataModel<UtilisateurOutputDto>> Login(UtilisateurLoginDto utilisateurInput) public async Task<IResponseDataModel<UtilisateurOutputDto>> Login(UtilisateurLoginDto utilisateurInput)
{ {
var validation = new UtilisateurCreateValidator();
var result = validation.Validate(utilisateurInput);
if (!result.IsValid)
{
return new ResponseDataModel<UtilisateurOutputDto>
{
StatusCode = 400,
Success = false,
Message = "Données utilisateur invalides: " + string.Join(", ", result.Errors)
};
}
var utilisateur = await _repositoryUtilisateur.GetByEmailAsync(utilisateurInput.Email); var utilisateur = await _repositoryUtilisateur.GetByEmailAsync(utilisateurInput.Email);
if (utilisateur == null) if (utilisateur == null)

View File

@ -0,0 +1,18 @@
using FluentValidation;
using ldap_cesi.DTOs.Inputs;
namespace ldap_cesi.Validator.Utilisateur;
public class UtilisateurCreateValidator : AbstractValidator<UtilisateurLoginDto>
{
public UtilisateurCreateValidator()
{
RuleFor(x => x.Email)
.NotEmpty().WithMessage("L'email est requis.")
.EmailAddress().WithMessage("L'email n'est pas valide.");
RuleFor(x => x.MotDePasse)
.NotEmpty().WithMessage("Le mot de passe est requis.")
.MinimumLength(6).WithMessage("Le mot de passe doit contenir au moins 6 caractères.");
}
}

View File

@ -11,8 +11,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0" /> <PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" /> <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="FluentValidation" Version="11.11.0" />
<PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.2" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.2"/> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.2"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.2">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>