Ajout des logs dans l'api engagement

develop
jboinembalome 4 years ago
parent c6d69a0d20
commit 79828d46b1
  1. 125
      Controllers/EngagementsApi.cs
  2. 40
      Exceptions/EngagementIncompatibleIdException.cs
  3. 40
      Exceptions/EngagementInvalidException.cs
  4. 40
      Exceptions/EngagementNotFoundException.cs
  5. 92
      Services/EngagementService.cs

@ -20,6 +20,9 @@ using Microsoft.AspNetCore.Authorization;
using IO.Swagger.DTO; using IO.Swagger.DTO;
using EPAServeur.IServices; using EPAServeur.IServices;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using EPAServeur.Exceptions;
using Microsoft.EntityFrameworkCore;
namespace IO.Swagger.Controllers namespace IO.Swagger.Controllers
{ {
@ -30,10 +33,13 @@ namespace IO.Swagger.Controllers
public class EngagementsApiController : ControllerBase public class EngagementsApiController : ControllerBase
{ {
private readonly IEngagementService engagementService; private readonly IEngagementService engagementService;
private readonly ILogger<EngagementsApiController> logger;
public EngagementsApiController(IEngagementService _engagementService)
public EngagementsApiController(IEngagementService _engagementService, ILogger<EngagementsApiController> _logger)
{ {
engagementService = _engagementService; engagementService = _engagementService;
logger = _logger;
} }
/// <summary> /// <summary>
/// ///
@ -54,19 +60,26 @@ namespace IO.Swagger.Controllers
[SwaggerOperation("GetEngagements")] [SwaggerOperation("GetEngagements")]
[SwaggerResponse(statusCode: 200, type: typeof(List<EngagementDTO>), description: "OK")] [SwaggerResponse(statusCode: 200, type: typeof(List<EngagementDTO>), description: "OK")]
[SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")]
public virtual IActionResult GetEngagements([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]long? idAgence, [FromQuery]string texte, [FromQuery]string tri) public virtual async Task<IActionResult> GetEngagements([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]long? 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(..), ... logger.LogInformation("Récupération de la liste des engagements.");
IEnumerable<EngagementDTO> engagements = engagementService.GetEngagements(asc, numPage, parPAge, idAgence, texte, tri);
if (engagements == null) IEnumerable<EngagementDTO> engagements = null;
try
{ {
ErreurDTO erreur = new ErreurDTO() engagements = await engagementService.GetEngagementsAsync(asc, numPage, parPAge, idAgence, texte, tri);
{
Code = "404",
Message = "Aucun engagement"
};
return NotFound(erreur);
} }
catch (ArgumentNullException)
{
logger.LogError("Un des arguments passés dans la requête pour récupérer la liste des engagements est invalide.");
}
catch (Exception)
{
logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des engagements.");
}
logger.LogInformation("Liste des engagements récupérée.");
return Ok(engagements); return Ok(engagements);
} }
@ -90,19 +103,26 @@ namespace IO.Swagger.Controllers
[SwaggerOperation("GetEngagementsEnAttente")] [SwaggerOperation("GetEngagementsEnAttente")]
[SwaggerResponse(statusCode: 200, type: typeof(List<EngagementDTO>), description: "OK")] [SwaggerResponse(statusCode: 200, type: typeof(List<EngagementDTO>), description: "OK")]
[SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")]
public virtual IActionResult GetEngagementsEnAttente([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]long? idAgence, [FromQuery]string texte, [FromQuery]string tri) public virtual async Task<IActionResult> GetEngagementsEnAttente([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]long? 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(..), ... logger.LogInformation("Récupération de la liste des engagements en attente.");
IEnumerable<EngagementDTO> engagements = engagementService.GetEngagementsEnAttente(asc, numPage, parPAge, idAgence, texte, tri);
if (engagements == null) IEnumerable<EngagementDTO> engagements = null;
try
{ {
ErreurDTO erreur = new ErreurDTO() engagements = await engagementService.GetEngagementsEnAttenteAsync(asc, numPage, parPAge, idAgence, texte, tri);
{ }
Code = "404", catch (ArgumentNullException)
Message = "Aucun engagement en attente" {
}; logger.LogError("Un des arguments passés dans la requête pour récupérer la liste des engagements en attente est invalide.");
return NotFound(erreur);
} }
catch (Exception)
{
logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des engagements en attente.");
}
logger.LogInformation("Liste des engagements en attente récupérée.");
return Ok(engagements); return Ok(engagements);
} }
@ -128,18 +148,25 @@ namespace IO.Swagger.Controllers
[SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")]
public virtual async Task<IActionResult> GetEngagementsRepondus([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]long? idAgence, [FromQuery]string texte, [FromQuery]string tri) public virtual async Task<IActionResult> GetEngagementsRepondus([FromQuery][Required()]bool? asc, [FromQuery][Required()]int? numPage, [FromQuery][Required()]int? parPAge, [FromQuery]long? 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(..), ... logger.LogInformation("Récupération de la liste des engagements répondus.");
IEnumerable<EngagementDTO> engagements = await engagementService.GetEngagementsRepondus(asc, numPage, parPAge, idAgence, texte, tri);
if (engagements == null) IEnumerable<EngagementDTO> engagements = null;
try
{ {
ErreurDTO erreur = new ErreurDTO() engagements = await engagementService.GetEngagementsRepondusAsync(asc, numPage, parPAge, idAgence, texte, tri);
{ }
Code = "404", catch (ArgumentNullException)
Message = "Aucun engagement en repondu" {
}; logger.LogError("Un des arguments passés dans la requête pour récupérer la liste des engagements répondus est invalide.");
return NotFound(erreur); }
catch (Exception)
{
logger.LogError("Une erreur inconnue est survenue lors de la récupération de la liste des engagements répondus.");
} }
logger.LogInformation("Liste des engagements répondus récupérée.");
return Ok(engagements); return Ok(engagements);
} }
@ -159,10 +186,42 @@ namespace IO.Swagger.Controllers
[SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")] [SwaggerResponse(statusCode: 403, type: typeof(ErreurDTO), description: "Acces interdit")]
public virtual async Task<IActionResult> RepondreEngagement([FromBody]EngagementDTO body, [FromRoute][Required]long? idEngagement) public virtual async Task<IActionResult> RepondreEngagement([FromBody]EngagementDTO body, [FromRoute][Required]long? idEngagement)
{ {
//if (body != null && body.Realise == false && string.IsNullOrWhiteSpace(body.RaisonNonRealisable)) logger.LogInformation("Tentative de mise à jour de l'engagement {idEngagement}.", idEngagement);
// return null; // A traiter ! Retourner une erreur
EngagementDTO engagement = null;
try
{
engagement = await engagementService.RepondreEngagementAsync(body, idEngagement);
}
catch (EngagementInvalidException ex)
{
logger.LogWarning("Des données sont manquants, l'engagement {idEngagement} ne peut pas être mise à jour.", idEngagement);
ErreurDTO erreur = new ErreurDTO()
{
Code = "400",
Message = ex.Message
};
return BadRequest(erreur);
}
catch (EngagementIncompatibleIdException)
{
logger.LogError("L'id de l'engagement à mettre à jour {body.Id} et l'id de l'engagement avec les nouvelles informations {idEngagement} sont différents.", body.Id, idEngagement);
}
catch (DbUpdateConcurrencyException)
{
logger.LogError("L'engagement {idEngagement} n'a pas pu être mise à jour car il est pris par une autre ressource.", idEngagement);
}
catch (DbUpdateException)
{
logger.LogError("Une erreur est survenue dans la base de données lors de la mise à jour de l'engagement {idEngagement}.", idEngagement);
}
catch (Exception)
{
logger.LogError("Une erreur inconnue est survenue lors de la mise à jour de l'engagement {idEngagement}.", idEngagement);
}
EngagementDTO engagement = await engagementService.RepondreEngagement(body, idEngagement); logger.LogInformation("Mise à jour de l'engagement {idEngagement} réussie.");
return Ok(engagement); return Ok(engagement);
} }

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EPAServeur.Exceptions
{
/// <summary>
/// Exception à jeter lorsque l'id de l'engagement avec les données à mettre à jour et l'id de l'engagement à mettre sont différents
/// </summary>
public class EngagementIncompatibleIdException : Exception
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementIncompatibleIdException"/> class.
/// </summary>
public EngagementIncompatibleIdException()
{
}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementIncompatibleIdException"/> class.
/// </summary>
/// <param name="message"></param>
public EngagementIncompatibleIdException(string message) : base(message)
{
}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementIncompatibleIdException"/> class.
/// </summary>
/// <param name="message"></param>
/// <param name="inner"></param>
public EngagementIncompatibleIdException(string message, Exception inner) : base(message, inner)
{
}
}
}

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EPAServeur.Exceptions
{
/// <summary>
/// Exception à jeter lorsqu'un engagement est invalide
/// </summary>
public class EngagementInvalidException : Exception
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementInvalidException"/> class.
/// </summary>
public EngagementInvalidException()
{
}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementInvalidException"/> class.
/// </summary>
/// <param name="message"></param>
public EngagementInvalidException(string message) : base(message)
{
}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementInvalidException"/> class.
/// </summary>
/// <param name="message"></param>
/// <param name="inner"></param>
public EngagementInvalidException(string message, Exception inner) : base(message, inner)
{
}
}
}

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EPAServeur.Exceptions
{
/// <summary>
/// Exception à jeter lorsqu'un engagement n'a pas été trouvé
/// </summary>
public class EngagementNotFoundException : Exception
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementNotFoundException"/> class.
/// </summary>
public EngagementNotFoundException()
{
}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementNotFoundException"/> class.
/// </summary>
/// <param name="message"></param>
public EngagementNotFoundException(string message) : base(message)
{
}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="EngagementNotFoundException"/> class.
/// </summary>
/// <param name="message"></param>
/// <param name="inner"></param>
public EngagementNotFoundException(string message, Exception inner) : base(message, inner)
{
}
}
}

@ -1,4 +1,5 @@
using EPAServeur.Context; using EPAServeur.Context;
using EPAServeur.Exceptions;
using EPAServeur.IServices; using EPAServeur.IServices;
using EPAServeur.Models.EP; using EPAServeur.Models.EP;
using EPAServeur.Models.Formation; using EPAServeur.Models.Formation;
@ -57,8 +58,8 @@ namespace EPAServeur.Services
else else
engagements = epContext.Engagement.Include(engagement => engagement.Ep); engagements = epContext.Engagement.Include(engagement => engagement.Ep);
if (engagements == null) if (engagements == null || engagements.Count() == 0)
return null; return new List<EngagementDTO>();
var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement));
@ -82,12 +83,13 @@ namespace EPAServeur.Services
else else
engagements = await epContext.Engagement.Include(engagement => engagement.Ep).ToListAsync(); engagements = await epContext.Engagement.Include(engagement => engagement.Ep).ToListAsync();
if (engagements == null) if (engagements == null || engagements.Count() == 0)
return null; return new List<EngagementDTO>();
var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement));
var results = await Task.WhenAll(engagementDTOs);
return engagementDTOs; return results;
} }
public IEnumerable<EngagementDTO> GetEngagementsEnAttente(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) public IEnumerable<EngagementDTO> GetEngagementsEnAttente(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri)
@ -107,8 +109,8 @@ namespace EPAServeur.Services
else else
engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise == null).ToList(); engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise == null).ToList();
if (engagements == null) if (engagements == null || engagements.Count() == 0)
return null; return new List<EngagementDTO>();
var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement));
@ -132,13 +134,13 @@ namespace EPAServeur.Services
else else
engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise == null).ToListAsync(); engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise == null).ToListAsync();
if (engagements == null || engagements.Count() == 0)
return new List<EngagementDTO>();
if (engagements == null) var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement));
return null; var results = await Task.WhenAll(engagementDTOs);
var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement));
return engagementDTOs; return results;
} }
public IEnumerable<EngagementDTO> GetEngagementsRepondus(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri) public IEnumerable<EngagementDTO> GetEngagementsRepondus(bool? asc, int? numPage, int? parPAge, long? idAgence, string texte, string tri)
@ -158,9 +160,8 @@ namespace EPAServeur.Services
else else
engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise != null && engagement.Modalite.ToLower().Contains(texte)); engagements = epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise != null && engagement.Modalite.ToLower().Contains(texte));
if (engagements == null || engagements.Count() == 0)
if (engagements == null) return new List<EngagementDTO>();
return null;
var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement)); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTO(engagement));
@ -184,8 +185,8 @@ namespace EPAServeur.Services
else else
engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise != null && engagement.Modalite.ToLower().Contains(texte)).ToListAsync(); engagements = await epContext.Engagement.Include(engagement => engagement.Ep).Where(engagement => engagement.Realise != null && engagement.Modalite.ToLower().Contains(texte)).ToListAsync();
if (engagements == null) if (engagements == null || engagements.Count() == 0)
return null; return new List<EngagementDTO>();
var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement)); var engagementDTOs = engagements.Where(engagement => engagement.Modalite.ToLower().Contains(texte)).Select(engagement => GetEngagementDTOAsync(engagement));
var results = await Task.WhenAll(engagementDTOs); var results = await Task.WhenAll(engagementDTOs);
@ -203,22 +204,36 @@ namespace EPAServeur.Services
{ {
if (!IsEngagementValide(engagementDTO)) if (!IsEngagementValide(engagementDTO))
return null; throw new EngagementInvalidException("Impossible de répondre à l'engagement, des données sont manquants.");
if (engagementDTO.Realise == false && string.IsNullOrWhiteSpace(engagementDTO.RaisonNonRealisable))
throw new EngagementInvalidException("Impossible de répondre à l'engagement, une raison doit être rensignée lorsqu'un engagement n'est pas réalisé.");
if (engagementDTO == null && !engagementDTO.Id.HasValue && engagementDTO.Id.Value != idEngagement)
throw new EngagementIncompatibleIdException();
if (engagementDTO.Id != idEngagement)
return null;
Engagement engagement = epContext.Engagement.Include(engagement => engagement.Ep).FirstOrDefault(engagement => engagement.Id == idEngagement); Engagement engagement = epContext.Engagement.Include(engagement => engagement.Ep).FirstOrDefault(engagement => engagement.Id == idEngagement);
if (engagement == null) if (engagement == null)
return null; throw new EngagementNotFoundException();
engagement.Realise = engagementDTO.Realise; engagement.Realise = engagementDTO.Realise;
if (engagement.Realise == false) switch (engagement.Realise)
{ {
engagement.Realisable = engagementDTO.Realisable; case true:
engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable; engagement.Realisable = engagementDTO.Realisable;
engagement.RaisonNonRealisable = null;
break;
case false:
engagement.Realisable = engagementDTO.Realisable;
engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable;
break;
default:
engagement.Realisable = null;
engagement.RaisonNonRealisable = null;
break;
} }
epContext.SaveChanges(); epContext.SaveChanges();
@ -237,22 +252,33 @@ namespace EPAServeur.Services
{ {
if (!IsEngagementValide(engagementDTO)) if (!IsEngagementValide(engagementDTO))
return null; throw new EngagementInvalidException("Impossible de répondre à l'engagement, des données sont manquants.");
if (engagementDTO.Realise == false && string.IsNullOrWhiteSpace(engagementDTO.RaisonNonRealisable))
throw new EngagementInvalidException("Impossible de répondre à l'engagement, une raison doit être rensignée lorsqu'un engagement n'est pas réalisé.");
if (engagementDTO.Id != idEngagement)
return null;
Engagement engagement = await epContext.Engagement.Include(engagement => engagement.Ep).FirstOrDefaultAsync(engagement => engagement.Id == idEngagement); Engagement engagement = await epContext.Engagement.Include(engagement => engagement.Ep).FirstOrDefaultAsync(engagement => engagement.Id == idEngagement);
if (engagement == null) if (engagement == null)
return null; throw new EngagementNotFoundException();
engagement.Realise = engagementDTO.Realise; engagement.Realise = engagementDTO.Realise;
if (engagement.Realise == false) switch (engagement.Realise)
{ {
engagement.Realisable = engagementDTO.Realisable; case true:
engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable; engagement.Realisable = engagementDTO.Realisable;
engagement.RaisonNonRealisable = null;
break;
case false:
engagement.Realisable = engagementDTO.Realisable;
engagement.RaisonNonRealisable = engagementDTO.RaisonNonRealisable;
break;
default:
engagement.Realisable = null;
engagement.RaisonNonRealisable = null;
break;
} }
await epContext.SaveChangesAsync(); await epContext.SaveChangesAsync();
@ -266,7 +292,7 @@ namespace EPAServeur.Services
#region Méthodes Privée #region Méthodes Privée
private bool IsEngagementValide(EngagementDTO engagementDTO) private bool IsEngagementValide(EngagementDTO engagementDTO)
{ {
return !(engagementDTO == null || engagementDTO.Id == null || engagementDTO.Action == null || engagementDTO.DatePrevisionnelle == null || engagementDTO.Dispositif == null || engagementDTO.Modalite == null || (engagementDTO.Realise == false && string.IsNullOrWhiteSpace(engagementDTO.RaisonNonRealisable))); return !(engagementDTO == null || engagementDTO.Id == null || engagementDTO.Action == null || engagementDTO.DatePrevisionnelle == null || engagementDTO.Dispositif == null || engagementDTO.Modalite == null);
} }
#region Object to DTO #region Object to DTO

Loading…
Cancel
Save