diff --git a/ldap-cesi/Controllers/JwtController.cs b/ldap-cesi/Controllers/JwtController.cs index 55fad8d..b163375 100644 --- a/ldap-cesi/Controllers/JwtController.cs +++ b/ldap-cesi/Controllers/JwtController.cs @@ -1,4 +1,5 @@ using ldap_cesi.Services.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace ldap_cesi.Controllers; diff --git a/ldap-cesi/Controllers/ServicesController.cs b/ldap-cesi/Controllers/ServicesController.cs index 19ff669..2081b99 100644 --- a/ldap-cesi/Controllers/ServicesController.cs +++ b/ldap-cesi/Controllers/ServicesController.cs @@ -85,7 +85,7 @@ public class ServicesController : ControllerBase [Authorize(Roles = "admin")] public async Task DeleteService(int id) { - var result = await _serviceService.Delete(id); + var result = await _serviceService.DeleteWithEntiteCheck(id); return result.Success ? Ok(result) : BadRequest(result); } } \ No newline at end of file diff --git a/ldap-cesi/Controllers/SiteController.cs b/ldap-cesi/Controllers/SiteController.cs index 51f4ee4..bcb29c8 100644 --- a/ldap-cesi/Controllers/SiteController.cs +++ b/ldap-cesi/Controllers/SiteController.cs @@ -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 /// Les données du site à créer. /// Retourne l'identifiant du site créé. [HttpPost] + [Authorize(Roles = "admin")] public async Task CreateSite([FromBody] SiteCreateDto siteCreateDto) { var result = await _siteService.Create(siteCreateDto); @@ -76,6 +78,7 @@ public class SiteController : ControllerBase /// Les données du site à mettre à jour. /// Retourne l'objet ou une erreur. [HttpPut] + [Authorize(Roles = "admin")] public async Task UpdateSite([FromBody] SiteUpdateDto siteUpdateDto) { var result = await _siteService.Update(siteUpdateDto); @@ -89,9 +92,10 @@ public class SiteController : ControllerBase /// L'identifiant du site à supprimer. /// Retourne l'id, ou l'erreur [HttpDelete("{id}")] + [Authorize(Roles = "admin")] public async Task DeleteSite(int id) { - var result = await _siteService.Delete(id); + var result = await _siteService.DeleteWithEntiteCheck(id); return result.Success ? Ok(result) : BadRequest(result); } } \ No newline at end of file diff --git a/ldap-cesi/Controllers/UtilisateurController.cs b/ldap-cesi/Controllers/UtilisateurController.cs index 660823d..0f747bd 100644 --- a/ldap-cesi/Controllers/UtilisateurController.cs +++ b/ldap-cesi/Controllers/UtilisateurController.cs @@ -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 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}" }); + } + } + + /// + /// Endpoint pour déconnecter un utilisateur (invalider son token). + /// + /// Un statut indiquant que la déconnexion a réussi. + [HttpPost("logout")] + [Authorize] + public async Task 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" }); + } + } /// /// Endpoint pour récupérer tous les utilisateurs. diff --git a/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs b/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs index 9842778..a8ca3e7 100644 --- a/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs +++ b/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs @@ -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; } diff --git a/ldap-cesi/Mapper/AutoMapperProfile.cs b/ldap-cesi/Mapper/AutoMapperProfile.cs index 3acd83e..d76b6cb 100644 --- a/ldap-cesi/Mapper/AutoMapperProfile.cs +++ b/ldap-cesi/Mapper/AutoMapperProfile.cs @@ -22,7 +22,7 @@ public class AutoMapperProfile : Profile CreateMap(); CreateMap(); CreateMap() - .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() .ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFixe)) @@ -43,7 +43,10 @@ public class AutoMapperProfile : Profile CreateMap(); CreateMap() .ForMember(dest => dest.Salaries, opt => opt.MapFrom(src => src.Salaries)); - CreateMap(); + CreateMap() + .ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation)) + .ForMember(dest => dest.Site, opt => opt.MapFrom(src => src.IdSiteNavigation)); + CreateMap(); CreateMap(); CreateMap() .ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation.Nom)) diff --git a/ldap-cesi/Models/IResponseDataModel.cs b/ldap-cesi/Models/IResponseDataModel.cs index 5255852..1eb89dc 100644 --- a/ldap-cesi/Models/IResponseDataModel.cs +++ b/ldap-cesi/Models/IResponseDataModel.cs @@ -3,7 +3,5 @@ namespace ldap_cesi.Models; public interface IResponseDataModel : IResponseModel { public T Data { get; set; } - public int? TotalPages { get; set; } - public int? TotalCount { get; set; } string Token { get; set; } } \ No newline at end of file diff --git a/ldap-cesi/Models/PaginatedList.cs b/ldap-cesi/Models/PaginatedList.cs index ae99066..cbdb15f 100644 --- a/ldap-cesi/Models/PaginatedList.cs +++ b/ldap-cesi/Models/PaginatedList.cs @@ -1,21 +1,22 @@ -namespace ldap_cesi.Models; - -public class PaginatedList +namespace ldap_cesi.Models { - public List 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 donnees, int totalCount, int pageNumber, int pageSize) + public class PaginatedList { - Datas = donnees; - TotalCount = totalCount; - PageNumber = pageNumber; - PageSize = pageSize; - } + public List 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 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; + } } \ No newline at end of file diff --git a/ldap-cesi/Models/ResponseDataModel.cs b/ldap-cesi/Models/ResponseDataModel.cs index 220c124..973842a 100644 --- a/ldap-cesi/Models/ResponseDataModel.cs +++ b/ldap-cesi/Models/ResponseDataModel.cs @@ -5,4 +5,6 @@ public class ResponseDataModel : ResponseModel, IResponseDataModel 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; } } \ No newline at end of file diff --git a/ldap-cesi/Repositories/Interfaces/IRepositoryBase.cs b/ldap-cesi/Repositories/Interfaces/IRepositoryBase.cs index baf4780..17e737d 100644 --- a/ldap-cesi/Repositories/Interfaces/IRepositoryBase.cs +++ b/ldap-cesi/Repositories/Interfaces/IRepositoryBase.cs @@ -20,6 +20,7 @@ public interface IRepositoryBase where TEntity : class int pageNumber = 1, int pageSize = 10, params Expression>[] relationsAInclude); + Task CountRelatedEntitiesAsync(int id, Expression> predicate) where TRelated : class; Task FirstOrDefaultAsync(Expression> predicate, CancellationToken cancellationToken = default); diff --git a/ldap-cesi/Repositories/RepositoryBase.cs b/ldap-cesi/Repositories/RepositoryBase.cs index 886ed2e..0b02212 100644 --- a/ldap-cesi/Repositories/RepositoryBase.cs +++ b/ldap-cesi/Repositories/RepositoryBase.cs @@ -132,28 +132,6 @@ public class RepositoryBase : IRepositoryBase where TEntity : } } - public virtual async Task> ListAsync(CancellationToken cancellationToken = default) - { - try - { - return await _context.Set().ToListAsync(cancellationToken); - } - catch (Exception ex) - { - throw new Exception("Erreur qui concerne le listing des entités", ex); - } - } - public virtual async Task> GetAllWithRelationsAsync(params Expression>[] relationInclues) - { - IQueryable query = _dbSet; - - foreach (var relationInclue in relationInclues) - { - query = query.Include(relationInclue); - } - - return await query.ToListAsync(); - } public virtual async Task GetWithRelationsAsync(int id, params Expression>[] relationInclues) { @@ -198,5 +176,9 @@ public class RepositoryBase : IRepositoryBase where TEntity : return await _dbSet.CountAsync(predicate, cancellationToken); } + public virtual async Task CountRelatedEntitiesAsync(int id, Expression> predicate) where TRelated : class + { + return await _context.Set().CountAsync(predicate); + } } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/IJwtService.cs b/ldap-cesi/Services/Interfaces/IJwtService.cs index 1ba65ee..fcfbc88 100644 --- a/ldap-cesi/Services/Interfaces/IJwtService.cs +++ b/ldap-cesi/Services/Interfaces/IJwtService.cs @@ -7,4 +7,5 @@ public interface IJwtService string GenerateToken(Utilisateur utilisateur); string GetPublicKey(); Task ValidateToken(string token, int userId); + Task InvalidateToken(string token); } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/ISalarieService.cs b/ldap-cesi/Services/Interfaces/ISalarieService.cs index 1cbff57..8386361 100644 --- a/ldap-cesi/Services/Interfaces/ISalarieService.cs +++ b/ldap-cesi/Services/Interfaces/ISalarieService.cs @@ -9,7 +9,9 @@ namespace ldap_cesi.Services.Interfaces; public interface ISalarieService : IServiceBase { - Task>> GetSalariesBySite(int siteId); - Task>> GetSalariesByService(int serviceId); - Task> GetCompletById(int id); + Task>> GetSalariesByService(int serviceId, int pageNumber = 1, + int pageSize = 25); + + Task>> GetSalariesBySite(int siteId, int pageNumber = 1, + int pageSize = 25); } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/IServiceBase.cs b/ldap-cesi/Services/Interfaces/IServiceBase.cs index db8cb40..f11aef2 100644 --- a/ldap-cesi/Services/Interfaces/IServiceBase.cs +++ b/ldap-cesi/Services/Interfaces/IServiceBase.cs @@ -19,4 +19,5 @@ public interface IServiceBase Task> Create(TCreateDto dto); Task> Update(TUpdateDto dto); Task> Delete(int id); + Task> DeleteWithDependencyCheck(int id, Expression> relationPredicate, string relationErrorMessage) where TRelated : class; } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/IServiceService.cs b/ldap-cesi/Services/Interfaces/IServiceService.cs index 4cd3a7c..d509e38 100644 --- a/ldap-cesi/Services/Interfaces/IServiceService.cs +++ b/ldap-cesi/Services/Interfaces/IServiceService.cs @@ -7,5 +7,6 @@ namespace ldap_cesi.Services.Interfaces { public interface IServiceService : IServiceBase { + Task> DeleteWithEntiteCheck(int id); } } diff --git a/ldap-cesi/Services/Interfaces/ISiteService.cs b/ldap-cesi/Services/Interfaces/ISiteService.cs index 4c99e84..08e3b93 100644 --- a/ldap-cesi/Services/Interfaces/ISiteService.cs +++ b/ldap-cesi/Services/Interfaces/ISiteService.cs @@ -7,9 +7,5 @@ namespace ldap_cesi.Services.Interfaces; public interface ISiteService : IServiceBase { - // Task>> GetAll(); - // Task> GetById(int id); - // Task> CreateSite(SiteCreateDto siteCreateDto); - // Task> UpdateSite(SiteUpdateDto siteUpdate); - // Task> DeleteSite(int id); + Task> DeleteWithEntiteCheck(int id); } \ No newline at end of file diff --git a/ldap-cesi/Services/JwtService.cs b/ldap-cesi/Services/JwtService.cs index 8ef0ec2..8464c4b 100644 --- a/ldap-cesi/Services/JwtService.cs +++ b/ldap-cesi/Services/JwtService.cs @@ -78,6 +78,47 @@ public class JwtService : IJwtService throw; } } + + // Ajouter cette méthode à votre JwtService.cs + public async Task 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 ValidateToken(string token, int userId) { diff --git a/ldap-cesi/Services/SalarieService.cs b/ldap-cesi/Services/SalarieService.cs index 31b551f..c339300 100644 --- a/ldap-cesi/Services/SalarieService.cs +++ b/ldap-cesi/Services/SalarieService.cs @@ -27,25 +27,13 @@ public class SalarieService : ServiceBase> GetCompletById(int id) - { - var salarie = await _repositorySalarie.GetSalarieWithRelationsAsync(id); - var salarieOutput = _mapper.Map(salarie); - return new ResponseDataModel - { - Success = true, - Data = salarieOutput, - StatusCode = 200, - }; - } - public async Task>> GetSalariesBySite(int siteId) + public async Task>> GetSalariesBySite(int siteId, int pageNumber = 1, int pageSize = 25) { var site = await _repositorySite.GetByIdAsync(siteId); if (site == null) { - return new ResponseDataModel> + return new ResponseDataModel> { Success = false, Message = "Site non trouvé", @@ -54,33 +42,32 @@ public class SalarieService : ServiceBase> - { - Success = true, - Message = "Aucun salarié trouvé pour ce site", - Data = new List(), - StatusCode = 200 - }; - } + var totalCount = salaries.Count; + var paginatedSalaries = salaries + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); - var salariesDto = _mapper.Map>(salaries); - - return new ResponseDataModel> + var salariesDto = _mapper.Map>(paginatedSalaries); + + return new ResponseDataModel> { Success = true, Data = salariesDto, + TotalPages = (int)Math.Ceiling((double)totalCount / pageSize), + TotalCount = totalCount, + PageNumber = pageNumber, + PageSize = pageSize, StatusCode = 200 }; } - public async Task>> GetSalariesByService(int serviceId) + public async Task>> GetSalariesByService(int serviceId, int pageNumber = 1, int pageSize = 25) { var service = await _repositoryService.GetByIdAsync(serviceId); if (service == null) { - return new ResponseDataModel> + return new ResponseDataModel> { Success = false, Message = "Service non trouvé", @@ -89,132 +76,23 @@ public class SalarieService : ServiceBase>(salaries); - - return new ResponseDataModel> + var totalCount = salaries.Count; + var paginatedSalaries = salaries + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + + var salariesDto = _mapper.Map>(paginatedSalaries); + + return new ResponseDataModel> { 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>> RechercherParNom(string nom) - { - var salaries = await _repositorySalarie.SearchByNameAsync(nom); - var salariesDto = _mapper.Map>(salaries); - - return new ResponseDataModel> - { - Success = true, - Data = salariesDto, - StatusCode = 200 - }; - } - - // public async Task> Create(SalarieCreateDto salarieInput) - // { - // var validation = new SalarieCreateValidator(); - // var result = validation.Validate(salarieInput); - // if (!result.IsValid) - // { - // return new ResponseDataModel - // { - // StatusCode = 400, - // Success = false, - // Message = "Données salariées invalides: " + string.Join(", ", result.Errors) - // }; - // } - // var service = _mapper.Map(salarieInput); - // var response = await _repositorySalarie.AddAsync(service); - // return new ResponseDataModel - // { - // StatusCode = 201, - // Success = true, - // Data = response.Id.ToString(), - // }; - // } - - // public async Task> Update(SalarieUpdateDto salarieInput) - // { - // var validation = new SalarieUpdateValidator(); - // var result = validation.Validate(salarieInput); - // if (!result.IsValid) - // { - // return new ResponseDataModel - // { - // 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 - // { - // Success = false, - // Message = "Salarié introuvable.", - // StatusCode = 404 - // }; - // } - - // var salarie = _mapper.Map(salarieInput, salarieFind); - // var response = await _repositorySalarie.UpdateAsync(salarie); - // if (!response) - // { - // return new ResponseDataModel - // { - // StatusCode = 500, - // Success = false, - // Message = "Erreur lors de la mise à jour du salarié : " + string.Join(", ", result.Errors) - // }; - // } - // return new ResponseDataModel - // { - // StatusCode = 200, - // Success = true, - // Data = salarie, - // }; - // } - - // public async Task> Delete(int id) - // { - // if (id == null) - // { - // return new ResponseDataModel - // { - // StatusCode = 400, - // Success = false, - // Message = "Id manquant" - // }; - // } - // var salarie = await _repositorySalarie.GetByIdAsync(id); - // if (salarie == null) - // { - // return new ResponseDataModel - // { - // Success = false, - // Message = "Salarié introuvable.", - // StatusCode = 404 - // }; - // } - // var response = await _repositorySalarie.DeleteAsync(salarie); - // if (!response) - // { - // return new ResponseDataModel - // { - // StatusCode = 500, - // Success = false, - // Message = "Erreur durant la suppression du service" - // }; - // } - // return new ResponseDataModel - // { - // StatusCode = 200, - // Success = true, - // Data = salarie.Id.ToString(), - // }; - // } } \ No newline at end of file diff --git a/ldap-cesi/Services/ServiceBase.cs b/ldap-cesi/Services/ServiceBase.cs index 20908ea..a8a72c1 100644 --- a/ldap-cesi/Services/ServiceBase.cs +++ b/ldap-cesi/Services/ServiceBase.cs @@ -308,5 +308,53 @@ public class ServiceBase : IServiceBase> DeleteWithDependencyCheck(int id, Expression> relationPredicate, string relationErrorMessage) where TRelated : class + { + try + { + var entity = await _repository.GetByIdAsync(id); + if (entity == null) + { + return new ResponseDataModel + { + 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).CountRelatedEntitiesAsync(id, relationPredicate); + if (relatedCount > 0) + { + return new ResponseDataModel + { + Success = false, + Message = relationErrorMessage, + StatusCode = 400 + }; + } + + var isDeleted = await _repository.DeleteAsync(entity); + return new ResponseDataModel + { + 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 + { + Success = false, + Message = "Une erreur s'est produite lors de la suppression de l'entité.", + StatusCode = 500 + }; + } + } } \ No newline at end of file diff --git a/ldap-cesi/Services/ServiceService.cs b/ldap-cesi/Services/ServiceService.cs index 193fe2c..b2dae4b 100644 --- a/ldap-cesi/Services/ServiceService.cs +++ b/ldap-cesi/Services/ServiceService.cs @@ -17,7 +17,14 @@ public class ServiceService : ServiceBase> DeleteWithEntiteCheck(int id) + { + return await DeleteWithDependencyCheck( + id, + salarie => salarie.IdServiceNavigation.Id == id, + "Impossible de supprimer ce service car des salariés y sont affectés." + ); + } // public async Task>> GetAll() // { diff --git a/ldap-cesi/Services/SiteService.cs b/ldap-cesi/Services/SiteService.cs index 246fb98..441fd6e 100644 --- a/ldap-cesi/Services/SiteService.cs +++ b/ldap-cesi/Services/SiteService.cs @@ -20,6 +20,14 @@ public class SiteService : ServiceBase> DeleteWithEntiteCheck(int id) + { + return await DeleteWithDependencyCheck( + id, + salarie => salarie.IdSiteNavigation.Id == id, + "Impossible de supprimer ce site car des salariés y sont affectés." + ); + } // public async Task>> GetAll() // { diff --git a/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs b/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs index c23c02a..d07721f 100644 --- a/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs +++ b/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs @@ -15,7 +15,7 @@ public class SalarieCreateValidator : AbstractValidator .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.")