Mise à jour de l'ajout d'une note

develop
Yanaël GRETTE 4 years ago
parent 194e67135c
commit 39519bfc34
  1. 104
      EPAServeur/Controllers/NotesApi.cs
  2. 8
      EPAServeur/IServices/INoteService.cs
  3. 136
      EPAServeur/Services/NoteService.cs

@ -18,6 +18,11 @@ using IO.Swagger.Attributes;
using IO.Swagger.Security; using IO.Swagger.Security;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using IO.Swagger.DTO; using IO.Swagger.DTO;
using EPAServeur.IServices;
using Microsoft.Extensions.Logging;
using IO.Swagger.ClientCollaborateur;
using EPAServeur.Exceptions;
using Microsoft.EntityFrameworkCore;
namespace IO.Swagger.Controllers namespace IO.Swagger.Controllers
{ {
@ -27,6 +32,24 @@ namespace IO.Swagger.Controllers
[ApiController] [ApiController]
public class NotesApiController : ControllerBase public class NotesApiController : ControllerBase
{ {
/// <summary>
/// Service des note
/// </summary>
private readonly INoteService noteService;
/// <summary>
/// Logger du contrôleur
/// </summary>
private readonly ILogger<NotesApiController> logger;
public NotesApiController(INoteService _noteService, ILogger<NotesApiController> _logger)
{
noteService = _noteService;
logger = _logger;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -39,8 +62,8 @@ namespace IO.Swagger.Controllers
/// <response code="500">Une erreur est survenue sur le serveur</response> /// <response code="500">Une erreur est survenue sur le serveur</response>
[HttpPost] [HttpPost]
[Route("/api/notes/")] [Route("/api/notes/")]
[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)]
[ValidateModelState] //[ValidateModelState]
[SwaggerOperation("AddNote")] [SwaggerOperation("AddNote")]
[SwaggerResponse(statusCode: 201, type: typeof(DetailsNoteDTO), description: "Note créée avec succès")] [SwaggerResponse(statusCode: 201, type: typeof(DetailsNoteDTO), description: "Note créée avec succès")]
[SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L&#x27;utilisateur souhaitant accéder à la ressource n&#x27;est pas authentifié")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L&#x27;utilisateur souhaitant accéder à la ressource n&#x27;est pas authentifié")]
@ -49,6 +72,77 @@ namespace IO.Swagger.Controllers
[SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] [SwaggerResponse(statusCode: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")]
public virtual IActionResult AddNote([FromBody]DetailsNoteDTO body) public virtual IActionResult AddNote([FromBody]DetailsNoteDTO body)
{ {
try
{
body = noteService.AjouterNote(body);
}
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 données collaborateurs",
};
return StatusCode(erreur.Code.Value, erreur);
}
catch(NoteInvalideException e)
{
ErreurDTO erreur = new ErreurDTO()
{
Code = 415,
Message = e.Message,
};
return StatusCode(erreur.Code.Value, erreur.Message);
}
catch(ReferentNotFoundException e)
{
ErreurDTO erreur = new ErreurDTO()
{
Code = 404,
Message = e.Message,
};
return NotFound(erreur);
}
catch(CollaborateurNotFoundException e)
{
ErreurDTO erreur = new ErreurDTO()
{
Code = 404,
Message = e.Message,
};
return NotFound(erreur);
}
catch(CollaborateurPartiException e)
{
ErreurDTO erreur = new ErreurDTO()
{
Code = 415,
Message = e.Message,
};
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 Created("",body);
//TODO: Uncomment the next line to return response 201 or use other options such as return this.NotFound(), return this.BadRequest(..), ... //TODO: Uncomment the next line to return response 201 or use other options such as return this.NotFound(), return this.BadRequest(..), ...
// return StatusCode(201, default(DetailsNoteDTO)); // return StatusCode(201, default(DetailsNoteDTO));
@ -63,13 +157,7 @@ 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(..), ... //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)); // 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<DetailsNoteDTO>(exampleJson)
: default(DetailsNoteDTO); //TODO: Change the data returned
return new ObjectResult(example);
} }
/// <summary> /// <summary>

@ -10,7 +10,7 @@ namespace EPAServeur.IServices
{ {
public interface INoteService public interface INoteService
{ {
//bool? asc, int? numPage, int? parPAge, string texte, string tri) /*
public IEnumerable<AffichageNoteDTO> GetNotes(bool? asc, int? numPage, int? parPAge, string texte, string tri); public IEnumerable<AffichageNoteDTO> GetNotes(bool? asc, int? numPage, int? parPAge, string texte, string tri);
public IEnumerable<AffichageNoteDTO> GetNotesByAuteur(Guid? idAuteur, bool? asc, int? numPage, int? parPAge, string texte, string tri); public IEnumerable<AffichageNoteDTO> GetNotesByAuteur(Guid? idAuteur, bool? asc, int? numPage, int? parPAge, string texte, string tri);
public DetailsNoteDTO GetNoteById(long? idNote); public DetailsNoteDTO GetNoteById(long? idNote);
@ -18,5 +18,11 @@ namespace EPAServeur.IServices
public DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote); public DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote);
public void SupprimerNote(long? idNote); public void SupprimerNote(long? idNote);
public DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note); public DetailsNoteDTO UpdateNote(long? idNote, DetailsNoteDTO note);
*/
DetailsNoteDTO AjouterNote(DetailsNoteDTO note);
Task<DetailsNoteDTO> AjouterNoteAsync(DetailsNoteDTO note);
} }
} }

@ -2,6 +2,7 @@
using EPAServeur.Exceptions; using EPAServeur.Exceptions;
using EPAServeur.IServices; using EPAServeur.IServices;
using EPAServeur.Models.Notes; using EPAServeur.Models.Notes;
using IO.Swagger.ApiCollaborateur;
using IO.Swagger.DTO; using IO.Swagger.DTO;
using IO.Swagger.ModelCollaborateur; using IO.Swagger.ModelCollaborateur;
using System; using System;
@ -18,37 +19,93 @@ namespace EPAServeur.Services
public class NoteService : INoteService public class NoteService : INoteService
{ {
#region Variables #region Variables
/*
/// <summary> /// <summary>
/// API pour accéder aux données collaborateur en passant par le service collaborateur /// Service collaborateur pour récupérer les données collaborateurs
/// </summary> /// </summary>
private readonly ICollaborateurService collaborateurService; private readonly ICollaborateurService collaborateurService;
*/
private readonly ICollaborateurApi collaborateurApi;
/// <summary> /// <summary>
/// Contexte pour interagir avec la base de données MySQL du serveur EP /// Contexte pour interagir avec la base de données MySQL du serveur EP
/// </summary> /// </summary>
private readonly EpContext context; private readonly EpContext context;
#endregion #endregion
#region Constructeurs #region Constructeurs
public NoteService(ICollaborateurService _collaborateurService, EpContext _context) public NoteService(ICollaborateurApi _collaborateurApi, EpContext _context)
{ {
collaborateurService = _collaborateurService; //collaborateurService = _collaborateurService;
collaborateurApi = _collaborateurApi;
context = _context; context = _context;
} }
#endregion #endregion
#region Services Sync
/// <summary> /// <summary>
/// Ajouter une nouvelle note dans la base de données /// Ajouter une nouvelle note dans la base de données
/// </summary> /// </summary>
/// <param name="nouvelleNote">La nouvelle note a ajouté en base</param> /// <param name="nouvelleNote">La nouvelle note a ajouté en base</param>
/// <returns></returns> /// <returns>La nouvelle note ajouté</returns>
public DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote) public DetailsNoteDTO AjouterNote(DetailsNoteDTO nouvelleNote)
{ {
if (!IsDetailsNoteValide(nouvelleNote)) //vérifier qu'il n'y a aucune valeur null
throw new NoteInvalideException(); CheckNoteValide(nouvelleNote);
//vérifier que le référent existe
Collaborateur auteur = collaborateurApi.ChercherCollabId(nouvelleNote.IdAuteur);
CheckReferent(auteur);
//vérifier que le collaborateur existe
Collaborateur collaborateur = collaborateurApi.ChercherCollabId(nouvelleNote.Collaborateur.Id);
CheckCollaborateur(collaborateur);
//transformer la note DTO en Note
Note note = DetailsNoteDTOToNouvelleNote(nouvelleNote); Note note = DetailsNoteDTOToNouvelleNote(nouvelleNote);
//ajouter la note et sauvegarder
context.Note.Add(note); context.Note.Add(note);
context.SaveChanges(); context.SaveChanges();
return NoteToDetailSDTO(note); nouvelleNote.Id = note.IdNote;
return nouvelleNote;
}
#endregion
#region Services Async
/// <summary>
/// Ajouter une nouvelle note dans la base de données de manière async
/// </summary>
/// <param name="nouvelleNote">La nouvelle note a ajouté en base</param>
/// <returns>La nouvelle note ajouté</returns>
public async Task<DetailsNoteDTO> AjouterNoteAsync(DetailsNoteDTO nouvelleNote)
{
//vérifier qu'il n'y a aucune valeur null
CheckNoteValide(nouvelleNote);
//vérifier que le référent existe
Collaborateur auteur = await collaborateurApi.ChercherCollabIdAsync((Guid?)nouvelleNote.IdAuteur);
CheckReferent(auteur);
//vérifier que le collaborateur existe
Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(nouvelleNote.Collaborateur.Id);
CheckCollaborateur(collaborateur);
//transformer la note DTO en Note
Note note = DetailsNoteDTOToNouvelleNote(nouvelleNote);
//ajouter la note et sauvegarder
await context.Note.AddAsync(note);
await context.SaveChangesAsync();
nouvelleNote.Id = note.IdNote;
return nouvelleNote;
} }
#endregion
/*
#region Services #region Services
/// <summary> /// <summary>
@ -169,7 +226,7 @@ namespace EPAServeur.Services
{ {
if (idNote != note.Id) if (idNote != note.Id)
throw new NoteIdImcompatibleException(); throw new NoteIdImcompatibleException();
if (!IsDetailsNoteValide(note)) if (!CheckNoteValide(note))
throw new NoteInvalideException(); throw new NoteInvalideException();
Note noteToUpdate = context.Note.Find(idNote); Note noteToUpdate = context.Note.Find(idNote);
noteToUpdate.Titre = note.Titre; noteToUpdate.Titre = note.Titre;
@ -185,13 +242,67 @@ namespace EPAServeur.Services
/// <remarks> Un objet DetailsNoteDTO est valide si aucune de ses propriétés n'est à null</remarks> /// <remarks> Un objet DetailsNoteDTO est valide si aucune de ses propriétés n'est à null</remarks>
/// <param name="note"></param> /// <param name="note"></param>
/// <returns>true si l'objet est valide, false sinon</returns> /// <returns>true si l'objet est valide, false sinon</returns>
private bool IsDetailsNoteValide(DetailsNoteDTO note) private bool CheckNoteValide(DetailsNoteDTO note)
{ {
return !(note == null || note.IdAuteur == null || note.Collaborateur == null || note.Collaborateur.Id == null || note.Titre == null || note.Texte == null) ; return !(note == null || note.IdAuteur == null || note.Collaborateur == null || note.Collaborateur.Id == null || note.Titre == null || note.Texte == null) ;
} }
#endregion #endregion
*/
#region fonctions privees
/// <summary>
/// Vérfier si la note est valide
/// </summary>
/// <param name="note">La note a vérifié</param>
private void CheckNoteValide(DetailsNoteDTO note)
{
//vérifier que la note n'est pas null
if (note == null)
throw new NoteInvalideException("Aucune note n'a été reçue");
//vérfier que la note a bien un auteur
if (note.IdAuteur == null || !note.IdAuteur.HasValue)
throw new NoteInvalideException("Il impossible d'enregistrer sans donnée sur la personne qui l'a écrite");
//vérifier que la note est bien lié à un collaboarteur identifiable sur le serveur distant (avec une id)
if (note.Collaborateur == null || note.Collaborateur.Id == null || !note.Collaborateur.Id.HasValue)
throw new NoteInvalideException("Il est impossible d'enregistrer une note qui n'est pas lié à un collaborateur");
//vérifier que le titre de la note est valide
if (note.Titre == null || note.Titre == "" || note.Titre.Length < 3)
throw new NoteInvalideException("Vous devez saisir un titre d'au moins 3 caractères");
//vérifier que le texte de la note est valide
if(note.Texte == null || note.Texte == "" || note.Texte.Length < 3)
throw new NoteInvalideException("Vous devez saisir une note d'au moins 3 caractères");
}
/// <summary>
/// Vérifier que l'auteur de la note existe et est toujours présent dans l'entreprise
/// </summary>
/// <param name="referent">L'auteur de la note</param>
private void CheckReferent(Collaborateur auteur)
{
if (auteur == null)
throw new ReferentNotFoundException("Les informations de l'auteur de la note n'ont pas été trouvé");
if (auteur.DateDepart.HasValue)
throw new CollaborateurPartiException("Vous ne pouvez pas créer ou modifier de note si vous avez quitté l'entreprise");
}
/// <summary>
/// Vérifier que le collaborateur concerné par la note existe et est toujorus présent dans l'entreprise
/// </summary>
/// <param name="collaborateur">Le collaborateur concerné</param>
private void CheckCollaborateur(Collaborateur collaborateur)
{
if (collaborateur == null)
throw new CollaborateurNotFoundException("Le collaborateur pour qui la note est écrite n'a pas été trouvé");
if (collaborateur.DateDepart.HasValue)
throw new CollaborateurPartiException("Vous ne pouvez pas créer ou modifier de note si vous avez quitté l'entreprise");
}
#endregion
#region ObjectToDTO #region ObjectToDTO
/// <summary> /// <summary>
/// Transformer un objet note en objet pour afficher un note dans dans un tableau /// Transformer un objet note en objet pour afficher un note dans dans un tableau
@ -199,9 +310,10 @@ namespace EPAServeur.Services
/// <param name="note">Note à transformer</param> /// <param name="note">Note à transformer</param>
/// <param name="collaborateurService">Service collaborateur pour récupérer les informations des collaborateurs</param> /// <param name="collaborateurService">Service collaborateur pour récupérer les informations des collaborateurs</param>
/// <returns>La note transformée pour être affichée</returns> /// <returns>La note transformée pour être affichée</returns>
private static AffichageNoteDTO NoteToAffichageDTO(Note note, ICollaborateurService collaborateurService) private AffichageNoteDTO NoteToAffichageDTO(Note note)
{ {
CollaborateurDTO collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur); //CollaborateurDTO collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur);
Collaborateur collaborateur = collaborateurApi.ChercherCollabId((Guid?)note.IdCollaborateur);
AffichageNoteDTO affichage = new AffichageNoteDTO() AffichageNoteDTO affichage = new AffichageNoteDTO()
{ {
Id = note.IdNote, Id = note.IdNote,
@ -228,7 +340,7 @@ namespace EPAServeur.Services
Titre = note.Titre, Titre = note.Titre,
Texte = note.Texte, Texte = note.Texte,
IdAuteur = note.IdAuteur, IdAuteur = note.IdAuteur,
Collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur) //Collaborateur = collaborateurService.GetCollaborateurById(note.IdCollaborateur)
}; };
return details; return details;
} }

Loading…
Cancel
Save