|
|
@ -1,3 +1,4 @@
|
|
|
|
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
|
using APIMappers;
|
|
|
|
using APIMappers;
|
|
|
|
using Dto;
|
|
|
|
using Dto;
|
|
|
|
using HeartTrackAPI.Request;
|
|
|
|
using HeartTrackAPI.Request;
|
|
|
@ -9,10 +10,13 @@ using Model.Repository;
|
|
|
|
using Shared;
|
|
|
|
using Shared;
|
|
|
|
|
|
|
|
|
|
|
|
namespace HeartTrackAPI.Controllers;
|
|
|
|
namespace HeartTrackAPI.Controllers;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Contrôle les actions liées aux utilisateurs dans l'application HeartTrack.
|
|
|
|
|
|
|
|
/// Gère les opérations CRUD sur les utilisateurs, leurs amis, et leurs activités.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
[ApiController]
|
|
|
|
[ApiController]
|
|
|
|
[ApiVersion("1.0")]
|
|
|
|
[ApiVersion("1.0")]
|
|
|
|
[Route("api/v{version:apiVersion}/users")]
|
|
|
|
[Route("api/v{version:apiVersion}/[controller]")]
|
|
|
|
public class UsersController : Controller
|
|
|
|
public class UsersController : Controller
|
|
|
|
{
|
|
|
|
{
|
|
|
|
private readonly ILogger<UsersController> _logger;
|
|
|
|
private readonly ILogger<UsersController> _logger;
|
|
|
@ -24,7 +28,15 @@ public class UsersController : Controller
|
|
|
|
_userService = dataManager.UserRepo;
|
|
|
|
_userService = dataManager.UserRepo;
|
|
|
|
_activityService = dataManager.ActivityRepo;
|
|
|
|
_activityService = dataManager.ActivityRepo;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Récupère une page d'utilisateurs en fonction des critères de pagination et de tri fournis.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="request">Les critères de pagination et de tri pour les utilisateurs.</param>
|
|
|
|
|
|
|
|
/// <returns>Une page de données utilisateur selon les critères spécifiés.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne la page demandée d'utilisateurs.</response>
|
|
|
|
|
|
|
|
/// <response code="400">La demande de pagination est invalide.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpGet]
|
|
|
|
[HttpGet]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<UserDto>), 200)]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<UserDto>), 200)]
|
|
|
|
[ProducesResponseType(400)]
|
|
|
|
[ProducesResponseType(400)]
|
|
|
@ -49,15 +61,23 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting all athletes");
|
|
|
|
_logger.LogError(e, "Error while getting all athletes");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Récupère un utilisateur spécifique par son identifiant.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="id">L'identifiant de l'utilisateur à récupérer.</param>
|
|
|
|
|
|
|
|
/// <returns>L'utilisateur correspondant à l'identifiant spécifié.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne l'utilisateur demandé.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Aucun utilisateur trouvé pour l'identifiant spécifié.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpGet("{id}")]
|
|
|
|
[HttpGet("{id}")]
|
|
|
|
[ProducesResponseType(typeof(UserDto), 200)]
|
|
|
|
[ProducesResponseType(typeof(UserDto), 200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(500)]
|
|
|
|
[ProducesResponseType(500)]
|
|
|
|
public async Task<ActionResult<UserDto>> GetById(int id)
|
|
|
|
public async Task<ActionResult<UserDto>> GetById([Range(0,int.MaxValue)]int id)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
try
|
|
|
|
try
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -73,11 +93,16 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting athlete by id {id}", id);
|
|
|
|
_logger.LogError(e, "Error while getting athlete by id {id}", id);
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Obtient le nombre total d'utilisateurs.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <returns>Le nombre total d'utilisateurs.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne le nombre total d'utilisateurs.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpGet("count")]
|
|
|
|
[HttpGet("count")]
|
|
|
|
[ProducesResponseType(typeof(int), 200)]
|
|
|
|
[ProducesResponseType(typeof(int), 200)]
|
|
|
|
[ProducesResponseType(500)]
|
|
|
|
[ProducesResponseType(500)]
|
|
|
@ -92,10 +117,19 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Met à jour les informations d'un utilisateur spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="id">L'identifiant de l'utilisateur à mettre à jour.</param>
|
|
|
|
|
|
|
|
/// <param name="user">Les données de l'utilisateur pour la mise à jour.</param>
|
|
|
|
|
|
|
|
/// <returns>L'utilisateur mis à jour.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne l'utilisateur mis à jour.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Utilisateur non trouvé.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpPut("{id}")]
|
|
|
|
[HttpPut("{id}")]
|
|
|
|
[ProducesResponseType(typeof(UserDto), 200)]
|
|
|
|
[ProducesResponseType(typeof(UserDto), 200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
@ -115,7 +149,7 @@ public class UsersController : Controller
|
|
|
|
if(updatedAthlete == null)
|
|
|
|
if(updatedAthlete == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError("Error while updating athlete with id {id}", id);
|
|
|
|
_logger.LogError("Error while updating athlete with id {id}", id);
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Ok(updatedAthlete.ToDto());
|
|
|
|
return Ok(updatedAthlete.ToDto());
|
|
|
|
|
|
|
|
|
|
|
@ -123,10 +157,18 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Supprime un utilisateur spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="id">L'identifiant de l'utilisateur à supprimer.</param>
|
|
|
|
|
|
|
|
/// <returns>Action result.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Utilisateur supprimé avec succès.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Utilisateur non trouvé.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpDelete("{id}")]
|
|
|
|
[HttpDelete("{id}")]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
@ -148,17 +190,26 @@ public class UsersController : Controller
|
|
|
|
if(!isDeleted)
|
|
|
|
if(!isDeleted)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError("Error while deleting athlete with id {id}", id);
|
|
|
|
_logger.LogError("Error while deleting athlete with id {id}", id);
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Ok();
|
|
|
|
return Ok();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Obtient la liste des amis d'un utilisateur spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="id">L'identifiant de l'utilisateur.</param>
|
|
|
|
|
|
|
|
/// <param name="request">Les critères de pagination et de tri.</param>
|
|
|
|
|
|
|
|
/// <returns>La liste paginée des amis.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne la liste paginée des amis de l'utilisateur.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Utilisateur non trouvé.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpGet("{id}/friends")]
|
|
|
|
[HttpGet("{id}/friends")]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<UserDto>), 200)]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<UserDto>), 200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
@ -188,11 +239,19 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Ajoute un ami à un utilisateur spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="id">L'identifiant de l'utilisateur.</param>
|
|
|
|
|
|
|
|
/// <param name="friendId">L'identifiant de l'ami à ajouter.</param>
|
|
|
|
|
|
|
|
/// <returns>Action result.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Ami ajouté avec succès.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Utilisateur ou ami non trouvé.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpPost("{id}/friend/{friendId}")]
|
|
|
|
[HttpPost("{id}/friend/{friendId}")]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
@ -218,17 +277,27 @@ public class UsersController : Controller
|
|
|
|
if(!isAdded)
|
|
|
|
if(!isAdded)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError("Error while adding friend with id {friendId} to athlete with id {id}", friendId, id);
|
|
|
|
_logger.LogError("Error while adding friend with id {friendId} to athlete with id {id}", friendId, id);
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Ok();
|
|
|
|
return Ok();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Supprime un ami d'un utilisateur spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="id">L'identifiant de l'utilisateur.</param>
|
|
|
|
|
|
|
|
/// <param name="friendId">L'identifiant de l'ami à supprimer.</param>
|
|
|
|
|
|
|
|
/// <returns>Action result.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Ami supprimé avec succès.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Utilisateur ou ami non trouvé.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpDelete("{id}/friend/{friendId}")]
|
|
|
|
[HttpDelete("{id}/friend/{friendId}")]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
@ -254,19 +323,28 @@ public class UsersController : Controller
|
|
|
|
if(!isRemoved)
|
|
|
|
if(!isRemoved)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError("Error while removing friend with id {friendId} to athlete with id {id}", friendId, id);
|
|
|
|
_logger.LogError("Error while removing friend with id {friendId} to athlete with id {id}", friendId, id);
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Ok();
|
|
|
|
return Ok();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ou faire un get qui si le role est coach resend les athletes et si le role est athlete resend les coach
|
|
|
|
// #[TODO] [Dave] ou faire un get qui si le role est coach resend les athletes et si le role est athlete resend les coach
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Obtient la liste des athlètes d'un coach spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="coachId">L'identifiant du coach.</param>
|
|
|
|
|
|
|
|
/// <param name="request">Les critères de pagination et de tri.</param>
|
|
|
|
|
|
|
|
/// <returns>La liste paginée des athlètes.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne la liste paginée des athlètes du coach.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Coach non trouvé.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpGet("{coachId}/athletes")]
|
|
|
|
[HttpGet("{coachId}/athletes")]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<UserDto>), 200)]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<UserDto>), 200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
@ -296,10 +374,19 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
_logger.LogError(e, "Error while getting the number of users");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Obtient la liste des activités d'un utilisateur spécifique.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="userId">L'identifiant de l'utilisateur.</param>
|
|
|
|
|
|
|
|
/// <param name="pageRequest">Les critères de pagination et de tri.</param>
|
|
|
|
|
|
|
|
/// <returns>La liste paginée des activités de l'utilisateur.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Retourne la liste paginée des activités.</response>
|
|
|
|
|
|
|
|
/// <response code="404">Aucune activité trouvée.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpGet("{userId}/activities")]
|
|
|
|
[HttpGet("{userId}/activities")]
|
|
|
|
// should be tiny DTOActivity returned with only the necessary information (will be used in the list of activities of a user)
|
|
|
|
// should be tiny DTOActivity returned with only the necessary information (will be used in the list of activities of a user)
|
|
|
|
public async Task<ActionResult<PageResponse<ActivityDto>>> GetActivitiesByUser(int userId, [FromQuery] PageRequest pageRequest)
|
|
|
|
public async Task<ActionResult<PageResponse<ActivityDto>>> GetActivitiesByUser(int userId, [FromQuery] PageRequest pageRequest)
|
|
|
@ -324,20 +411,26 @@ public class UsersController : Controller
|
|
|
|
catch (Exception e)
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.LogError(e, "Error while getting all activities");
|
|
|
|
_logger.LogError(e, "Error while getting all activities");
|
|
|
|
return StatusCode(500);
|
|
|
|
return Problem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
/* [TODO] [Dave]
|
|
|
|
|
|
|
|
|
|
|
|
[HttpGet("{userId}/trainings")]
|
|
|
|
[HttpGet("{userId}/trainings")]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<TrainingDto>), 200)]
|
|
|
|
[ProducesResponseType(typeof(PageResponse<TrainingDto>), 200)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(404)]
|
|
|
|
[ProducesResponseType(500)]
|
|
|
|
[ProducesResponseType(500)]
|
|
|
|
public async Task<ActionResult<PageResponse<TrainingDto>> GetTrainings(int userId, [FromQuery] PageRequest request)
|
|
|
|
public async Task<ActionResult<PageResponse<TrainingDto>> GetTrainings(int userId, [FromQuery] PageRequest request)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Déconnecte l'utilisateur actuel.
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
/// <param name="signInManager">Le gestionnaire de connexion.</param>
|
|
|
|
|
|
|
|
/// <param name="empty">Paramètre vide utilisé pour s'assurer que la requête provient bien d'un client.</param>
|
|
|
|
|
|
|
|
/// <returns>Action result.</returns>
|
|
|
|
|
|
|
|
/// <response code="200">Déconnexion réussie.</response>
|
|
|
|
|
|
|
|
/// <response code="401">Déconnexion non autorisée.</response>
|
|
|
|
|
|
|
|
/// <response code="500">Erreur interne du serveur.</response>
|
|
|
|
[HttpPost("logout")]
|
|
|
|
[HttpPost("logout")]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(200)]
|
|
|
|
[ProducesResponseType(401)]
|
|
|
|
[ProducesResponseType(401)]
|
|
|
|