From b0f6787f295bd2ad71c354bb87ccd48380d15d4e Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Fri, 11 Sep 2020 10:07:20 +0200 Subject: [PATCH 01/12] Modification des controles des listes nulles dans l'api formation --- Controllers/FormationsApi.cs | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/Controllers/FormationsApi.cs b/Controllers/FormationsApi.cs index 561eb2e..07303c1 100644 --- a/Controllers/FormationsApi.cs +++ b/Controllers/FormationsApi.cs @@ -11,16 +11,12 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; -using Swashbuckle.AspNetCore.SwaggerGen; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using IO.Swagger.Attributes; -using IO.Swagger.Security; -using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; using EPAServeur.IServices; -using System.Reflection.Metadata.Ecma335; -using System.Runtime.InteropServices.WindowsRuntime; +using System.Linq; namespace IO.Swagger.Controllers { @@ -55,14 +51,6 @@ namespace IO.Swagger.Controllers FormationDTO nouvelleFormation = formationService.AddFormation(body); return Created("", nouvelleFormation); - //if (body.Id != null && body.Id > 0) - //{ - // return StatusCode(201, body); - //} - //else - //{ - // return NotFound(); - //} } /// @@ -89,6 +77,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreur); } + return NoContent(); } @@ -117,7 +106,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetFormationAnnulees(asc, numPage, parPAge, idAgence, texte, tri); - if (formations == null) + if (formations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -186,7 +175,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetFormationRealisee(asc, numPage, parPAge, idAgence, texte, tri); - if (formations == null) + if (formations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -224,7 +213,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetFormations(asc, numPage, parPAge, idAgence, texte, tri); - if (formations == null) + if (formations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -254,7 +243,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable modeFormations = formationService.GetModesFormation(); - if (modeFormations == null) + if (modeFormations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -284,7 +273,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable origineFormations = formationService.GetOriginesFormation(); - if (origineFormations == null) + if (origineFormations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -322,7 +311,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetProchainesFormation(asc, numPage, parPAge, idAgence, texte, tri); - if (formations == null) + if (formations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -352,7 +341,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable statutFormations = formationService.GetStatutsFormation(); - if (statutFormations == null) + if (statutFormations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { @@ -382,7 +371,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable typeFormations = formationService.GetTypesFormation(); - if (typeFormations == null) + if (typeFormations.Count() == 0) { ErreurDTO erreur = new ErreurDTO() { From d673d32cb36eedefc98d1d4184d26c1eb34cf7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Fri, 11 Sep 2020 15:18:22 +0200 Subject: [PATCH 02/12] =?UTF-8?q?Premiers=20affichages=20de=20log=20effect?= =?UTF-8?q?u=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/CollaborateursApi.cs | 17 ++++++++++++----- EPAServeur.csproj | 1 + Program.cs | 4 ++++ Properties/launchSettings.json | 2 +- Startup.cs | 11 ++++------- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Controllers/CollaborateursApi.cs b/Controllers/CollaborateursApi.cs index ead8209..3bfc315 100644 --- a/Controllers/CollaborateursApi.cs +++ b/Controllers/CollaborateursApi.cs @@ -19,6 +19,7 @@ using IO.Swagger.Security; using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; using EPAServeur.IServices; +using Microsoft.Extensions.Logging; namespace IO.Swagger.Controllers { @@ -29,9 +30,11 @@ namespace IO.Swagger.Controllers public class CollaborateursApiController : ControllerBase { private readonly ICollaborateurService collaborateurService; - public CollaborateursApiController(ICollaborateurService _collaborateurService) + private readonly ILogger logger; + public CollaborateursApiController(ICollaborateurService _collaborateurService, ILogger _logger) { collaborateurService = _collaborateurService; + logger = _logger; } /// /// @@ -53,10 +56,11 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); - + logger.LogInformation("Récupération du collaborateur d'ID {idCollaborateur}", idCollaborateur); CollaborateurDTO collaborateurDTO = collaborateurService.GetCollaborateurById(idCollaborateur); if( collaborateurDTO == null) { + logger.LogWarning("Le ccollaborateur {id} est introuvable", idCollaborateur); ErreurDTO erreurDTO = new ErreurDTO() { Code = "404", @@ -64,6 +68,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreurDTO); } + logger.LogInformation("Collaborateur {id} trouvée", idCollaborateur); return Ok(collaborateurDTO); } @@ -87,10 +92,11 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); - + logger.LogInformation("Récupération d'un collaborateur par le mail {mail}", mail); CollaborateurDTO collaborateurDTO = collaborateurService.GetCollaborateurByMail(mail); if (collaborateurDTO == null) { + logger.LogWarning("Le collaborateur {mail} est introuvable", mail); ErreurDTO erreurDTO = new ErreurDTO() { Code = "404", @@ -98,6 +104,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreurDTO); } + logger.LogInformation("Collaborateur {mail} trouvée", mail); return Ok(collaborateurDTO); } @@ -124,10 +131,10 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual IActionResult GetCollaborateurs([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]List fonctions, [FromQuery]long? idAgence, [FromQuery]long? idBU, [FromQuery]string texte, [FromQuery]string tri) - { + { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); - + logger.LogInformation("Récupération de la liste des collaborateurs"); return Ok(collaborateurService.GetCollaborateurs(asc, numPage, parPAge, fonctions, idAgence, idBU, texte, tri)); } diff --git a/EPAServeur.csproj b/EPAServeur.csproj index c4915ce..5900bca 100644 --- a/EPAServeur.csproj +++ b/EPAServeur.csproj @@ -10,6 +10,7 @@ + diff --git a/Program.cs b/Program.cs index dda309a..6ec487d 100644 --- a/Program.cs +++ b/Program.cs @@ -21,6 +21,10 @@ namespace EPAServeur public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) + .ConfigureLogging(logging => + { + logging.ClearProviders(); + }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json index 9790dad..0c92275 100644 --- a/Properties/launchSettings.json +++ b/Properties/launchSettings.json @@ -12,7 +12,7 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "api/notes/1", + "launchUrl": "api/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/Startup.cs b/Startup.cs index 7290f43..9ce6936 100644 --- a/Startup.cs +++ b/Startup.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using EPAServeur.Context; using EPAServeur.IServices; using EPAServeur.Services; @@ -10,12 +6,11 @@ using IO.Swagger.Security; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using System.IO; namespace EPAServeur { @@ -62,8 +57,10 @@ namespace EPAServeur } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory logger) { + string path = Directory.GetCurrentDirectory(); + logger.AddFile(path+"Log/loggerfile-{Date}.txt"); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); From 52977a45204c6abfa25aad103e5332bebf0479f4 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Fri, 11 Sep 2020 16:34:02 +0200 Subject: [PATCH 03/12] Modification des noms de variables dans le service formation et l'api formation --- Controllers/FormationsApi.cs | 18 ++++++++--------- IServices/IFormationService.cs | 6 +++--- Services/FormationService.cs | 36 ++++++++++++++++++++++------------ 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/Controllers/FormationsApi.cs b/Controllers/FormationsApi.cs index 9cfa4f1..812c683 100644 --- a/Controllers/FormationsApi.cs +++ b/Controllers/FormationsApi.cs @@ -106,7 +106,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetFormationAnnulees(asc, numPage, parPAge, idAgence, texte, tri); - if (formations.Count() == 0) + if (formations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -175,7 +175,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetFormationRealisee(asc, numPage, parPAge, idAgence, texte, tri); - if (formations.Count() == 0) + if (formations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -213,7 +213,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetFormations(asc, numPage, parPAge, idAgence, texte, tri); - if (formations.Count() == 0) + if (formations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -243,7 +243,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable modeFormations = formationService.GetModesFormation(); - if (modeFormations.Count() == 0) + if (modeFormations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -273,7 +273,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable origineFormations = formationService.GetOriginesFormation(); - if (origineFormations.Count() == 0) + if (origineFormations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -311,7 +311,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable formations = formationService.GetProchainesFormation(asc, numPage, parPAge, idAgence, texte, tri); - if (formations.Count() == 0) + if (formations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -341,7 +341,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable statutFormations = formationService.GetStatutsFormation(); - if (statutFormations.Count() == 0) + if (statutFormations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -371,7 +371,7 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... IEnumerable typeFormations = formationService.GetTypesFormation(); - if (typeFormations.Count() == 0) + if (typeFormations == null) { ErreurDTO erreur = new ErreurDTO() { @@ -401,7 +401,7 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual IActionResult UpdateFormation([FromBody] FormationDTO body, [FromRoute][Required] long? idFormation) { - FormationDTO formation = formationService.UpdateFormation(body); + FormationDTO formation = formationService.UpdateFormation(idFormation, body); if (formation == null) { formation = formationService.AddFormation(body); diff --git a/IServices/IFormationService.cs b/IServices/IFormationService.cs index dbe8278..2e5b0c5 100644 --- a/IServices/IFormationService.cs +++ b/IServices/IFormationService.cs @@ -10,7 +10,7 @@ namespace EPAServeur.IServices { public interface IFormationService { - FormationDTO GetFormationById(long? id); + FormationDTO GetFormationById(long? idFormation); IEnumerable GetFormations(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); IEnumerable GetFormationAnnulees(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); @@ -22,7 +22,7 @@ namespace EPAServeur.IServices IEnumerable GetTypesFormation(); FormationDTO AddFormation(FormationDTO formationDTO); - FormationDTO UpdateFormation(FormationDTO formationDTO); - bool DeleteFormationById(long? id); + FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO); + bool DeleteFormationById(long? idFormation); } } diff --git a/Services/FormationService.cs b/Services/FormationService.cs index 775bf3d..6d1a36a 100644 --- a/Services/FormationService.cs +++ b/Services/FormationService.cs @@ -35,15 +35,15 @@ namespace EPAServeur.Services /// /// Récupérer une formation par son id /// - /// + /// /// - public FormationDTO GetFormationById(long? id) + public FormationDTO GetFormationById(long? idFormation) { Formation formation = epContext.Formation.Include(formation => formation.Statut) .Include(formation => formation.ModeFormation) .Include(formation => formation.Origine) .Include(formation => formation.TypeFormation) - .FirstOrDefault(formation => formation.Id == id); + .FirstOrDefault(formation => formation.Id == idFormation); if (formation == null) return null; @@ -106,7 +106,7 @@ namespace EPAServeur.Services if (formations == null) - return new List(); + return null; formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); @@ -150,7 +150,7 @@ namespace EPAServeur.Services .Include(formation => formation.TypeFormation); if (formations == null) - return new List(); + return null; formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); @@ -214,7 +214,7 @@ namespace EPAServeur.Services if (formations == null) - return new List(); + return null; formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); @@ -268,7 +268,7 @@ namespace EPAServeur.Services } if (formations == null) - return new List(); + return null; formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); @@ -292,6 +292,9 @@ namespace EPAServeur.Services throw; } + if (modeFormations == null) + return null; + modeFormationDTOs = modeFormations.Select(modeFormation => GetModeFormationDTO(modeFormation)); return modeFormationDTOs; @@ -315,6 +318,9 @@ namespace EPAServeur.Services throw; } + if (origineFormations == null) + return null; + origineFormationDTOs = origineFormations.Select(origineFormation => GetOrigineFormationDTO(origineFormation)); return origineFormationDTOs; @@ -339,6 +345,9 @@ namespace EPAServeur.Services throw; } + if (statutFormations == null) + return null; + statutFormationDTOs = statutFormations.Select(statutFormation => GetStatutFormationDTO(statutFormation)); return statutFormationDTOs; @@ -362,6 +371,9 @@ namespace EPAServeur.Services throw; } + if (typeFormations == null) + return null; + typeFormationDTOs = typeFormations.Select(typeFormation => GetTypeFormationDTO(typeFormation)); return typeFormationDTOs; @@ -404,9 +416,9 @@ namespace EPAServeur.Services /// /// /// - public FormationDTO UpdateFormation(FormationDTO formationDTO) + public FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO) { - Formation formation = epContext.Formation.FirstOrDefault(formation => formation.Id == formationDTO.Id); + Formation formation = epContext.Formation.Find(idFormation); if (formation == null) { @@ -429,11 +441,11 @@ namespace EPAServeur.Services /// /// Supprimer une formation /// - /// + /// /// - public bool DeleteFormationById(long? id) + public bool DeleteFormationById(long? idFormation) { - Formation formation = epContext.Formation.FirstOrDefault(formation => formation.Id == id); + Formation formation = epContext.Formation.Find(idFormation); if (formation == null) return false; From 2144a10458f0d1d29c0bf768e4ee04c707e684cf Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Fri, 11 Sep 2020 16:38:54 +0200 Subject: [PATCH 04/12] Modification des commentaires dans le service formation --- Services/FormationService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Services/FormationService.cs b/Services/FormationService.cs index 6d1a36a..aaf7796 100644 --- a/Services/FormationService.cs +++ b/Services/FormationService.cs @@ -414,6 +414,7 @@ namespace EPAServeur.Services /// /// Modifier une formation /// + /// /// /// public FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO) From 8768f63fac8dc35f4ae00470694da3c7fe24461c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Mon, 14 Sep 2020 10:50:18 +0200 Subject: [PATCH 05/12] Ajout des commentaires du service collaborateur --- Services/CollaborateurService.cs | 99 +++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 7 deletions(-) diff --git a/Services/CollaborateurService.cs b/Services/CollaborateurService.cs index f098c48..c7bccce 100644 --- a/Services/CollaborateurService.cs +++ b/Services/CollaborateurService.cs @@ -12,16 +12,31 @@ using System.Threading.Tasks; namespace EPAServeur.Services { + /// + /// Service permettant de récupérer les informations collaborateurs. + /// public class CollaborateurService : ICollaborateurService { + #region Variables + /// + /// API pour accéder aux données collaborateur en passant par le service collaborateur + /// private readonly ICollaborateurApi collaborateurApi; + #endregion + #region Constructeurs public CollaborateurService(ICollaborateurApi _collaborateurApi) { collaborateurApi = _collaborateurApi; } + #endregion - + #region Services + /// + /// Récupérer un collaborateur en fonction d'un id + /// + /// Identifiant du collaborateur à renvoyer + /// Le collaborateur corresponant à l'id en paramètre public CollaborateurDTO GetCollaborateurById(Guid? id) { Collaborateur collaborateur = collaborateurApi.ChercherCollabId(id); @@ -30,6 +45,11 @@ namespace EPAServeur.Services return GetCollaborateurDTO(collaborateur); } + /// + /// Récupérer un collaborateur en fonction d'un mail + /// + /// Mail du collaborateur à renvoyer + /// Le collaborateur correspondant au mail en paramètre public CollaborateurDTO GetCollaborateurByMail(string mail) { Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail); @@ -38,7 +58,24 @@ namespace EPAServeur.Services return GetCollaborateurDTO(collaborateur); } - + /// + /// Récupérer la liste de tous les collaborateurs + /// + /// + /// Précise si la liste est trié dans l'ordre croissant ou décroissant + /// Numéro de la page qui est affiché du côté front + /// Nombre de collaborateurs à renvoyer + /// Liste des fonctions + /// id de l'agence à laquelle appartient les collaborateurs à récupérer + /// + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// + /// idBU est à prendre en compte avant l'idAgence + /// idAgence n'est à prendre en compte que si idBU est nul + /// + /// + /// Renvoie la liste des collaborateurs en fonction des paramètres public IEnumerable GetCollaborateurs(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri) { if (texte == null) @@ -64,15 +101,26 @@ namespace EPAServeur.Services return collaborateursDTO; } + /// + /// Récupérer les collaborateurs d'un référent + /// + /// id du référent des collaborateurs à récupérer + /// Précise si la liste est trié dans l'ordre croissant ou décroissant + /// Numéro de la page qui est affiché du côté front + /// Nombre de collaborateurs à renvoyer + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// Renvoyer les collaborateurs du référent dont l'id est passé en paramètre public IEnumerable GetCollaborateursByReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri) { + Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent); + if (referent == null) + return null; + if (texte == null) texte = ""; else texte = texte.ToLower(); - Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent); - if (referent == null) - return null; IEnumerable collaborateurs = collaborateurApi.ChercherCollabRef(idReferent); int skip = (numPage.Value - 1) * parPage.Value; int take = parPage.Value; @@ -82,6 +130,11 @@ namespace EPAServeur.Services return collaborateursDTO; } + /// + /// Récupérer le profil d'un collaborateur par mail + /// + /// mail du collaborateur dont on cherche le profil + /// Renvoie le profil correspondant au mail passé en paramètre public ProfilDTO GetProfilByMail(string mail) { Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail); @@ -90,6 +143,11 @@ namespace EPAServeur.Services return GetProfilDTO(collaborateur); } + /// + /// Récupérer un profil d'un collaborateur par l'id + /// + /// id du collaborateur dont on cherche le profil + /// Renvoie le profil correspondant à l'id passé en paramètre public ProfilDTO GetProfilById(Guid? idCollaborateur) { Collaborateur collaborateur = collaborateurApi.ChercherCollabId(idCollaborateur); @@ -97,8 +155,15 @@ namespace EPAServeur.Services return null; return GetProfilDTO(collaborateur); } + #endregion - //Object to DTO + #region DTO To Object + + /// + /// Transformer un objet collaborateur en ProfilDTO + /// + /// collaborateur a transformé en profilDTO + /// Renvoie le profil associé au collaborateur passé en paramètre private ProfilDTO GetProfilDTO(Collaborateur collaborateur) { ProfilDTO profilDTO = new ProfilDTO() @@ -113,7 +178,11 @@ namespace EPAServeur.Services return profilDTO; } - + /// + /// Transformer une agence en agenceDTO + /// + /// agence à transformer en agenceDTO + /// Retourne la transformation DTO de l'agence private AgenceDTO GetAgenceDTO(Agence agence) { if (agence == null) @@ -132,6 +201,11 @@ namespace EPAServeur.Services return agenceDTO; } + /// + /// Transforme une businessUnit en businessUnitDTO + /// + /// businessUnit à transformer en businessUnitDTO + /// Retourne la transformation DTO de la businessUnit private BusinessUnitDTO GetBusinessUnitDTO(BU businessUnit) { if (businessUnit == null) @@ -145,6 +219,11 @@ namespace EPAServeur.Services return businessUnitDTO; } + /// + /// Transforme un collaborateur en collaborateurDTO + /// + /// collaborateur à transformer en collaborateurDTO + /// Renvoie la transformation DTO du collaborateur private CollaborateurDTO GetCollaborateurDTO(Collaborateur collaborateur) { CollaborateurDTO collaborateurDTO = new CollaborateurDTO() @@ -161,6 +240,11 @@ namespace EPAServeur.Services return collaborateurDTO; } + /// + /// Transforme un referent en referentDTO + /// + /// referent à transformer en referentDTO + /// Renvoie la transformation DTO du referent private ReferentDTO GetReferentDTO(Referent referent) { if (referent == null) @@ -174,5 +258,6 @@ namespace EPAServeur.Services }; return referentDTO; } + #endregion } } From 64b4394994035259c93f3e18e02a0a05ae61510c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Mon, 14 Sep 2020 14:38:33 +0200 Subject: [PATCH 06/12] Ajout de commentaire pour le service des notes --- ApiCollaborateur/ReferentApi.cs | 4 +- Services/NoteService.cs | 93 ++++++++++++++++++++++++++++++--- 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/ApiCollaborateur/ReferentApi.cs b/ApiCollaborateur/ReferentApi.cs index d36c4f1..c49c8f0 100644 --- a/ApiCollaborateur/ReferentApi.cs +++ b/ApiCollaborateur/ReferentApi.cs @@ -45,7 +45,7 @@ namespace IO.Swagger.ApiCollaborateur /// ApiResponse of Referent ApiResponse ChercherRefActuelCollabIdWithHttpInfo (Guid? collabId); /// - /// rechercher le référent qui a le plus suivi + /// rechercher le référent actuel /// /// /// rechercher le référent actuel du collaborateur à l'aide de son identifiant @@ -56,7 +56,7 @@ namespace IO.Swagger.ApiCollaborateur Referent ChercherRefActuelCollabMail (string mailApside); /// - /// rechercher le référent qui a le plus suivi + /// rechercher le référent actuel /// /// /// rechercher le référent actuel du collaborateur à l'aide de son identifiant diff --git a/Services/NoteService.cs b/Services/NoteService.cs index 8399e86..2e4783a 100644 --- a/Services/NoteService.cs +++ b/Services/NoteService.cs @@ -11,17 +11,34 @@ using System.Threading.Tasks; namespace EPAServeur.Services { + /// + /// Service permettant de gérer les notes (ajout, récupération, mise à jour, suppression) + /// public class NoteService : INoteService { + #region Variables + /// + /// API pour accéder aux données collaborateur en passant par le service collaborateur + /// private readonly ICollaborateurService collaborateurService; + /// + /// Contexte pour interagir avec la base de données MySQL du serveur EP + /// private readonly EpContext context; - + #endregion + #region Constructeurs public NoteService(ICollaborateurService _collaborateurService, EpContext _context) { collaborateurService = _collaborateurService; context = _context; } + #endregion + /// + /// Ajouter une nouvelle note dans la base de données + /// + /// La nouvelle note a ajouté en base + /// public Note AjouterNote(DetailsNoteDTO nouvelleNote) { if (!IsDetailsNoteValide(nouvelleNote)) @@ -32,6 +49,18 @@ namespace EPAServeur.Services return note; } + #region Services + /// + /// Récupérer la liste des notes qu'un auteur a écrit sur un collaborateur + /// + /// Id de l'auteur des notes à récupérer + /// Id du collaborateur pour lesquelles les notes ont été écrites + /// Précise si la liste est trié dans l'ordre croissant ou décroissant + /// Numéro de la page qui est affiché du côté front + /// Nombre de notes à renvoyer + /// permet de récupérer les notes les informations du collaborateur ou le titre de la note contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// Retour la liste des notes à afficher public IEnumerable GetNotesByCollaborateur(Guid? idAuteur, Guid? idCollaborateur, bool? asc, int? numPage, int? parPage, string texte, string tri) { if (collaborateurService.GetProfilById(idAuteur) == null || collaborateurService.GetProfilById(idCollaborateur) == null) @@ -46,11 +75,16 @@ namespace EPAServeur.Services where n.IdAuteur == idAuteur && n.IdCollaborateur == idCollaborateur select NoteToAffichageDTO(n, collaborateurService)); AffichageNoteDTO = (from a in AffichageNoteDTO - where a.Collaborateur.ToLower().Contains(texte) || a.Titre.ToLower().Contains(texte) + where a.Titre.ToLower().Contains(texte) select a).Skip(skip).Take(take); return AffichageNoteDTO; } + /// + /// Récupérer une note en fonction de son id + /// + /// Id de la note à récupérer + /// L'objet DTO de la note correspondant à l'id passé en paramètre public DetailsNoteDTO GetNoteById(long? idNote) { Note note = context.Note.Find(idNote); @@ -67,6 +101,16 @@ namespace EPAServeur.Services throw new NotImplementedException(); } + /// + /// Récupérer la liste des notes qu'un auteur a écrit sur un collaborateur + /// + /// Id de l'auteur des notes à récupérer + /// Précise si la liste est trié dans l'ordre croissant ou décroissant + /// Numéro de la page qui est affiché du côté front + /// Nombre de notes à renvoyer + /// permet de récupérer les notes les informations du collaborateur ou le titre de la note contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// Retour la liste des notes à afficher public IEnumerable GetNotesByAuteur(Guid? idAuteur, bool? asc, int? numPage, int? parPage, string texte, string tri) { if (collaborateurService.GetCollaborateurById(idAuteur) == null) @@ -93,6 +137,11 @@ namespace EPAServeur.Services return AffichageNoteDTO; } + /// + /// Supprimer une note en fonction de son Id + /// + /// Id de la note à supprimer + /// Si oui ou non la notea bien été supprimé public bool SupprimerNote(long? idNote) { Note note = context.Note.Find(idNote); @@ -103,12 +152,18 @@ namespace EPAServeur.Services return true; } + /// + /// Mettre à jour une note + /// + /// Id de la note à modifier + /// + /// public Note UpdateNote(long? idNote, DetailsNoteDTO note) { if (!IsDetailsNoteValide(note)) return null; Note noteToUpdate = context.Note.Find(idNote); - if (noteToUpdate == null) + if (noteToUpdate == null || note.Id != noteToUpdate.Id ) return AjouterNote(note); noteToUpdate.Titre = note.Titre; noteToUpdate.Texte = note.Texte; @@ -117,13 +172,26 @@ namespace EPAServeur.Services return noteToUpdate; } - + /// + /// Vérifier si un objet DetailsNoteDTO possède est valide pour ajout ou mise à jour + /// + /// Un objet DetailsNoteDTO est valide si aucune de ses propriétés n'est à null + /// + /// true si l'objet est valide, false sinon private bool IsDetailsNoteValide(DetailsNoteDTO note) { return !(note == null || note.IdAuteur == null || note.Collaborateur == null || note.Collaborateur.Id == null || note.Titre == null || note.Texte == null) ; } + #endregion + - //Object to DTO + #region ObjectToDTO + /// + /// Transformer un objet note en objet pour afficher un note dans dans un tableau + /// + /// Note à transformer + /// Service collaborateur pour récupérer les informations des collaborateurs + /// La note transformée pour être affichée private static AffichageNoteDTO NoteToAffichageDTO(Note note, ICollaborateurService collaborateurService) { CollaborateurDTO collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur); @@ -138,6 +206,11 @@ namespace EPAServeur.Services return affichage; } + /// + /// Transformatino d'une note en DetailsNoteDTO + /// + /// Note à transformer + /// Note transformer en DetailsNoteDTO private DetailsNoteDTO NoteToDetailSDTO(Note note) { DetailsNoteDTO details = new DetailsNoteDTO() @@ -152,8 +225,15 @@ namespace EPAServeur.Services }; return details; } + #endregion - //DTO to Object + #region DTOToObject + /// + /// Transformer l'objet DTO d'une note en note + /// + /// En général, de base, cette méthode est prévue pour être utilisée qu'à la création d'une nouvelle note, dateCreation et dateUpdate sont donc initialisée à ce moment là + /// Objet DTO à transformer en note + /// L'objet DTO transformé en note private Note DetailsNoteDTOToNouvelleNote(DetailsNoteDTO detailsNoteDTO) { Note note = new Note() @@ -167,5 +247,6 @@ namespace EPAServeur.Services }; return note; } + #endregion } } From 79df883367c4679e9d3615c0c137da4a38279aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Mon, 14 Sep 2020 16:16:53 +0200 Subject: [PATCH 07/12] =?UTF-8?q?D=C3=A9but=20d'ajout=20de=20logger=20pour?= =?UTF-8?q?=20les=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/NotesApi.cs | 48 +++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/Controllers/NotesApi.cs b/Controllers/NotesApi.cs index 1422250..c6d5379 100644 --- a/Controllers/NotesApi.cs +++ b/Controllers/NotesApi.cs @@ -21,6 +21,7 @@ using IO.Swagger.DTO; using EPAServeur.Services; using EPAServeur.IServices; using EPAServeur.Models.Notes; +using Microsoft.Extensions.Logging; namespace IO.Swagger.Controllers { @@ -31,10 +32,12 @@ namespace IO.Swagger.Controllers public class NotesApiController : ControllerBase { private readonly INoteService noteService; + private readonly ILogger logger; - public NotesApiController(INoteService _noteService) + public NotesApiController(INoteService _noteService, ILogger _logger) { noteService = _noteService; + logger = _logger; } /// @@ -56,8 +59,10 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); - if(!noteService.SupprimerNote(idNote)) + logger.LogInformation("Suppresion de la note {idNote}", idNote); + if (!noteService.SupprimerNote(idNote)) { + logger.LogError("Impossible de supprimer la note d'id {idNote} car elle n'existe pas", idNote); ErreurDTO erreur = new ErreurDTO() { Code = "404", @@ -65,6 +70,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreur); }; + logger.LogInformation("Note {idNote} supprimée avec sucès", idNote); return NoContent(); } @@ -88,9 +94,11 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); + logger.LogInformation("Récupération de la note {idNote}", idNote); DetailsNoteDTO note = noteService.GetNoteById(idNote); if(note == null) { + logger.LogError("Aucune note ne correspond à l'id {idNote} cherché", idNote); ErreurDTO erreur = new ErreurDTO() { Code = "404", @@ -98,6 +106,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreur); } + logger.LogInformation("Note d'id {idNote} trouvée",idNote); return Ok(note); } @@ -121,18 +130,12 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual IActionResult GetNotes([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(200, default(List)); + //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... + // return StatusCode(200, default(List)); - //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(403, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "[ {\n \"idCollaborateur\" : \"046b6c7f-0b8a-43b9-b35d-6489e6daee91\",\n \"dateMiseAjour\" : \"2000-01-23T04:56:07.000+00:00\",\n \"titre\" : \"titre\",\n \"id\" : 0,\n \"collaborateur\" : \"collaborateur\"\n}, {\n \"idCollaborateur\" : \"046b6c7f-0b8a-43b9-b35d-6489e6daee91\",\n \"dateMiseAjour\" : \"2000-01-23T04:56:07.000+00:00\",\n \"titre\" : \"titre\",\n \"id\" : 0,\n \"collaborateur\" : \"collaborateur\"\n} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); + //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... + // return StatusCode(403, default(ErreurDTO)); + throw new NotImplementedException(); } /// @@ -160,9 +163,11 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); + logger.LogInformation("Récupération des notes de l'auteur d'id {idReferent}", idReferent); IEnumerable notes = noteService.GetNotesByAuteur(idReferent, asc, numPage, parPAge, texte, tri); if(notes == null) { + logger.LogError("Le référent {idReferent} n'a pas été trouvé", idReferent); ErreurDTO erreur = new ErreurDTO() { Code = "404", @@ -170,6 +175,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreur); } + logger.LogInformation("Liste des notes de l'auteur {idReferent} trouvée", idReferent); return Ok(notes); } @@ -199,9 +205,11 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); + logger.LogInformation("Récupération des notes de l'auteur {idReferent} sur un collaborateur {idCollaborateur}", idReferent, idCollaborateur); IEnumerable notes = noteService.GetNotesByCollaborateur(idReferent, idCollaborateur, asc, numPage, parPAge, texte, tri); if (notes == null) { + logger.LogInformation("auteur {idReferent} ou collaborateur {idCollaborateur} introuvable", idReferent, idCollaborateur); ErreurDTO erreur = new ErreurDTO() { Code = "404", @@ -209,6 +217,7 @@ namespace IO.Swagger.Controllers }; return NotFound(erreur); } + logger.LogInformation("Liste des notes de l'auteur {idReferent} sur un collaborateur {idCollaborateur} trouvée", idReferent, idCollaborateur); return Ok(notes); } @@ -229,7 +238,9 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); + logger.LogInformation("Ajout d'une nouvelle note"); Note nouvelleNote = noteService.AjouterNote(body); + logger.LogInformation("Nouvelle note ajoutée"); return Created("",nouvelleNote); } @@ -248,14 +259,19 @@ namespace IO.Swagger.Controllers [ValidateModelState] [SwaggerOperation("UpdateNote")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult UpdateNote([FromBody]DetailsNoteDTO body, [FromRoute][Required]long? idNote) + public virtual IActionResult UpdateNote([FromBody] DetailsNoteDTO body, [FromRoute][Required] long? idNote) { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); - + logger.LogInformation("Mise à jour de la note d'id {idNote}", idNote); Note note = noteService.UpdateNote(idNote, body); - if (note == null) + if (note == null) { + logger.LogInformation(""); note = noteService.AjouterNote(body); + logger.LogInformation("Ajout effectuer avec succès"); + } + else + logger.LogInformation("Update effectué avec succès"); return Ok(note); //TODO: Uncomment the next line to return response 201 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(201); From f9205b0a5ef43a105f8ca9d0b747cb0cef977f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Wed, 16 Sep 2020 10:57:41 +0200 Subject: [PATCH 08/12] Ajouts d'exceptions et de try catch avec plusieurs loggers --- Controllers/NotesApi.cs | 177 ++++++++++++++++--- Exceptions/CollaborateurNotFoundException.cs | 14 ++ Exceptions/NoteIdImcompatibleException.cs | 14 ++ Exceptions/NoteInvalideException.cs | 14 ++ Exceptions/NoteNotFoundException.cs | 15 ++ Exceptions/ReferentNotFoundException.cs | 14 ++ IServices/INoteService.cs | 6 +- Program.cs | 4 +- Services/CollaborateurService.cs | 18 ++ Services/NoteService.cs | 41 +++-- 10 files changed, 266 insertions(+), 51 deletions(-) create mode 100644 Exceptions/CollaborateurNotFoundException.cs create mode 100644 Exceptions/NoteIdImcompatibleException.cs create mode 100644 Exceptions/NoteInvalideException.cs create mode 100644 Exceptions/NoteNotFoundException.cs create mode 100644 Exceptions/ReferentNotFoundException.cs diff --git a/Controllers/NotesApi.cs b/Controllers/NotesApi.cs index c6d5379..75d4f17 100644 --- a/Controllers/NotesApi.cs +++ b/Controllers/NotesApi.cs @@ -18,10 +18,13 @@ using IO.Swagger.Attributes; using IO.Swagger.Security; using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; -using EPAServeur.Services; using EPAServeur.IServices; using EPAServeur.Models.Notes; using Microsoft.Extensions.Logging; +using Microsoft.EntityFrameworkCore; +using EPAServeur.Exceptions; +using Microsoft.OpenApi.Expressions; +using IO.Swagger.ClientCollaborateur; namespace IO.Swagger.Controllers { @@ -57,10 +60,15 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] public virtual IActionResult DeleteNote([FromRoute][Required]long? idNote) { - //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(403, default(ErreurDTO)); - logger.LogInformation("Suppresion de la note {idNote}", idNote); - if (!noteService.SupprimerNote(idNote)) + //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... + // return StatusCode(403, default(ErreurDTO)); + try + { + logger.LogInformation("Suppresion de la note {idNote}", idNote); + noteService.SupprimerNote(idNote); + + } + catch(NoteNotFoundException) { logger.LogError("Impossible de supprimer la note d'id {idNote} car elle n'existe pas", idNote); ErreurDTO erreur = new ErreurDTO() @@ -69,7 +77,18 @@ namespace IO.Swagger.Controllers Message = "Aucune note trouvé" }; return NotFound(erreur); - }; + } + catch(DbUpdateConcurrencyException) { + logger.LogWarning("La note {idNote} n'a pas pu être supprimé car elle était prise par une autre ressource.", idNote); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur a eu lieu, la note {idNote} n'a pas pu être supprimée.", idNote); + } + catch(Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la suppression de la note {idNote}",idNote); + } logger.LogInformation("Note {idNote} supprimée avec sucès", idNote); return NoContent(); } @@ -95,17 +114,34 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Récupération de la note {idNote}", idNote); - DetailsNoteDTO note = noteService.GetNoteById(idNote); - if(note == null) + DetailsNoteDTO note = null; + try + { + note = noteService.GetNoteById(idNote); + } + catch(NoteNotFoundException) { - logger.LogError("Aucune note ne correspond à l'id {idNote} cherché", idNote); + logger.LogError("Aucune note ne correspond à l'id {idNote} recherchée", idNote); ErreurDTO erreur = new ErreurDTO() { Code = "404", Message = "Aucune note n'a été trouvée" }; return NotFound(erreur); + } + catch (DbUpdateConcurrencyException) + { + logger.LogWarning("La note {idNote} n'a pas pu être récupérée car elle était prise par une autre ressource.", idNote); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur a eu lieu, la note {idNote} n'a pas pu être récupérée.", idNote); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la note {idNote}", idNote); + } logger.LogInformation("Note d'id {idNote} trouvée",idNote); return Ok(note); } @@ -161,11 +197,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] public virtual IActionResult GetNotesByAuteur([FromQuery][Required()]bool? asc, [FromRoute][Required]Guid? idReferent, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) { - //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - // return StatusCode(403, default(ErreurDTO)); - logger.LogInformation("Récupération des notes de l'auteur d'id {idReferent}", idReferent); - IEnumerable notes = noteService.GetNotesByAuteur(idReferent, asc, numPage, parPAge, texte, tri); - if(notes == null) + //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... + // return StatusCode(403, default(ErreurDTO)); + logger.LogInformation("Récupération des notes de l'auteur d'id {idReferent}", idReferent); + IEnumerable notes = null; + try + { + notes = noteService.GetNotesByAuteur(idReferent, asc, numPage, parPAge, texte, tri); + } + catch (ApiException) + { + logger.LogError("Une erreur est survenue lors de la discussion avec le service Collaborateur"); + } + catch (ReferentNotFoundException) { logger.LogError("Le référent {idReferent} n'a pas été trouvé", idReferent); ErreurDTO erreur = new ErreurDTO() @@ -174,8 +218,20 @@ namespace IO.Swagger.Controllers Message = "Aucun id ne correspond au référent" }; return NotFound(erreur); - } - logger.LogInformation("Liste des notes de l'auteur {idReferent} trouvée", idReferent); + } + catch (DbUpdateConcurrencyException) + { + logger.LogWarning("Les notes du référents {idReferent} n'ont pas pu être récupérées car une ou plusieurs notes sont prises par une autre ressource.", idReferent); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur dans la base de données est survenue lors de la récupération des notes du référent {idRefrent}", idReferent); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération des notes du référebt {idReferent}", idReferent); + } + logger.LogInformation("Liste des notes de l'auteur {idReferent} récupérée", idReferent); return Ok(notes); } @@ -206,17 +262,48 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Récupération des notes de l'auteur {idReferent} sur un collaborateur {idCollaborateur}", idReferent, idCollaborateur); - IEnumerable notes = noteService.GetNotesByCollaborateur(idReferent, idCollaborateur, asc, numPage, parPAge, texte, tri); - if (notes == null) + IEnumerable notes = null; + try + { + notes = noteService.GetNotesByCollaborateur(idReferent, idCollaborateur, asc, numPage, parPAge, texte, tri); + + } + catch (ApiException) { - logger.LogInformation("auteur {idReferent} ou collaborateur {idCollaborateur} introuvable", idReferent, idCollaborateur); + logger.LogError("Une erreur est survenue lors de la discussion avec le service Collaborateur"); + } + catch (CollaborateurNotFoundException) + { + logger.LogError("Le référent {idReferent} n'a pas été trouvé", idReferent); + ErreurDTO erreur = new ErreurDTO() + { + Code = "404", + Message = "Aucun id ne correspond au référent" + }; + return NotFound(erreur); + } + catch(ReferentNotFoundException) + { + logger.LogError("Le collaborateur {idCollaborateur} n'a pas été trouvé", idCollaborateur); ErreurDTO erreur = new ErreurDTO() { Code = "404", - Message = "Aucun id ne correspond au référent et/ou au collaborateur" + Message = "Aucun id ne correspond au collaborateur" }; return NotFound(erreur); } + catch (DbUpdateConcurrencyException) + { + logger.LogWarning("Les notes du référents {idReferent} n'ont pas pu être récupérées pour le collaborateur {idCollaborateur} car une ou plusieurs notes sont prises par une autre ressource", idReferent, idCollaborateur); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur a eu lieu dans la base de données lors de la récupération des notes du référent {idReferent} pour le collaborateur {idCollaborateur}.", idReferent, idCollaborateur); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue a eu lieu lors de la récupération des notes du référent { idReferent} pour le collaborateur { idCollaborateur}.", idReferent, idCollaborateur); + } logger.LogInformation("Liste des notes de l'auteur {idReferent} sur un collaborateur {idCollaborateur} trouvée", idReferent, idCollaborateur); return Ok(notes); } @@ -239,7 +326,14 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Ajout d'une nouvelle note"); - Note nouvelleNote = noteService.AjouterNote(body); + DetailsNoteDTO nouvelleNote = null; + try + { + nouvelleNote = noteService.AjouterNote(body); + } + catch (NoteInvalideException) { logger.LogWarning("Des données sont manquants, la nouvelle note ne peut pas être ajoutée"); } + catch (DbUpdateException) { logger.LogError("Une erreur est survenue dans la base de données durant l'ajout de la nouvelle note"); } + catch(Exception) { logger.LogError("Une erreur inconnue est survenue lors de l'ajout de la nouvelle note"); } logger.LogInformation("Nouvelle note ajoutée"); return Created("",nouvelleNote); } @@ -264,17 +358,42 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Mise à jour de la note d'id {idNote}", idNote); - Note note = noteService.UpdateNote(idNote, body); - if (note == null) { - logger.LogInformation(""); - note = noteService.AjouterNote(body); - logger.LogInformation("Ajout effectuer avec succès"); + DetailsNoteDTO note = null; + try + { + note = noteService.UpdateNote(idNote, body); + } + catch(ApiException) + { + logger.LogError("Une erreur est survenue lors de la discussion avec le service Collaborateur"); + } + catch(NoteIdImcompatibleException) + { + logger.LogError("L'id de la note à mettre à jour {body.Id} et l'id de la note avec les nouvelels information {idNote} sont différents", body.Id, idNote); + } + catch(NoteNotFoundException) + { + logger.LogError("La note {idNote} n'a pas pu être mise à jour car elle n'existe pas", idNote); + } + catch (NoteInvalideException) + { + logger.LogWarning("Des données sont manquants, la note {idNote} ne peut pas être mise à jour", idNote); + } + catch (DbUpdateConcurrencyException) + { + logger.LogError("La note {idNote} n'a pas pu être mise à jour car elle été prise par une autre ressource", idNote); + } + catch(DbUpdateException) + { + logger.LogError("Une erreur est survenue dans la base de données lors de la mise à jour de la note {idNote}", idNote); + } + catch(Exception) { + logger.LogError("Une erreur inconnue est survenue lors de la mise à jour de la note {idNote}", idNote); } - else - logger.LogInformation("Update effectué avec succès"); + logger.LogInformation("Update effectué avec succès"); return Ok(note); //TODO: Uncomment the next line to return response 201 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(201); } } -} +} \ No newline at end of file diff --git a/Exceptions/CollaborateurNotFoundException.cs b/Exceptions/CollaborateurNotFoundException.cs new file mode 100644 index 0000000..a753e13 --- /dev/null +++ b/Exceptions/CollaborateurNotFoundException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter quand le collaborateur n'est pas trouvé + /// + public class CollaborateurNotFoundException : Exception + { + } +} diff --git a/Exceptions/NoteIdImcompatibleException.cs b/Exceptions/NoteIdImcompatibleException.cs new file mode 100644 index 0000000..8a3e5f3 --- /dev/null +++ b/Exceptions/NoteIdImcompatibleException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsque l'id de la note avec les données à mettre à jour et l'id de la note à mettre sont différents + /// + public class NoteIdImcompatibleException : Exception + { + } +} diff --git a/Exceptions/NoteInvalideException.cs b/Exceptions/NoteInvalideException.cs new file mode 100644 index 0000000..e85526e --- /dev/null +++ b/Exceptions/NoteInvalideException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter quand l'objet détails note contient des valeurs null + /// + public class NoteInvalideException : Exception + { + } +} diff --git a/Exceptions/NoteNotFoundException.cs b/Exceptions/NoteNotFoundException.cs new file mode 100644 index 0000000..4244e57 --- /dev/null +++ b/Exceptions/NoteNotFoundException.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter quand la note n'a pas été trouvée + /// + public class NoteNotFoundException : Exception + { + + } +} diff --git a/Exceptions/ReferentNotFoundException.cs b/Exceptions/ReferentNotFoundException.cs new file mode 100644 index 0000000..3559ada --- /dev/null +++ b/Exceptions/ReferentNotFoundException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter quand le référent n'a pas été trouvée + /// + public class ReferentNotFoundException : Exception + { + } +} diff --git a/IServices/INoteService.cs b/IServices/INoteService.cs index ee1c5ce..6b69c12 100644 --- a/IServices/INoteService.cs +++ b/IServices/INoteService.cs @@ -15,8 +15,8 @@ namespace EPAServeur.IServices public IEnumerable GetNotesByAuteur(Guid? idAuteur, bool? asc, int? numPage, int? parPAge, string texte, string tri); public DetailsNoteDTO GetNoteById(long? idNote); public IEnumerable GetNotesByCollaborateur(Guid? idAuteur, Guid? idCollaborateur, bool? asc, int? numPage, int? parPAge, string texte, string tri); - public Note AjouterNote(DetailsNoteDTO nouvelleNote); - public bool SupprimerNote(long? idNote); - public Note UpdateNote(long? idNote, DetailsNoteDTO note); + public DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote); + public void SupprimerNote(long? idNote); + public DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note); } } diff --git a/Program.cs b/Program.cs index 6ec487d..65abc7a 100644 --- a/Program.cs +++ b/Program.cs @@ -23,8 +23,8 @@ namespace EPAServeur Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { - logging.ClearProviders(); - }) + //logging.ClearProviders(); + }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); diff --git a/Services/CollaborateurService.cs b/Services/CollaborateurService.cs index c7bccce..bb7ab43 100644 --- a/Services/CollaborateurService.cs +++ b/Services/CollaborateurService.cs @@ -6,6 +6,7 @@ using IO.Swagger.ModelCollaborateur; using Microsoft.EntityFrameworkCore.ChangeTracking; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices.ComTypes; using System.Threading.Tasks; @@ -113,6 +114,15 @@ namespace EPAServeur.Services /// Renvoyer les collaborateurs du référent dont l'id est passé en paramètre public IEnumerable GetCollaborateursByReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri) { + /* + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + stopwatch.Stop(); + Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); + stopwatch.Restart(); + stopwatch.Stop(); + Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); + */ Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent); if (referent == null) return null; @@ -150,7 +160,15 @@ namespace EPAServeur.Services /// Renvoie le profil correspondant à l'id passé en paramètre public ProfilDTO GetProfilById(Guid? idCollaborateur) { + //Stopwatch stopwatch = new Stopwatch(); + //stopwatch.Start(); Collaborateur collaborateur = collaborateurApi.ChercherCollabId(idCollaborateur); + //stopwatch.Stop(); + //Console.WriteLine("Durée d'exécution GetProfil: {0}", stopwatch.Elapsed.TotalSeconds); + //stopwatch.Restart(); + //stopwatch.Stop(); + //Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); + if (collaborateur == null) return null; return GetProfilDTO(collaborateur); diff --git a/Services/NoteService.cs b/Services/NoteService.cs index 2e4783a..64a59f7 100644 --- a/Services/NoteService.cs +++ b/Services/NoteService.cs @@ -1,4 +1,5 @@ using EPAServeur.Context; +using EPAServeur.Exceptions; using EPAServeur.IServices; using EPAServeur.Models.Notes; using IO.Swagger.DTO; @@ -39,14 +40,14 @@ namespace EPAServeur.Services /// /// La nouvelle note a ajouté en base /// - public Note AjouterNote(DetailsNoteDTO nouvelleNote) + public DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote) { if (!IsDetailsNoteValide(nouvelleNote)) - return null; + throw new NoteInvalideException(); Note note = DetailsNoteDTOToNouvelleNote(nouvelleNote); context.Note.Add(note); context.SaveChanges(); - return note; + return NoteToDetailSDTO(note); } #region Services @@ -63,8 +64,18 @@ namespace EPAServeur.Services /// Retour la liste des notes à afficher public IEnumerable GetNotesByCollaborateur(Guid? idAuteur, Guid? idCollaborateur, bool? asc, int? numPage, int? parPage, string texte, string tri) { + //Stopwatch stopwatch = new Stopwatch(); + //stopwatch.Start(); + if (collaborateurService.GetProfilById(idAuteur) == null) + throw new ReferentNotFoundException(); + //stopwatch.Stop(); + //Console.WriteLine("Durée d'exécution GetProfil 1: {0}", stopwatch.Elapsed.TotalSeconds); + //stopwatch.Restart(); if (collaborateurService.GetProfilById(idAuteur) == null || collaborateurService.GetProfilById(idCollaborateur) == null) - return null; + throw new CollaborateurNotFoundException(); + //stopwatch.Stop(); + //Console.WriteLine("Durée d'exécution GetProfil 2: {0}", stopwatch.Elapsed.TotalSeconds); + if (texte == null) texte = ""; else @@ -89,11 +100,8 @@ namespace EPAServeur.Services { Note note = context.Note.Find(idNote); if (note == null) - return null; + throw new NoteNotFoundException(); return NoteToDetailSDTO(note); - /*return (from n in context.Note - where n.Id == idNote - select NoteToDetailSDTO(n)).ToList().FirstOrDefault();*/ } public IEnumerable GetNotes(bool? asc, int? numPage, int? parPage, string texte, string tri) @@ -114,7 +122,7 @@ namespace EPAServeur.Services public IEnumerable GetNotesByAuteur(Guid? idAuteur, bool? asc, int? numPage, int? parPage, string texte, string tri) { if (collaborateurService.GetCollaborateurById(idAuteur) == null) - return null; + throw new CollaborateurNotFoundException(); if (texte == null) texte = ""; else @@ -142,14 +150,13 @@ namespace EPAServeur.Services /// /// Id de la note à supprimer /// Si oui ou non la notea bien été supprimé - public bool SupprimerNote(long? idNote) + public void SupprimerNote(long? idNote) { Note note = context.Note.Find(idNote); if (note == null) - return false; + throw new NoteNotFoundException(); context.Remove(note); context.SaveChanges(); - return true; } /// @@ -158,18 +165,18 @@ namespace EPAServeur.Services /// Id de la note à modifier /// /// - public Note UpdateNote(long? idNote, DetailsNoteDTO note) + public DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note) { + if (idNote != note.Id) + throw new NoteIdImcompatibleException(); if (!IsDetailsNoteValide(note)) - return null; + throw new NoteInvalideException(); Note noteToUpdate = context.Note.Find(idNote); - if (noteToUpdate == null || note.Id != noteToUpdate.Id ) - return AjouterNote(note); noteToUpdate.Titre = note.Titre; noteToUpdate.Texte = note.Texte; noteToUpdate.DateUpdate = DateTime.Now; context.SaveChanges(); - return noteToUpdate; + return NoteToDetailSDTO(noteToUpdate); } /// From 2f3e2024502b27d38e17ed247fcb23f3bd34cc7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Wed, 16 Sep 2020 11:44:46 +0200 Subject: [PATCH 09/12] Ajout des loggers, et try catch pour la partie collaborateurs --- Controllers/CollaborateursApi.cs | 96 +++++++++++++++++++++++++++----- Services/CollaborateurService.cs | 11 ++-- 2 files changed, 88 insertions(+), 19 deletions(-) diff --git a/Controllers/CollaborateursApi.cs b/Controllers/CollaborateursApi.cs index 3bfc315..53f2158 100644 --- a/Controllers/CollaborateursApi.cs +++ b/Controllers/CollaborateursApi.cs @@ -20,6 +20,9 @@ using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; using EPAServeur.IServices; using Microsoft.Extensions.Logging; +using EPAServeur.Exceptions; +using IO.Swagger.ClientCollaborateur; +using Microsoft.AspNetCore.Server.Kestrel.Core; namespace IO.Swagger.Controllers { @@ -57,17 +60,29 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Récupération du collaborateur d'ID {idCollaborateur}", idCollaborateur); - CollaborateurDTO collaborateurDTO = collaborateurService.GetCollaborateurById(idCollaborateur); - if( collaborateurDTO == null) + CollaborateurDTO collaborateurDTO = null; + try { - logger.LogWarning("Le ccollaborateur {id} est introuvable", idCollaborateur); + collaborateurDTO = collaborateurService.GetCollaborateurById(idCollaborateur); + } + catch (ApiException) + { + logger.LogError("Une erreur est survenue lors de la communication avec le service Collaborateur pour récupérer le collaborateur par son id {idCollaborateur}", idCollaborateur); + } + catch (CollaborateurNotFoundException) + { + logger.LogError("Le ccollaborateur {id} est introuvable", idCollaborateur); ErreurDTO erreurDTO = new ErreurDTO() { Code = "404", Message = "Le collaborateur n'existe pas", }; return NotFound(erreurDTO); - } + } + catch(Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération du collaborateur {idCollaborateur}", idCollaborateur); + } logger.LogInformation("Collaborateur {id} trouvée", idCollaborateur); return Ok(collaborateurDTO); } @@ -93,20 +108,31 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Récupération d'un collaborateur par le mail {mail}", mail); - CollaborateurDTO collaborateurDTO = collaborateurService.GetCollaborateurByMail(mail); - if (collaborateurDTO == null) + CollaborateurDTO collaborateurDTO = null; + try + { + collaborateurDTO = collaborateurService.GetCollaborateurByMail(mail); + } + catch (CollaborateurNotFoundException) { - logger.LogWarning("Le collaborateur {mail} est introuvable", mail); + logger.LogError("Le ccollaborateur {mail} est introuvable", mail); ErreurDTO erreurDTO = new ErreurDTO() { Code = "404", - Message = "Aucun collaborateur n'est lié au mail "+mail, + Message = "Aucun collaborateur n'est lié au mail " + mail, }; return NotFound(erreurDTO); } + catch (ApiException) + { + logger.LogError("Une erreur est survenue lors de la communication avec le service Collaborateur pour récupérer le collaborateur par son mail {mail}", mail); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération du collaborateur {mail}", mail); + } logger.LogInformation("Collaborateur {mail} trouvée", mail); return Ok(collaborateurDTO); - } /// @@ -135,7 +161,21 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Récupération de la liste des collaborateurs"); - return Ok(collaborateurService.GetCollaborateurs(asc, numPage, parPAge, fonctions, idAgence, idBU, texte, tri)); + IEnumerable collaborateurs = null; + try + { + collaborateurs = collaborateurService.GetCollaborateurs(asc, numPage, parPAge, fonctions, idAgence, idBU, texte, tri); + } + catch(ApiException) + { + logger.LogError("Une erreur est survenue lors de la discussion avec le service Collaborateur pour récupérer la liste des collaborateurs"); + } + catch(Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des collaborateurs"); + } + logger.LogInformation("Liste des collaborateurs récupérée"); + return Ok(collaborateurs); } @@ -164,8 +204,17 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); + logger.LogInformation("Récupération de la liste des collaborateurs du référent {idReferent}",idReferent); IEnumerable collaborateurs = collaborateurService.GetCollaborateursByReferent(idReferent, asc, numPage, parPAge, texte, tri); - if(collaborateurs == null) + try + { + collaborateurs = collaborateurService.GetCollaborateursByReferent(idReferent, asc, numPage, parPAge, texte, tri); + } + catch (ApiException) + { + logger.LogError("Une erreur est survenue lors de la communication avec le service collaborateur lors de la récupération de la liste des collaborateurs du référent {idReferent}", idReferent); + } + catch (ReferentNotFoundException) { ErreurDTO erreurDTO = new ErreurDTO() { @@ -174,6 +223,11 @@ namespace IO.Swagger.Controllers }; return NotFound(erreurDTO); } + catch (Exception) + { + logger.LogError("Uner erreur inconnue est survenue lors de la récupération des collaborateurs du référent {idReferent}", idReferent); + } + logger.LogInformation("Liste des collaborateurs du référent {idReferent} récupérée", idReferent); return Ok(collaborateurs); } @@ -197,10 +251,19 @@ namespace IO.Swagger.Controllers { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); - - ProfilDTO collaborateurDTO = collaborateurService.GetProfilByMail(mail); - if (collaborateurDTO == null) + logger.LogInformation("Récupération du profil par la mail {mail}", mail); + ProfilDTO collaborateurDTO = null; + try + { + collaborateurDTO = collaborateurService.GetProfilByMail(mail); + } + catch (ApiException) + { + logger.LogError("Une erreur est survenue lors de la communication avec le service collaborateur lors de la récupération du profil par le mail {mail}", mail); + } + catch (CollaborateurNotFoundException) { + logger.LogError("Aucun collaborateur n'est lié au mail {mail}", mail); ErreurDTO erreurDTO = new ErreurDTO() { Code = "404", @@ -208,6 +271,11 @@ namespace IO.Swagger.Controllers }; return NotFound(erreurDTO); } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération du profil d'un collaborateur par le mail {mail}", mail); + } + logger.LogInformation("Profil du mail {mail} récupéré", mail); return Ok(collaborateurDTO); } } diff --git a/Services/CollaborateurService.cs b/Services/CollaborateurService.cs index bb7ab43..55d58b1 100644 --- a/Services/CollaborateurService.cs +++ b/Services/CollaborateurService.cs @@ -1,4 +1,5 @@ using EPAServeur.Context; +using EPAServeur.Exceptions; using EPAServeur.IServices; using IO.Swagger.ApiCollaborateur; using IO.Swagger.DTO; @@ -42,7 +43,7 @@ namespace EPAServeur.Services { Collaborateur collaborateur = collaborateurApi.ChercherCollabId(id); if (collaborateur == null) - return null; + throw new CollaborateurNotFoundException(); return GetCollaborateurDTO(collaborateur); } @@ -55,7 +56,7 @@ namespace EPAServeur.Services { Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail); if (collaborateur == null) - return null; + throw new CollaborateurNotFoundException(); return GetCollaborateurDTO(collaborateur); } @@ -125,7 +126,7 @@ namespace EPAServeur.Services */ Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent); if (referent == null) - return null; + throw new ReferentNotFoundException(); if (texte == null) texte = ""; @@ -149,7 +150,7 @@ namespace EPAServeur.Services { Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail); if (collaborateur == null) - return null; + throw new CollaborateurNotFoundException(); return GetProfilDTO(collaborateur); } @@ -170,7 +171,7 @@ namespace EPAServeur.Services //Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); if (collaborateur == null) - return null; + throw new CollaborateurNotFoundException(); return GetProfilDTO(collaborateur); } #endregion From 7ecb14ec5960ee10295d268013eefe419982a733 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Thu, 17 Sep 2020 10:57:52 +0200 Subject: [PATCH 10/12] =?UTF-8?q?Ajout=20des=20m=C3=A9thodes=20asynchrones?= =?UTF-8?q?=20dans=20le=20service=20collaborateurs,=20modification=20de=20?= =?UTF-8?q?l'api=20collaborateur=20en=20asynchrone,=20modification=20de=20?= =?UTF-8?q?epinformationDTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/CollaborateursApi.cs | 21 +++-- DTO/EpInformationDTO.cs | 2 +- IServices/ICollaborateurService.cs | 7 ++ Services/CollaborateurService.cs | 141 +++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 11 deletions(-) diff --git a/Controllers/CollaborateursApi.cs b/Controllers/CollaborateursApi.cs index 53f2158..1e2f473 100644 --- a/Controllers/CollaborateursApi.cs +++ b/Controllers/CollaborateursApi.cs @@ -23,6 +23,7 @@ using Microsoft.Extensions.Logging; using EPAServeur.Exceptions; using IO.Swagger.ClientCollaborateur; using Microsoft.AspNetCore.Server.Kestrel.Core; +using System.Threading.Tasks; namespace IO.Swagger.Controllers { @@ -55,7 +56,7 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(CollaborateurDTO), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetCollaborateurById([FromRoute][Required]Guid? idCollaborateur) + public virtual async Task GetCollaborateurById([FromRoute][Required]Guid? idCollaborateur) { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); @@ -63,7 +64,7 @@ namespace IO.Swagger.Controllers CollaborateurDTO collaborateurDTO = null; try { - collaborateurDTO = collaborateurService.GetCollaborateurById(idCollaborateur); + collaborateurDTO = await collaborateurService.GetCollaborateurByIdAsync(idCollaborateur); } catch (ApiException) { @@ -103,7 +104,7 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(CollaborateurDTO), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetCollaborateurByMail([FromRoute][Required]string mail) + public virtual async Task GetCollaborateurByMail([FromRoute][Required]string mail) { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); @@ -111,7 +112,7 @@ namespace IO.Swagger.Controllers CollaborateurDTO collaborateurDTO = null; try { - collaborateurDTO = collaborateurService.GetCollaborateurByMail(mail); + collaborateurDTO = await collaborateurService.GetCollaborateurByMailAsync(mail); } catch (CollaborateurNotFoundException) { @@ -156,7 +157,7 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetCollaborateurs")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult GetCollaborateurs([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]List fonctions, [FromQuery]long? idAgence, [FromQuery]long? idBU, [FromQuery]string texte, [FromQuery]string tri) + public virtual async Task GetCollaborateurs([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]List fonctions, [FromQuery]long? idAgence, [FromQuery]long? idBU, [FromQuery]string texte, [FromQuery]string tri) { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); @@ -164,7 +165,7 @@ namespace IO.Swagger.Controllers IEnumerable collaborateurs = null; try { - collaborateurs = collaborateurService.GetCollaborateurs(asc, numPage, parPAge, fonctions, idAgence, idBU, texte, tri); + collaborateurs = await collaborateurService.GetCollaborateursAsync(asc, numPage, parPAge, fonctions, idAgence, idBU, texte, tri); } catch(ApiException) { @@ -200,12 +201,12 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetCollaborateursByReferent([FromQuery][Required()]bool? asc, [FromRoute][Required]Guid? idReferent, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) + public virtual async Task GetCollaborateursByReferent([FromQuery][Required()]bool? asc, [FromRoute][Required]Guid? idReferent, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); logger.LogInformation("Récupération de la liste des collaborateurs du référent {idReferent}",idReferent); - IEnumerable collaborateurs = collaborateurService.GetCollaborateursByReferent(idReferent, asc, numPage, parPAge, texte, tri); + IEnumerable collaborateurs = await collaborateurService.GetCollaborateursByReferentAsync(idReferent, asc, numPage, parPAge, texte, tri); try { collaborateurs = collaborateurService.GetCollaborateursByReferent(idReferent, asc, numPage, parPAge, texte, tri); @@ -247,7 +248,7 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(ProfilDTO), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetProfilCollaborateurByMail([FromRoute][Required]string mail) + public virtual async Task GetProfilCollaborateurByMailAsync([FromRoute][Required]string mail) { //TODO: Uncomment the next line to return response 403 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(403, default(ErreurDTO)); @@ -255,7 +256,7 @@ namespace IO.Swagger.Controllers ProfilDTO collaborateurDTO = null; try { - collaborateurDTO = collaborateurService.GetProfilByMail(mail); + collaborateurDTO = await collaborateurService.GetProfilByMailAsync(mail); } catch (ApiException) { diff --git a/DTO/EpInformationDTO.cs b/DTO/EpInformationDTO.cs index 9188543..3e287d6 100644 --- a/DTO/EpInformationDTO.cs +++ b/DTO/EpInformationDTO.cs @@ -80,7 +80,7 @@ namespace IO.Swagger.DTO /// [Required] [DataMember(Name="referent")] - public CollaborateurDTO Referent { get; set; } + public ReferentDTO Referent { get; set; } /// /// Returns the string presentation of the object diff --git a/IServices/ICollaborateurService.cs b/IServices/ICollaborateurService.cs index e556ccc..3a43321 100644 --- a/IServices/ICollaborateurService.cs +++ b/IServices/ICollaborateurService.cs @@ -12,10 +12,17 @@ namespace EPAServeur.IServices public interface ICollaborateurService { CollaborateurDTO GetCollaborateurById(Guid? id); + Task GetCollaborateurByIdAsync(Guid? id); CollaborateurDTO GetCollaborateurByMail(string mail); + Task GetCollaborateurByMailAsync(string mail); ProfilDTO GetProfilById(Guid? idCollaborateur); + Task GetProfilByIdAsync(Guid? idCollaborateur); ProfilDTO GetProfilByMail(string mail); + Task GetProfilByMailAsync(string mail); IEnumerable GetCollaborateurs(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri); + Task> GetCollaborateursAsync(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri); IEnumerable GetCollaborateursByReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri); + Task> GetCollaborateursByReferentAsync(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri); + } } diff --git a/Services/CollaborateurService.cs b/Services/CollaborateurService.cs index 55d58b1..37137b6 100644 --- a/Services/CollaborateurService.cs +++ b/Services/CollaborateurService.cs @@ -47,6 +47,19 @@ namespace EPAServeur.Services return GetCollaborateurDTO(collaborateur); } + /// + /// Récupérer un collaborateur en fonction d'un id de manière asynchrone + /// + /// Identifiant du collaborateur à renvoyer + /// Le collaborateur corresponant à l'id en paramètre + public async Task GetCollaborateurByIdAsync(Guid? id) + { + Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(id); + if (collaborateur == null) + throw new CollaborateurNotFoundException(); + return GetCollaborateurDTO(collaborateur); + } + /// /// Récupérer un collaborateur en fonction d'un mail /// @@ -60,6 +73,19 @@ namespace EPAServeur.Services return GetCollaborateurDTO(collaborateur); } + /// + /// Récupérer un collaborateur en fonction d'un mail de manière asynchrone + /// + /// Mail du collaborateur à renvoyer + /// Le collaborateur correspondant au mail en paramètre + public async Task GetCollaborateurByMailAsync(string mail) + { + Collaborateur collaborateur = await collaborateurApi.ChercherCollabMailAsync(mail); + if (collaborateur == null) + throw new CollaborateurNotFoundException(); + return GetCollaborateurDTO(collaborateur); + } + /// /// Récupérer la liste de tous les collaborateurs /// @@ -103,6 +129,49 @@ namespace EPAServeur.Services return collaborateursDTO; } + /// + /// Récupérer la liste de tous les collaborateurs de manière asynchrone + /// + /// + /// Précise si la liste est trié dans l'ordre croissant ou décroissant + /// Numéro de la page qui est affiché du côté front + /// Nombre de collaborateurs à renvoyer + /// Liste des fonctions + /// id de l'agence à laquelle appartient les collaborateurs à récupérer + /// + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// + /// idBU est à prendre en compte avant l'idAgence + /// idAgence n'est à prendre en compte que si idBU est nul + /// + /// + /// Renvoie la liste des collaborateurs en fonction des paramètres + public async Task> GetCollaborateursAsync(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri) + { + if (texte == null) + texte = ""; + else + texte = texte.ToLower(); + IEnumerable collaborateurs; + IEnumerable collaborateursDTO; + if (idBU != null) + collaborateurs = await collaborateurApi.ChercherCollabBUAsync(idBU); + else if (idAgence != null) + collaborateurs = await collaborateurApi.ChercherCollabAgenceAsync(idAgence); + else + collaborateurs = await collaborateurApi.ChercherCollabAsync(); + if (collaborateurs == null) + return new List(); + int skip = (numPage.Value - 1) * parPage.Value; + int take = parPage.Value; + collaborateursDTO = (from c in collaborateurs + where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) + select GetCollaborateurDTO(c)).Skip(skip).Take(take); + + return collaborateursDTO; + } + /// /// Récupérer les collaborateurs d'un référent /// @@ -141,6 +210,44 @@ namespace EPAServeur.Services return collaborateursDTO; } + /// + /// Récupérer les collaborateurs d'un référent de manière asynchrone + /// + /// id du référent des collaborateurs à récupérer + /// Précise si la liste est trié dans l'ordre croissant ou décroissant + /// Numéro de la page qui est affiché du côté front + /// Nombre de collaborateurs à renvoyer + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// Renvoyer les collaborateurs du référent dont l'id est passé en paramètre + public async Task> GetCollaborateursByReferentAsync(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri) + { + /* + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + stopwatch.Stop(); + Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); + stopwatch.Restart(); + stopwatch.Stop(); + Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); + */ + Collaborateur referent = await collaborateurApi.ChercherCollabIdAsync(idReferent); + if (referent == null) + throw new ReferentNotFoundException(); + + if (texte == null) + texte = ""; + else + texte = texte.ToLower(); + IEnumerable collaborateurs = await collaborateurApi.ChercherCollabRefAsync(idReferent); + int skip = (numPage.Value - 1) * parPage.Value; + int take = parPage.Value; + IEnumerable collaborateursDTO = (from c in collaborateurs + where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) + select GetCollaborateurDTO(c)).Skip(skip).Take(take); + return collaborateursDTO; + } + /// /// Récupérer le profil d'un collaborateur par mail /// @@ -154,6 +261,19 @@ namespace EPAServeur.Services return GetProfilDTO(collaborateur); } + /// + /// Récupérer le profil d'un collaborateur par mail de manière asynchrone + /// + /// mail du collaborateur dont on cherche le profil + /// Renvoie le profil correspondant au mail passé en paramètre + public async Task GetProfilByMailAsync(string mail) + { + Collaborateur collaborateur = await collaborateurApi.ChercherCollabMailAsync(mail); + if (collaborateur == null) + throw new CollaborateurNotFoundException(); + return GetProfilDTO(collaborateur); + } + /// /// Récupérer un profil d'un collaborateur par l'id /// @@ -174,6 +294,27 @@ namespace EPAServeur.Services throw new CollaborateurNotFoundException(); return GetProfilDTO(collaborateur); } + + /// + /// Récupérer un profil d'un collaborateur par l'id de manière asynchrone + /// + /// id du collaborateur dont on cherche le profil + /// Renvoie le profil correspondant à l'id passé en paramètre + public async Task GetProfilByIdAsync(Guid? idCollaborateur) + { + //Stopwatch stopwatch = new Stopwatch(); + //stopwatch.Start(); + Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(idCollaborateur); + //stopwatch.Stop(); + //Console.WriteLine("Durée d'exécution GetProfil: {0}", stopwatch.Elapsed.TotalSeconds); + //stopwatch.Restart(); + //stopwatch.Stop(); + //Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); + + if (collaborateur == null) + throw new CollaborateurNotFoundException(); + return GetProfilDTO(collaborateur); + } #endregion #region DTO To Object From 13c4fb74fd125c45f0474ae783dfca7f009129d3 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Fri, 18 Sep 2020 12:00:28 +0200 Subject: [PATCH 11/12] =?UTF-8?q?Ajout=20des=20m=C3=A9thodes=20asynchrones?= =?UTF-8?q?=20et=20modification=20du=20DTO=20FormationDetailsDTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/FormationsApi.cs | 63 ++--- DTO/FormationDetailsDTO.cs | 7 + IServices/IFormationService.cs | 14 +- Services/FormationService.cs | 443 +++++++++++++++++++++++++++++++++ 4 files changed, 488 insertions(+), 39 deletions(-) diff --git a/Controllers/FormationsApi.cs b/Controllers/FormationsApi.cs index 812c683..8170e30 100644 --- a/Controllers/FormationsApi.cs +++ b/Controllers/FormationsApi.cs @@ -17,6 +17,7 @@ using IO.Swagger.Attributes; using IO.Swagger.DTO; using EPAServeur.IServices; using System.Linq; +using System.Threading.Tasks; namespace IO.Swagger.Controllers { @@ -46,9 +47,9 @@ namespace IO.Swagger.Controllers [ValidateModelState] [SwaggerOperation("AjouterFormation")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult AjouterFormation([FromBody] FormationDTO body) + public virtual async Task AjouterFormation([FromBody] FormationDTO body) { - FormationDTO nouvelleFormation = formationService.AddFormation(body); + FormationDTO nouvelleFormation = await formationService.AddFormationAsync(body); return Created("", nouvelleFormation); } @@ -66,9 +67,9 @@ namespace IO.Swagger.Controllers [ValidateModelState] [SwaggerOperation("DeleteFormation")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult DeleteFormation([FromRoute][Required] long? idFormation) + public virtual async Task DeleteFormation([FromRoute][Required] long? idFormation) { - if (!formationService.DeleteFormationById(idFormation)) + if ( ! await formationService.DeleteFormationByIdAsync(idFormation)) { ErreurDTO erreur = new ErreurDTO() { @@ -102,10 +103,10 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetFormationAnnulees([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) + public virtual async Task GetFormationAnnulees([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = formationService.GetFormationAnnulees(asc, numPage, parPAge, idAgence, texte, tri); + IEnumerable formations = await formationService.GetFormationAnnuleesAsync(asc, numPage, parPAge, idAgence, texte, tri); if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -135,9 +136,9 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(FormationDTO), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetFormationById([FromRoute][Required] long? idFormation) + public virtual async Task GetFormationById([FromRoute][Required] long? idFormation) { - FormationDTO formationDTO = formationService.GetFormationById(Convert.ToInt32(idFormation)); + FormationDTO formationDTO = await formationService.GetFormationByIdAsync(idFormation); if (formationDTO == null) { ErreurDTO erreurDTO = new ErreurDTO() @@ -171,10 +172,10 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetFormationRealisee([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) + public virtual async Task GetFormationRealisee([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = formationService.GetFormationRealisee(asc, numPage, parPAge, idAgence, texte, tri); + IEnumerable formations = await formationService.GetFormationRealiseeAsync(asc, numPage, parPAge, idAgence, texte, tri); if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -209,10 +210,10 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetFormations")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult GetFormations([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]int? idAgence, [FromQuery]int? statutFormation, [FromQuery]string texte, [FromQuery]string tri) + public virtual async Task GetFormations([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]int? idAgence, [FromQuery]int? statutFormation, [FromQuery]string texte, [FromQuery]string tri) { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = formationService.GetFormations(asc, numPage, parPAge, idAgence, texte, tri); + IEnumerable formations = await formationService.GetFormationsAsync(asc, numPage, parPAge, idAgence, texte, tri); if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -239,10 +240,10 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetModesFormation")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult GetModesFormation() + public virtual async Task GetModesFormation() { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable modeFormations = formationService.GetModesFormation(); + IEnumerable modeFormations = await formationService.GetModesFormationAsync(); if (modeFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -269,10 +270,10 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetOriginesFormation")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult GetOriginesFormation() + public virtual async Task GetOriginesFormation() { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable origineFormations = formationService.GetOriginesFormation(); + IEnumerable origineFormations = await formationService.GetOriginesFormationAsync(); if (origineFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -307,10 +308,10 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] - public virtual IActionResult GetProchainesFormation([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) + public virtual async Task GetProchainesFormation([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = formationService.GetProchainesFormation(asc, numPage, parPAge, idAgence, texte, tri); + IEnumerable formations = await formationService.GetProchainesFormationAsync(asc, numPage, parPAge, idAgence, texte, tri); if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -337,10 +338,10 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetStatutsFormation")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult GetStatutsFormation() + public virtual async Task GetStatutsFormation() { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable statutFormations = formationService.GetStatutsFormation(); + IEnumerable statutFormations = await formationService.GetStatutsFormationAsync(); if (statutFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -367,10 +368,10 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetTypesFormation")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult GetTypesFormation() + public virtual async Task GetTypesFormation() { //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable typeFormations = formationService.GetTypesFormation(); + IEnumerable typeFormations = await formationService.GetTypesFormationAsync(); if (typeFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -399,29 +400,15 @@ namespace IO.Swagger.Controllers [ValidateModelState] [SwaggerOperation("UpdateFormation")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual IActionResult UpdateFormation([FromBody] FormationDTO body, [FromRoute][Required] long? idFormation) + public virtual async Task UpdateFormation([FromBody] FormationDTO body, [FromRoute][Required] long? idFormation) { - FormationDTO formation = formationService.UpdateFormation(idFormation, body); + FormationDTO formation = await formationService.UpdateFormationAsync(idFormation, body); if (formation == null) { formation = formationService.AddFormation(body); return Created("", formation); } return Ok(formation); - - - //switch (formationService.UpdateFormation(body)) - //{ - // case 0: - // return Ok(); - // case 1: - // return StatusCode(201); - // case 2: - // return Forbid(); - // default: - // return NotFound(); - //} - } } } diff --git a/DTO/FormationDetailsDTO.cs b/DTO/FormationDetailsDTO.cs index d125cb6..50e979f 100644 --- a/DTO/FormationDetailsDTO.cs +++ b/DTO/FormationDetailsDTO.cs @@ -66,6 +66,13 @@ namespace IO.Swagger.DTO [DataMember(Name="nbPartitipants")] public int? NbPartitipants { get; set; } + /// + /// Gets or Sets Origine + /// + [Required] + [DataMember(Name = "origine")] + public OrigineFormationDTO Origine { get; set; } + /// /// Gets or Sets Mode /// diff --git a/IServices/IFormationService.cs b/IServices/IFormationService.cs index 2e5b0c5..4a08b04 100644 --- a/IServices/IFormationService.cs +++ b/IServices/IFormationService.cs @@ -11,18 +11,30 @@ namespace EPAServeur.IServices public interface IFormationService { FormationDTO GetFormationById(long? idFormation); - + Task GetFormationByIdAsync(long? idFormation); IEnumerable GetFormations(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); + Task> GetFormationsAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); IEnumerable GetFormationAnnulees(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); + Task> GetFormationAnnuleesAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); IEnumerable GetFormationRealisee(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); + Task> GetFormationRealiseeAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); IEnumerable GetProchainesFormation(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); + Task> GetProchainesFormationAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); IEnumerable GetModesFormation(); + Task> GetModesFormationAsync(); IEnumerable GetOriginesFormation(); + Task> GetOriginesFormationAsync(); IEnumerable GetStatutsFormation(); + Task> GetStatutsFormationAsync(); IEnumerable GetTypesFormation(); + Task> GetTypesFormationAsync(); FormationDTO AddFormation(FormationDTO formationDTO); + Task AddFormationAsync(FormationDTO formationDTO); FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO); + Task UpdateFormationAsync(long? idFormation, FormationDTO formationDTO); bool DeleteFormationById(long? idFormation); + Task DeleteFormationByIdAsync(long? idFormation); + } } diff --git a/Services/FormationService.cs b/Services/FormationService.cs index aaf7796..150f207 100644 --- a/Services/FormationService.cs +++ b/Services/FormationService.cs @@ -6,6 +6,7 @@ using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace EPAServeur.Services { @@ -51,6 +52,25 @@ namespace EPAServeur.Services return GetFormationDTO(formation); } + /// + /// Récupérer une formation par son id de manière asynchrone + /// + /// + /// + public async Task GetFormationByIdAsync(long? idFormation) + { + Formation formation = await epContext.Formation.Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation) + .FirstOrDefaultAsync(formation => formation.Id == idFormation); + + if (formation == null) + return null; + + return GetFormationDTO(formation); + } + /// /// Récupérer la liste des formations /// @@ -113,6 +133,68 @@ namespace EPAServeur.Services return formationDTOs; } + /// + /// Récupérer la liste des formations de manière asynchrone + /// + /// Préciser si les données sont dans l'ordre (true) ou dans l'ordre inverse (false) + /// Numéro de la page du tableau qui affiche les données + /// Nombre d'éléments affiché sur chaque page du tableau + /// id de l'agence à laquelle sont rattachées les données à récupérer + /// Texte permettant d'identifier l'objet rechercher + /// Colonne du tableau sur lequel le tri s'effectue + /// + public async Task> GetFormationsAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri) + { + IEnumerable formations; + IEnumerable formationDTOs; + + if (texte == null) + texte = ""; + else + texte = texte.ToLower(); + + int skip = (numPage.Value - 1) * parPAge.Value; + int take = parPAge.Value; + + if (idAgence != null) + { + try + { + formations = await epContext.Formation + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).Where(formation => formation.IdAgence == idAgence).ToListAsync(); + } + catch (Exception ex) + { + throw; + } + } + else + { + try + { + formations = await epContext.Formation.Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + } + catch (Exception ex) + { + throw; + } + } + + + if (formations == null) + return null; + + formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); + + return formationDTOs; + } + /// /// Récupérer les formations annulées /// @@ -157,6 +239,50 @@ namespace EPAServeur.Services return formationDTOs; } + /// + /// Récupérer les formations annulées de manière asynchrone + /// + /// Préciser si les données sont dans l'ordre (true) ou dans l'ordre inverse (false) + /// Numéro de la page du tableau qui affiche les données + /// Nombre d'éléments affiché sur chaque page du tableau + /// id de l'agence à laquelle sont rattachées les données à récupérer + /// Texte permettant d'identifier l'objet rechercher + /// Colonne du tableau sur lequel le tri s'effectue + /// + public async Task> GetFormationAnnuleesAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri) + { + IEnumerable formations; + IEnumerable formationDTOs; + + if (texte == null) + texte = ""; + else + texte = texte.ToLower(); + + int skip = (numPage.Value - 1) * parPAge.Value; + int take = parPAge.Value; + + if (idAgence != null) + formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && formation.Statut.Id == 4) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + else + formations = await epContext.Formation.Where(formation => formation.Statut.Id == 4) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + + if (formations == null) + return null; + + formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); + + return formationDTOs; + } + /// /// Récupérer les formations réalisées /// @@ -221,6 +347,70 @@ namespace EPAServeur.Services return formationDTOs; } + /// + /// Récupérer les formations réalisées de manière asynchrone + /// + /// Préciser si les données sont dans l'ordre (true) ou dans l'ordre inverse (false) + /// Numéro de la page du tableau qui affiche les données + /// Nombre d'éléments affiché sur chaque page du tableau + /// id de l'agence à laquelle sont rattachées les données à récupérer + /// Texte permettant d'identifier l'objet rechercher + /// Colonne du tableau sur lequel le tri s'effectue + /// + public async Task> GetFormationRealiseeAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri) + { + IEnumerable formations; + IEnumerable formationDTOs; + + if (texte == null) + texte = ""; + else + texte = texte.ToLower(); + + int skip = (numPage.Value - 1) * parPAge.Value; + int take = parPAge.Value; + + if (idAgence != null) + { + try + { + formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && formation.Statut.Id == 3) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + } + catch (Exception ex) + { + throw; + } + } + + else + { + try + { + formations = await epContext.Formation.Where(formation => formation.Statut.Id == 3) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + } + catch (Exception ex) + { + throw; + } + } + + + if (formations == null) + return null; + + formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); + + return formationDTOs; + } + /// /// Récupérer les formations plannifiées et replannifiées /// @@ -275,6 +465,60 @@ namespace EPAServeur.Services return formationDTOs; } + /// + /// Récupérer les formations plannifiées et replannifiées de manère asynchrone + /// + /// Préciser si les données sont dans l'ordre (true) ou dans l'ordre inverse (false) + /// Numéro de la page du tableau qui affiche les données + /// Nombre d'éléments affiché sur chaque page du tableau + /// id de l'agence à laquelle sont rattachées les données à récupérer + /// Texte permettant d'identifier l'objet rechercher + /// Colonne du tableau sur lequel le tri s'effectue + /// + public async Task> GetProchainesFormationAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri) + { + IEnumerable formations; + IEnumerable formationDTOs; + + if (texte == null) + texte = ""; + else + texte = texte.ToLower(); + + int skip = (numPage.Value - 1) * parPAge.Value; + int take = parPAge.Value; + + if (idAgence != null) + try + { + formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && (formation.Statut.Id == 1 || formation.Statut.Id == 2)) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + } + catch (Exception ex) + { + throw; + } + + else + { + formations = await epContext.Formation.Where(formation => (formation.Statut.Id == 1 || formation.Statut.Id == 2)) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + } + + if (formations == null) + return null; + + formationDTOs = formations.Where(formation => formation.Intitule.ToLower().Contains(texte)).Select(formation => GetFormationDTO(formation)); + + return formationDTOs; + } + /// /// Récupérer les modes de formation /// @@ -300,6 +544,31 @@ namespace EPAServeur.Services return modeFormationDTOs; } + /// + /// Récupérer les modes de formation de manière asynchrone + /// + /// + public async Task> GetModesFormationAsync() + { + IEnumerable modeFormations; + IEnumerable modeFormationDTOs; + try + { + modeFormations = await epContext.ModeFormation.ToListAsync(); + } + catch (Exception ex) + { + throw; + } + + if (modeFormations == null) + return null; + + modeFormationDTOs = modeFormations.Select(modeFormation => GetModeFormationDTO(modeFormation)); + + return modeFormationDTOs; + } + /// /// Récupérer les origines de formation /// @@ -326,6 +595,32 @@ namespace EPAServeur.Services return origineFormationDTOs; } + /// + /// Récupérer les origines de formation de manière asynchrone + /// + /// + public async Task> GetOriginesFormationAsync() + { + IEnumerable origineFormations; + IEnumerable origineFormationDTOs; + + try + { + origineFormations = await epContext.OrigineFormation.ToListAsync(); + } + catch (Exception ex) + { + throw; + } + + if (origineFormations == null) + return null; + + origineFormationDTOs = origineFormations.Select(origineFormation => GetOrigineFormationDTO(origineFormation)); + + return origineFormationDTOs; + } + /// /// Récupérer les statuts de formation /// @@ -353,6 +648,33 @@ namespace EPAServeur.Services return statutFormationDTOs; } + /// + /// Récupérer les statuts de formation de manière asynchrone + /// + /// + public async Task> GetStatutsFormationAsync() + { + IEnumerable statutFormations; + IEnumerable statutFormationDTOs; + + try + { + statutFormations = await epContext.StatutFormation.ToListAsync(); + } + catch (Exception ex) + { + + throw; + } + + if (statutFormations == null) + return null; + + statutFormationDTOs = statutFormations.Select(statutFormation => GetStatutFormationDTO(statutFormation)); + + return statutFormationDTOs; + } + /// /// Récupérer les types de formation /// @@ -379,6 +701,32 @@ namespace EPAServeur.Services return typeFormationDTOs; } + /// + /// Récupérer les types de formation de manière asynchrone + /// + /// + public async Task> GetTypesFormationAsync() + { + IEnumerable typeFormations; + IEnumerable typeFormationDTOs; + + try + { + typeFormations = await epContext.TypeFormation.ToListAsync(); + } + catch (Exception ex) + { + throw; + } + + if (typeFormations == null) + return null; + + typeFormationDTOs = typeFormations.Select(typeFormation => GetTypeFormationDTO(typeFormation)); + + return typeFormationDTOs; + } + /// /// Ajouter une formation /// @@ -411,6 +759,38 @@ namespace EPAServeur.Services return GetFormationDTO(formation); } + /// + /// Ajouter une formation de manière asynchrone + /// + /// + /// + public async Task AddFormationAsync(FormationDTO formationDTO) + { + Formation formation = new Formation(); + formation = SetFormation(formation, formationDTO); + + if (formation.Statut != null) + { + epContext.StatutFormation.Attach(formation.Statut); + } + + epContext.OrigineFormation.Attach(formation.Origine); + epContext.ModeFormation.Attach(formation.ModeFormation); + epContext.TypeFormation.Attach(formation.TypeFormation); + epContext.Add(formation); + + try + { + await epContext.SaveChangesAsync(); + } + catch (Exception ex) + { + throw; + } + + return GetFormationDTO(formation); + } + /// /// Modifier une formation /// @@ -419,6 +799,11 @@ namespace EPAServeur.Services /// public FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO) { + if (formationDTO == null && !formationDTO.Id.HasValue && formationDTO.Id.Value != idFormation) + { + return null; + } + Formation formation = epContext.Formation.Find(idFormation); if (formation == null) @@ -439,6 +824,39 @@ namespace EPAServeur.Services return GetFormationDTO(formation); } + /// + /// Modifier une formation de manière asynchrone + /// + /// + /// + /// + public async Task UpdateFormationAsync(long? idFormation, FormationDTO formationDTO) + { + if (formationDTO == null && !formationDTO.Id.HasValue && formationDTO.Id.Value != idFormation) + { + return null; + } + + Formation formation = await epContext.Formation.FindAsync(idFormation); + + if (formation == null) + { + return null; + } + + formation = SetFormation(formation, formationDTO); + try + { + await epContext.SaveChangesAsync(); + } + catch (Exception ex) + { + throw; + } + + return GetFormationDTO(formation); + } + /// /// Supprimer une formation /// @@ -465,6 +883,31 @@ namespace EPAServeur.Services return true; } + /// + /// Supprimer une formation de manière asynchrone + /// + /// + /// + public async Task DeleteFormationByIdAsync(long? idFormation) + { + Formation formation = await epContext.Formation.FindAsync(idFormation); + + if (formation == null) + return false; + + epContext.Remove(formation); + + try + { + await epContext.SaveChangesAsync(); + } + catch (Exception) + { + throw; + } + + return true; + } #endregion #region Méthodes Privée From 3ec0c7fdf41f87a4cfac40150037b009494f9d72 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Mon, 21 Sep 2020 13:43:31 +0200 Subject: [PATCH 12/12] Ajout des logs dans l'api formation --- Controllers/FormationsApi.cs | 282 +++++++++++- .../FormationIncompatibleIdException.cs | 40 ++ Exceptions/FormationInvalidException.cs | 40 ++ Exceptions/FormationNotFoundException.cs | 40 ++ Exceptions/ModeFormationNotFoundException.cs | 40 ++ .../OrigineFormationNotFoundException.cs | 40 ++ .../StatutFormationNotFoundException.cs | 40 ++ Exceptions/TypeFormationNotFoundException.cs | 40 ++ IServices/IFormationService.cs | 8 +- Services/FormationService.cs | 412 +++++++----------- 10 files changed, 695 insertions(+), 287 deletions(-) create mode 100644 Exceptions/FormationIncompatibleIdException.cs create mode 100644 Exceptions/FormationInvalidException.cs create mode 100644 Exceptions/FormationNotFoundException.cs create mode 100644 Exceptions/ModeFormationNotFoundException.cs create mode 100644 Exceptions/OrigineFormationNotFoundException.cs create mode 100644 Exceptions/StatutFormationNotFoundException.cs create mode 100644 Exceptions/TypeFormationNotFoundException.cs diff --git a/Controllers/FormationsApi.cs b/Controllers/FormationsApi.cs index 8170e30..6c58dde 100644 --- a/Controllers/FormationsApi.cs +++ b/Controllers/FormationsApi.cs @@ -18,6 +18,9 @@ using IO.Swagger.DTO; using EPAServeur.IServices; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using EPAServeur.Exceptions; +using Microsoft.EntityFrameworkCore; namespace IO.Swagger.Controllers { @@ -28,10 +31,12 @@ namespace IO.Swagger.Controllers public class FormationsApiController : ControllerBase { private readonly IFormationService formationService; + private readonly ILogger logger; - public FormationsApiController(IFormationService _formationService) + public FormationsApiController(IFormationService _formationService, ILogger _logger) { formationService = _formationService; + logger = _logger; } /// @@ -49,7 +54,28 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task AjouterFormation([FromBody] FormationDTO body) { - FormationDTO nouvelleFormation = await formationService.AddFormationAsync(body); + logger.LogInformation("Ajout d'une nouvelle formation."); + + FormationDTO nouvelleFormation = null; + + try + { + nouvelleFormation = await formationService.AddFormationAsync(body); + } + catch (FormationInvalidException) + { + logger.LogWarning("Des données sont manquants, la nouvelle formation ne peut pas être ajoutée."); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur est survenue dans la base de données durant l'ajout de la nouvelle formation."); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de l'ajout de la formation note."); + } + + logger.LogInformation("Nouvelle formation ajoutée."); return Created("", nouvelleFormation); } @@ -69,15 +95,38 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task DeleteFormation([FromRoute][Required] long? idFormation) { - if ( ! await formationService.DeleteFormationByIdAsync(idFormation)) + try { + logger.LogInformation("Suppresion de la formation {idFormation}.", idFormation); + + FormationDTO formation = await formationService.DeleteFormationByIdAsync(idFormation); + } + catch (FormationNotFoundException) + { + logger.LogError("Impossible de supprimer la formation d'id {idFormation} car elle n'existe pas.", idFormation); + ErreurDTO erreur = new ErreurDTO() { Code = "404", Message = "Aucune formation trouvée" }; + return NotFound(erreur); } + catch (DbUpdateConcurrencyException) + { + logger.LogWarning("La formation {idFormation} n'a pas pu être supprimée car elle est prise par une autre ressource.", idFormation); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur a eu lieu, la formation {idFormation} n'a pas pu être supprimée.", idFormation); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la suppression de la formation {idFormation}.", idFormation); + } + + logger.LogInformation("Formation {idFormation} supprimée avec succès.", idFormation); return NoContent(); } @@ -105,8 +154,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] public virtual async Task GetFormationAnnulees([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = await formationService.GetFormationAnnuleesAsync(asc, numPage, parPAge, idAgence, texte, tri); + logger.LogInformation("Récupération de la liste des formations annulées."); + + IEnumerable formations = null; + + try + { + formations = await formationService.GetFormationAnnuleesAsync(asc, numPage, parPAge, idAgence, texte, tri); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des formations annulées."); + } + if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -114,9 +174,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucune formation annulée" }; + return NotFound(erreur); } + logger.LogInformation("Liste des formations annulées récupérée."); + return Ok(formations); } @@ -138,16 +201,41 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] public virtual async Task GetFormationById([FromRoute][Required] long? idFormation) { - FormationDTO formationDTO = await formationService.GetFormationByIdAsync(idFormation); - if (formationDTO == null) + logger.LogInformation("Récupération de la formation {idFormation}.", idFormation); + + FormationDTO formationDTO = null; + + try + { + formationDTO = await formationService.GetFormationByIdAsync(idFormation); + } + catch (FormationNotFoundException) { + logger.LogError("Aucune formation ne correspond à l'id {idFormation} recherchée.", idFormation); + ErreurDTO erreurDTO = new ErreurDTO() { Code = "404", Message = "La formation n'existe pas", }; + return NotFound(erreurDTO); } + catch (DbUpdateConcurrencyException) + { + logger.LogWarning("La formation {idFormation} n'a pas pu être récupérée car elle est prise par une autre ressource.", idFormation); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur a eu lieu, la formation {idFormation} n'a pas pu être récupérée.", idFormation); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la formation {idFormation}.", idFormation); + } + + logger.LogInformation("Formation {idFormation} récupérée.", idFormation); + return Ok(formationDTO); } @@ -174,8 +262,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] public virtual async Task GetFormationRealisee([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = await formationService.GetFormationRealiseeAsync(asc, numPage, parPAge, idAgence, texte, tri); + logger.LogInformation("Récupération de la liste des formations réalisées."); + + IEnumerable formations = null; + + try + { + formations = await formationService.GetFormationRealiseeAsync(asc, numPage, parPAge, idAgence, texte, tri); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des formations réalisées."); + } + if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -183,9 +282,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucune formation réalisée" }; + return NotFound(erreur); } + logger.LogInformation("Liste des formations réalisées récupérée."); + return Ok(formations); } @@ -210,10 +312,21 @@ namespace IO.Swagger.Controllers [SwaggerOperation("GetFormations")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] - public virtual async Task GetFormations([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]int? idAgence, [FromQuery]int? statutFormation, [FromQuery]string texte, [FromQuery]string tri) + public virtual async Task GetFormations([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] int? statutFormation, [FromQuery] string texte, [FromQuery] string tri) { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = await formationService.GetFormationsAsync(asc, numPage, parPAge, idAgence, texte, tri); + logger.LogInformation("Récupération de la liste des formations."); + + IEnumerable formations = null; + + try + { + formations = await formationService.GetFormationsAsync(asc, numPage, parPAge, idAgence, statutFormation, texte, tri); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des formations."); + } + if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -221,9 +334,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucune formation" }; + return NotFound(erreur); } + logger.LogInformation("Liste des formations récupérée."); + return Ok(formations); } @@ -242,8 +358,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task GetModesFormation() { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable modeFormations = await formationService.GetModesFormationAsync(); + logger.LogInformation("Récupération de la liste des modes de formation."); + + IEnumerable modeFormations = null; + + try + { + modeFormations = await formationService.GetModesFormationAsync(); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des modes de formation."); + } + if (modeFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -251,9 +378,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucun mode de formation" }; + return NotFound(erreur); } + logger.LogInformation("Liste des modes de formation récupérée."); + return Ok(modeFormations); } @@ -272,8 +402,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task GetOriginesFormation() { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable origineFormations = await formationService.GetOriginesFormationAsync(); + logger.LogInformation("Récupération de la liste des origines de formation."); + + IEnumerable origineFormations = null; + + try + { + origineFormations = await formationService.GetOriginesFormationAsync(); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des origines de formation."); + } + if (origineFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -284,6 +425,8 @@ namespace IO.Swagger.Controllers return NotFound(erreur); } + logger.LogInformation("Liste des origines de formation récupérée."); + return Ok(origineFormations); } @@ -310,8 +453,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "Ressource n'a pas été trouvée")] public virtual async Task GetProchainesFormation([FromQuery][Required()] bool? asc, [FromQuery][Required()] int? numPage, [FromQuery][Required()] int? parPAge, [FromQuery] int? idAgence, [FromQuery] string texte, [FromQuery] string tri) { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable formations = await formationService.GetProchainesFormationAsync(asc, numPage, parPAge, idAgence, texte, tri); + logger.LogInformation("Récupération de la liste des prochaines formations."); + + IEnumerable formations = null; + + try + { + formations = await formationService.GetProchainesFormationAsync(asc, numPage, parPAge, idAgence, texte, tri); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des prochaines formations."); + } + if (formations == null) { ErreurDTO erreur = new ErreurDTO() @@ -319,9 +473,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucune prochaine formation" }; + return NotFound(erreur); } + logger.LogInformation("Liste des prochaines formations récupérée."); + return Ok(formations); } @@ -340,8 +497,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task GetStatutsFormation() { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable statutFormations = await formationService.GetStatutsFormationAsync(); + logger.LogInformation("Récupération de la liste des statuts de formation."); + + IEnumerable statutFormations = null; + + try + { + statutFormations = await formationService.GetStatutsFormationAsync(); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des statuts de formation."); + } + if (statutFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -349,9 +517,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucun statut de formation" }; + return NotFound(erreur); } + logger.LogInformation("Liste des statuts de formation récupérée."); + return Ok(statutFormations); } @@ -370,8 +541,19 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task GetTypesFormation() { - //TODO: Uncomment the next line to return response 200 or use other options such as return this.NotFound(), return this.BadRequest(..), ... - IEnumerable typeFormations = await formationService.GetTypesFormationAsync(); + logger.LogInformation("Récupération de la liste des types de formation."); + + IEnumerable typeFormations = null; + + try + { + typeFormations = await formationService.GetTypesFormationAsync(); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des types de formation."); + } + if (typeFormations == null) { ErreurDTO erreur = new ErreurDTO() @@ -379,9 +561,12 @@ namespace IO.Swagger.Controllers Code = "404", Message = "Aucun type de formation" }; + return NotFound(erreur); } + logger.LogInformation("Liste des types de formation récupérée."); + return Ok(typeFormations); } @@ -402,12 +587,61 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] public virtual async Task UpdateFormation([FromBody] FormationDTO body, [FromRoute][Required] long? idFormation) { - FormationDTO formation = await formationService.UpdateFormationAsync(idFormation, body); + logger.LogInformation("Mise à jour de la formation d'id {idFormation}.", idFormation); + + FormationDTO formation = null; + + try + { + formation = await formationService.UpdateFormationAsync(idFormation, body); + } + catch (FormationInvalidException) + { + logger.LogWarning("Des données sont manquants, la formation {idFormation} ne peut pas être mise à jour.", idFormation); + } + catch (FormationIncompatibleIdException) + { + logger.LogError("L'id de la formation à mettre à jour {body.Id} et l'id de la formation avec les nouvelles informations {idFormation} sont différents.", body.Id, idFormation); + } + catch (DbUpdateConcurrencyException) + { + logger.LogError("La formation {idFormation} n'a pas pu être mise à jour car elle est prise par une autre ressource.", idFormation); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur est survenue dans la base de données lors de la mise à jour de la formation {idFormation}.", idFormation); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de la mise à jour de la formation {idFormation}.", idFormation); + } + if (formation == null) { - formation = formationService.AddFormation(body); + try + { + formation = await formationService.AddFormationAsync(body); + } + catch (FormationInvalidException) + { + logger.LogWarning("Des données sont manquants, la nouvelle formation ne peut pas être ajoutée."); + } + catch (DbUpdateException) + { + logger.LogError("Une erreur est survenue dans la base de données durant l'ajout de la nouvelle formation."); + } + catch (Exception) + { + logger.LogError("Une erreur inconnue est survenue lors de l'ajout de la formation note."); + } + + logger.LogInformation("Nouvelle formation ajoutée."); + return Created("", formation); } + + logger.LogInformation("Update effectué avec succès"); + return Ok(formation); } } diff --git a/Exceptions/FormationIncompatibleIdException.cs b/Exceptions/FormationIncompatibleIdException.cs new file mode 100644 index 0000000..2fc7201 --- /dev/null +++ b/Exceptions/FormationIncompatibleIdException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsque l'id de la formation avec les données à mettre à jour et l'id de la formation à mettre sont différents + /// + public class FormationIncompatibleIdException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public FormationIncompatibleIdException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public FormationIncompatibleIdException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public FormationIncompatibleIdException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/Exceptions/FormationInvalidException.cs b/Exceptions/FormationInvalidException.cs new file mode 100644 index 0000000..0d5e444 --- /dev/null +++ b/Exceptions/FormationInvalidException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsq'une formation est invalide + /// + public class FormationInvalidException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public FormationInvalidException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public FormationInvalidException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public FormationInvalidException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/Exceptions/FormationNotFoundException.cs b/Exceptions/FormationNotFoundException.cs new file mode 100644 index 0000000..93fdcc9 --- /dev/null +++ b/Exceptions/FormationNotFoundException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsqu'une formation n'a pas été trouvée + /// + public class FormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public FormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public FormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public FormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/Exceptions/ModeFormationNotFoundException.cs b/Exceptions/ModeFormationNotFoundException.cs new file mode 100644 index 0000000..c3c1f4a --- /dev/null +++ b/Exceptions/ModeFormationNotFoundException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsqu'un mode de formation n'a pas été trouvé + /// + public class ModeFormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public ModeFormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public ModeFormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public ModeFormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/Exceptions/OrigineFormationNotFoundException.cs b/Exceptions/OrigineFormationNotFoundException.cs new file mode 100644 index 0000000..26438b6 --- /dev/null +++ b/Exceptions/OrigineFormationNotFoundException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsqu'une origine de formation n'a pas été trouvée + /// + public class OrigineFormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public OrigineFormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public OrigineFormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public OrigineFormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/Exceptions/StatutFormationNotFoundException.cs b/Exceptions/StatutFormationNotFoundException.cs new file mode 100644 index 0000000..66c7167 --- /dev/null +++ b/Exceptions/StatutFormationNotFoundException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsqu'un statut de formation n'a pas été trouvé + /// + public class StatutFormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public StatutFormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public StatutFormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public StatutFormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/Exceptions/TypeFormationNotFoundException.cs b/Exceptions/TypeFormationNotFoundException.cs new file mode 100644 index 0000000..54f1de8 --- /dev/null +++ b/Exceptions/TypeFormationNotFoundException.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace EPAServeur.Exceptions +{ + /// + /// Exception à jeter lorsqu'un type de formation n'a pas été trouvé + /// + public class TypeFormationNotFoundException : Exception + { + /// + /// Initialise une nouvelle instance de la classe class. + /// + public TypeFormationNotFoundException() + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + public TypeFormationNotFoundException(string message) : base(message) + { + + } + + /// + /// Initialise une nouvelle instance de la classe class. + /// + /// + /// + public TypeFormationNotFoundException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/IServices/IFormationService.cs b/IServices/IFormationService.cs index 4a08b04..6b455c8 100644 --- a/IServices/IFormationService.cs +++ b/IServices/IFormationService.cs @@ -12,8 +12,8 @@ namespace EPAServeur.IServices { FormationDTO GetFormationById(long? idFormation); Task GetFormationByIdAsync(long? idFormation); - IEnumerable GetFormations(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); - Task> GetFormationsAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); + IEnumerable GetFormations(bool? asc, int? numPage, int? parPAge, int? idAgence, int? statutFormation, string texte, string tri); + Task> GetFormationsAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, int? statutFormation, string texte, string tri); IEnumerable GetFormationAnnulees(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); Task> GetFormationAnnuleesAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); IEnumerable GetFormationRealisee(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri); @@ -33,8 +33,8 @@ namespace EPAServeur.IServices Task AddFormationAsync(FormationDTO formationDTO); FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO); Task UpdateFormationAsync(long? idFormation, FormationDTO formationDTO); - bool DeleteFormationById(long? idFormation); - Task DeleteFormationByIdAsync(long? idFormation); + FormationDTO DeleteFormationById(long? idFormation); + Task DeleteFormationByIdAsync(long? idFormation); } } diff --git a/Services/FormationService.cs b/Services/FormationService.cs index 150f207..f164303 100644 --- a/Services/FormationService.cs +++ b/Services/FormationService.cs @@ -1,4 +1,5 @@ using EPAServeur.Context; +using EPAServeur.Exceptions; using EPAServeur.IServices; using EPAServeur.Models.Formation; using IO.Swagger.DTO; @@ -47,7 +48,7 @@ namespace EPAServeur.Services .FirstOrDefault(formation => formation.Id == idFormation); if (formation == null) - return null; + throw new FormationNotFoundException(); return GetFormationDTO(formation); } @@ -66,7 +67,7 @@ namespace EPAServeur.Services .FirstOrDefaultAsync(formation => formation.Id == idFormation); if (formation == null) - return null; + throw new FormationNotFoundException(); return GetFormationDTO(formation); } @@ -81,7 +82,7 @@ namespace EPAServeur.Services /// Texte permettant d'identifier l'objet rechercher /// Colonne du tableau sur lequel le tri s'effectue /// - public IEnumerable GetFormations(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri) + public IEnumerable GetFormations(bool? asc, int? numPage, int? parPAge, int? idAgence, int? statutFormation, string texte, string tri) { IEnumerable formations; IEnumerable formationDTOs; @@ -94,34 +95,38 @@ namespace EPAServeur.Services int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; - if (idAgence != null) + if (statutFormation != null && idAgence != null) { - try - { - formations = epContext.Formation.Where(formation => formation.IdAgence == idAgence) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation); - } - catch (Exception ex) - { - throw; - } + formations = epContext.Formation + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation) + .Where(formation => formation.Statut.Id == statutFormation && formation.IdAgence == idAgence); + } + else if (statutFormation != null && idAgence == null) + { + formations = epContext.Formation + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation) + .Where(formation => formation.Statut.Id == statutFormation); + } + else if (idAgence != null) + { + formations = epContext.Formation.Where(formation => formation.IdAgence == idAgence) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation); } else { - try - { - formations = epContext.Formation.Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation); - } - catch (Exception ex) - { - throw; - } + formations = epContext.Formation.Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation); } @@ -143,7 +148,7 @@ namespace EPAServeur.Services /// Texte permettant d'identifier l'objet rechercher /// Colonne du tableau sur lequel le tri s'effectue /// - public async Task> GetFormationsAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, string texte, string tri) + public async Task> GetFormationsAsync(bool? asc, int? numPage, int? parPAge, int? idAgence, int? statutFormation, string texte, string tri) { IEnumerable formations; IEnumerable formationDTOs; @@ -156,34 +161,42 @@ namespace EPAServeur.Services int skip = (numPage.Value - 1) * parPAge.Value; int take = parPAge.Value; - if (idAgence != null) + if (statutFormation != null && idAgence != null) { - try - { - formations = await epContext.Formation - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation).Where(formation => formation.IdAgence == idAgence).ToListAsync(); - } - catch (Exception ex) - { - throw; - } + formations = await epContext.Formation + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation) + .Where(formation => formation.Statut.Id == statutFormation && formation.IdAgence == idAgence).ToListAsync(); + } + else if (statutFormation != null && idAgence == null) + { + formations = await epContext.Formation + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation) + .Where(formation => formation.Statut.Id == statutFormation).ToListAsync(); + } + else if (idAgence != null) + { + + formations = await epContext.Formation + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).Where(formation => formation.IdAgence == idAgence).ToListAsync(); + } else { - try - { - formations = await epContext.Formation.Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation).ToListAsync(); - } - catch (Exception ex) - { - throw; - } + + formations = await epContext.Formation.Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + } @@ -308,34 +321,23 @@ namespace EPAServeur.Services if (idAgence != null) { - try - { - formations = epContext.Formation.Where(formation => formation.IdAgence == idAgence && formation.Statut.Id == 3) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation); - } - catch (Exception ex) - { - throw; - } + + formations = epContext.Formation.Where(formation => formation.IdAgence == idAgence && formation.Statut.Id == 3) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation); } else { - try - { - formations = epContext.Formation.Where(formation => formation.Statut.Id == 3) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation); - } - catch (Exception ex) - { - throw; - } + + formations = epContext.Formation.Where(formation => formation.Statut.Id == 3) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation); + } @@ -372,34 +374,22 @@ namespace EPAServeur.Services if (idAgence != null) { - try - { - formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && formation.Statut.Id == 3) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation).ToListAsync(); - } - catch (Exception ex) - { - throw; - } + + formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && formation.Statut.Id == 3) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); } else { - try - { - formations = await epContext.Formation.Where(formation => formation.Statut.Id == 3) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation).ToListAsync(); - } - catch (Exception ex) - { - throw; - } + + formations = await epContext.Formation.Where(formation => formation.Statut.Id == 3) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); } @@ -435,19 +425,14 @@ namespace EPAServeur.Services int take = parPAge.Value; if (idAgence != null) - try - { - formations = epContext.Formation.Where(formation => formation.IdAgence == idAgence && (formation.Statut.Id == 1 || formation.Statut.Id == 2)) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation); - } - catch (Exception ex) - { - throw; - } + { + formations = epContext.Formation.Where(formation => formation.IdAgence == idAgence && (formation.Statut.Id == 1 || formation.Statut.Id == 2)) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation); + } else { formations = epContext.Formation.Where(formation => (formation.Statut.Id == 1 || formation.Statut.Id == 2)) @@ -489,18 +474,14 @@ namespace EPAServeur.Services int take = parPAge.Value; if (idAgence != null) - try - { - formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && (formation.Statut.Id == 1 || formation.Statut.Id == 2)) - .Include(formation => formation.Statut) - .Include(formation => formation.ModeFormation) - .Include(formation => formation.Origine) - .Include(formation => formation.TypeFormation).ToListAsync(); - } - catch (Exception ex) - { - throw; - } + { + formations = await epContext.Formation.Where(formation => formation.IdAgence == idAgence && (formation.Statut.Id == 1 || formation.Statut.Id == 2)) + .Include(formation => formation.Statut) + .Include(formation => formation.ModeFormation) + .Include(formation => formation.Origine) + .Include(formation => formation.TypeFormation).ToListAsync(); + + } else { @@ -527,14 +508,8 @@ namespace EPAServeur.Services { IEnumerable modeFormations; IEnumerable modeFormationDTOs; - try - { - modeFormations = epContext.ModeFormation; - } - catch (Exception ex) - { - throw; - } + + modeFormations = epContext.ModeFormation; if (modeFormations == null) return null; @@ -552,14 +527,7 @@ namespace EPAServeur.Services { IEnumerable modeFormations; IEnumerable modeFormationDTOs; - try - { - modeFormations = await epContext.ModeFormation.ToListAsync(); - } - catch (Exception ex) - { - throw; - } + modeFormations = await epContext.ModeFormation.ToListAsync(); if (modeFormations == null) return null; @@ -578,14 +546,7 @@ namespace EPAServeur.Services IEnumerable origineFormations; IEnumerable origineFormationDTOs; - try - { - origineFormations = epContext.OrigineFormation; - } - catch (Exception ex) - { - throw; - } + origineFormations = epContext.OrigineFormation; if (origineFormations == null) return null; @@ -604,14 +565,7 @@ namespace EPAServeur.Services IEnumerable origineFormations; IEnumerable origineFormationDTOs; - try - { - origineFormations = await epContext.OrigineFormation.ToListAsync(); - } - catch (Exception ex) - { - throw; - } + origineFormations = await epContext.OrigineFormation.ToListAsync(); if (origineFormations == null) return null; @@ -630,15 +584,7 @@ namespace EPAServeur.Services IEnumerable statutFormations; IEnumerable statutFormationDTOs; - try - { - statutFormations = epContext.StatutFormation; - } - catch (Exception ex) - { - - throw; - } + statutFormations = epContext.StatutFormation; if (statutFormations == null) return null; @@ -657,15 +603,7 @@ namespace EPAServeur.Services IEnumerable statutFormations; IEnumerable statutFormationDTOs; - try - { - statutFormations = await epContext.StatutFormation.ToListAsync(); - } - catch (Exception ex) - { - - throw; - } + statutFormations = await epContext.StatutFormation.ToListAsync(); if (statutFormations == null) return null; @@ -684,14 +622,7 @@ namespace EPAServeur.Services IEnumerable typeFormations; IEnumerable typeFormationDTOs; - try - { - typeFormations = epContext.TypeFormation; - } - catch (Exception ex) - { - throw; - } + typeFormations = epContext.TypeFormation; if (typeFormations == null) return null; @@ -710,14 +641,7 @@ namespace EPAServeur.Services IEnumerable typeFormations; IEnumerable typeFormationDTOs; - try - { - typeFormations = await epContext.TypeFormation.ToListAsync(); - } - catch (Exception ex) - { - throw; - } + typeFormations = await epContext.TypeFormation.ToListAsync(); if (typeFormations == null) return null; @@ -734,27 +658,21 @@ namespace EPAServeur.Services /// public FormationDTO AddFormation(FormationDTO formationDTO) { + if (!IsFormationValide(formationDTO)) + throw new FormationInvalidException(); + Formation formation = new Formation(); formation = SetFormation(formation, formationDTO); if (formation.Statut != null) - { epContext.StatutFormation.Attach(formation.Statut); - } epContext.OrigineFormation.Attach(formation.Origine); epContext.ModeFormation.Attach(formation.ModeFormation); epContext.TypeFormation.Attach(formation.TypeFormation); epContext.Add(formation); - try - { - epContext.SaveChanges(); - } - catch (Exception ex) - { - throw; - } + epContext.SaveChanges(); return GetFormationDTO(formation); } @@ -766,27 +684,21 @@ namespace EPAServeur.Services /// public async Task AddFormationAsync(FormationDTO formationDTO) { + if (!IsFormationValide(formationDTO)) + throw new FormationInvalidException(); + Formation formation = new Formation(); formation = SetFormation(formation, formationDTO); if (formation.Statut != null) - { epContext.StatutFormation.Attach(formation.Statut); - } epContext.OrigineFormation.Attach(formation.Origine); epContext.ModeFormation.Attach(formation.ModeFormation); epContext.TypeFormation.Attach(formation.TypeFormation); epContext.Add(formation); - try - { - await epContext.SaveChangesAsync(); - } - catch (Exception ex) - { - throw; - } + await epContext.SaveChangesAsync(); return GetFormationDTO(formation); } @@ -799,27 +711,20 @@ namespace EPAServeur.Services /// public FormationDTO UpdateFormation(long? idFormation, FormationDTO formationDTO) { - if (formationDTO == null && !formationDTO.Id.HasValue && formationDTO.Id.Value != idFormation) - { - return null; - } + if (!IsFormationValide(formationDTO)) + throw new FormationInvalidException(); + + if (formationDTO == null && !formationDTO.Id.HasValue && formationDTO.Id.Value != idFormation) + throw new FormationIncompatibleIdException(); Formation formation = epContext.Formation.Find(idFormation); if (formation == null) - { return null; - } formation = SetFormation(formation, formationDTO); - try - { - epContext.SaveChanges(); - } - catch (Exception ex) - { - throw; - } + + epContext.SaveChanges(); return GetFormationDTO(formation); } @@ -832,27 +737,19 @@ namespace EPAServeur.Services /// public async Task UpdateFormationAsync(long? idFormation, FormationDTO formationDTO) { + if (!IsFormationValide(formationDTO)) + throw new FormationInvalidException(); + if (formationDTO == null && !formationDTO.Id.HasValue && formationDTO.Id.Value != idFormation) - { - return null; - } + throw new FormationIncompatibleIdException(); Formation formation = await epContext.Formation.FindAsync(idFormation); if (formation == null) - { return null; - } formation = SetFormation(formation, formationDTO); - try - { - await epContext.SaveChangesAsync(); - } - catch (Exception ex) - { - throw; - } + await epContext.SaveChangesAsync(); return GetFormationDTO(formation); } @@ -862,25 +759,19 @@ namespace EPAServeur.Services /// /// /// - public bool DeleteFormationById(long? idFormation) + public FormationDTO DeleteFormationById(long? idFormation) { Formation formation = epContext.Formation.Find(idFormation); if (formation == null) - return false; + throw new FormationNotFoundException(); epContext.Remove(formation); - try - { - epContext.SaveChanges(); - } - catch (Exception) - { - throw; - } - return true; + epContext.SaveChanges(); + + return GetFormationDTO(formation); } /// @@ -888,29 +779,32 @@ namespace EPAServeur.Services /// /// /// - public async Task DeleteFormationByIdAsync(long? idFormation) + public async Task DeleteFormationByIdAsync(long? idFormation) { Formation formation = await epContext.Formation.FindAsync(idFormation); if (formation == null) - return false; + throw new FormationNotFoundException(); epContext.Remove(formation); - try - { - await epContext.SaveChangesAsync(); - } - catch (Exception) - { - throw; - } + await epContext.SaveChangesAsync(); - return true; + return GetFormationDTO(formation); } #endregion #region Méthodes Privée + /// + /// Vérifier si un objet FormationDTO est valide pour ajout ou mise à jour + /// + /// Un objet FormationDTO est valide si aucune de ses propriétés n'est à null + /// + /// true si l'objet est valide, false sinon + private bool IsFormationValide(FormationDTO formation) + { + return !(formation == null || formation.IdAgence == null || formation.Intitule == null || formation.Organisme == null); + } #region Object to DTO ///