feat/modif-metier #19
@ -1,4 +1,5 @@
|
|||||||
using ldap_cesi.Services.Interfaces;
|
using ldap_cesi.Services.Interfaces;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace ldap_cesi.Controllers;
|
namespace ldap_cesi.Controllers;
|
||||||
|
@ -85,7 +85,7 @@ public class ServicesController : ControllerBase
|
|||||||
[Authorize(Roles = "admin")]
|
[Authorize(Roles = "admin")]
|
||||||
public async Task<IActionResult> DeleteService(int id)
|
public async Task<IActionResult> DeleteService(int id)
|
||||||
{
|
{
|
||||||
var result = await _serviceService.Delete(id);
|
var result = await _serviceService.DeleteWithEntiteCheck(id);
|
||||||
return result.Success ? Ok(result) : BadRequest(result);
|
return result.Success ? Ok(result) : BadRequest(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,6 @@
|
|||||||
using ldap_cesi.DTOs.Inputs.Site;
|
using ldap_cesi.DTOs.Inputs.Site;
|
||||||
using ldap_cesi.Services.Interfaces;
|
using ldap_cesi.Services.Interfaces;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace ldap_cesi.Controllers;
|
namespace ldap_cesi.Controllers;
|
||||||
@ -63,6 +64,7 @@ public class SiteController : ControllerBase
|
|||||||
/// <param name="siteCreateDto">Les données du site à créer.</param>
|
/// <param name="siteCreateDto">Les données du site à créer.</param>
|
||||||
/// <returns>Retourne l'identifiant du site créé.</returns>
|
/// <returns>Retourne l'identifiant du site créé.</returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
[Authorize(Roles = "admin")]
|
||||||
public async Task<ActionResult> CreateSite([FromBody] SiteCreateDto siteCreateDto)
|
public async Task<ActionResult> CreateSite([FromBody] SiteCreateDto siteCreateDto)
|
||||||
{
|
{
|
||||||
var result = await _siteService.Create(siteCreateDto);
|
var result = await _siteService.Create(siteCreateDto);
|
||||||
@ -76,6 +78,7 @@ public class SiteController : ControllerBase
|
|||||||
/// <param name="siteUpdateDto">Les données du site à mettre à jour.</param>
|
/// <param name="siteUpdateDto">Les données du site à mettre à jour.</param>
|
||||||
/// <returns>Retourne l'objet ou une erreur.</returns>
|
/// <returns>Retourne l'objet ou une erreur.</returns>
|
||||||
[HttpPut]
|
[HttpPut]
|
||||||
|
[Authorize(Roles = "admin")]
|
||||||
public async Task<IActionResult> UpdateSite([FromBody] SiteUpdateDto siteUpdateDto)
|
public async Task<IActionResult> UpdateSite([FromBody] SiteUpdateDto siteUpdateDto)
|
||||||
{
|
{
|
||||||
var result = await _siteService.Update(siteUpdateDto);
|
var result = await _siteService.Update(siteUpdateDto);
|
||||||
@ -89,9 +92,10 @@ public class SiteController : ControllerBase
|
|||||||
/// <param name="id">L'identifiant du site à supprimer.</param>
|
/// <param name="id">L'identifiant du site à supprimer.</param>
|
||||||
/// <returns>Retourne l'id, ou l'erreur</returns>
|
/// <returns>Retourne l'id, ou l'erreur</returns>
|
||||||
[HttpDelete("{id}")]
|
[HttpDelete("{id}")]
|
||||||
|
[Authorize(Roles = "admin")]
|
||||||
public async Task<IActionResult> DeleteSite(int id)
|
public async Task<IActionResult> DeleteSite(int id)
|
||||||
{
|
{
|
||||||
var result = await _siteService.Delete(id);
|
var result = await _siteService.DeleteWithEntiteCheck(id);
|
||||||
return result.Success ? Ok(result) : BadRequest(result);
|
return result.Success ? Ok(result) : BadRequest(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Security.Claims;
|
||||||
using ldap_cesi.DTOs.Inputs;
|
using ldap_cesi.DTOs.Inputs;
|
||||||
using ldap_cesi.Services.Interfaces;
|
using ldap_cesi.Services.Interfaces;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
@ -8,11 +9,12 @@ namespace ldap_cesi.Controllers;
|
|||||||
[Route("api/utilisateurs")]
|
[Route("api/utilisateurs")]
|
||||||
public class UtilisateurController : ControllerBase
|
public class UtilisateurController : ControllerBase
|
||||||
{
|
{
|
||||||
private IUtilisateurService _utilisateurService;
|
private readonly IUtilisateurService _utilisateurService;
|
||||||
|
private readonly IJwtService _jwtService;
|
||||||
public UtilisateurController(IUtilisateurService utilisateurService)
|
public UtilisateurController(IUtilisateurService utilisateurService, IJwtService jwtService)
|
||||||
{
|
{
|
||||||
_utilisateurService = utilisateurService;
|
_utilisateurService = utilisateurService;
|
||||||
|
_jwtService = jwtService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -27,6 +29,80 @@ public class UtilisateurController : ControllerBase
|
|||||||
var result = await _utilisateurService.Login(utilisateurInput);
|
var result = await _utilisateurService.Login(utilisateurInput);
|
||||||
return result.Success ? Ok(result) : BadRequest(result);
|
return result.Success ? Ok(result) : BadRequest(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpGet("me")]
|
||||||
|
[Authorize]
|
||||||
|
public async Task<IActionResult> GetCurrentUser()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// rçupère tous les claims de type NameIdentifier
|
||||||
|
var nameIdClaims = User.FindAll(ClaimTypes.NameIdentifier).ToList();
|
||||||
|
|
||||||
|
// cherche le claim qui contient un nombre entier
|
||||||
|
int userId = 0;
|
||||||
|
bool foundValidId = false;
|
||||||
|
|
||||||
|
foreach (var claim in nameIdClaims)
|
||||||
|
{
|
||||||
|
if (int.TryParse(claim.Value, out userId))
|
||||||
|
{
|
||||||
|
foundValidId = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundValidId)
|
||||||
|
{
|
||||||
|
return BadRequest(new {
|
||||||
|
Success = false,
|
||||||
|
Message = "Utilisateur non identifié. Aucun ID numérique trouvé."
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// rçupère les informations utilisateur
|
||||||
|
var result = await _utilisateurService.GetById(userId);
|
||||||
|
return result.Success ? Ok(result) : BadRequest(result);
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
return BadRequest(new { Success = false, Message = $"Erreur: {ex.Message}" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Endpoint pour déconnecter un utilisateur (invalider son token).
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Un statut indiquant que la déconnexion a réussi.</returns>
|
||||||
|
[HttpPost("logout")]
|
||||||
|
[Authorize]
|
||||||
|
public async Task<IActionResult> Logout()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var authHeader = Request.Headers["Authorization"].ToString();
|
||||||
|
if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Bearer "))
|
||||||
|
{
|
||||||
|
return BadRequest(new { Success = false, Message = "Token non fourni" });
|
||||||
|
}
|
||||||
|
|
||||||
|
var token = authHeader.Substring("Bearer ".Length).Trim();
|
||||||
|
|
||||||
|
// rendre le tokenm invalide
|
||||||
|
var result = await _jwtService.InvalidateToken(token);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
return Ok(new { Success = true, Message = "Déconnexion réussie" });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return BadRequest(new { Success = false, Message = "Échec de la déconnexion" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return StatusCode(500, new { Success = false, Message = "Erreur interne du serveur" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Endpoint pour récupérer tous les utilisateurs.
|
/// Endpoint pour récupérer tous les utilisateurs.
|
||||||
|
@ -4,7 +4,7 @@ public class SalarieCreateDto
|
|||||||
{
|
{
|
||||||
public string Nom { get; set; }
|
public string Nom { get; set; }
|
||||||
public string Prenom { get; set; }
|
public string Prenom { get; set; }
|
||||||
public string TelephoneFix { get; set; }
|
public string TelephoneFixe { get; set; }
|
||||||
public string TelephonePortable { get; set; }
|
public string TelephonePortable { get; set; }
|
||||||
public string Email { get; set; }
|
public string Email { get; set; }
|
||||||
public int IdSite { get; set; }
|
public int IdSite { get; set; }
|
||||||
|
@ -22,7 +22,7 @@ public class AutoMapperProfile : Profile
|
|||||||
CreateMap<RoleCreateDto, Role>();
|
CreateMap<RoleCreateDto, Role>();
|
||||||
CreateMap<SiteUpdateDto, Site>();
|
CreateMap<SiteUpdateDto, Site>();
|
||||||
CreateMap<SalarieCreateDto, Salarie>()
|
CreateMap<SalarieCreateDto, Salarie>()
|
||||||
.ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFix))
|
.ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFixe))
|
||||||
.ForMember(dest => dest.TelephonePortable, opt => opt.MapFrom(src => src.TelephonePortable));
|
.ForMember(dest => dest.TelephonePortable, opt => opt.MapFrom(src => src.TelephonePortable));
|
||||||
CreateMap<SalarieUpdateDto, Salarie>()
|
CreateMap<SalarieUpdateDto, Salarie>()
|
||||||
.ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFixe))
|
.ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFixe))
|
||||||
@ -43,7 +43,10 @@ public class AutoMapperProfile : Profile
|
|||||||
CreateMap<Site, SiteMinimalDto>();
|
CreateMap<Site, SiteMinimalDto>();
|
||||||
CreateMap<Site, SiteDto>()
|
CreateMap<Site, SiteDto>()
|
||||||
.ForMember(dest => dest.Salaries, opt => opt.MapFrom(src => src.Salaries));
|
.ForMember(dest => dest.Salaries, opt => opt.MapFrom(src => src.Salaries));
|
||||||
CreateMap<Salarie, SalarieListDto>();
|
CreateMap<Salarie, SalarieListDto>()
|
||||||
|
.ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation))
|
||||||
|
.ForMember(dest => dest.Site, opt => opt.MapFrom(src => src.IdSiteNavigation));
|
||||||
|
CreateMap<Service, ServiceDto>();
|
||||||
CreateMap<Salarie, SalarieMinimalDto>();
|
CreateMap<Salarie, SalarieMinimalDto>();
|
||||||
CreateMap<Salarie, SalarieListDto>()
|
CreateMap<Salarie, SalarieListDto>()
|
||||||
.ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation.Nom))
|
.ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation.Nom))
|
||||||
|
@ -3,7 +3,5 @@ namespace ldap_cesi.Models;
|
|||||||
public interface IResponseDataModel<T> : IResponseModel
|
public interface IResponseDataModel<T> : IResponseModel
|
||||||
{
|
{
|
||||||
public T Data { get; set; }
|
public T Data { get; set; }
|
||||||
public int? TotalPages { get; set; }
|
|
||||||
public int? TotalCount { get; set; }
|
|
||||||
string Token { get; set; }
|
string Token { get; set; }
|
||||||
}
|
}
|
@ -1,21 +1,22 @@
|
|||||||
namespace ldap_cesi.Models;
|
namespace ldap_cesi.Models
|
||||||
|
|
||||||
public class PaginatedList<T>
|
|
||||||
{
|
{
|
||||||
public List<T> Datas { get; }
|
public class PaginatedList<T>
|
||||||
public int TotalCount { get; }
|
|
||||||
public int PageNumber { get; }
|
|
||||||
public int PageSize { get; }
|
|
||||||
public int TotalPages => (int)Math.Ceiling(TotalCount / (double)PageSize);
|
|
||||||
|
|
||||||
public PaginatedList(List<T> donnees, int totalCount, int pageNumber, int pageSize)
|
|
||||||
{
|
{
|
||||||
Datas = donnees;
|
public List<T> Data { get; }
|
||||||
TotalCount = totalCount;
|
public int TotalCount { get; }
|
||||||
PageNumber = pageNumber;
|
public int PageNumber { get; }
|
||||||
PageSize = pageSize;
|
public int PageSize { get; }
|
||||||
}
|
public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
|
||||||
|
|
||||||
public bool HasPreviousPage => PageNumber > 1;
|
public PaginatedList(List<T> data, int totalCount, int pageNumber, int pageSize)
|
||||||
public bool HasNextPage => PageNumber < TotalPages;
|
{
|
||||||
|
Data = data;
|
||||||
|
TotalCount = totalCount;
|
||||||
|
PageNumber = pageNumber;
|
||||||
|
PageSize = pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasPreviousPage => PageNumber > 1;
|
||||||
|
public bool HasNextPage => PageNumber < TotalPages;
|
||||||
|
}
|
||||||
}
|
}
|
@ -5,4 +5,6 @@ public class ResponseDataModel<T> : ResponseModel, IResponseDataModel<T> where T
|
|||||||
public T Data { get; set; } = null!;
|
public T Data { get; set; } = null!;
|
||||||
public int? TotalPages { get; set; }
|
public int? TotalPages { get; set; }
|
||||||
public int? TotalCount { get; set; }
|
public int? TotalCount { get; set; }
|
||||||
|
public int? PageNumber { get; set; }
|
||||||
|
public int? PageSize { get; set; }
|
||||||
}
|
}
|
@ -20,6 +20,7 @@ public interface IRepositoryBase<TEntity> where TEntity : class
|
|||||||
int pageNumber = 1,
|
int pageNumber = 1,
|
||||||
int pageSize = 10,
|
int pageSize = 10,
|
||||||
params Expression<Func<TEntity, object>>[] relationsAInclude);
|
params Expression<Func<TEntity, object>>[] relationsAInclude);
|
||||||
|
Task<int> CountRelatedEntitiesAsync<TRelated>(int id, Expression<Func<TRelated, bool>> predicate) where TRelated : class;
|
||||||
|
|
||||||
Task<TEntity?> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate,
|
Task<TEntity?> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate,
|
||||||
CancellationToken cancellationToken = default);
|
CancellationToken cancellationToken = default);
|
||||||
|
@ -5,4 +5,5 @@ namespace ldap_cesi.Repository.Services;
|
|||||||
public interface IRepositoryUtilisateur : IRepositoryBase<Utilisateur>
|
public interface IRepositoryUtilisateur : IRepositoryBase<Utilisateur>
|
||||||
{
|
{
|
||||||
Task<Utilisateur> GetByEmailAsync(string email);
|
Task<Utilisateur> GetByEmailAsync(string email);
|
||||||
|
Task<Utilisateur> GetByIdIncludeRoleAsync(int id);
|
||||||
}
|
}
|
@ -132,28 +132,6 @@ public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<List<TEntity>> ListAsync(CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return await _context.Set<TEntity>().ToListAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new Exception("Erreur qui concerne le listing des entités", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public virtual async Task<List<TEntity>> GetAllWithRelationsAsync(params Expression<Func<TEntity, object>>[] relationInclues)
|
|
||||||
{
|
|
||||||
IQueryable<TEntity> query = _dbSet;
|
|
||||||
|
|
||||||
foreach (var relationInclue in relationInclues)
|
|
||||||
{
|
|
||||||
query = query.Include(relationInclue);
|
|
||||||
}
|
|
||||||
|
|
||||||
return await query.ToListAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual async Task<TEntity> GetWithRelationsAsync(int id, params Expression<Func<TEntity, object>>[] relationInclues)
|
public virtual async Task<TEntity> GetWithRelationsAsync(int id, params Expression<Func<TEntity, object>>[] relationInclues)
|
||||||
{
|
{
|
||||||
@ -198,5 +176,9 @@ public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity :
|
|||||||
return await _dbSet.CountAsync(predicate, cancellationToken);
|
return await _dbSet.CountAsync(predicate, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual async Task<int> CountRelatedEntitiesAsync<TRelated>(int id, Expression<Func<TRelated, bool>> predicate) where TRelated : class
|
||||||
|
{
|
||||||
|
return await _context.Set<TRelated>().CountAsync(predicate);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -14,7 +14,14 @@ public class UtilisateurRepository : RepositoryBase<Utilisateur>, IRepositoryUti
|
|||||||
|
|
||||||
public async Task<Utilisateur> GetByEmailAsync(string email)
|
public async Task<Utilisateur> GetByEmailAsync(string email)
|
||||||
{
|
{
|
||||||
return await _context.Utilisateurs.Include(u => u.IdRoleNavigation)
|
return await _context.Utilisateurs
|
||||||
|
.Include(u => u.IdRoleNavigation)
|
||||||
.FirstOrDefaultAsync(u => u.Email == email);
|
.FirstOrDefaultAsync(u => u.Email == email);
|
||||||
}
|
}
|
||||||
|
public async Task<Utilisateur> GetByIdIncludeRoleAsync(int id)
|
||||||
|
{
|
||||||
|
return await _context.Utilisateurs
|
||||||
|
.Include(u => u.IdRoleNavigation)
|
||||||
|
.FirstOrDefaultAsync(u => u.Id == id);
|
||||||
|
}
|
||||||
}
|
}
|
@ -7,4 +7,5 @@ public interface IJwtService
|
|||||||
string GenerateToken(Utilisateur utilisateur);
|
string GenerateToken(Utilisateur utilisateur);
|
||||||
string GetPublicKey();
|
string GetPublicKey();
|
||||||
Task<bool> ValidateToken(string token, int userId);
|
Task<bool> ValidateToken(string token, int userId);
|
||||||
|
Task<bool> InvalidateToken(string token);
|
||||||
}
|
}
|
@ -9,7 +9,9 @@ namespace ldap_cesi.Services.Interfaces;
|
|||||||
|
|
||||||
public interface ISalarieService : IServiceBase<Salarie, SalarieOutputDetail, SalarieCreateDto, SalarieUpdateDto>
|
public interface ISalarieService : IServiceBase<Salarie, SalarieOutputDetail, SalarieCreateDto, SalarieUpdateDto>
|
||||||
{
|
{
|
||||||
Task<IResponseDataModel<List<SalarieListDto>>> GetSalariesBySite(int siteId);
|
Task<IResponseDataModel<List<SalarieOutputDetail>>> GetSalariesByService(int serviceId, int pageNumber = 1,
|
||||||
Task<IResponseDataModel<List<SalarieListDto>>> GetSalariesByService(int serviceId);
|
int pageSize = 25);
|
||||||
Task<IResponseDataModel<SalarieDto>> GetCompletById(int id);
|
|
||||||
|
Task<IResponseDataModel<List<SalarieOutputDetail>>> GetSalariesBySite(int siteId, int pageNumber = 1,
|
||||||
|
int pageSize = 25);
|
||||||
}
|
}
|
@ -19,4 +19,5 @@ public interface IServiceBase<T, TDto, TCreateDto, TUpdateDto>
|
|||||||
Task<IResponseDataModel<T>> Create(TCreateDto dto);
|
Task<IResponseDataModel<T>> Create(TCreateDto dto);
|
||||||
Task<IResponseDataModel<T>> Update(TUpdateDto dto);
|
Task<IResponseDataModel<T>> Update(TUpdateDto dto);
|
||||||
Task<IResponseDataModel<string>> Delete(int id);
|
Task<IResponseDataModel<string>> Delete(int id);
|
||||||
|
Task<IResponseDataModel<string>> DeleteWithDependencyCheck<TRelated>(int id, Expression<Func<TRelated, bool>> relationPredicate, string relationErrorMessage) where TRelated : class;
|
||||||
}
|
}
|
@ -7,5 +7,6 @@ namespace ldap_cesi.Services.Interfaces
|
|||||||
{
|
{
|
||||||
public interface IServiceService : IServiceBase<Service, ServiceDto, ServiceCreateDto, ServiceUpdateDto>
|
public interface IServiceService : IServiceBase<Service, ServiceDto, ServiceCreateDto, ServiceUpdateDto>
|
||||||
{
|
{
|
||||||
|
Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,5 @@ namespace ldap_cesi.Services.Interfaces;
|
|||||||
|
|
||||||
public interface ISiteService : IServiceBase<Site, SiteDto, SiteCreateDto, SiteUpdateDto>
|
public interface ISiteService : IServiceBase<Site, SiteDto, SiteCreateDto, SiteUpdateDto>
|
||||||
{
|
{
|
||||||
// Task<IResponseDataModel<List<Site>>> GetAll();
|
Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id);
|
||||||
// Task<IResponseDataModel<Site>> GetById(int id);
|
|
||||||
// Task<IResponseDataModel<string>> CreateSite(SiteCreateDto siteCreateDto);
|
|
||||||
// Task<IResponseDataModel<Site>> UpdateSite(SiteUpdateDto siteUpdate);
|
|
||||||
// Task<IResponseDataModel<string>> DeleteSite(int id);
|
|
||||||
}
|
}
|
@ -78,6 +78,47 @@ public class JwtService : IJwtService
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ajouter cette méthode à votre JwtService.cs
|
||||||
|
public async Task<bool> InvalidateToken(string token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var tokenHandler = new JwtSecurityTokenHandler();
|
||||||
|
|
||||||
|
// récupération du token
|
||||||
|
var jwtToken = tokenHandler.ReadJwtToken(token);
|
||||||
|
|
||||||
|
// identifiant de l'utilisateur
|
||||||
|
var userIdClaim = jwtToken.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
|
||||||
|
|
||||||
|
if (userIdClaim == null || !int.TryParse(userIdClaim.Value, out var userId))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Erreur d'invalidation du token : Id utilisateur non trouvé ou invalide.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var utilisateur = await _context.Utilisateurs.FindAsync(userId);
|
||||||
|
if (utilisateur == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Erreur d'invalidation du token : Utilisateur non trouvé.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// delte le token stocké
|
||||||
|
utilisateur.AccessToken = null;
|
||||||
|
_context.Utilisateurs.Update(utilisateur);
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
|
_logger.LogInformation($"Token invalidé pour l'utilisateur {userId}.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Une erreur s'est produite pendant l'invalidation du token JWT.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> ValidateToken(string token, int userId)
|
public async Task<bool> ValidateToken(string token, int userId)
|
||||||
{
|
{
|
||||||
|
@ -27,25 +27,13 @@ public class SalarieService : ServiceBase<Salarie, SalarieOutputDetail, SalarieC
|
|||||||
_repositoryService = repositoryService;
|
_repositoryService = repositoryService;
|
||||||
_mapper = mapper;
|
_mapper = mapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IResponseDataModel<SalarieDto>> GetCompletById(int id)
|
|
||||||
{
|
|
||||||
var salarie = await _repositorySalarie.GetSalarieWithRelationsAsync(id);
|
|
||||||
var salarieOutput = _mapper.Map<SalarieDto>(salarie);
|
|
||||||
return new ResponseDataModel<SalarieDto>
|
|
||||||
{
|
|
||||||
Success = true,
|
|
||||||
Data = salarieOutput,
|
|
||||||
StatusCode = 200,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IResponseDataModel<List<SalarieListDto>>> GetSalariesBySite(int siteId)
|
public async Task<IResponseDataModel<List<SalarieOutputDetail>>> GetSalariesBySite(int siteId, int pageNumber = 1, int pageSize = 25)
|
||||||
{
|
{
|
||||||
var site = await _repositorySite.GetByIdAsync(siteId);
|
var site = await _repositorySite.GetByIdAsync(siteId);
|
||||||
if (site == null)
|
if (site == null)
|
||||||
{
|
{
|
||||||
return new ResponseDataModel<List<SalarieListDto>>
|
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||||
{
|
{
|
||||||
Success = false,
|
Success = false,
|
||||||
Message = "Site non trouvé",
|
Message = "Site non trouvé",
|
||||||
@ -54,33 +42,32 @@ public class SalarieService : ServiceBase<Salarie, SalarieOutputDetail, SalarieC
|
|||||||
}
|
}
|
||||||
|
|
||||||
var salaries = await _repositorySalarie.GetSalariesBySiteAsync(siteId);
|
var salaries = await _repositorySalarie.GetSalariesBySiteAsync(siteId);
|
||||||
if (!salaries.Any())
|
var totalCount = salaries.Count;
|
||||||
{
|
var paginatedSalaries = salaries
|
||||||
return new ResponseDataModel<List<SalarieListDto>>
|
.Skip((pageNumber - 1) * pageSize)
|
||||||
{
|
.Take(pageSize)
|
||||||
Success = true,
|
.ToList();
|
||||||
Message = "Aucun salarié trouvé pour ce site",
|
|
||||||
Data = new List<SalarieListDto>(),
|
|
||||||
StatusCode = 200
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var salariesDto = _mapper.Map<List<SalarieListDto>>(salaries);
|
var salariesDto = _mapper.Map<List<SalarieOutputDetail>>(paginatedSalaries);
|
||||||
|
|
||||||
return new ResponseDataModel<List<SalarieListDto>>
|
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||||
{
|
{
|
||||||
Success = true,
|
Success = true,
|
||||||
Data = salariesDto,
|
Data = salariesDto,
|
||||||
|
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
|
||||||
|
TotalCount = totalCount,
|
||||||
|
PageNumber = pageNumber,
|
||||||
|
PageSize = pageSize,
|
||||||
StatusCode = 200
|
StatusCode = 200
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IResponseDataModel<List<SalarieListDto>>> GetSalariesByService(int serviceId)
|
public async Task<IResponseDataModel<List<SalarieOutputDetail>>> GetSalariesByService(int serviceId, int pageNumber = 1, int pageSize = 25)
|
||||||
{
|
{
|
||||||
var service = await _repositoryService.GetByIdAsync(serviceId);
|
var service = await _repositoryService.GetByIdAsync(serviceId);
|
||||||
if (service == null)
|
if (service == null)
|
||||||
{
|
{
|
||||||
return new ResponseDataModel<List<SalarieListDto>>
|
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||||
{
|
{
|
||||||
Success = false,
|
Success = false,
|
||||||
Message = "Service non trouvé",
|
Message = "Service non trouvé",
|
||||||
@ -89,132 +76,23 @@ public class SalarieService : ServiceBase<Salarie, SalarieOutputDetail, SalarieC
|
|||||||
}
|
}
|
||||||
|
|
||||||
var salaries = await _repositorySalarie.GetSalariesByServiceAsync(serviceId);
|
var salaries = await _repositorySalarie.GetSalariesByServiceAsync(serviceId);
|
||||||
var salariesDto = _mapper.Map<List<SalarieListDto>>(salaries);
|
var totalCount = salaries.Count;
|
||||||
|
var paginatedSalaries = salaries
|
||||||
return new ResponseDataModel<List<SalarieListDto>>
|
.Skip((pageNumber - 1) * pageSize)
|
||||||
|
.Take(pageSize)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var salariesDto = _mapper.Map<List<SalarieOutputDetail>>(paginatedSalaries);
|
||||||
|
|
||||||
|
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||||
{
|
{
|
||||||
Success = true,
|
Success = true,
|
||||||
Data = salariesDto,
|
Data = salariesDto, // Les salariés paginés
|
||||||
|
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
|
||||||
|
TotalCount = totalCount,
|
||||||
|
PageNumber = pageNumber,
|
||||||
|
PageSize = pageSize,
|
||||||
StatusCode = 200
|
StatusCode = 200
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IResponseDataModel<List<SalarieListDto>>> RechercherParNom(string nom)
|
|
||||||
{
|
|
||||||
var salaries = await _repositorySalarie.SearchByNameAsync(nom);
|
|
||||||
var salariesDto = _mapper.Map<List<SalarieListDto>>(salaries);
|
|
||||||
|
|
||||||
return new ResponseDataModel<List<SalarieListDto>>
|
|
||||||
{
|
|
||||||
Success = true,
|
|
||||||
Data = salariesDto,
|
|
||||||
StatusCode = 200
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<string>> Create(SalarieCreateDto salarieInput)
|
|
||||||
// {
|
|
||||||
// var validation = new SalarieCreateValidator();
|
|
||||||
// var result = validation.Validate(salarieInput);
|
|
||||||
// if (!result.IsValid)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Données salariées invalides: " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var service = _mapper.Map<Salarie>(salarieInput);
|
|
||||||
// var response = await _repositorySalarie.AddAsync(service);
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 201,
|
|
||||||
// Success = true,
|
|
||||||
// Data = response.Id.ToString(),
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<Salarie>> Update(SalarieUpdateDto salarieInput)
|
|
||||||
// {
|
|
||||||
// var validation = new SalarieUpdateValidator();
|
|
||||||
// var result = validation.Validate(salarieInput);
|
|
||||||
// if (!result.IsValid)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Salarie>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Données salariées invalides: " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var salarieFind = await _repositorySalarie.GetByIdAsync(salarieInput.Id);
|
|
||||||
// if (salarieFind == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Salarie>
|
|
||||||
// {
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Salarié introuvable.",
|
|
||||||
// StatusCode = 404
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var salarie = _mapper.Map(salarieInput, salarieFind);
|
|
||||||
// var response = await _repositorySalarie.UpdateAsync(salarie);
|
|
||||||
// if (!response)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Salarie>
|
|
||||||
// {
|
|
||||||
// StatusCode = 500,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Erreur lors de la mise à jour du salarié : " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// return new ResponseDataModel<Salarie>
|
|
||||||
// {
|
|
||||||
// StatusCode = 200,
|
|
||||||
// Success = true,
|
|
||||||
// Data = salarie,
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<string>> Delete(int id)
|
|
||||||
// {
|
|
||||||
// if (id == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Id manquant"
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var salarie = await _repositorySalarie.GetByIdAsync(id);
|
|
||||||
// if (salarie == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Salarié introuvable.",
|
|
||||||
// StatusCode = 404
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var response = await _repositorySalarie.DeleteAsync(salarie);
|
|
||||||
// if (!response)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 500,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Erreur durant la suppression du service"
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 200,
|
|
||||||
// Success = true,
|
|
||||||
// Data = salarie.Id.ToString(),
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
}
|
}
|
@ -308,5 +308,53 @@ public class ServiceBase<T, TDto, TCreateDto, TUpdateDto> : IServiceBase<T, TDto
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual async Task<IResponseDataModel<string>> DeleteWithDependencyCheck<TRelated>(int id, Expression<Func<TRelated, bool>> relationPredicate, string relationErrorMessage) where TRelated : class
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var entity = await _repository.GetByIdAsync(id);
|
||||||
|
if (entity == null)
|
||||||
|
{
|
||||||
|
return new ResponseDataModel<string>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Message = $"Aucune entité trouvée avec l'identifiant {id}.",
|
||||||
|
StatusCode = 404
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier si des entités dépendantes existent
|
||||||
|
var relatedCount = await (_repository as IRepositoryBase<T>).CountRelatedEntitiesAsync<TRelated>(id, relationPredicate);
|
||||||
|
if (relatedCount > 0)
|
||||||
|
{
|
||||||
|
return new ResponseDataModel<string>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Message = relationErrorMessage,
|
||||||
|
StatusCode = 400
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var isDeleted = await _repository.DeleteAsync(entity);
|
||||||
|
return new ResponseDataModel<string>
|
||||||
|
{
|
||||||
|
Success = isDeleted,
|
||||||
|
Data = isDeleted ? id.ToString() : null,
|
||||||
|
StatusCode = isDeleted ? 200 : 500,
|
||||||
|
Message = isDeleted ? "Entité supprimée avec succès." : "Échec de la suppression de l'entité."
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, $"Une erreur s'est produite lors de la suppression de l'entité avec l'identifiant {id}.");
|
||||||
|
return new ResponseDataModel<string>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Message = "Une erreur s'est produite lors de la suppression de l'entité.",
|
||||||
|
StatusCode = 500
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -17,133 +17,12 @@ public class ServiceService : ServiceBase<Service, ServiceDto, ServiceCreateDto,
|
|||||||
: base(repositoryService, mapper, logger, serviceCreateValidator, serviceUpdateValidator)
|
: base(repositoryService, mapper, logger, serviceCreateValidator, serviceUpdateValidator)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
public async Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id)
|
||||||
|
{
|
||||||
// public async Task<IResponseDataModel<List<Service>>> GetAll()
|
return await DeleteWithDependencyCheck<Salarie>(
|
||||||
// {
|
id,
|
||||||
// var services = await _repositoryService.GetAllAsync();
|
salarie => salarie.IdServiceNavigation.Id == id,
|
||||||
// return new ResponseDataModel<List<Service>>
|
"il n'est pas possible de supprimer ce service car des salariés y sont liés"
|
||||||
// {
|
);
|
||||||
// Success = true,
|
}
|
||||||
// Data = services,
|
|
||||||
// StatusCode = 200,
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<Service>> GetById(int id)
|
|
||||||
// {
|
|
||||||
// var service = await _repositoryService.GetByIdAsync(id);
|
|
||||||
// return new ResponseDataModel<Service>
|
|
||||||
// {
|
|
||||||
// Success = true,
|
|
||||||
// Data = service,
|
|
||||||
// StatusCode = 200,
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<string>> CreateService(ServiceCreateDto serviceCreateDto)
|
|
||||||
// {
|
|
||||||
// var validation = new ServiceCreateValidator();
|
|
||||||
// var result = validation.Validate(serviceCreateDto);
|
|
||||||
// if (!result.IsValid)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Données du service invalides: " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var service = _mapper.Map<Service>(serviceCreateDto);
|
|
||||||
// var response = await _repositoryService.AddAsync(service);
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 201,
|
|
||||||
// Success = true,
|
|
||||||
// Data = response.Id.ToString(),
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<Service>> UpdateService(ServiceUpdateDto serviceUpdateDto)
|
|
||||||
// {
|
|
||||||
// var validation = new ServiceUpdateValidator();
|
|
||||||
// var result = validation.Validate(serviceUpdateDto);
|
|
||||||
// if (!result.IsValid)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Service>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Données du service invalides: " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var serviceFind = await _repositoryService.GetByIdAsync(serviceUpdateDto.Id);
|
|
||||||
// if (serviceFind is null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Service>
|
|
||||||
// {
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Service introuvable.",
|
|
||||||
// StatusCode = 404
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var service = _mapper.Map(serviceUpdateDto, serviceFind);
|
|
||||||
// var response = await _repositoryService.UpdateAsync(service);
|
|
||||||
// if (!response)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Service>
|
|
||||||
// {
|
|
||||||
// StatusCode = 500,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Erreur lors de la mise à jour du service : " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// return new ResponseDataModel<Service>
|
|
||||||
// {
|
|
||||||
// StatusCode = 200,
|
|
||||||
// Success = true,
|
|
||||||
// Data = service,
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<string>> DeleteService(int idService)
|
|
||||||
// {
|
|
||||||
// if (idService == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Id manquant"
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var service = await _repositoryService.GetByIdAsync(idService);
|
|
||||||
// if (service == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Service introuvable.",
|
|
||||||
// StatusCode = 404
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var response = await _repositoryService.DeleteAsync(service);
|
|
||||||
// if (!response)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 500,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Erreur durant la suppression du service"
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 200,
|
|
||||||
// Success = true,
|
|
||||||
// Data = service.Id.ToString(),
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
}
|
}
|
@ -14,138 +14,19 @@ public class SiteService : ServiceBase<Site, SiteDto, SiteCreateDto, SiteUpdateD
|
|||||||
|
|
||||||
private readonly IRepositorySite _repositorySite;
|
private readonly IRepositorySite _repositorySite;
|
||||||
|
|
||||||
public SiteService(IRepositorySite repositorySite, IMapper mapper,
|
public SiteService(IRepositorySite repositorySite, IMapper mapper,
|
||||||
ILogger<SiteService> logger, SiteCreateValidator siteCreateValidator, SiteUpdateValidator siteUpdateValidator)
|
ILogger<SiteService> logger, SiteCreateValidator siteCreateValidator, SiteUpdateValidator siteUpdateValidator)
|
||||||
: base(repositorySite, mapper, logger, siteCreateValidator, siteUpdateValidator )
|
: base(repositorySite, mapper, logger, siteCreateValidator, siteUpdateValidator)
|
||||||
{
|
{
|
||||||
_repositorySite = repositorySite;
|
_repositorySite = repositorySite;
|
||||||
}
|
}
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<List<Site>>> GetAll()
|
|
||||||
// {
|
|
||||||
// var sites = await _repositorySite.GetAllAsync();
|
|
||||||
// return new ResponseDataModel<List<Site>>
|
|
||||||
// {
|
|
||||||
// Success = true,
|
|
||||||
// Data = sites,
|
|
||||||
// StatusCode = 200,
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public async Task<IResponseDataModel<Site>> GetById(int id)
|
|
||||||
// {
|
|
||||||
// var site = await _repositorySite.GetByIdAsync(id);
|
|
||||||
// return new ResponseDataModel<Site>
|
|
||||||
// {
|
|
||||||
// Success = true,
|
|
||||||
// Data = site,
|
|
||||||
// StatusCode = 200,
|
|
||||||
// };
|
|
||||||
}
|
|
||||||
|
|
||||||
// public async Task<IResponseDataModel<string>> CreateSite(SiteCreateDto siteCreateDto)
|
public async Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id)
|
||||||
// {
|
{
|
||||||
// var validation = new SiteCreateValidator();
|
return await DeleteWithDependencyCheck<Salarie>(
|
||||||
// var result = validation.Validate(siteCreateDto);
|
id,
|
||||||
// if (!result.IsValid)
|
salarie => salarie.IdSiteNavigation.Id == id,
|
||||||
// {
|
"il n'est pas possible de supprimer ce site car des salariés y sont liés"
|
||||||
// return new ResponseDataModel<string>
|
);
|
||||||
// {
|
}
|
||||||
// StatusCode = 400,
|
}
|
||||||
// Success = false,
|
|
||||||
// Message = "Données du site invalides: " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var site = _mapper.Map<Site>(siteCreateDto);
|
|
||||||
// var response = await _repositorySite.AddAsync(site);
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 201,
|
|
||||||
// Success = true,
|
|
||||||
// Data = response.Id.ToString(),
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public async Task<IResponseDataModel<Site>> UpdateSite(SiteUpdateDto siteUpdate)
|
|
||||||
// {
|
|
||||||
// var validation = new SiteUpdateValidator();
|
|
||||||
// var result = validation.Validate(siteUpdate);
|
|
||||||
// if (!result.IsValid)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Site>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Données du site invalides: " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var siteFind = await _repositorySite.GetByIdAsync(siteUpdate.Id);
|
|
||||||
// if (siteFind is null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Site>
|
|
||||||
// {
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Site introuvable.",
|
|
||||||
// StatusCode = 404
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var site = _mapper.Map(siteUpdate, siteFind);
|
|
||||||
// var response = await _repositorySite.UpdateAsync(site);
|
|
||||||
// if (!response)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<Site>
|
|
||||||
// {
|
|
||||||
// StatusCode = 500,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Erreur lors de la mise à jour du site : " + string.Join(", ", result.Errors)
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// return new ResponseDataModel<Site>
|
|
||||||
// {
|
|
||||||
// StatusCode = 200,
|
|
||||||
// Success = true,
|
|
||||||
// Data = site,
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public async Task<IResponseDataModel<string>> DeleteSite(int id)
|
|
||||||
// {
|
|
||||||
// if (id == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 400,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Id manquant"
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var site = await _repositorySite.GetByIdAsync(id);
|
|
||||||
// if (site == null)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Site introuvable.",
|
|
||||||
// StatusCode = 404
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// var response = await _repositorySite.DeleteAsync(site);
|
|
||||||
// if (!response)
|
|
||||||
// {
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 500,
|
|
||||||
// Success = false,
|
|
||||||
// Message = "Erreur durant la suppression du site"
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
// return new ResponseDataModel<string>
|
|
||||||
// {
|
|
||||||
// StatusCode = 200,
|
|
||||||
// Success = true,
|
|
||||||
// Data = site.Id.ToString(),
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
|
@ -34,7 +34,7 @@ public class UtilisateurService : IUtilisateurService
|
|||||||
|
|
||||||
public async Task<IResponseDataModel<UtilisateurOutputDto>> GetById(int id)
|
public async Task<IResponseDataModel<UtilisateurOutputDto>> GetById(int id)
|
||||||
{
|
{
|
||||||
var utililisateur = await _repositoryUtilisateur.GetByIdAsync(id);
|
var utililisateur = await _repositoryUtilisateur.GetByIdIncludeRoleAsync(id);
|
||||||
var utilisateurOutput = _mapper.Map<UtilisateurOutputDto>(utililisateur);
|
var utilisateurOutput = _mapper.Map<UtilisateurOutputDto>(utililisateur);
|
||||||
return new ResponseDataModel<UtilisateurOutputDto>
|
return new ResponseDataModel<UtilisateurOutputDto>
|
||||||
{
|
{
|
||||||
|
@ -15,7 +15,7 @@ public class SalarieCreateValidator : AbstractValidator<SalarieCreateDto>
|
|||||||
.NotEmpty().WithMessage("Le prénom est requis.")
|
.NotEmpty().WithMessage("Le prénom est requis.")
|
||||||
.MaximumLength(50).WithMessage("Le prénom ne doit pas dépasser 50 caractères.");
|
.MaximumLength(50).WithMessage("Le prénom ne doit pas dépasser 50 caractères.");
|
||||||
|
|
||||||
RuleFor(x => x.TelephoneFix)
|
RuleFor(x => x.TelephoneFixe)
|
||||||
.NotEmpty().WithMessage("Le téléphone fixe est requis.")
|
.NotEmpty().WithMessage("Le téléphone fixe est requis.")
|
||||||
.Matches(@"^(\+33|0)[1-9](\d{2}){4}$")
|
.Matches(@"^(\+33|0)[1-9](\d{2}){4}$")
|
||||||
.WithMessage("Le numéro de téléphone fixe n'est pas valide. Format attendu : +33XXXXXXXXX ou 0XXXXXXXXX.")
|
.WithMessage("Le numéro de téléphone fixe n'est pas valide. Format attendu : +33XXXXXXXXX ou 0XXXXXXXXX.")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user