From 194e67135c89571afd00d2168d7dcaeca69102ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yana=C3=ABl=20GRETTE?= Date: Tue, 15 Dec 2020 16:06:56 +0100 Subject: [PATCH] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20l'API=20collaborate?= =?UTF-8?q?ur=20du=20serveur=20EP=20(partiellement=20test=C3=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EPAServeur/Controllers/CollaborateursApi.cs | 391 +++++++++++--- EPAServeur/IServices/ICollaborateurService.cs | 11 +- EPAServeur/Services/CollaborateurService.cs | 511 ++++++++++++++---- 3 files changed, 720 insertions(+), 193 deletions(-) diff --git a/EPAServeur/Controllers/CollaborateursApi.cs b/EPAServeur/Controllers/CollaborateursApi.cs index 249e93b..b0a5144 100644 --- a/EPAServeur/Controllers/CollaborateursApi.cs +++ b/EPAServeur/Controllers/CollaborateursApi.cs @@ -18,6 +18,11 @@ using IO.Swagger.Attributes; using IO.Swagger.Security; using Microsoft.AspNetCore.Authorization; using IO.Swagger.DTO; +using Microsoft.Extensions.Logging; +using EPAServeur.IServices; +using System.Threading.Tasks; +using IO.Swagger.ClientCollaborateur; +using EPAServeur.Exceptions; namespace IO.Swagger.Controllers { @@ -26,7 +31,22 @@ namespace IO.Swagger.Controllers /// [ApiController] public class CollaborateursApiController : ControllerBase - { + { + + private readonly ICollaborateurService collaborateurService; + private readonly ILogger logger; + private readonly IAuthorizationService authorizationService; + + public CollaborateursApiController(ICollaborateurService _collaborateurService, ILogger _logger, IAuthorizationService _authorizationService) + { + collaborateurService = _collaborateurService; + logger = _logger; + authorizationService = _authorizationService; + } + + + + /// /// /// @@ -39,7 +59,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/collaborateurs/{idCollaborateur}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetCollaborateurById")] [SwaggerResponse(statusCode: 200, type: typeof(CollaborateurDTO), description: "OK")] @@ -47,8 +67,64 @@ 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 GetCollaborateurById([FromRoute][Required]Guid? idCollaborateur) - { + public virtual async Task GetCollaborateurById([FromRoute][Required]Guid? idCollaborateur) + { + CollaborateurDTO collaborateurDTO; + try + { + collaborateurDTO = await collaborateurService.GetCollaborateurByIdAsync(idCollaborateur); + } + 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(500, erreur); + } + catch (CollaborateurNotFoundException e) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 404, + Message = e.Message, + }; + return NotFound(erreurDTO); + } + catch (Exception e) + { + logger.LogError(e.Message); + //TODO : vérifier des cas d'erreur possible avant ?... + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + + // Si l'utilisateur connecté est un collaborateur, on vérifie si il est autorisé à accéder au détail du collaborateur + if (User.IsInRole("Collaborateur")) + { + //Le collaborateur récupère ses informations + if (!(await authorizationService.AuthorizeAsync(User, collaborateurDTO, "SameMailRequirement")).Succeeded) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 403, + Message = "Accès interdit", + }; + return StatusCode(403, erreurDTO); + } + + //TODO : Le collaborateur récupère les informations d'un collaborateur dont il est référentEP + + //TODO : Le collaborateur récupère les informations d'un collaborateur dont il est référent de l'EP actuel + } + return Ok(collaborateurDTO); + //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(CollaborateurDTO)); @@ -63,13 +139,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(..), ... // return StatusCode(500, default(ErreurDTO)); - string exampleJson = null; - exampleJson = "{\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}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(CollaborateurDTO); //TODO: Change the data returned - return new ObjectResult(example); + } /// @@ -83,8 +153,8 @@ namespace IO.Swagger.Controllers /// La ressource n'a pas été trouvée /// Une erreur est survenue sur le serveur [HttpGet] - [Route("/api/collaborateurs/{mail}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + [Route("/api/collaborateurs/{mail}/mail")] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetCollaborateurByMail")] [SwaggerResponse(statusCode: 200, type: typeof(CollaborateurDTO), description: "OK")] @@ -92,8 +162,65 @@ 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 GetCollaborateurByMail([FromRoute][Required]string mail) - { + public virtual async Task GetCollaborateurByMail([FromRoute][Required]string mail) + { + + CollaborateurDTO collaborateurDTO; + try + { + collaborateurDTO = await collaborateurService.GetCollaborateurByMailAsync(mail); + } + 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(500, erreur); + } + catch (CollaborateurNotFoundException e) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 404, + Message = e.Message, + }; + return NotFound(erreurDTO); + } + catch (Exception e) + { + logger.LogError(e.Message); + //TODO : vérifier des cas d'erreur possible avant ?... + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + + // Si l'utilisateur connecté est un collaborateur, on vérifie si il est autorisé à accéder au détail du collaborateur + if (User.IsInRole("Collaborateur")) + { + //Le collaborateur récupère ses informations + if (!(await authorizationService.AuthorizeAsync(User, collaborateurDTO, "SameMailRequirement")).Succeeded) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 403, + Message = "Accès interdit", + }; + return StatusCode(403, erreurDTO); + } + + //TODO : Le collaborateur récupère les informations d'un collaborateur dont il est référentEP + + //TODO : Le collaborateur récupère les informations d'un collaborateur dont il est référent de l'EP actuel + } + + return Ok(collaborateurDTO); //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(CollaborateurDTO)); @@ -108,13 +235,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 \"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}"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject(exampleJson) - : default(CollaborateurDTO); //TODO: Change the data returned - return new ObjectResult(example); } /// @@ -136,15 +256,41 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/collaborateurs")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetCollaborateurs")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetCollaborateurs([FromQuery]List roles, [FromQuery]List idBUs, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri, [FromQuery]DateTime? dateDebut, [FromQuery]DateTime? dateFin) - { + public virtual async Task GetCollaborateurs([FromQuery]List roles, [FromQuery]List idBUs, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri, [FromQuery]DateTime? dateDebut, [FromQuery]DateTime? dateFin) + { + IEnumerable collaborateurs; + try + { + collaborateurs = await collaborateurService.GetCollaborateursAsync(roles, idBUs, asc, numPage, parPAge, texte, tri, dateDebut, dateFin); + } + 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(500, erreur); + } + catch (Exception e) + { + logger.LogError(e.Message); + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue", + }; + return StatusCode(500, erreurDTO); + } + return Ok(collaborateurs); //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)); @@ -156,13 +302,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 \"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 \"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} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); } /// @@ -182,7 +321,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/collaborateurs/referent/{idReferent}")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetCollaborateursByReferent")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] @@ -190,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 GetCollaborateursByReferent([FromRoute][Required]Guid? idReferent, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) - { + public virtual async Task GetCollaborateursByReferent([FromRoute][Required]Guid? idReferent, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) + { + IEnumerable collaborateurs; + try + { + collaborateurs = await collaborateurService.GetCollaborateursByReferentAsync(idReferent, asc, numPage, parPAge, texte, tri); + } + 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(500, erreur); + } + catch (ReferentNotFoundException e) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 404, + Message = e.Message, + }; + return NotFound(erreurDTO); + } + catch (Exception e) + { + logger.LogError(e.Message); + //TODO : vérifier des cas d'erreur possible avant ?... + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + return Ok(collaborateurs); + //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)); @@ -206,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 \"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 \"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} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); } /// @@ -231,15 +400,51 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/collaborateurs/referent/{idReferent}/count")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetCollaborateursByReferentCount")] [SwaggerResponse(statusCode: 200, type: typeof(long?), description: "OK")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetCollaborateursByReferentCount([FromRoute][Required]Guid? idReferent, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) - { + public virtual async Task GetCollaborateursByReferentCount([FromRoute][Required]Guid? idReferent, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri) + { + int collaborateurs; + try + { + collaborateurs = await collaborateurService.GetCollaborateursCountByReferentAsync(idReferent, texte); + } + 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(500, erreur); + } + catch (ReferentNotFoundException e) + { + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 404, + Message = e.Message, + }; + return NotFound(erreurDTO); + } + catch (Exception e) + { + logger.LogError(e.Message); + //TODO : vérifier des cas d'erreur possible avant ?... + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + return Ok(collaborateurs); //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?)); @@ -251,13 +456,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); } /// @@ -279,15 +477,42 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/collaborateurs/count")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetCollaborateursCount")] [SwaggerResponse(statusCode: 200, type: typeof(long?), description: "OK")] [SwaggerResponse(statusCode: 401, type: typeof(ErreurDTO), description: "L'utilisateur souhaitant accéder à la ressource n'est pas authentifié")] [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: 500, type: typeof(ErreurDTO), description: "Une erreur est survenue sur le serveur")] - public virtual IActionResult GetCollaborateursCount([FromQuery]List roles, [FromQuery]List idBUs, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri, [FromQuery]DateTime? dateDebut, [FromQuery]DateTime? dateFin) - { + public virtual async Task GetCollaborateursCount([FromQuery]List roles, [FromQuery]List idBUs, [FromQuery]bool? asc, [FromQuery]int? numPage, [FromQuery][Range(5, 100)]int? parPAge, [FromQuery]string texte, [FromQuery]string tri, [FromQuery]DateTime? dateDebut, [FromQuery]DateTime? dateFin) + { + int collaborateurs; + try + { + collaborateurs = await collaborateurService.GetCollaborateursCountAsync(roles, idBUs, texte, dateDebut, dateFin); + } + 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(500, erreur); + } + catch (Exception e) + { + logger.LogError(e.Message); + //TODO : vérifier des cas d'erreur possible avant ?... + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + return Ok(collaborateurs); //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?)); @@ -299,13 +524,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(..), ... // 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); + } /// @@ -320,7 +539,7 @@ namespace IO.Swagger.Controllers /// Une erreur est survenue sur le serveur [HttpGet] [Route("/api/collaborateurs/{idCollaborateur}/ep/referents")] - [Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] + //[Authorize(AuthenticationSchemes = BearerAuthenticationHandler.SchemeName)] [ValidateModelState] [SwaggerOperation("GetReferentsPrecedentEPCollaborateur")] [SwaggerResponse(statusCode: 200, type: typeof(List), description: "OK")] @@ -328,8 +547,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 GetReferentsPrecedentEPCollaborateur([FromRoute][Required]Guid? idCollaborateur) - { + public virtual async Task GetReferentsPrecedentEPCollaborateur([FromRoute][Required]Guid? idCollaborateur) + { + IEnumerable referents = null; + try + { + referents = await collaborateurService.GetReferentsPrecedentsEPAsync(idCollaborateur); + } + catch (CollaborateurNotFoundException e) { + ErreurDTO erreur = new ErreurDTO() + { + Code = 404, + Message = e.Message + }; + return NotFound(erreur); + } + 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(500, erreur); + } + catch (Exception e) + { + logger.LogError(e.Message); + //TODO : vérifier des cas d'erreur possible avant ?... + ErreurDTO erreurDTO = new ErreurDTO() + { + Code = 500, + Message = "Une erreur interne est survenue sur le serveur", + }; + return StatusCode(500, erreurDTO); + } + return Ok(referents); //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)); @@ -344,13 +598,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 \"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 \"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} ]"; - - var example = exampleJson != null - ? JsonConvert.DeserializeObject>(exampleJson) - : default(List); //TODO: Change the data returned - return new ObjectResult(example); } } } diff --git a/EPAServeur/IServices/ICollaborateurService.cs b/EPAServeur/IServices/ICollaborateurService.cs index 3b30e43..4013eef 100644 --- a/EPAServeur/IServices/ICollaborateurService.cs +++ b/EPAServeur/IServices/ICollaborateurService.cs @@ -15,10 +15,17 @@ namespace EPAServeur.IServices Task GetCollaborateurByIdAsync(Guid? id); CollaborateurDTO GetCollaborateurByMail(string mail); Task GetCollaborateurByMailAsync(string mail); - IEnumerable GetCollaborateurs(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri); - Task> GetCollaborateursAsync(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri); + IEnumerable GetCollaborateurs(List roles, List idBUs, bool? asc, int? numPage, int? parPAge, string texte, string tri, DateTime? dateDebut, DateTime? dateFin); + Task> GetCollaborateursAsync(List roles, List idBUs, bool? asc, int? numPage, int? parPAge, string texte, string tri, DateTime? dateDebut, DateTime? dateFin); + int GetCollaborateursCount(List roles, List idBUs, string texte, DateTime? dateDebut, DateTime? dateFin); + Task GetCollaborateursCountAsync(List roles, List idBUs, string texte, DateTime? dateDebut, DateTime? dateFin); IEnumerable GetCollaborateursByReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri); Task> GetCollaborateursByReferentAsync(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri); + int GetCollaborateursCountByReferent(Guid? idReferent, string texte); + Task GetCollaborateursCountByReferentAsync(Guid? idReferent, string texte); + IEnumerable GetReferentsPrecedentsEP(Guid? idCollaborateur); + Task> GetReferentsPrecedentsEPAsync(Guid? idCollaborateur); + } } diff --git a/EPAServeur/Services/CollaborateurService.cs b/EPAServeur/Services/CollaborateurService.cs index 7844c53..c1770f8 100644 --- a/EPAServeur/Services/CollaborateurService.cs +++ b/EPAServeur/Services/CollaborateurService.cs @@ -1,6 +1,7 @@ using EPAServeur.Context; using EPAServeur.Exceptions; using EPAServeur.IServices; +using EPAServeur.Models.EP; using IO.Swagger.ApiCollaborateur; using IO.Swagger.DTO; using IO.Swagger.ModelCollaborateur; @@ -24,16 +25,39 @@ namespace EPAServeur.Services /// API pour accéder aux données collaborateur en passant par le service collaborateur /// private readonly ICollaborateurApi collaborateurApi; + + /// + /// Nombre d'éléments min à afficher par page + /// + private readonly int minParPage = 5; + + /// + /// Nom d'éléments max à affichar par page + /// + private readonly int maxParPage = 100; + + /// + /// Nombre d'éléments à afficher par défaut par page + /// + private readonly int defaultParPage = 15; + + /// + /// Accès et gestion de la base de données + /// + private readonly EpContext context; #endregion + #region Constructeurs - public CollaborateurService(ICollaborateurApi _collaborateurApi) + public CollaborateurService(ICollaborateurApi _collaborateurApi, EpContext _contexte) { collaborateurApi = _collaborateurApi; + context = _contexte; } #endregion - #region Services + + #region Services Sync /// /// Récupérer un collaborateur en fonction d'un id /// @@ -43,21 +67,8 @@ namespace EPAServeur.Services { Collaborateur collaborateur = collaborateurApi.ChercherCollabId(id); if (collaborateur == null) - throw new CollaborateurNotFoundException(); - return GetCollaborateurDTO(collaborateur); - } - - /// - /// Récupérer un collaborateur en fonction d'un id de manière asynchrone - /// - /// Identifiant du collaborateur à renvoyer - /// Le collaborateur corresponant à l'id en paramètre - public async Task GetCollaborateurByIdAsync(Guid? id) - { - Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(id); - if (collaborateur == null) - throw new CollaborateurNotFoundException(); - return GetCollaborateurDTO(collaborateur); + throw new CollaborateurNotFoundException("Le collaborateur recherché n'a pas été trouvé"); + return GetCollaborateurDTO(collaborateur, true); } /// @@ -69,108 +80,79 @@ namespace EPAServeur.Services { Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail); if (collaborateur == null) - throw new CollaborateurNotFoundException(); - return GetCollaborateurDTO(collaborateur); - } - - /// - /// Récupérer un collaborateur en fonction d'un mail de manière asynchrone - /// - /// Mail du collaborateur à renvoyer - /// Le collaborateur correspondant au mail en paramètre - public async Task GetCollaborateurByMailAsync(string mail) - { - Collaborateur collaborateur = await collaborateurApi.ChercherCollabMailAsync(mail); - if (collaborateur == null) - throw new CollaborateurNotFoundException(); - return GetCollaborateurDTO(collaborateur); + throw new CollaborateurNotFoundException("Le collaborateur recherché n'a pas été trouvé"); + return GetCollaborateurDTO(collaborateur, true); } /// /// Récupérer la liste de tous les collaborateurs /// /// + /// Liste des rôles auxquels les collaborateurs à récupérer appartiennent + /// Liste des business units auxquelles sont rattachés les collaborateurs à 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 collaborateurs à renvoyer - /// Liste des fonctions /// id de l'agence à laquelle appartient les collaborateurs à récupérer /// /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte /// Choisir l'attribut par lequel est trié la liste - /// - /// idBU est à prendre en compte avant l'idAgence - /// idAgence n'est à prendre en compte que si idBU est nul - /// - /// + /// Date à partir de laquelle les collaborateurs sont arrivés + /// Date jusqu'à laquelle les collaborateurs sont arrivés /// Renvoie la liste des collaborateurs en fonction des paramètres - public IEnumerable GetCollaborateurs(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri) + public IEnumerable GetCollaborateurs(List roles, List idBUs, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) { - if (texte == null) - texte = ""; - else - texte = texte.ToLower(); IEnumerable collaborateurs; IEnumerable collaborateursDTO; - if(idBU != null) - collaborateurs = collaborateurApi.ChercherCollabBU(idBU); - else if( idAgence != null) - collaborateurs = collaborateurApi.ChercherCollabAgence(idAgence); - else - collaborateurs = collaborateurApi.ChercherCollab(); - if (collaborateurs == null) - return new List(); + + collaborateurs = collaborateurApi.ChercherCollab(ancienCollaborateur: false, roles: roles, buIds: idBUs); + collaborateursDTO = from c in collaborateurs + select GetCollaborateurDTO(c, true); + + if (parPage.Value < minParPage || parPage.Value > maxParPage) + parPage = defaultParPage; + if (numPage.Value <= 0) + numPage = 1; + int skip = (numPage.Value - 1) * parPage.Value; int take = parPage.Value; - collaborateursDTO = (from c in collaborateurs - where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) - select GetCollaborateurDTO(c)).Skip(skip).Take(take); + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + + //collaborateursDTO = TriAttribut(collaborateursDTO, tri, asc.Value); + + collaborateursDTO = TriDates(collaborateursDTO, dateDebut, dateFin); - return collaborateursDTO; + return collaborateursDTO.Skip(skip).Take(take); } /// - /// Récupérer la liste de tous les collaborateurs de manière asynchrone + /// Récupérer le nombre de collaborateurs correspondant aux paramètres de la requête /// /// - /// 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 collaborateurs à renvoyer - /// Liste des fonctions - /// id de l'agence à laquelle appartient les collaborateurs à récupérer - /// + /// Liste des rôles auxquels les collaborateurs à récupérer appartiennent + /// Liste des business units auxquelles sont rattachés les collaborateurs à récupérer /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte - /// Choisir l'attribut par lequel est trié la liste - /// - /// idBU est à prendre en compte avant l'idAgence - /// idAgence n'est à prendre en compte que si idBU est nul - /// - /// + /// Date à partir de laquelle les collaborateurs sont arrivés + /// Date jusqu'à laquelle les collaborateurs sont arrivés /// Renvoie la liste des collaborateurs en fonction des paramètres - public async Task> GetCollaborateursAsync(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri) + /// Le nombre de collaborateur + public int GetCollaborateursCount(List roles, List idBUs, string texte, DateTime? dateDebut, DateTime? dateFin) { - if (texte == null) - texte = ""; - else - texte = texte.ToLower(); IEnumerable collaborateurs; IEnumerable collaborateursDTO; - if (idBU != null) - collaborateurs = await collaborateurApi.ChercherCollabBUAsync(idBU); - else if (idAgence != null) - collaborateurs = await collaborateurApi.ChercherCollabAgenceAsync(idAgence); - else - collaborateurs = await collaborateurApi.ChercherCollabAsync(); - if (collaborateurs == null) - return new List(); - int skip = (numPage.Value - 1) * parPage.Value; - int take = parPage.Value; - collaborateursDTO = (from c in collaborateurs - where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) - select GetCollaborateurDTO(c)).Skip(skip).Take(take); - return collaborateursDTO; + collaborateurs = collaborateurApi.ChercherCollab(ancienCollaborateur: false, roles: roles, buIds: idBUs); + collaborateursDTO = from c in collaborateurs + select GetCollaborateurDTO(c, false); + + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + + collaborateursDTO = TriDates(collaborateursDTO, dateDebut, dateFin); + + return collaborateursDTO.Count(); } /// @@ -196,19 +178,158 @@ namespace EPAServeur.Services */ Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent); if (referent == null) - throw new ReferentNotFoundException(); + throw new ReferentNotFoundException("Le référent recherché n'a pas été trouvé"); + + List collaborateursIds = (from referentEP in context.ReferentEP + where referentEP.IdReferent.Value.Equals(idReferent) + select (Guid?)referentEP.IdCollaborateur).ToList(); + IEnumerable collaborateurs = collaborateurApi.ChercherCollab(collabsId: collaborateursIds); + + int skip = (numPage.Value - 1) * parPage.Value; + int take = parPage.Value; + IEnumerable collaborateursDTO = from c in collaborateurs + select GetCollaborateurDTO(c, false); + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + collaborateursDTO = TriAttribut(collaborateursDTO, tri, asc.Value); + return collaborateursDTO.Skip(skip).Take(take); + } + + /// + /// Récupérer le nombre de collaborateurs d'un référent en fonction des paramètres + /// + /// id du référent des collaborateurs à récupérer + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Renvoyer le nombre collaborateurs du référent en fonction des paramètres + public int GetCollaborateursCountByReferent(Guid? idReferent, string texte) + { + Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent); + if (referent == null) + throw new ReferentNotFoundException("Le référent recherché n'a pas été trouvé"); + + List collaborateursIds = (from referentEP in context.ReferentEP + where referentEP.IdReferent.Value.Equals(idReferent) + select (Guid?)referentEP.IdCollaborateur).ToList(); + IEnumerable collaborateurs = collaborateurApi.ChercherCollab(collabsId: collaborateursIds); + + IEnumerable collaborateursDTO = from c in collaborateurs + select GetCollaborateurDTO(c, false); + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + return collaborateursDTO.Count(); + } + + /// + /// Récupérer la liste référents ayant fait passer des EP au collaborateur + /// + /// id du collaborateur concerné + /// Liste des référents + public IEnumerable GetReferentsPrecedentsEP(Guid? idCollaborateur) + { + throw new NotImplementedException(); + } + + + #endregion + + + #region Services Async + /// + /// Récupérer un collaborateur en fonction d'un id de manière asynchrone + /// + /// Identifiant du collaborateur à renvoyer + /// Le collaborateur corresponant à l'id en paramètre + public async Task GetCollaborateurByIdAsync(Guid? id) + { + Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(id); + if (collaborateur == null) + throw new CollaborateurNotFoundException("Le collaborateur recherché n'a pas été trouvé"); + return await GetCollaborateurDTOAsync(collaborateur, true); + } + + /// + /// Récupérer un collaborateur en fonction d'un mail de manière asynchrone + /// + /// Mail du collaborateur à renvoyer + /// Le collaborateur correspondant au mail en paramètre + public async Task GetCollaborateurByMailAsync(string mail) + { + Collaborateur collaborateur = await collaborateurApi.ChercherCollabMailAsync(mail); + if (collaborateur == null) + throw new CollaborateurNotFoundException("Le collaborateur recherché n'a pas été trouvé"); + return await GetCollaborateurDTOAsync(collaborateur, true); + } + + + /// + /// Récupérer la liste de tous les collaborateurs de manière asynchrone + /// + /// + /// Liste des rôles auxquels les collaborateurs à récupérer appartiennent + /// Liste des business units auxquelles sont rattachés les collaborateurs à 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 collaborateurs à renvoyer + /// id de l'agence à laquelle appartient les collaborateurs à récupérer + /// + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Choisir l'attribut par lequel est trié la liste + /// Date à partir de laquelle les collaborateurs sont arrivés + /// Date jusqu'à laquelle les collaborateurs sont arrivés + /// Renvoie la liste des collaborateurs en fonction des paramètres + public async Task> GetCollaborateursAsync(List roles, List idBUs, bool? asc, int? numPage, int? parPage, string texte, string tri, DateTime? dateDebut, DateTime? dateFin) + { + IEnumerable collaborateurs; + IEnumerable collaborateursDTO; + + collaborateurs = await collaborateurApi.ChercherCollabAsync(ancienCollaborateur: false, roles: roles, buIds: idBUs); + collaborateursDTO = (from c in collaborateurs + select GetCollaborateurDTO(c, false)); + + if (parPage.Value < minParPage || parPage.Value > maxParPage) + parPage = defaultParPage; + if (numPage.Value <= 0) + numPage = 1; - if (texte == null) - texte = ""; - else - texte = texte.ToLower(); - IEnumerable collaborateurs = collaborateurApi.ChercherCollabRef(idReferent); int skip = (numPage.Value - 1) * parPage.Value; int take = parPage.Value; - IEnumerable collaborateursDTO = (from c in collaborateurs - where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) - select GetCollaborateurDTO(c)).Skip(skip).Take(take); - return collaborateursDTO; + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + + + collaborateursDTO = TriDates(collaborateursDTO, dateDebut, dateFin); + + return collaborateursDTO.Skip(skip).Take(take); + } + + + /// + /// Récupérer le nombre de collaborateurs correspondant aux paramètres de la requête de manière asynchrone + /// + /// + /// Liste des rôles auxquels les collaborateurs à récupérer appartiennent + /// Liste des business units auxquelles sont rattachés les collaborateurs à récupérer + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Date à partir de laquelle les collaborateurs sont arrivés + /// Date jusqu'à laquelle les collaborateurs sont arrivés + /// Renvoie la liste des collaborateurs en fonction des paramètres + /// Le nombre de collaborateur + public async Task GetCollaborateursCountAsync(List roles, List idBUs, string texte, DateTime? dateDebut, DateTime? dateFin) + { + IEnumerable collaborateurs; + IEnumerable collaborateursDTO; + + collaborateurs = await collaborateurApi.ChercherCollabAsync(ancienCollaborateur: false, roles: roles, buIds: idBUs); + + var tasks = collaborateurs.Select(c => GetCollaborateurDTOAsync(c, false)); + collaborateursDTO = await Task.WhenAll(tasks); + + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + + collaborateursDTO = TriDates(collaborateursDTO, dateDebut, dateFin); + + return collaborateursDTO.Count(); } /// @@ -220,41 +341,132 @@ namespace EPAServeur.Services /// Nombre de collaborateurs à renvoyer /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte /// Choisir l'attribut par lequel est trié la liste - /// Renvoyer les collaborateurs du référent dont l'id est passé en paramètre + /// Renvoyer les collaborateurs du référent en paramètre public async Task> GetCollaborateursByReferentAsync(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri) { - /* - Stopwatch stopwatch = new Stopwatch(); - stopwatch.Start(); - stopwatch.Stop(); - Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); - stopwatch.Restart(); - stopwatch.Stop(); - Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds); - */ Collaborateur referent = await collaborateurApi.ChercherCollabIdAsync(idReferent); if (referent == null) - throw new ReferentNotFoundException(); + throw new ReferentNotFoundException("Le référent recherché n'a pas été trouvé"); - if (texte == null) - texte = ""; - else - texte = texte.ToLower(); - IEnumerable collaborateurs = await collaborateurApi.ChercherCollabRefAsync(idReferent); + List collaborateursIds = (from r in context.ReferentEP + where r.IdReferent.Value.Equals(idReferent) + select (Guid?) r.IdCollaborateur).ToList(); + + IEnumerable collaborateurs = await collaborateurApi.ChercherCollabAsync(collabsId: collaborateursIds); int skip = (numPage.Value - 1) * parPage.Value; int take = parPage.Value; - IEnumerable collaborateursDTO = (from c in collaborateurs + + var tasks = collaborateurs.Select(c => GetCollaborateurDTOAsync(c, false)); + IEnumerable collaborateursDTO = await Task.WhenAll(tasks); + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + return collaborateursDTO.Skip(skip).Take(take); + } + + /// + /// Récupérer le nombre de collaborateurs d'un référent en fonction des paramètres de manière asynchrone + /// + /// id du référent des collaborateurs à récupérer + /// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte + /// Renvoyer le nombre collaborateurs du référent en fonction des paramètres + public async Task GetCollaborateursCountByReferentAsync(Guid? idReferent, string texte) + { + Collaborateur referent = await collaborateurApi.ChercherCollabIdAsync(idReferent); + if (referent == null) + throw new ReferentNotFoundException("Le référent recherché n'a pas été trouvé"); + + List collaborateursIds = (from r in context.ReferentEP + where r.IdReferent.Value.Equals(idReferent) + select (Guid?)r.IdCollaborateur).ToList(); + IEnumerable collaborateurs = await collaborateurApi.ChercherCollabAsync(collabsId: collaborateursIds); + /*IEnumerable collaborateursDTO = (from c in collaborateurs where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) select GetCollaborateurDTO(c)).Skip(skip).Take(take); - return collaborateursDTO; + */ + + var tasks = collaborateurs.Select(c => GetCollaborateurDTOAsync(c, false)); + IEnumerable collaborateursDTO = await Task.WhenAll(tasks); + if (texte != null) + collaborateursDTO = TriTexte(collaborateursDTO, texte.ToLower()); + return collaborateursDTO.Count(); + } + + /// + /// Récupérer la liste référents ayant fait passer des EP au collaborateur + /// + /// id du collaborateur concerné + /// Liste des référents + public Task> GetReferentsPrecedentsEPAsync(Guid? idCollaborateur) + { + throw new NotImplementedException(); } + #endregion - #region DTO To Object - + #region Methode de tri + /// + /// Permettre de récupéer les collaborateurs en fonction de leur nom et/ou prénom + /// + /// Liste des collaborateurs à trier + /// Texte permettant de trier par rapport aux noms et prénoms + /// Une liste de collaborateurs + private IEnumerable TriTexte(IEnumerable collaborateurs, string texte) + { + return (from c in collaborateurs + where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte) + select c); + } + + /// + /// Permettre de trier les données collaborateurs en fonction d'un attribut + /// + /// La liste des collaborateurs à trier + /// L'attribut sur lequel les données sont triées + /// Indique si les données sont rangées dans l'ordre croissant ou non + /// Une liste de collaborateur + private IEnumerable TriAttribut(IEnumerable collaborateurs, string tri, bool asc) + { + throw new NotImplementedException(); + } + + /// + /// Cette fonction va permettre de récupérer les collaborteurs dont la date d'arrivée se situe dans un intervalle de dates + /// + /// La liste des collaborateurs à trier + /// La date à partir de laquelle les dates d'arrivées sont récupérées + /// La data limite d'arrivée du collaborateur + /// Une liste de collaborateurs + private IEnumerable TriDates(IEnumerable collaborateurs, DateTime? dateDebut, DateTime? dateFin) + { + if(dateDebut.HasValue && dateFin.HasValue) + { + DateTime dateFinValue = dateFin.Value.AddDays(1); + return (from c in collaborateurs + where c.DateArrivee >= dateDebut.Value && c.DateArrivee < dateFinValue + select c); + } + if(dateDebut.HasValue) + { + return (from c in collaborateurs + where c.DateArrivee >= dateDebut.Value + select c); + } + if(dateFin.HasValue) + { + DateTime dateFinValue = dateFin.Value.AddDays(1); + return (from c in collaborateurs + where c.DateArrivee < dateFinValue + select c); + } + return collaborateurs; + } + #endregion + + + #region DTO To Object /// /// Transformer une agence en agenceDTO @@ -301,8 +513,33 @@ namespace EPAServeur.Services /// Transforme un collaborateur en collaborateurDTO /// /// collaborateur à transformer en collaborateurDTO + /// Indiquer si le référent du collaborateur doit être récupéré ou non + /// Renvoie la transformation DTO du collaborateur + private CollaborateurDTO GetCollaborateurDTO(Collaborateur collaborateur, bool chercherReferent) + { + CollaborateurDTO collaborateurDTO = new CollaborateurDTO() + { + Id = collaborateur.Id, + Prenom = collaborateur.Prenom, + Nom = collaborateur.Nom, + MailApside = collaborateur.MailApside, + DateArrivee = collaborateur.DateArrivee, + + }; + collaborateurDTO.BusinessUnit = GetBusinessUnitDTO(collaborateur.BusinessUnit); + //Si le référent du collaborateur doit être récupérer en même temps + if(chercherReferent) + collaborateurDTO.Referent = GetReferent(collaborateurDTO); + return collaborateurDTO; + } + + /// + /// Transforme un collaborateur en collaborateurDTO de manière asynchrone + /// + /// collaborateur à transformer en collaborateurDTO + /// Indiquer si le référent du collaborateur doit être récupéré ou non /// Renvoie la transformation DTO du collaborateur - private CollaborateurDTO GetCollaborateurDTO(Collaborateur collaborateur) + private async Task GetCollaborateurDTOAsync(Collaborateur collaborateur, bool chercherReferent) { CollaborateurDTO collaborateurDTO = new CollaborateurDTO() { @@ -314,10 +551,46 @@ namespace EPAServeur.Services }; collaborateurDTO.BusinessUnit = GetBusinessUnitDTO(collaborateur.BusinessUnit); - //collaborateurDTO.Referent = GetReferentDTO(collaborateur.Referen + //Si le référent du collaborateur doit être récupérer en même temps + if (chercherReferent) + collaborateurDTO.Referent = await GetReferentAsync(collaborateurDTO); return collaborateurDTO; } + /// + /// Récupérer le référent EP d'un collaborateur si il existe + /// + /// Le collaborateur dont on cherche le référent EP + /// Le référent EP du collaborateur + private CollaborateurDTO GetReferent(CollaborateurDTO collaborateur) + { + ReferentEP referentEP = context.ReferentEP.Find(collaborateur.Id); + //vérifier que le collaorateur a un référent EP + if (referentEP == null || referentEP.IdReferent == null || !referentEP.IdReferent.HasValue || referentEP.IdReferent.Value == null) + return null; + Collaborateur referent = collaborateurApi.ChercherCollabId(referentEP.IdReferent); + if (referent == null) + return null; + //throw new ReferentNotFoundException("Le référent EP recherché n'a pas été trouvé"); + return GetCollaborateurDTO(referent, false); + } + + /// + /// Récupérer le référent EP d'un collaborateur de manière asynchrone si il existe + /// + /// Le collaborateur dont on cherche le référent EP + /// Le référent EP du collaborateur + private async Task GetReferentAsync(CollaborateurDTO collaborateur) + { + ReferentEP referentEP = await context.ReferentEP.FindAsync(collaborateur.Id); + //vérifier que le collaorateur a un référent EP + if (referentEP == null || referentEP.IdReferent == null || !referentEP.IdReferent.HasValue || referentEP.IdReferent.Value == null) + return null; + Collaborateur referent = await collaborateurApi.ChercherCollabIdAsync(referentEP.IdReferent); + if (referent == null) + return null; + return GetCollaborateurDTO(referent, false); + } #endregion } }