diff --git a/.idea/.idea.ldap-cesi/.idea/vcs.xml b/.idea/.idea.ldap-cesi/.idea/vcs.xml index d843f34..35eb1dd 100644 --- a/.idea/.idea.ldap-cesi/.idea/vcs.xml +++ b/.idea/.idea.ldap-cesi/.idea/vcs.xml @@ -1,4 +1,6 @@ - + + + \ No newline at end of file diff --git a/ldap-cesi/Configurations/Conf.cs b/ldap-cesi/Configurations/Conf.cs index 64e7298..32e91c3 100644 --- a/ldap-cesi/Configurations/Conf.cs +++ b/ldap-cesi/Configurations/Conf.cs @@ -43,7 +43,7 @@ public static class Conf { builder.Services.AddScoped(); // builder.Services.AddScoped(); - // builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -53,7 +53,7 @@ public static class Conf { string connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddDbContext(options => options.UseNpgsql(connectionString)); - } + } public static void CorseConfiguration(this WebApplicationBuilder builder) { builder.Services.AddCors(options => diff --git a/ldap-cesi/Controllers/SalarieController.cs b/ldap-cesi/Controllers/SalarieController.cs index fdf1cf7..63d9120 100644 --- a/ldap-cesi/Controllers/SalarieController.cs +++ b/ldap-cesi/Controllers/SalarieController.cs @@ -1,4 +1,7 @@ +using ldap_cesi.DTOs.Inputs.Salarie; +using ldap_cesi.DTOs.Inputs.Service; using ldap_cesi.Services.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace ldap_cesi.Controllers; @@ -13,27 +16,115 @@ public class SalarieController : ControllerBase _salarieService = salarieService; } - // GET: api/salaries - /// - /// Endpoint qui retournes tous les salaries + /// + /// Endpoint qui retourne tous les salariés. /// - /// List + /// Une liste de salariés. [HttpGet] - public async Task GetUtilisateurs() + public async Task GetAllSalaries() { var result = await _salarieService.GetAll(); - return result.Success ? Ok(result) : BadRequest(result); - } - - // GET: api/salaries + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + /// - /// Endpoint retourne le salarie correspondant à l'id en param + /// Endpoint qui retourne le salarié correspondant à l'ID en paramètre. /// - /// Salarie + /// L'ID du salarié. + /// Le salarié correspondant à l'ID. [HttpGet("{id}")] - public async Task GetUtilisateurById(int id) + public async Task GetSalarieById(int id) { var result = await _salarieService.GetById(id); - return result.Success ? Ok(result) : BadRequest(result); - } -} \ No newline at end of file + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Endpoint qui retourne le salarié correspondant à l'ID en paramètre. Avec le nom de service et de site auxquels il apaprtient. + /// + /// L'ID du salarié. + /// Le salarié correspondant à l'ID. + [HttpGet("/complet/{id}")] + public async Task GetSalarieCompletById(int id) + { + var result = await _salarieService.GetCompletById(id); + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Endpoint qui crée un salarié. + /// + /// Les informations du salarié à créer. + /// Le salarié créé. + [HttpPost] + [Authorize(Roles = "admin")] + public async Task CreateSalarie([FromBody] SalarieCreateDto salarieInput) + { + var result = await _salarieService.Create(salarieInput); + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Endpoint qui met à jour un salarié. + /// + /// Les informations du salarié à mettre à jour. + /// Le salarié mis à jour. + [HttpPut] + [Authorize(Roles = "admin")] + public async Task UpdateSalarie([FromBody] SalarieUpdateDto salarieInput) + { + var result = await _salarieService.Update(salarieInput); + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Endpoint qui supprime un salarié. + /// + /// L'ID du salarié à supprimer. + /// Un message de confirmation de suppression. + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task DeleteSalarie(int id) + { + var result = await _salarieService.Delete(id); + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Récupère les salariés appartenant à un site spécifique + /// + /// Identifiant du site + /// Liste des salariés du site + [HttpGet("site/{siteId}")] + public async Task GetSalariesBySite(int siteId) + { + var result = await _salarieService.GetSalariesBySite(siteId); + return result.Success ? Ok(result.Data) : NotFound(result.Message); + } + + /// + /// Récupère les salariés appartenant à un service spécifique + /// + /// Identifiant du service + /// Liste des salariés du service + [HttpGet("service/{serviceId}")] + public async Task GetSalariesByService(int serviceId) + { + var result = await _salarieService.GetSalariesByService(serviceId); + return result.Success ? Ok(result.Data) : NotFound(result.Message); + } + + /// + /// Endpoint qui met à jour partiellement un salarié. + /// + /// L'ID du salarié. + /// Les informations du salarié à mettre à jour partiellement. + /// Le salarié mis à jour partiellement. + // [HttpPatch("{id}")] + // [Authorize(Roles = "admin")] + // public async Task PatchSalarie(int id, [FromBody] SalariePatchDto salariePatch) + // { + // var result = await _salarieService.Patch(id, salariePatch); + // return result.Success ? Ok(result.Data) : BadRequest(result.Message); + // } +} diff --git a/ldap-cesi/Controllers/ServicesController.cs b/ldap-cesi/Controllers/ServicesController.cs index 0d0e987..d9c3c84 100644 --- a/ldap-cesi/Controllers/ServicesController.cs +++ b/ldap-cesi/Controllers/ServicesController.cs @@ -16,40 +16,67 @@ public class ServicesController : ControllerBase _serviceService = serviceService; } - // GET: api/services /// - /// Endpoint qui retournes tous les services + /// Endpoint qui retourne tous les services. /// - /// Retourne tous les services + /// Retourne tous les services. [HttpGet] - // [Authorize(Roles = "admin")] - public async Task GetServices() + [Authorize(Roles = "admin")] + public async Task GetServices() { var result = await _serviceService.GetAll(); - return result.Success ? Ok(result) : BadRequest(result); - } - - // GET: api/services + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + /// - /// Endpoint retourne le service correspondant à l'id en param + /// Endpoint qui retourne le service correspondant à l'id en paramètre. /// - /// Service + /// L'ID du service. + /// Le service correspondant à l'ID. [HttpGet("{id}")] - public async Task GetServices(int id) + [Authorize(Roles = "admin")] + public async Task GetServiceById(int id) { var result = await _serviceService.GetById(id); - return result.Success ? Ok(result) : BadRequest(result); - } - - // {POST}: api/services + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + /// - /// Endpoint qui créé un service + /// Endpoint qui crée un service. /// - /// Retourne tous les services + /// Les informations du service à créer. + /// Le service créé. [HttpPost] - public async Task CreateService([FromBody] ServiceCreateDto serviceInputDto) + [Authorize(Roles = "admin")] + public async Task CreateService([FromBody] ServiceCreateDto serviceInputDto) { var result = await _serviceService.CreateService(serviceInputDto); - return result.Success ? Ok(result) : BadRequest(result); - } + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Endpoint qui met à jour un service. + /// + /// Les informations du service à mettre à jour. + /// Le service mis à jour. + [HttpPut] + [Authorize(Roles = "admin")] + public async Task UpdateService([FromBody] ServiceUpdateDto serviceUpdateDto) + { + var result = await _serviceService.UpdateService(serviceUpdateDto); + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + + /// + /// Endpoint qui supprime un service. + /// + /// L'ID du service à supprimer. + /// Un message de confirmation de suppression. + [HttpDelete("{id}")] + [Authorize(Roles = "admin")] + public async Task DeleteService(int id) + { + var result = await _serviceService.DeleteService(id); + return result.Success ? Ok(result.Message) : BadRequest(result.Message); + } } \ No newline at end of file diff --git a/ldap-cesi/Controllers/SiteController.cs b/ldap-cesi/Controllers/SiteController.cs new file mode 100644 index 0000000..50664dc --- /dev/null +++ b/ldap-cesi/Controllers/SiteController.cs @@ -0,0 +1,84 @@ +using ldap_cesi.DTOs.Inputs.Site; +using ldap_cesi.Services.Interfaces; +using Microsoft.AspNetCore.Mvc; + +namespace ldap_cesi.Controllers; + +[ApiController] +[Route("/api/site")] +public class SiteController : ControllerBase +{ + private readonly ISiteService _siteService; + + public SiteController(ISiteService siteService) + { + _siteService = siteService; + } + + // GET: api/site + /// + /// Récupère la liste de tous les sites. + /// + /// Retourne une liste de tous les sites. + [HttpGet] + public async Task GetSites() + { + var result = await _siteService.GetAll(); + return result.Success ? Ok(result) : BadRequest(result); + } + + // GET: api/site/{id} + /// + /// Récupère un site spécifique par son identifiant. + /// + /// L'identifiant du site à récupérer. + /// Retourne le site correspondant à l'identifiant. + /// Le site a été récupéré avec succès. + /// Une erreur s'est produite lors de la récupération du site. + /// Le site n'a pas été trouvé. + [HttpGet("{id}")] + public async Task GetSite(int id) + { + var result = await _siteService.GetById(id); + return result.Success ? Ok(result) : BadRequest(result); + } + + // POST: api/site + /// + /// Crée un nouveau site. + /// + /// Les données du site à créer. + /// Retourne l'identifiant du site créé. + [HttpPost] + public async Task CreateSite([FromBody] SiteCreateDto siteCreateDto) + { + var result = await _siteService.CreateSite(siteCreateDto); + return result.Success ? Ok(result) : BadRequest(result); + } + + // PUT: api/site + /// + /// Met à jour un site existant. + /// + /// Les données du site à mettre à jour. + /// Retourne l'objet ou une erreur. + [HttpPut] + public async Task UpdateSite([FromBody] SiteUpdateDto siteUpdateDto) + { + var result = await _siteService.UpdateSite(siteUpdateDto); + return result.Success ? Ok(result) : BadRequest(result); + } + + // DELETE: api/site/{id} + /// + /// Supprime un site par son identifiant. + /// + /// L'identifiant du site à supprimer. + /// Retourne l'id, ou l'erreur + [HttpDelete("{id}")] + public async Task DeleteSite(int id) + { + var result = await _siteService.DeleteSite(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 f9b5a51..c56ca6f 100644 --- a/ldap-cesi/Controllers/UtilisateurController.cs +++ b/ldap-cesi/Controllers/UtilisateurController.cs @@ -1,5 +1,6 @@ using ldap_cesi.DTOs.Inputs; using ldap_cesi.Services.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace ldap_cesi.Controllers; @@ -13,35 +14,42 @@ public class UtilisateurController : ControllerBase { _utilisateurService = utilisateurService; } - + + + /// + /// Endpoint pour la connexion des utilisateurs. + /// + /// Les informations de connexion de l'utilisateur. + /// Un token JWT si la connexion est réussie. [HttpPost("login")] public async Task Login([FromBody] UtilisateurLoginDto utilisateurInput) { var response = await _utilisateurService.Login(utilisateurInput); return StatusCode(response.StatusCode, response); } - - // GET: api/utilisateurs + /// - /// Endpoint qui retournes tous les utilisateurs + /// Endpoint pour récupérer tous les utilisateurs. /// - /// List + /// Une liste d'utilisateurs. [HttpGet] - public async Task GetUtilisateurs() + [Authorize(Roles = "admin")] + public async Task GetUtilisateurs() { var result = await _utilisateurService.GetAll(); - return result.Success ? Ok(result) : BadRequest(result); - } - - // GET: api/utilisateur + return result.Success ? Ok(result.Data) : BadRequest(result.Message); + } + /// - /// Endpoint retourne l'utilisateur correspondant à l'id en param + /// Endpoint pour récupérer un utilisateur par son ID. /// - /// Utilisateur + /// L'ID de l'utilisateur. + /// L'utilisateur correspondant à l'ID. [HttpGet("{id}")] - public async Task GetUtilisateurById(int id) + [Authorize(Roles = "admin")] + public async Task GetUtilisateurById(int id) { var result = await _utilisateurService.GetById(id); - return result.Success ? Ok(result) : BadRequest(result); + return result.Success ? Ok(result.Data) : BadRequest(result.Message); } } \ No newline at end of file diff --git a/ldap-cesi/DTOs/Generic/ServiceDto.cs b/ldap-cesi/DTOs/Generic/ServiceDto.cs new file mode 100644 index 0000000..f786ae4 --- /dev/null +++ b/ldap-cesi/DTOs/Generic/ServiceDto.cs @@ -0,0 +1,8 @@ +namespace ldap_cesi.DTOs; + +public class ServiceDto +{ + public int Id { get; set; } + + public string Nom { get; set; } +} \ No newline at end of file diff --git a/ldap-cesi/DTOs/Generic/SiteDto.cs b/ldap-cesi/DTOs/Generic/SiteDto.cs new file mode 100644 index 0000000..82fa364 --- /dev/null +++ b/ldap-cesi/DTOs/Generic/SiteDto.cs @@ -0,0 +1,8 @@ +namespace ldap_cesi.DTOs; + +public class SiteDto +{ + public int Id { get; set; } + + public string Ville { get; set; } +} \ No newline at end of file diff --git a/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs b/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs index 7804ce4..9842778 100644 --- a/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs +++ b/ldap-cesi/DTOs/Inputs/Salarie/SalarieCreateDto.cs @@ -4,8 +4,8 @@ public class SalarieCreateDto { public string Nom { get; set; } public string Prenom { get; set; } - public string Telephone_fix { get; set; } - public string Telephone_portable { get; set; } + public string TelephoneFix { get; set; } + public string TelephonePortable { get; set; } public string Email { get; set; } public int IdSite { get; set; } public int IdService { get; set; } diff --git a/ldap-cesi/DTOs/Outputs/Salarie/SalarieListDto.cs b/ldap-cesi/DTOs/Outputs/Salarie/SalarieListDto.cs new file mode 100644 index 0000000..07fccb5 --- /dev/null +++ b/ldap-cesi/DTOs/Outputs/Salarie/SalarieListDto.cs @@ -0,0 +1,12 @@ +namespace ldap_cesi.DTOs.Outputs.Salarie; + +public class SalarieListDto +{ + + public int Id { get; set; } + public string Nom { get; set; } + public string Prenom { get; set; } + public string NomComplet => $"{Prenom} {Nom}"; + public ServiceDto Service { get; set; } + public SiteDto Site { get; set; } +} \ No newline at end of file diff --git a/ldap-cesi/DTOs/Outputs/Salarie/SalarieOutputDetail.cs b/ldap-cesi/DTOs/Outputs/Salarie/SalarieOutputDetail.cs new file mode 100644 index 0000000..060b7cd --- /dev/null +++ b/ldap-cesi/DTOs/Outputs/Salarie/SalarieOutputDetail.cs @@ -0,0 +1,19 @@ +namespace ldap_cesi.DTOs.Outputs.Salarie; + +public class SalarieOutputDetail +{ + public int Id { get; set; } + + public string Nom { get; set; } + + public string Prenom { get; set; } + + public string TelephoneFixe { get; set; } + + public string TelephonePortable { get; set; } + + public string Email { get; set; } + + public ServiceDto Service { get; set; } + public SiteDto Site { get; set; } +} \ No newline at end of file diff --git a/ldap-cesi/Mapper/AutoMapperProfile.cs b/ldap-cesi/Mapper/AutoMapperProfile.cs index 15fc504..8d3924e 100644 --- a/ldap-cesi/Mapper/AutoMapperProfile.cs +++ b/ldap-cesi/Mapper/AutoMapperProfile.cs @@ -1,5 +1,9 @@ using AutoMapper; +using ldap_cesi.DTOs; +using ldap_cesi.DTOs.Inputs.Salarie; using ldap_cesi.DTOs.Inputs.Service; +using ldap_cesi.DTOs.Inputs.Site; +using ldap_cesi.DTOs.Outputs.Salarie; using ldap_cesi.DTOs.Outputs.Utilisateur; using ldap_cesi.Entities; @@ -9,8 +13,30 @@ public class AutoMapperProfile : Profile { public AutoMapperProfile() { + // INPUTS MAPPER + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFix)) + .ForMember(dest => dest.TelephonePortable, opt => opt.MapFrom(src => src.TelephonePortable)); + CreateMap() + .ForMember(dest => dest.TelephoneFixe, opt => opt.MapFrom(src => src.TelephoneFixe)) + .ForMember(dest => dest.TelephonePortable, opt => opt.MapFrom(src => src.TelephonePortable)); + + + //OUTPUTS MAPPER CreateMap() .ForMember(dest => dest.RoleNom, opt => opt.MapFrom(src => src.IdRoleNavigation.Nom)); - CreateMap(); + CreateMap() + .ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation)) + .ForMember(dest => dest.Site, opt => opt.MapFrom(src => src.IdSiteNavigation)); + CreateMap() + .ForMember(dest => dest.Service, opt => opt.MapFrom(src => src.IdServiceNavigation.Nom)) + .ForMember(dest => dest.Site, opt => opt.MapFrom(src => src.IdSiteNavigation.Ville)); + CreateMap(); + CreateMap(); + CreateMap(); } } \ No newline at end of file diff --git a/ldap-cesi/Models/IEntity.cs b/ldap-cesi/Models/IEntity.cs new file mode 100644 index 0000000..2120b39 --- /dev/null +++ b/ldap-cesi/Models/IEntity.cs @@ -0,0 +1,6 @@ +namespace ldap_cesi.Models; + +public interface IEntity +{ + int Id { 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 1057e98..1daf9fb 100644 --- a/ldap-cesi/Repositories/Interfaces/IRepositoryBase.cs +++ b/ldap-cesi/Repositories/Interfaces/IRepositoryBase.cs @@ -8,8 +8,8 @@ public interface IRepositoryBase where TEntity : class Task AnyAsync(Expression> predicate, CancellationToken cancellationToken = default); Task GetByIdAsync(TId id, CancellationToken cancellationToken = default) where TId : notnull; Task> GetAllAsync(CancellationToken cancellationToken = default); - Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default); - Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default); + Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default); + Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default); Task FirstOrDefaultAsync(Expression> predicate, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/ldap-cesi/Repositories/Interfaces/IRepositorySalarie.cs b/ldap-cesi/Repositories/Interfaces/IRepositorySalarie.cs index c281f5f..410c326 100644 --- a/ldap-cesi/Repositories/Interfaces/IRepositorySalarie.cs +++ b/ldap-cesi/Repositories/Interfaces/IRepositorySalarie.cs @@ -4,5 +4,8 @@ namespace ldap_cesi.Repository.Services; public interface IRepositorySalarie : IRepositoryBase { - + Task GetSalarieWithRelationsAsync(int id); + Task> SearchByNameAsync(string inputRecherche); + Task> GetSalariesBySiteAsync(int siteId); + Task> GetSalariesByServiceAsync(int serviceId); } \ No newline at end of file diff --git a/ldap-cesi/Repositories/RepositoryBase.cs b/ldap-cesi/Repositories/RepositoryBase.cs index 911ddcd..3253321 100644 --- a/ldap-cesi/Repositories/RepositoryBase.cs +++ b/ldap-cesi/Repositories/RepositoryBase.cs @@ -1,5 +1,6 @@ using System.Linq.Expressions; using ldap_cesi.Context; +using ldap_cesi.Models; using ldap_cesi.Repository.Services; using Microsoft.EntityFrameworkCore; @@ -49,12 +50,13 @@ public class RepositoryBase : IRepositoryBase where TEntity : return await _context.Set().FirstOrDefaultAsync(predicate, cancellationToken); } - public virtual async Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default) + public virtual async Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default) { try { _context.Set().Update(entity); await SaveChangesAsync(cancellationToken); + return true; } catch (Exception ex) { @@ -74,12 +76,13 @@ public class RepositoryBase : IRepositoryBase where TEntity : } } - public virtual async Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default) + public virtual async Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default) { try { _context.Set().Remove(entity); await SaveChangesAsync(cancellationToken); + return true; } catch (Exception ex) { diff --git a/ldap-cesi/Repositories/SalarieRepository.cs b/ldap-cesi/Repositories/SalarieRepository.cs index bb84bb1..cb5d329 100644 --- a/ldap-cesi/Repositories/SalarieRepository.cs +++ b/ldap-cesi/Repositories/SalarieRepository.cs @@ -1,6 +1,7 @@ using ldap_cesi.Context; using ldap_cesi.Entities; using ldap_cesi.Repository.Services; +using Microsoft.EntityFrameworkCore; namespace ldap_cesi.Repository; @@ -10,4 +11,39 @@ public class SalarieRepository : RepositoryBase, IRepositorySalarie { } + + public async Task GetSalarieWithRelationsAsync(int id) + { + return await _context.Salaries + .Include(s => s.IdServiceNavigation) + .Include(s => s.IdSiteNavigation) + .FirstOrDefaultAsync(s => s.Id == id); + } + + public async Task> SearchByNameAsync(string inputRecherche) + { + return await _context.Salaries + .Where(s => s.Nom.Contains(inputRecherche) || s.Prenom.Contains(inputRecherche)) + .Include(s => s.IdServiceNavigation) + .Include(s => s.IdSiteNavigation) + .ToListAsync(); + } + + public async Task> GetSalariesBySiteAsync(int siteId) + { + return await _context.Salaries + .Where(s => s.IdSite == siteId) + .Include(s => s.IdServiceNavigation) + .Include(s => s.IdSiteNavigation) + .ToListAsync(); + } + + public async Task> GetSalariesByServiceAsync(int serviceId) + { + return await _context.Salaries + .Where(s => s.IdService == serviceId) + .Include(s => s.IdServiceNavigation) + .Include(s => s.IdSiteNavigation) + .ToListAsync(); + } } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/ISalarieService.cs b/ldap-cesi/Services/Interfaces/ISalarieService.cs index c6bce16..5318fa7 100644 --- a/ldap-cesi/Services/Interfaces/ISalarieService.cs +++ b/ldap-cesi/Services/Interfaces/ISalarieService.cs @@ -1,3 +1,6 @@ +using ldap_cesi.DTOs.Inputs.Salarie; +using ldap_cesi.DTOs.Inputs.Service; +using ldap_cesi.DTOs.Outputs.Salarie; using ldap_cesi.Entities; using ldap_cesi.Models; @@ -7,4 +10,10 @@ public interface ISalarieService { Task>> GetAll(); Task> GetById(int id); + Task>> GetSalariesBySite(int siteId); + Task>> GetSalariesByService(int serviceId); + Task> Create(SalarieCreateDto salarieInput); + Task> Update(SalarieUpdateDto salarieInput); + Task> Delete(int id); + Task> GetCompletById(int id); } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/IServiceService.cs b/ldap-cesi/Services/Interfaces/IServiceService.cs index f44a387..4247928 100644 --- a/ldap-cesi/Services/Interfaces/IServiceService.cs +++ b/ldap-cesi/Services/Interfaces/IServiceService.cs @@ -9,4 +9,6 @@ public interface IServiceService Task>> GetAll(); Task> GetById(int id); Task> CreateService(ServiceCreateDto serviceCreateDto); + Task> UpdateService(ServiceUpdateDto serviceUpdateDto); + Task> DeleteService(int id); } \ No newline at end of file diff --git a/ldap-cesi/Services/Interfaces/ISiteService.cs b/ldap-cesi/Services/Interfaces/ISiteService.cs index 2b37660..cdff833 100644 --- a/ldap-cesi/Services/Interfaces/ISiteService.cs +++ b/ldap-cesi/Services/Interfaces/ISiteService.cs @@ -1,6 +1,15 @@ +using ldap_cesi.DTOs.Inputs.Service; +using ldap_cesi.DTOs.Inputs.Site; +using ldap_cesi.Entities; +using ldap_cesi.Models; + namespace ldap_cesi.Services.Interfaces; public interface ISiteService { - + Task>> GetAll(); + Task> GetById(int id); + Task> CreateSite(SiteCreateDto siteCreateDto); + Task> UpdateSite(SiteUpdateDto siteUpdate); + Task> DeleteSite(int id); } \ No newline at end of file diff --git a/ldap-cesi/Services/SalarieService.cs b/ldap-cesi/Services/SalarieService.cs index be4410a..69c8108 100644 --- a/ldap-cesi/Services/SalarieService.cs +++ b/ldap-cesi/Services/SalarieService.cs @@ -1,17 +1,28 @@ +using AutoMapper; +using ldap_cesi.DTOs.Inputs.Salarie; +using ldap_cesi.DTOs.Inputs.Service; +using ldap_cesi.DTOs.Outputs.Salarie; using ldap_cesi.Entities; using ldap_cesi.Models; using ldap_cesi.Repository.Services; using ldap_cesi.Services.Interfaces; +using ldap_cesi.Validator.Salarie; namespace ldap_cesi.Services; public class SalarieService : ISalarieService { private IRepositorySalarie _repositorySalarie; + private readonly IRepositorySite _repositorySite; + private readonly IRepositoryService _repositoryService; + private readonly IMapper _mapper; - public SalarieService(IRepositorySalarie repositorySalarie) + public SalarieService(IRepositorySalarie repositorySalarie, IMapper mapper, IRepositorySite repositorySite, IRepositoryService repositoryService) { _repositorySalarie = repositorySalarie; + _repositorySite = repositorySite; + _repositoryService = repositoryService; + _mapper = mapper; } public async Task>> GetAll() @@ -27,12 +38,202 @@ public class SalarieService : ISalarieService public async Task> GetById(int id) { - var service = await _repositorySalarie.GetByIdAsync(id); + var salarie = await _repositorySalarie.GetSalarieWithRelationsAsync(id); return new ResponseDataModel { Success = true, - Data = service, + Data = salarie, + StatusCode = 200, + }; + } + + public async Task> 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) + { + var site = await _repositorySite.GetByIdAsync(siteId); + if (site == null) + { + return new ResponseDataModel> + { + Success = false, + Message = "Site non trouvé", + StatusCode = 404 + }; + } + + var salaries = await _repositorySalarie.GetSalariesBySiteAsync(siteId); + if (!salaries.Any()) + { + return new ResponseDataModel> + { + Success = true, + Message = "Aucun salarié trouvé pour ce site", + Data = new List(), + StatusCode = 200 + }; + } + + var salariesDto = _mapper.Map>(salaries); + + return new ResponseDataModel> + { + Success = true, + Data = salariesDto, + StatusCode = 200 + }; + } + + public async Task>> GetSalariesByService(int serviceId) + { + var service = await _repositoryService.GetByIdAsync(serviceId); + if (service == null) + { + return new ResponseDataModel> + { + Success = false, + Message = "Service non trouvé", + StatusCode = 404 + }; + } + + var salaries = await _repositorySalarie.GetSalariesByServiceAsync(serviceId); + var salariesDto = _mapper.Map>(salaries); + + return new ResponseDataModel> + { + Success = true, + Data = salariesDto, + 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/ServiceService.cs b/ldap-cesi/Services/ServiceService.cs index c29cb22..608496f 100644 --- a/ldap-cesi/Services/ServiceService.cs +++ b/ldap-cesi/Services/ServiceService.cs @@ -4,6 +4,7 @@ using ldap_cesi.Entities; using ldap_cesi.Models; using ldap_cesi.Repository.Services; using ldap_cesi.Services.Interfaces; +using ldap_cesi.Validator.Service; namespace ldap_cesi.Services; @@ -43,12 +44,107 @@ public class ServiceService : IServiceService public async Task> CreateService(ServiceCreateDto serviceCreateDto) { + var validation = new ServiceCreateValidator(); + var result = validation.Validate(serviceCreateDto); + if (!result.IsValid) + { + return new ResponseDataModel + { + StatusCode = 400, + Success = false, + Message = "Données du service invalides: " + string.Join(", ", result.Errors) + }; + } var service = _mapper.Map(serviceCreateDto); var response = await _repositoryService.AddAsync(service); return new ResponseDataModel { + StatusCode = 201, Success = true, Data = response.Id.ToString(), }; } + + public async Task> UpdateService(ServiceUpdateDto serviceUpdateDto) + { + var validation = new ServiceUpdateValidator(); + var result = validation.Validate(serviceUpdateDto); + if (!result.IsValid) + { + return new ResponseDataModel + { + 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 + { + Success = false, + Message = "Service introuvable.", + StatusCode = 404 + }; + } + + var service = _mapper.Map(serviceUpdateDto, serviceFind); + var response = await _repositoryService.UpdateAsync(service); + if (!response) + { + return new ResponseDataModel + { + StatusCode = 500, + Success = false, + Message = "Erreur lors de la mise à jour du service : " + string.Join(", ", result.Errors) + }; + } + return new ResponseDataModel + { + StatusCode = 200, + Success = true, + Data = service, + }; + } + + public async Task> DeleteService(int idService) + { + if (idService == null) + { + return new ResponseDataModel + { + StatusCode = 400, + Success = false, + Message = "Id manquant" + }; + } + + var service = await _repositoryService.GetByIdAsync(idService); + if (service == null) + { + return new ResponseDataModel + { + Success = false, + Message = "Service introuvable.", + StatusCode = 404 + }; + } + var response = await _repositoryService.DeleteAsync(service); + if (!response) + { + return new ResponseDataModel + { + StatusCode = 500, + Success = false, + Message = "Erreur durant la suppression du service" + }; + } + return new ResponseDataModel + { + StatusCode = 200, + Success = true, + Data = service.Id.ToString(), + }; + } } \ No newline at end of file diff --git a/ldap-cesi/Services/SiteService.cs b/ldap-cesi/Services/SiteService.cs new file mode 100644 index 0000000..5d5628d --- /dev/null +++ b/ldap-cesi/Services/SiteService.cs @@ -0,0 +1,151 @@ +using AutoMapper; +using ldap_cesi.DTOs.Inputs.Site; +using ldap_cesi.Entities; +using ldap_cesi.Models; +using ldap_cesi.Repository.Services; +using ldap_cesi.Services.Interfaces; +using ldap_cesi.Validator.Site; + +namespace ldap_cesi.Services; + +public class SiteService : ISiteService +{ + + private readonly IRepositorySite _repositorySite; + private readonly IMapper _mapper; + + public SiteService(IRepositorySite repositorySite, IMapper mapper) + { + _repositorySite = repositorySite; + _mapper = mapper; + } + + public async Task>> GetAll() + { + var sites = await _repositorySite.GetAllAsync(); + return new ResponseDataModel> + { + Success = true, + Data = sites, + StatusCode = 200, + }; + } + + public async Task> GetById(int id) + { + var site = await _repositorySite.GetByIdAsync(id); + return new ResponseDataModel + { + Success = true, + Data = site, + StatusCode = 200, + }; + } + + public async Task> CreateSite(SiteCreateDto siteCreateDto) + { + var validation = new SiteCreateValidator(); + var result = validation.Validate(siteCreateDto); + if (!result.IsValid) + { + return new ResponseDataModel + { + StatusCode = 400, + Success = false, + Message = "Données du site invalides: " + string.Join(", ", result.Errors) + }; + } + var site = _mapper.Map(siteCreateDto); + var response = await _repositorySite.AddAsync(site); + return new ResponseDataModel + { + StatusCode = 201, + Success = true, + Data = response.Id.ToString(), + }; + } + + public async Task> UpdateSite(SiteUpdateDto siteUpdate) + { + var validation = new SiteUpdateValidator(); + var result = validation.Validate(siteUpdate); + if (!result.IsValid) + { + return new ResponseDataModel + { + 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 + { + Success = false, + Message = "Site introuvable.", + StatusCode = 404 + }; + } + + var site = _mapper.Map(siteUpdate, siteFind); + var response = await _repositorySite.UpdateAsync(site); + if (!response) + { + return new ResponseDataModel + { + StatusCode = 500, + Success = false, + Message = "Erreur lors de la mise à jour du site : " + string.Join(", ", result.Errors) + }; + } + return new ResponseDataModel + { + StatusCode = 200, + Success = true, + Data = site, + }; + } + + public async Task> DeleteSite(int id) + { + if (id == null) + { + return new ResponseDataModel + { + StatusCode = 400, + Success = false, + Message = "Id manquant" + }; + } + + var site = await _repositorySite.GetByIdAsync(id); + if (site == null) + { + return new ResponseDataModel + { + Success = false, + Message = "Site introuvable.", + StatusCode = 404 + }; + } + var response = await _repositorySite.DeleteAsync(site); + if (!response) + { + return new ResponseDataModel + { + StatusCode = 500, + Success = false, + Message = "Erreur durant la suppression du site" + }; + } + return new ResponseDataModel + { + StatusCode = 200, + Success = true, + Data = site.Id.ToString(), + }; + } +} \ No newline at end of file diff --git a/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs b/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs new file mode 100644 index 0000000..a53fc1c --- /dev/null +++ b/ldap-cesi/Validator/Salarie/SalarieCreateValidator.cs @@ -0,0 +1,37 @@ +using FluentValidation; +using ldap_cesi.DTOs.Inputs.Salarie; + +namespace ldap_cesi.Validator.Salarie; + +public class SalarieCreateValidator : AbstractValidator +{ + public SalarieCreateValidator() + { + RuleFor(x => x.Nom) + .NotEmpty().WithMessage("Le nom est requis.") + .MaximumLength(50).WithMessage("Le nom ne doit pas dépasser 50 caractères."); + + RuleFor(x => x.Prenom) + .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) + .NotEmpty().WithMessage("Le téléphone fixe est requis.") + .MaximumLength(15).WithMessage("Le téléphone fixe ne doit pas dépasser 15 caractères."); + + RuleFor(x => x.TelephonePortable) + .NotEmpty().WithMessage("Le téléphone portable est requis.") + .MaximumLength(15).WithMessage("Le téléphone portable ne doit pas dépasser 15 caractères."); + + RuleFor(x => x.Email) + .NotEmpty().WithMessage("L'email est requis.") + .EmailAddress().WithMessage("L'email n'est pas valide.") + .MaximumLength(50).WithMessage("L'email ne doit pas dépasser 50 caractères."); + + RuleFor(x => x.IdSite) + .NotEmpty().WithMessage("L'ID du site est requis."); + + RuleFor(x => x.IdService) + .NotEmpty().WithMessage("L'ID du service est requis."); + } +} \ No newline at end of file diff --git a/ldap-cesi/Validator/Salarie/SalarieUpdateValidator.cs b/ldap-cesi/Validator/Salarie/SalarieUpdateValidator.cs new file mode 100644 index 0000000..a755c82 --- /dev/null +++ b/ldap-cesi/Validator/Salarie/SalarieUpdateValidator.cs @@ -0,0 +1,39 @@ +using FluentValidation; +using ldap_cesi.DTOs.Inputs.Service; + +namespace ldap_cesi.Validator.Salarie; + +public class SalarieUpdateValidator : AbstractValidator +{ + public SalarieUpdateValidator() + { + RuleFor(x => x.Id) + .NotEmpty().WithMessage("L'identifiant du salarié est requis."); + RuleFor(x => x.Nom) + .NotEmpty().WithMessage("Le nom est requis.") + .MaximumLength(50).WithMessage("Le nom ne doit pas dépasser 50 caractères."); + + RuleFor(x => x.Prenom) + .NotEmpty().WithMessage("Le prénom est requis.") + .MaximumLength(50).WithMessage("Le prénom ne doit pas dépasser 50 caractères."); + + RuleFor(x => x.TelephoneFixe) + .NotEmpty().WithMessage("Le téléphone fixe est requis.") + .MaximumLength(15).WithMessage("Le téléphone fixe ne doit pas dépasser 15 caractères."); + + RuleFor(x => x.TelephonePortable) + .NotEmpty().WithMessage("Le téléphone portable est requis.") + .MaximumLength(15).WithMessage("Le téléphone portable ne doit pas dépasser 15 caractères."); + + RuleFor(x => x.Email) + .NotEmpty().WithMessage("L'email est requis.") + .EmailAddress().WithMessage("L'email n'est pas valide.") + .MaximumLength(50).WithMessage("L'email ne doit pas dépasser 50 caractères."); + + RuleFor(x => x.IdSite) + .NotEmpty().WithMessage("L'ID du site est requis."); + + RuleFor(x => x.IdService) + .NotEmpty().WithMessage("L'ID du service est requis."); + } +} \ No newline at end of file diff --git a/ldap-cesi/Validator/Service/ServiceCreateValidator.cs b/ldap-cesi/Validator/Service/ServiceCreateValidator.cs new file mode 100644 index 0000000..48f58dd --- /dev/null +++ b/ldap-cesi/Validator/Service/ServiceCreateValidator.cs @@ -0,0 +1,14 @@ +using FluentValidation; +using ldap_cesi.DTOs.Inputs.Service; + +namespace ldap_cesi.Validator.Service; + +public class ServiceCreateValidator : AbstractValidator +{ + public ServiceCreateValidator() + { + RuleFor(x => x.Nom) + .NotEmpty().WithMessage("Le nom est requis.") + .MaximumLength(50).WithMessage("Le nom ne doit pas dépasser 50 caractères."); + } +} \ No newline at end of file diff --git a/ldap-cesi/Validator/Service/ServiceUpdateValidator.cs b/ldap-cesi/Validator/Service/ServiceUpdateValidator.cs new file mode 100644 index 0000000..a2362f5 --- /dev/null +++ b/ldap-cesi/Validator/Service/ServiceUpdateValidator.cs @@ -0,0 +1,18 @@ +using FluentValidation; +using ldap_cesi.DTOs.Inputs.Service; + +namespace ldap_cesi.Validator.Service; + +public class ServiceUpdateValidator : AbstractValidator +{ + public ServiceUpdateValidator() + { + RuleFor(x => x.Nom) + .NotEmpty().WithMessage("Le nom est requis.") + .MaximumLength(50).WithMessage("Le nom ne doit pas dépasser 50 caractères."); + RuleFor(x => x.Id) + .NotEmpty().WithMessage("L'identifiant du service est requis."); + + } + +} \ No newline at end of file diff --git a/ldap-cesi/Validator/Site/SiteCreateValidator.cs b/ldap-cesi/Validator/Site/SiteCreateValidator.cs new file mode 100644 index 0000000..16ea713 --- /dev/null +++ b/ldap-cesi/Validator/Site/SiteCreateValidator.cs @@ -0,0 +1,14 @@ +using FluentValidation; +using ldap_cesi.DTOs.Inputs.Site; + +namespace ldap_cesi.Validator.Site; + +public class SiteCreateValidator : AbstractValidator +{ + public SiteCreateValidator() + { + RuleFor(x => x.Ville) + .NotEmpty().WithMessage("Le nom est requis.") + .MaximumLength(150).WithMessage("Le nom de la ville ne doit pas dépasser 150 caractères."); + } +} \ No newline at end of file diff --git a/ldap-cesi/Validator/Site/SiteUpdateValidator.cs b/ldap-cesi/Validator/Site/SiteUpdateValidator.cs new file mode 100644 index 0000000..1efd5a5 --- /dev/null +++ b/ldap-cesi/Validator/Site/SiteUpdateValidator.cs @@ -0,0 +1,16 @@ +using FluentValidation; +using ldap_cesi.DTOs.Inputs.Site; + +namespace ldap_cesi.Validator.Site; + +public class SiteUpdateValidator : AbstractValidator +{ + public SiteUpdateValidator() + { + RuleFor(x => x.Ville) + .NotEmpty().WithMessage("Le nom est requis.") + .MaximumLength(150).WithMessage("Le nom de la ville ne doit pas dépasser 150 caractères."); + RuleFor(x => x.Id) + .NotEmpty().WithMessage("L'identifiant du site est requis."); + } +} \ No newline at end of file diff --git a/ldap-cesi/ldap-cesi.csproj b/ldap-cesi/ldap-cesi.csproj index f06e052..5070353 100644 --- a/ldap-cesi/ldap-cesi.csproj +++ b/ldap-cesi/ldap-cesi.csproj @@ -31,7 +31,6 @@ -