diff --git a/EPAServeur/Controllers/NotesApi.cs b/EPAServeur/Controllers/NotesApi.cs index b9b91cf..7cefb0f 100644 --- a/EPAServeur/Controllers/NotesApi.cs +++ b/EPAServeur/Controllers/NotesApi.cs @@ -321,7 +321,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/notes/auteur/{idAuteur}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetNotesAuteur")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] @@ -329,8 +329,45 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "L’utilisateur souhaitant accéder à la ressource n’a pas les droits d’accès suffisants")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "La ressource n'a pas été trouvée")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetNotesAuteur([FromRoute][Required]Guid? idAuteur, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) - { + public virtual async Task GetNotesAuteur([FromRoute][Required]Guid? idAuteur, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) + { + IEnumerable affichageNotes; + try + { + affichageNotes = await noteService.GetNotesByAuteurAsync(idAuteur, asc, numPage, parPAge, texte, tri); + //affichageNotes = noteService.GetNotesByAuteur(idAuteur, asc, numPage, parPAge, texte, tri); + } + catch(ReferentNotFoundException e) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 404, + Message = e.Message, + }; + return NotFound(erreurDTO); + } + catch(ApiException e) + { + logger.LogError(e.Message); + ErreurDTO erreur = new ErreurDTO() + { + Code = 500, + Message = "Une erreur est survenue lors de la récupération des informations collaborateurs", + }; + return StatusCode(erreur.Code.Value, erreur); + } + catch(Exception e) + { + logger.LogError(e.Message); + ErreurDTO erreur = new ErreurDTO() + { + Code = 500, + //Message = "Une erreur inconnue est survenue", + Message = e.StackTrace, + }; + return StatusCode(500, erreur); + } + return Ok(affichageNotes); //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)); @@ -345,13 +382,6 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(500, 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); } /// @@ -370,8 +400,8 @@ namespace IO.Swagger.Controllers /// La ressource n'a pas été trouvée /// Une erreur est survenue sur le serveur [HttpGet] - [Route("/api/notes/{idAuteur}/count")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + [Route("/api/notes/auteur/{idAuteur}/count")] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetNotesAuteurCount")] [SwaggerResponse(statusCode: 200, type: typeof(long?), description: "OK")] @@ -379,8 +409,43 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "L’utilisateur souhaitant accéder à la ressource n’a pas les droits d’accès suffisants")] [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "La ressource n'a pas été trouvée")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetNotesAuteurCount([FromRoute][Required]Guid? idAuteur, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) - { + public virtual async Task GetNotesAuteurCount([FromRoute][Required]Guid? idAuteur, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) + { + int notes; + try + { + notes = await noteService.GetNotesByAuteurCountAsync(idAuteur, texte); + } + catch(ApiException e) + { + logger.LogError(e.Message); + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur est survenue lors de la récupération des informations collaborateurs", + }; + return StatusCode(500, erreurDTO); + } + catch(ReferentNotFoundException e) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 404, + Message = e.Message, + }; + return NotFound(erreurDTO); + } + catch(Exception e) + { + logger.LogError(e.Message); + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur inconnue es survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + return Ok(notes); //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(long?)); @@ -395,13 +460,6 @@ namespace IO.Swagger.Controllers //TODO: Uncomment the next line to return response 500 or use other options such as return this.NotFound(), return this.BadRequest(..), ... // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "0"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(long?); //TODO: Change the data returned - return new ObjectResult(example); } /// diff --git a/EPAServeur/IServices/INoteService.cs b/EPAServeur/IServices/INoteService.cs index 2326e69..d38de0c 100644 --- a/EPAServeur/IServices/INoteService.cs +++ b/EPAServeur/IServices/INoteService.cs @@ -25,6 +25,10 @@ namespace EPAServeur.IServices void SupprimerNoteAsync(long? idNote); DetailsNoteDTO GetNoteById(long? idNote); Task GetNoteByIdAsync(long? idNote); + IEnumerable GetNotesByAuteur(Guid? idAuteur, bool? asc, int? numPage, int? parPAge, string texte, string tri); + Task> GetNotesByAuteurAsync(Guid? idAuteur, bool? asc, int? numPage, int? parPAge, string texte, string tri); + int GetNotesByAuteurCount(Guid? idAuteur, string texte); + Task GetNotesByAuteurCountAsync(Guid? idAuteur, string texte); diff --git a/EPAServeur/Services/NoteService.cs b/EPAServeur/Services/NoteService.cs index 2ce9ca7..ed3c1d0 100644 --- a/EPAServeur/Services/NoteService.cs +++ b/EPAServeur/Services/NoteService.cs @@ -106,6 +106,77 @@ namespace EPAServeur.Services return NoteToDetailSDTO(note); } + + /// + /// 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) + { + Collaborateur auteur = collaborateurApi.ChercherCollabId(idAuteur); + if (auteur == null) + throw new ReferentNotFoundException("L'auteur de la note n'existe pas"); + + int skip = (numPage.Value - 1) * parPage.Value; + int take = parPage.Value; + //Stopwatch stopwatch = new Stopwatch(); + //stopwatch.Start(); + /* + * IEnumerable AffichageNoteDTO = (from n in context.Note + where n.IdAuteur == idAuteur + select NoteToAffichageDTO(n)); + */ + IEnumerable notes = (from n in context.Note + where n.IdAuteur == idAuteur + select n); + IEnumerable AffichageNoteDTO = (from n in notes + select NoteToAffichageDTO(n)); + + if (texte != null) + { + texte = texte.ToLower(); + AffichageNoteDTO = (from a in AffichageNoteDTO + where a.Collaborateur.ToLower().Contains(texte) || a.Titre.ToLower().Contains(texte) + select a); + } + return AffichageNoteDTO.Skip(skip).Take(take); + } + + /// + /// Récupérer le nombre de notes qu'un auteur a écrit + /// + /// Id de l'auteur des notes à récupérer + /// permet de récupérer les notes les informations du collaborateur ou le titre de la note contient le texte + /// Le nombre de notes + public int GetNotesByAuteurCount(Guid? idAuteur, string texte) + { + Collaborateur auteur = collaborateurApi.ChercherCollabId(idAuteur); + if (auteur == null) + throw new ReferentNotFoundException("L'auteur de la note n'existe pas"); + + IEnumerable notes = (from n in context.Note + where n.IdAuteur == idAuteur + select n); + IEnumerable AffichageNoteDTO = (from n in notes + select NoteToAffichageDTO(n)); + + if (texte != null) + { + texte = texte.ToLower(); + AffichageNoteDTO = (from a in AffichageNoteDTO + where a.Collaborateur.ToLower().Contains(texte) || a.Titre.ToLower().Contains(texte) + select a); + } + + return AffichageNoteDTO.Count(); + } + #endregion #region Services Async @@ -173,6 +244,69 @@ namespace EPAServeur.Services return await NoteToDetailSDTOAsync(note); } + /// + /// 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 async Task> GetNotesByAuteurAsync(Guid? idAuteur, bool? asc, int? numPage, int? parPage, string texte, string tri) + { + Collaborateur auteur = await collaborateurApi.ChercherCollabIdAsync(idAuteur); + if (auteur == null) + throw new ReferentNotFoundException("L'auteur de la note n'existe pas"); + + int skip = (numPage.Value - 1) * parPage.Value; + int take = parPage.Value; + + IEnumerable notes = context.Note.Where(n => n.IdAuteur == idAuteur); + + var task = notes.Select(n => NoteToAffichageDTOAsync(n)); + IEnumerable AffichageNoteDTO = await Task.WhenAll(task); + + if (texte != null) + { + texte = texte.ToLower(); + AffichageNoteDTO = (from a in AffichageNoteDTO + where a.Collaborateur.ToLower().Contains(texte) || a.Titre.ToLower().Contains(texte) + select a); + } + + return AffichageNoteDTO.Skip(skip).Take(take); + } + + /// + /// Récupérer le nombre de notes qu'un auteur a écrit + /// + /// Id de l'auteur des notes à récupérer + /// permet de récupérer les notes les informations du collaborateur ou le titre de la note contient le texte + /// Le nombre de notes + public async Task GetNotesByAuteurCountAsync(Guid? idAuteur, string texte) + { + Collaborateur auteur = await collaborateurApi.ChercherCollabIdAsync(idAuteur); + if (auteur == null) + throw new ReferentNotFoundException("L'auteur de la note n'existe pas"); + + IEnumerable notes = context.Note.Where(n => n.IdAuteur == idAuteur); + + var task = notes.Select(n => NoteToAffichageDTOAsync(n)); + IEnumerable AffichageNoteDTO = await Task.WhenAll(task); + + if (texte != null) + { + texte = texte.ToLower(); + AffichageNoteDTO = (from a in AffichageNoteDTO + where a.Collaborateur.ToLower().Contains(texte) || a.Titre.ToLower().Contains(texte) + select a); + } + + return AffichageNoteDTO.Count(); + } + #endregion /* @@ -379,15 +513,42 @@ namespace EPAServeur.Services /// Note à transformer /// Service collaborateur pour récupérer les informations des collaborateurs /// La note transformée pour être affichée - private AffichageNoteDTO NoteToAffichageDTO(Note note) + private AffichageNoteDTO NoteToAffichageDTO(Note note) { - //CollaborateurDTO collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur); + /* + string infoCollab = "Aucun collaborateur lié"; Collaborateur collaborateur = collaborateurApi.ChercherCollabId((Guid?)note.IdCollaborateur); + if (collaborateur != null) + infoCollab = collaborateur.Prenom + collaborateur.Nom; + */ + AffichageNoteDTO affichage = new AffichageNoteDTO() + { + Id = note.IdNote, + IdCollaborateur = note.IdCollaborateur, + Collaborateur = "ui", + Titre = note.Titre, + DateMiseAJour = note.DateMiseAJour + }; + return affichage; + } + + /// + /// 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 async Task NoteToAffichageDTOAsync(Note note) + { + string infoCollab = "Aucun collaborateur lié"; + Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync((Guid?)note.IdCollaborateur); + if (collaborateur != null) + infoCollab = collaborateur.Prenom + " " + collaborateur.Nom; AffichageNoteDTO affichage = new AffichageNoteDTO() { Id = note.IdNote, IdCollaborateur = note.IdCollaborateur, - Collaborateur = collaborateur.Prenom + collaborateur.Nom, + Collaborateur = infoCollab, Titre = note.Titre, DateMiseAJour = note.DateMiseAJour }; @@ -403,7 +564,7 @@ namespace EPAServeur.Services { CollaborateurDTO collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur); if (collaborateur == null) - throw new CollaborateurNotFoundException("Il est impossible de récupérer une note donc le collaborateur n'existe plus"); + throw new CollaborateurNotFoundException("Il est impossible de récupérer une note dont le collaborateur n'existe plus"); DetailsNoteDTO details = new DetailsNoteDTO() { Id = note.IdNote,