using EPAServeur.Context; using EPAServeur.Exceptions; using EPAServeur.IServices; using EPAServeur.Models.Notes; using IO.Swagger.DTO; using IO.Swagger.ModelCollaborateur; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; 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 DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote) { if (!IsDetailsNoteValide(nouvelleNote)) throw new NoteInvalideException(); Note note = DetailsNoteDTOToNouvelleNote(nouvelleNote); context.Note.Add(note); context.SaveChanges(); return NoteToDetailSDTO(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) { //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 (!IsDetailsNoteValide(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 IsDetailsNoteValide(DetailsNoteDTO note) { return !(note == null || note.IdAuteur == null || note.Collaborateur == null || note.Collaborateur.Id == null || note.Titre == null || note.Texte == null) ; } #endregion #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); AffichageNoteDTO affichage = new AffichageNoteDTO() { Id = note.IdNote, IdCollaborateur = note.IdCollaborateur, Collaborateur = collaborateur.Prenom + collaborateur.Nom, Titre = note.Titre, DateMiseAJour = note.DateMiseAJour }; return affichage; } /// /// Transformatino d'une note en DetailsNoteDTO /// /// Note à transformer /// Note transformer en DetailsNoteDTO private DetailsNoteDTO NoteToDetailSDTO(Note note) { DetailsNoteDTO details = new DetailsNoteDTO() { Id = note.IdNote, DateCreation = note.DateCreation, DateMiseAjour = note.DateMiseAJour, Titre = note.Titre, Texte = note.Texte, IdAuteur = note.IdAuteur, Collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur) }; return details; } #endregion #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() { IdAuteur = detailsNoteDTO.IdAuteur.Value, IdCollaborateur = detailsNoteDTO.Collaborateur.Id.Value, Texte = detailsNoteDTO.Texte, Titre = detailsNoteDTO.Titre, DateCreation = DateTime.Now, DateMiseAJour = DateTime.Now }; return note; } #endregion } }