diff --git a/EPAServeur/Controllers/NotesApi.cs b/EPAServeur/Controllers/NotesApi.cs index 7cefb0f..ed822a5 100644 --- a/EPAServeur/Controllers/NotesApi.cs +++ b/EPAServeur/Controllers/NotesApi.cs @@ -476,7 +476,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpPut] [Route("/api/notes/{idNote}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("UpdateNote")] [SwaggerResponse(statusCode: 200, type: typeof(DetailsNoteDTO), description: "Note modifiée avec succès")] @@ -485,8 +485,60 @@ namespace IO.Swagger.Controllers [SwaggerResponse(statusCode: 404, type: typeof(ErreurDTO), description: "La ressource n'a pas été trouvée")] [SwaggerResponse(statusCode: 415, type: typeof(ErreurDTO), description: "L’opération ne peut pas être effectuée car certaines données sont manquantes")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult UpdateNote([FromBody]DetailsNoteDTO body, [FromRoute][Required]long? idNote) + public virtual async Task UpdateNote([FromBody]DetailsNoteDTO body, [FromRoute][Required]long? idNote) { + try + { + body = await noteService.UpdateNoteAsync(idNote, body); + } + catch(NoteIdImcompatibleException e) + { + ErreurDTO erreur = new ErreurDTO + { + Code = 415, + Message = e.Message, + }; + return StatusCode(erreur.Code.Value, erreur); + }catch(NoteInvalideException e) + { + ErreurDTO erreur = new ErreurDTO + { + Code = 415, + Message = e.Message, + }; + return StatusCode(erreur.Code.Value, erreur); + } + catch (DbUpdateConcurrencyException e) + { + logger.LogError(e.Message); + ErreurDTO erreur = new ErreurDTO + { + Code = 500, + Message = "Une erreur est survenue sur le serveur", + }; + return StatusCode(erreur.Code.Value, erreur); + } + catch (DbUpdateException e) + { + logger.LogError(e.Message); + ErreurDTO erreur = new ErreurDTO + { + Code = 500, + Message = "Une erreur est survenue sur le serveur", + }; + 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 sur le serveur", + }; + return StatusCode(erreur.Code.Value, erreur); + } + return Ok(body); //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(DetailsNoteDTO)); @@ -504,13 +556,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 \"idAuteur\" : \"046b6c7f-0b8a-43b9-b35d-6489e6daee91\",\n \"dateCreation\" : \"2000-01-23T04:56:07.000+00:00\",\n \"dateMiseAjour\" : \"2000-01-23T04:56:07.000+00:00\",\n \"titre\" : \"titre\",\n \"texte\" : \"texte\",\n \"id\" : 0,\n \"collaborateur\" : {\n \"businessUnit\" : {\n \"agence\" : {\n \"bu\" : [ null, null ],\n \"id\" : 6,\n \"nom\" : \"nom\"\n },\n \"id\" : 0,\n \"nom\" : \"nom\"\n },\n \"mailApside\" : \"\",\n \"dateArrivee\" : \"2000-01-23T04:56:07.000+00:00\",\n \"id\" : \"046b6c7f-0b8a-43b9-b35d-6489e6daee91\",\n \"dateDepart\" : \"2000-01-23T04:56:07.000+00:00\",\n \"nom\" : \"nom\",\n \"prenom\" : \"prenom\"\n }\n}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(DetailsNoteDTO); //TODO: Change the data returned - return new ObjectResult(example); } } } diff --git a/EPAServeur/IServices/INoteService.cs b/EPAServeur/IServices/INoteService.cs index d38de0c..864a9c5 100644 --- a/EPAServeur/IServices/INoteService.cs +++ b/EPAServeur/IServices/INoteService.cs @@ -29,7 +29,8 @@ namespace EPAServeur.IServices 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); - + DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note); + Task UpdateNoteAsync(long? idNote, DetailsNoteDTO note); } diff --git a/EPAServeur/Services/NoteService.cs b/EPAServeur/Services/NoteService.cs index ed3c1d0..43cae4f 100644 --- a/EPAServeur/Services/NoteService.cs +++ b/EPAServeur/Services/NoteService.cs @@ -177,6 +177,29 @@ namespace EPAServeur.Services return AffichageNoteDTO.Count(); } + + /// + /// Mettre à jour une note de manière async + /// + /// Id de la note à modifier + /// Note avec les informations à jour + /// La note mise à jour + public DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note) + { + if (idNote != note.Id) + throw new NoteIdImcompatibleException("L'id de la note a mettre à jour et la note a mettre à jour sont incompatble"); + CheckNoteValide(note); + Note noteToUpdate = context.Note.Find(idNote); + if (!noteToUpdate.DateCreation.Equals(note.DateCreation) || note.Collaborateur.Id != noteToUpdate.IdCollaborateur || note.IdAuteur != noteToUpdate.IdAuteur) + throw new NoteIdImcompatibleException("La note a mettre à jour et la note en base de données ne correspondent pas"); + noteToUpdate.Titre = note.Titre; + noteToUpdate.Texte = note.Texte; + noteToUpdate.DateMiseAJour = DateTime.Now; + note.DateMiseAjour = DateTime.Now; + context.SaveChanges(); + return NoteToDetailSDTO(noteToUpdate); + } + #endregion #region Services Async @@ -307,151 +330,29 @@ namespace EPAServeur.Services return AffichageNoteDTO.Count(); } + + /// + /// Mettre à jour une note + /// + /// Id de la note à modifier + /// Note avec les informations à jour + /// La note mise à jour + public async Task UpdateNoteAsync(long? idNote, DetailsNoteDTO note) + { + if (idNote != note.Id) + throw new NoteIdImcompatibleException("L'id de la note a mettre à jour et la note a mettre à jour sont incompatble"); + CheckNoteValide(note); + Note noteToUpdate = await context.Note.FindAsync(idNote); + if (!noteToUpdate.DateCreation.Equals(note.DateCreation) || note.Collaborateur.Id != noteToUpdate.IdCollaborateur || note.IdAuteur != noteToUpdate.IdAuteur) + throw new NoteIdImcompatibleException("La note a mettre à jour et la note en base de données ne correspondent pas"); + noteToUpdate.Titre = note.Titre; + noteToUpdate.Texte = note.Texte; + noteToUpdate.DateMiseAJour = DateTime.Now; + note.DateMiseAjour = DateTime.Now; + await context.SaveChangesAsync(); + return NoteToDetailSDTO(noteToUpdate); + } #endregion - /* - - #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) - { - //Stopwatch stopwatch = new Stopwatch(); - //stopwatch.Start(); - if (collaborateurService.GetCollaborateurById(idAuteur) == null) - throw new ReferentNotFoundException(); - //stopwatch.Stop(); - //Console.WriteLine("Durée d'exécution GetProfil 1: {0}", stopwatch.Elapsed.TotalSeconds); - //stopwatch.Restart(); - if (collaborateurService.GetCollaborateurById(idAuteur) == null || collaborateurService.GetCollaborateurById(idCollaborateur) == null) - throw new CollaborateurNotFoundException(); - //stopwatch.Stop(); - //Console.WriteLine("Durée d'exécution GetProfil 2: {0}", stopwatch.Elapsed.TotalSeconds); - - if (texte == null) - texte = ""; - else - texte = texte.ToLower(); - int skip = (numPage.Value - 1) * parPage.Value; - int take = parPage.Value; - IEnumerable AffichageNoteDTO = (from n in context.Note - where n.IdAuteur == idAuteur && n.IdCollaborateur == idCollaborateur - select NoteToAffichageDTO(n, collaborateurService)); - AffichageNoteDTO = (from a in AffichageNoteDTO - 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); - if (note == null) - throw new NoteNotFoundException(); - return NoteToDetailSDTO(note); - } - - public IEnumerable GetNotes(bool? asc, int? numPage, int? parPage, string texte, string tri) - { - 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) - throw new CollaborateurNotFoundException(); - if (texte == null) - texte = ""; - else - texte = texte.ToLower(); - 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, collaborateurService)); - //stopwatch.Stop(); - //Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); - //stopwatch.Restart(); - AffichageNoteDTO = (from a in AffichageNoteDTO - where a.Collaborateur.ToLower().Contains(texte) || a.Titre.ToLower().Contains(texte) - select a).Skip(skip).Take(take); - //stopwatch.Stop(); - //Console.WriteLine("Durée d'exécution numéro 2: {0}", stopwatch.Elapsed.TotalSeconds); - 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 void SupprimerNote(long? idNote) - { - Note note = context.Note.Find(idNote); - if (note == null) - throw new NoteNotFoundException(); - context.Remove(note); - context.SaveChanges(); - } - - /// - /// Mettre à jour une note - /// - /// Id de la note à modifier - /// - /// - public DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note) - { - if (idNote != note.Id) - throw new NoteIdImcompatibleException(); - if (!CheckNoteValide(note)) - throw new NoteInvalideException(); - Note noteToUpdate = context.Note.Find(idNote); - noteToUpdate.Titre = note.Titre; - noteToUpdate.Texte = note.Texte; - noteToUpdate.DateMiseAJour = DateTime.Now; - context.SaveChanges(); - return NoteToDetailSDTO(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 CheckNoteValide(DetailsNoteDTO note) - { - return !(note == null || note.IdAuteur == null || note.Collaborateur == null || note.Collaborateur.Id == null || note.Titre == null || note.Texte == null) ; - } - #endregion - - */ #region fonctions privees ///