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 @@
-