- Api v1.0 #20
@ -1,4 +1,5 @@
|
||||
using ldap_cesi.Services.Interfaces;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace ldap_cesi.Controllers;
|
||||
|
@ -85,7 +85,7 @@ public class ServicesController : ControllerBase
|
||||
[Authorize(Roles = "admin")]
|
||||
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);
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
using ldap_cesi.DTOs.Inputs.Site;
|
||||
using ldap_cesi.Services.Interfaces;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace ldap_cesi.Controllers;
|
||||
@ -63,6 +64,7 @@ public class SiteController : ControllerBase
|
||||
/// <param name="siteCreateDto">Les données du site à créer.</param>
|
||||
/// <returns>Retourne l'identifiant du site créé.</returns>
|
||||
[HttpPost]
|
||||
[Authorize(Roles = "admin")]
|
||||
public async Task<ActionResult> CreateSite([FromBody] SiteCreateDto 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>
|
||||
/// <returns>Retourne l'objet ou une erreur.</returns>
|
||||
[HttpPut]
|
||||
[Authorize(Roles = "admin")]
|
||||
public async Task<IActionResult> UpdateSite([FromBody] SiteUpdateDto siteUpdateDto)
|
||||
{
|
||||
var result = await _siteService.Update(siteUpdateDto);
|
||||
@ -89,9 +92,10 @@ public class SiteController : ControllerBase
|
||||
/// <param name="id">L'identifiant du site à supprimer.</param>
|
||||
/// <returns>Retourne l'id, ou l'erreur</returns>
|
||||
[HttpDelete("{id}")]
|
||||
[Authorize(Roles = "admin")]
|
||||
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);
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
using System.Security.Claims;
|
||||
using ldap_cesi.DTOs.Inputs;
|
||||
using ldap_cesi.Services.Interfaces;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
@ -8,11 +9,12 @@ namespace ldap_cesi.Controllers;
|
||||
[Route("api/utilisateurs")]
|
||||
public class UtilisateurController : ControllerBase
|
||||
{
|
||||
private IUtilisateurService _utilisateurService;
|
||||
|
||||
public UtilisateurController(IUtilisateurService utilisateurService)
|
||||
private readonly IUtilisateurService _utilisateurService;
|
||||
private readonly IJwtService _jwtService;
|
||||
public UtilisateurController(IUtilisateurService utilisateurService, IJwtService jwtService)
|
||||
{
|
||||
_utilisateurService = utilisateurService;
|
||||
_jwtService = jwtService;
|
||||
}
|
||||
|
||||
|
||||
@ -27,6 +29,80 @@ public class UtilisateurController : ControllerBase
|
||||
var result = await _utilisateurService.Login(utilisateurInput);
|
||||
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>
|
||||
/// Endpoint pour récupérer tous les utilisateurs.
|
||||
|
@ -4,7 +4,7 @@ public class SalarieCreateDto
|
||||
{
|
||||
public string Nom { get; set; }
|
||||
public string Prenom { get; set; }
|
||||
public string TelephoneFix { get; set; }
|
||||
public string TelephoneFixe { get; set; }
|
||||
public string TelephonePortable { get; set; }
|
||||
public string Email { get; set; }
|
||||
public int IdSite { get; set; }
|
||||
|
@ -22,7 +22,7 @@ public class AutoMapperProfile : Profile
|
||||
CreateMap<RoleCreateDto, Role>();
|
||||
CreateMap<SiteUpdateDto, Site>();
|
||||
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));
|
||||
CreateMap<SalarieUpdateDto, Salarie>()
|
||||
.ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFixe))
|
||||
@ -43,7 +43,10 @@ public class AutoMapperProfile : Profile
|
||||
CreateMap<Site, SiteMinimalDto>();
|
||||
CreateMap<Site, SiteDto>()
|
||||
.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, SalarieListDto>()
|
||||
.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 T Data { get; set; }
|
||||
public int? TotalPages { get; set; }
|
||||
public int? TotalCount { get; set; }
|
||||
string Token { get; set; }
|
||||
}
|
@ -1,21 +1,22 @@
|
||||
namespace ldap_cesi.Models;
|
||||
|
||||
public class PaginatedList<T>
|
||||
namespace ldap_cesi.Models
|
||||
{
|
||||
public List<T> Datas { get; }
|
||||
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)
|
||||
public class PaginatedList<T>
|
||||
{
|
||||
Datas = donnees;
|
||||
TotalCount = totalCount;
|
||||
PageNumber = pageNumber;
|
||||
PageSize = pageSize;
|
||||
}
|
||||
public List<T> Data { get; }
|
||||
public int TotalCount { get; }
|
||||
public int PageNumber { get; }
|
||||
public int PageSize { get; }
|
||||
public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
|
||||
|
||||
public bool HasPreviousPage => PageNumber > 1;
|
||||
public bool HasNextPage => PageNumber < TotalPages;
|
||||
public PaginatedList(List<T> data, int totalCount, int pageNumber, int pageSize)
|
||||
{
|
||||
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 int? TotalPages { 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 pageSize = 10,
|
||||
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,
|
||||
CancellationToken cancellationToken = default);
|
||||
|
@ -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)
|
||||
{
|
||||
@ -198,5 +176,9 @@ public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity :
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
@ -7,4 +7,5 @@ public interface IJwtService
|
||||
string GenerateToken(Utilisateur utilisateur);
|
||||
string GetPublicKey();
|
||||
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>
|
||||
{
|
||||
Task<IResponseDataModel<List<SalarieListDto>>> GetSalariesBySite(int siteId);
|
||||
Task<IResponseDataModel<List<SalarieListDto>>> GetSalariesByService(int serviceId);
|
||||
Task<IResponseDataModel<SalarieDto>> GetCompletById(int id);
|
||||
Task<IResponseDataModel<List<SalarieOutputDetail>>> GetSalariesByService(int serviceId, int pageNumber = 1,
|
||||
int pageSize = 25);
|
||||
|
||||
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>> Update(TUpdateDto dto);
|
||||
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>
|
||||
{
|
||||
Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id);
|
||||
}
|
||||
}
|
||||
|
@ -7,9 +7,5 @@ namespace ldap_cesi.Services.Interfaces;
|
||||
|
||||
public interface ISiteService : IServiceBase<Site, SiteDto, SiteCreateDto, SiteUpdateDto>
|
||||
{
|
||||
// Task<IResponseDataModel<List<Site>>> GetAll();
|
||||
// Task<IResponseDataModel<Site>> GetById(int id);
|
||||
// Task<IResponseDataModel<string>> CreateSite(SiteCreateDto siteCreateDto);
|
||||
// Task<IResponseDataModel<Site>> UpdateSite(SiteUpdateDto siteUpdate);
|
||||
// Task<IResponseDataModel<string>> DeleteSite(int id);
|
||||
Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id);
|
||||
}
|
@ -78,6 +78,47 @@ public class JwtService : IJwtService
|
||||
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)
|
||||
{
|
||||
|
@ -27,25 +27,13 @@ public class SalarieService : ServiceBase<Salarie, SalarieOutputDetail, SalarieC
|
||||
_repositoryService = repositoryService;
|
||||
_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);
|
||||
if (site == null)
|
||||
{
|
||||
return new ResponseDataModel<List<SalarieListDto>>
|
||||
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||
{
|
||||
Success = false,
|
||||
Message = "Site non trouvé",
|
||||
@ -54,33 +42,32 @@ public class SalarieService : ServiceBase<Salarie, SalarieOutputDetail, SalarieC
|
||||
}
|
||||
|
||||
var salaries = await _repositorySalarie.GetSalariesBySiteAsync(siteId);
|
||||
if (!salaries.Any())
|
||||
{
|
||||
return new ResponseDataModel<List<SalarieListDto>>
|
||||
{
|
||||
Success = true,
|
||||
Message = "Aucun salarié trouvé pour ce site",
|
||||
Data = new List<SalarieListDto>(),
|
||||
StatusCode = 200
|
||||
};
|
||||
}
|
||||
var totalCount = salaries.Count;
|
||||
var paginatedSalaries = salaries
|
||||
.Skip((pageNumber - 1) * pageSize)
|
||||
.Take(pageSize)
|
||||
.ToList();
|
||||
|
||||
var salariesDto = _mapper.Map<List<SalarieListDto>>(salaries);
|
||||
|
||||
return new ResponseDataModel<List<SalarieListDto>>
|
||||
var salariesDto = _mapper.Map<List<SalarieOutputDetail>>(paginatedSalaries);
|
||||
|
||||
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||
{
|
||||
Success = true,
|
||||
Data = salariesDto,
|
||||
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
|
||||
TotalCount = totalCount,
|
||||
PageNumber = pageNumber,
|
||||
PageSize = pageSize,
|
||||
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);
|
||||
if (service == null)
|
||||
{
|
||||
return new ResponseDataModel<List<SalarieListDto>>
|
||||
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||
{
|
||||
Success = false,
|
||||
Message = "Service non trouvé",
|
||||
@ -89,132 +76,23 @@ public class SalarieService : ServiceBase<Salarie, SalarieOutputDetail, SalarieC
|
||||
}
|
||||
|
||||
var salaries = await _repositorySalarie.GetSalariesByServiceAsync(serviceId);
|
||||
var salariesDto = _mapper.Map<List<SalarieListDto>>(salaries);
|
||||
|
||||
return new ResponseDataModel<List<SalarieListDto>>
|
||||
var totalCount = salaries.Count;
|
||||
var paginatedSalaries = salaries
|
||||
.Skip((pageNumber - 1) * pageSize)
|
||||
.Take(pageSize)
|
||||
.ToList();
|
||||
|
||||
var salariesDto = _mapper.Map<List<SalarieOutputDetail>>(paginatedSalaries);
|
||||
|
||||
return new ResponseDataModel<List<SalarieOutputDetail>>
|
||||
{
|
||||
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
|
||||
};
|
||||
}
|
||||
|
||||
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,7 +17,14 @@ public class ServiceService : ServiceBase<Service, ServiceDto, ServiceCreateDto,
|
||||
: base(repositoryService, mapper, logger, serviceCreateValidator, serviceUpdateValidator)
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id)
|
||||
{
|
||||
return await DeleteWithDependencyCheck<Salarie>(
|
||||
id,
|
||||
salarie => salarie.IdServiceNavigation.Id == id,
|
||||
"Impossible de supprimer ce service car des salariés y sont affectés."
|
||||
);
|
||||
}
|
||||
|
||||
// public async Task<IResponseDataModel<List<Service>>> GetAll()
|
||||
// {
|
||||
|
@ -20,6 +20,14 @@ public class SiteService : ServiceBase<Site, SiteDto, SiteCreateDto, SiteUpdateD
|
||||
{
|
||||
_repositorySite = repositorySite;
|
||||
}
|
||||
public async Task<IResponseDataModel<string>> DeleteWithEntiteCheck(int id)
|
||||
{
|
||||
return await DeleteWithDependencyCheck<Salarie>(
|
||||
id,
|
||||
salarie => salarie.IdSiteNavigation.Id == id,
|
||||
"Impossible de supprimer ce site car des salariés y sont affectés."
|
||||
);
|
||||
}
|
||||
|
||||
// public async Task<IResponseDataModel<List<Site>>> GetAll()
|
||||
// {
|
||||
|
@ -15,7 +15,7 @@ public class SalarieCreateValidator : AbstractValidator<SalarieCreateDto>
|
||||
.NotEmpty().WithMessage("Le prénom est requis.")
|
||||
.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.")
|
||||
.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.")
|
||||
|
Loading…
x
Reference in New Issue
Block a user