diff --git a/.gitignore b/.gitignore
index 6d8621c..560f2ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -498,7 +498,8 @@ fabric.properties
.LSOverride
# Icon must end with two \r
-Icon
+Icon
+
# Thumbnails
._*
@@ -548,3 +549,18 @@ xcuserdata/
*.xcscmblueprint
*.xccheckout
+
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/.idea.HeartTrack.iml
+/modules.xml
+/projectSettingsUpdater.xml
+/contentModel.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+.idea
\ No newline at end of file
diff --git a/src/ApiMappeur/ApiMappeur.csproj b/src/ApiMappeur/ApiMappeur.csproj
new file mode 100644
index 0000000..7ba11f5
--- /dev/null
+++ b/src/ApiMappeur/ApiMappeur.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
diff --git a/src/ApiMappeur/AthleteMappeur.cs b/src/ApiMappeur/AthleteMappeur.cs
new file mode 100644
index 0000000..1021e13
--- /dev/null
+++ b/src/ApiMappeur/AthleteMappeur.cs
@@ -0,0 +1,59 @@
+using Dto;
+using Model;
+
+namespace ApiMappeur;
+
+public static class UserMappeur
+{
+ public static UserDto ToDto(this User user)
+ {
+ return new UserDto
+ {
+ Id = user.Id,
+ Username = user.Username,
+ ProfilePicture = user.ProfilePicture,
+ LastName = user.LastName,
+ FirstName = user.FirstName,
+ Email = user.Email,
+ Password = user.MotDePasse,
+ Sexe = user.Sexe,
+ Lenght = user.Lenght,
+ Weight = user.Weight,
+ DateOfBirth = user.DateOfBirth,
+ IsCoach = user.Role is Coach
+ };
+
+ }
+
+ public static User ToModel(this UserDto userDto)
+ {
+ if (userDto.IsCoach)
+ {
+ return new User(
+ userDto.Username,
+ userDto.ProfilePicture,
+ userDto.LastName,
+ userDto.FirstName,
+ userDto.Email,
+ userDto.Password,
+ userDto.Sexe,
+ userDto.Lenght,
+ userDto.Weight,
+ userDto.DateOfBirth,
+ new Coach()
+ );
+ }
+ return new User(
+ userDto.Username,
+ userDto.ProfilePicture,
+ userDto.LastName,
+ userDto.FirstName,
+ userDto.Email,
+ userDto.Password,
+ userDto.Sexe,
+ userDto.Lenght,
+ userDto.Weight,
+ userDto.DateOfBirth,
+ new Athlete());
+ }
+}
\ No newline at end of file
diff --git a/src/ApiMappeur/EnnumMappeur.cs b/src/ApiMappeur/EnnumMappeur.cs
new file mode 100644
index 0000000..22dc8b5
--- /dev/null
+++ b/src/ApiMappeur/EnnumMappeur.cs
@@ -0,0 +1,22 @@
+namespace ApiMappeur;
+
+public static class EnumMappeur
+{
+ public static Shared.AthleteOrderCriteria ToEnum(this string value)
+ {
+ return value switch
+ {
+ "None" => Shared.AthleteOrderCriteria.None,
+ "ByUsername" => Shared.AthleteOrderCriteria.ByUsername,
+ "ByFirstName" => Shared.AthleteOrderCriteria.ByFirstName,
+ "ByLastName" => Shared.AthleteOrderCriteria.ByLastName,
+ "BySexe" => Shared.AthleteOrderCriteria.BySexe,
+ "ByLenght" => Shared.AthleteOrderCriteria.ByLenght,
+ "ByWeight" => Shared.AthleteOrderCriteria.ByWeight,
+ "ByDateOfBirth" => Shared.AthleteOrderCriteria.ByDateOfBirth,
+ "ByEmail" => Shared.AthleteOrderCriteria.ByEmail,
+ "ByIsCoach" => Shared.AthleteOrderCriteria.ByIsCoach,
+ _ => Shared.AthleteOrderCriteria.None
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/Dto/AthleteDto.cs b/src/Dto/AthleteDto.cs
index cbae984..9ee369d 100644
--- a/src/Dto/AthleteDto.cs
+++ b/src/Dto/AthleteDto.cs
@@ -2,9 +2,9 @@
namespace Dto;
-public class AthleteDto
+public class UserDto
{
- public int IdAthlete { get; set; }
+ public int Id { get; set; }
[MaxLength(100)]
public required string Username { get; set; }
[MaxLength(150)]
@@ -13,9 +13,11 @@ public class AthleteDto
public required string FirstName { get; set; }
public required string Email { get; set; }
public required string Sexe { get; set; }
- public double Lenght { get; set; }
+ public float Lenght { get; set; }
public float Weight { get; set; }
- public required string Password { get; set; }
+ public string? Password { get; set; }
public DateTime DateOfBirth { get; set; }
+
+ public string ProfilePicture { get; set; } = "default.jpg";
public bool IsCoach { get; set; }
}
diff --git a/src/HeartTrack.sln b/src/HeartTrack.sln
index ddc2c8a..19f2afd 100644
--- a/src/HeartTrack.sln
+++ b/src/HeartTrack.sln
@@ -21,14 +21,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeartTrackAPI", "HeartTrack
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StubbedDtoLib", "StubbedDtoLib\StubbedDtoLib.csproj", "{87F65E21-0555-4772-88B4-C8B43146A02C}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestsAPI", "TestsAPI", "{30FC2BE9-7397-445A-84AD-043CE70F4281}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientTests", "Tests\TestsAPI\ClientTests\ClientTests.csproj", "{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsXUnit", "Tests\TestsAPI\TestsXUnit\TestsXUnit.csproj", "{44C367DC-5FE0-4CF2-9E76-A0282E931853}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "Model\Model.csproj", "{30AB7FAA-6072-40B6-A15E-9188B59144F9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiMappeur", "ApiMappeur\ApiMappeur.csproj", "{CB142F6B-0FF1-45B3-AB46-6F8DCD096C20}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StubAPI", "StubAPI\StubAPI.csproj", "{B9679DCA-F4C8-45BE-A849-44E2BA814083}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -70,10 +74,6 @@ Global
{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}.Release|Any CPU.Build.0 = Release|Any CPU
- {87F65E21-0555-4772-88B4-C8B43146A02C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {87F65E21-0555-4772-88B4-C8B43146A02C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {87F65E21-0555-4772-88B4-C8B43146A02C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {87F65E21-0555-4772-88B4-C8B43146A02C}.Release|Any CPU.Build.0 = Release|Any CPU
{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -82,6 +82,18 @@ Global
{44C367DC-5FE0-4CF2-9E76-A0282E931853}.Debug|Any CPU.Build.0 = Debug|Any CPU
{44C367DC-5FE0-4CF2-9E76-A0282E931853}.Release|Any CPU.ActiveCfg = Release|Any CPU
{44C367DC-5FE0-4CF2-9E76-A0282E931853}.Release|Any CPU.Build.0 = Release|Any CPU
+ {30AB7FAA-6072-40B6-A15E-9188B59144F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {30AB7FAA-6072-40B6-A15E-9188B59144F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {30AB7FAA-6072-40B6-A15E-9188B59144F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {30AB7FAA-6072-40B6-A15E-9188B59144F9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CB142F6B-0FF1-45B3-AB46-6F8DCD096C20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB142F6B-0FF1-45B3-AB46-6F8DCD096C20}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CB142F6B-0FF1-45B3-AB46-6F8DCD096C20}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CB142F6B-0FF1-45B3-AB46-6F8DCD096C20}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9679DCA-F4C8-45BE-A849-44E2BA814083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B9679DCA-F4C8-45BE-A849-44E2BA814083}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9679DCA-F4C8-45BE-A849-44E2BA814083}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B9679DCA-F4C8-45BE-A849-44E2BA814083}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{477D2129-A6C9-4FF8-8BE9-5E9E8E5282F8} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18}
diff --git a/src/HeartTrackAPI/Controllers/AthleteController.cs b/src/HeartTrackAPI/Controllers/AthleteController.cs
deleted file mode 100644
index 7180759..0000000
--- a/src/HeartTrackAPI/Controllers/AthleteController.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using Dto;
-using Microsoft.AspNetCore.Mvc;
-using Shared;
-
-[ApiController]
-[Route("api/athletes")]
-public class AthletesController : ControllerBase
-{
- private readonly ILogger _logger;
- IAthleteService _stubbedDto;
- private const int DEFAULT_INDEX = 0, DEFAULT_COUNT = 5;
-
- public AthletesController(ILogger logger, IAthleteService athletesService)
- {
- _logger = logger;
- _stubbedDto = athletesService;
- }
-
- [HttpGet("all")]
- [ProducesResponseType(typeof(IEnumerable), 200)]
- public async Task GetAllAthletesAsync()
- {
- var athletes = await _stubbedDto.GetAllAthletesAsync();
- return Ok(athletes);
- }
-}
\ No newline at end of file
diff --git a/src/HeartTrackAPI/Controllers/UsersController.cs b/src/HeartTrackAPI/Controllers/UsersController.cs
new file mode 100644
index 0000000..8887667
--- /dev/null
+++ b/src/HeartTrackAPI/Controllers/UsersController.cs
@@ -0,0 +1,159 @@
+using ApiMappeur;
+using Dto;
+using HeartTrackAPI.Request;
+using HeartTrackAPI.Responce;
+using Microsoft.AspNetCore.Mvc;
+using Model;
+using Shared;
+
+namespace HeartTrackAPI.Controllers;
+
+[ApiController]
+[Route("api/users")]
+public class UsersController : Controller
+{
+ // For the moment only support user who are athletes next handle user that are coach or athlete
+ private readonly ILogger _logger;
+ private readonly IUserService _userService;
+ public UsersController(ILogger logger, IUserService usersService)
+ {
+ _logger = logger;
+ _userService = usersService;
+ }
+
+ [HttpGet]
+ [ProducesResponseType(typeof(IEnumerable), 200)]
+ [ProducesResponseType(400)]
+ [ProducesResponseType(500)]
+ public async Task>> GetAllAthletes([FromQuery] PageRequest request)
+ {
+ try
+ {
+ var totalCount = await _userService.GetNbItems();
+ if (request.Count * request.Index >= totalCount)
+ {
+ _logger.LogError("To many object is asked the max is {totalCount} but the request is superior of ", totalCount);
+ return BadRequest("To many object is asked the max is : " + totalCount);
+ }
+ _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetAllAthletes), null);
+ // request.OrderingPropertyName
+ var athletes = await _userService.GetUsers(request.Index, request.Count, AthleteOrderCriteria.None, request.Descending ?? false);
+ var pageResponse = new PageResponse(request.Index, request.Count, totalCount, athletes.Select(a => a.ToDto()));
+ return Ok(pageResponse);
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Error while getting all athletes");
+ return StatusCode(500);
+ }
+ }
+
+ [HttpGet("{id}")]
+ [ProducesResponseType(typeof(UserDto), 200)]
+ [ProducesResponseType(404)]
+ [ProducesResponseType(500)]
+ public async Task> GetAthleteById(int id)
+ {
+ try
+ {
+ _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetAthleteById), id);
+ var athlete = await _userService.GetUserByIdAsync(id);
+ if (athlete == null)
+ {
+ _logger.LogError("Athlete with id {id} not found", id);
+ return NotFound($"Athlete with id {id} not found");
+ }
+ return Ok(athlete.ToDto());
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Error while getting athlete by id {id}", id);
+ return StatusCode(500);
+ }
+ }
+
+
+ [HttpGet("count")]
+ [ProducesResponseType(typeof(int), 200)]
+ [ProducesResponseType(500)]
+ public async Task> GetNbUsers()
+ {
+ try
+ {
+ _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetNbUsers), null);
+ var nbUsers = await _userService.GetNbItems();
+ return Ok(nbUsers);
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Error while getting the number of users");
+ return StatusCode(500);
+ }
+ }
+
+ [HttpPut("{id}")]
+ [ProducesResponseType(typeof(UserDto), 200)]
+ [ProducesResponseType(404)]
+ [ProducesResponseType(500)]
+ // need to adapt with coach
+ public async Task> UpdateUser(int id, [FromBody] UserDto user)
+ {
+ try
+ {
+ _logger.LogInformation("Executing {Action} with parameters: {Parameters} for {Id}", nameof(UpdateUser), user,id);
+ var athlete = await _userService.GetUserByIdAsync(id);
+ if (athlete == null)
+ {
+ _logger.LogError("Athlete with id {id} not found", id);
+ return NotFound($"Athlete with id {id} not found");
+ }
+ var updatedAthlete = await _userService.UpdateUser(id, user.ToModel());
+ if(updatedAthlete == null)
+ {
+ _logger.LogError("Error while updating athlete with id {id}", id);
+ return StatusCode(500);
+ }
+ return Ok(updatedAthlete.ToDto());
+
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Error while getting the number of users");
+ return StatusCode(500);
+ }
+ }
+
+ [HttpDelete("{id}")]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(404)]
+ [ProducesResponseType(500)]
+ public async Task DeleteUser(int id)
+ {
+ try
+ {
+ _logger.LogInformation("Executing {Action} with parameters: {Parameters} for {Id}", nameof(DeleteUser), null,id);
+
+
+ var athlete = await _userService.GetUserByIdAsync(id);
+ if (athlete == null)
+ {
+ _logger.LogError("Athlete with id {id} not found", id);
+ return NotFound($"Athlete with id {id} not found");
+ }
+ var isDeleted = await _userService.DeleteUser(id);
+ if(!isDeleted)
+ {
+ _logger.LogError("Error while deleting athlete with id {id}", id);
+ return StatusCode(500);
+ }
+ return Ok();
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Error while getting the number of users");
+ return StatusCode(500);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/HeartTrackAPI/HeartTrackAPI.csproj b/src/HeartTrackAPI/HeartTrackAPI.csproj
index 0a86543..35ec313 100644
--- a/src/HeartTrackAPI/HeartTrackAPI.csproj
+++ b/src/HeartTrackAPI/HeartTrackAPI.csproj
@@ -12,8 +12,12 @@
-
-
+
+
+
+
+
+
diff --git a/src/HeartTrackAPI/Program.cs b/src/HeartTrackAPI/Program.cs
index fda9a7d..bda6f2e 100644
--- a/src/HeartTrackAPI/Program.cs
+++ b/src/HeartTrackAPI/Program.cs
@@ -1,10 +1,14 @@
+using Model;
+using StubAPI;
+
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
-
+builder.Services.AddControllers();
+builder.Services.AddSingleton();
var app = builder.Build();
// Configure the HTTP request pipeline.
@@ -16,29 +20,5 @@ if (app.Environment.IsDevelopment())
app.UseHttpsRedirection();
-var summaries = new[]
-{
- "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
-};
-
-app.MapGet("/weatherforecast", () =>
-{
- var forecast = Enumerable.Range(1, 5).Select(index =>
- new WeatherForecast
- (
- DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
- Random.Shared.Next(-20, 55),
- summaries[Random.Shared.Next(summaries.Length)]
- ))
- .ToArray();
- return forecast;
-})
-.WithName("GetWeatherForecast")
-.WithOpenApi();
-
-app.Run();
-
-record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
-{
- public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
-}
+app.MapControllers();
+app.Run();
\ No newline at end of file
diff --git a/src/HeartTrackAPI/Request/PageRequest.cs b/src/HeartTrackAPI/Request/PageRequest.cs
new file mode 100644
index 0000000..fce6be3
--- /dev/null
+++ b/src/HeartTrackAPI/Request/PageRequest.cs
@@ -0,0 +1,9 @@
+namespace HeartTrackAPI.Request;
+
+public class PageRequest
+{
+ public string? OrderingPropertyName { get; set; } = null;// need to be map on the dto OrderCriteria
+ public bool? Descending { get; set; } = false;
+ public int Index { get; set; } = 0;
+ public int Count { get; set; } = 5;
+}
\ No newline at end of file
diff --git a/src/HeartTrackAPI/Responce/PageResponse.cs b/src/HeartTrackAPI/Responce/PageResponse.cs
new file mode 100644
index 0000000..93b4cfe
--- /dev/null
+++ b/src/HeartTrackAPI/Responce/PageResponse.cs
@@ -0,0 +1,22 @@
+namespace HeartTrackAPI.Responce;
+
+public class PageResponse
+{
+ // The index of the first item
+ public int Index { get; set; } = 1;
+ // The number of items
+ public int Count { get; set; } = 1;
+ // The total number of items
+ public int Total { get; set; } = 1;
+ // The items
+ public IEnumerable Items { get; set; }
+
+ public PageResponse(int index, int count, int total, IEnumerable items)
+ {
+ Index = index;
+ Count = count;
+ Total = total;
+ Items = items;
+ }
+
+}
\ No newline at end of file
diff --git a/src/Model/Athlete.cs b/src/Model/Athlete.cs
new file mode 100644
index 0000000..fa04950
--- /dev/null
+++ b/src/Model/Athlete.cs
@@ -0,0 +1,9 @@
+namespace Model;
+
+public class Athlete : Role
+{
+ public override bool CheckAdd(User user)
+ {
+ return user.Role is Athlete;
+ }
+}
\ No newline at end of file
diff --git a/src/Model/Coach.cs b/src/Model/Coach.cs
new file mode 100644
index 0000000..84fd18c
--- /dev/null
+++ b/src/Model/Coach.cs
@@ -0,0 +1,10 @@
+namespace Model;
+
+public class Coach : Role
+{
+ public override bool CheckAdd(User user)
+ {
+ return user.Role is Athlete;
+ }
+
+}
\ No newline at end of file
diff --git a/src/Model/IAthleteService.cs b/src/Model/IAthleteService.cs
new file mode 100644
index 0000000..ec9fac8
--- /dev/null
+++ b/src/Model/IAthleteService.cs
@@ -0,0 +1,16 @@
+using Dto;
+using Model;
+using Shared;
+
+namespace Model;
+
+public interface IUserService
+{
+ public Task> GetUsers(int index, int count, AthleteOrderCriteria criteria , bool descending = false);
+ public Task GetUserByIdAsync(int id);
+ public Task AddUser(User athlete);
+ public Task UpdateUser(int id, User user);
+ public Task DeleteUser(int id);
+ public Task GetNbItems();
+
+}
\ No newline at end of file
diff --git a/src/Model/Model.csproj b/src/Model/Model.csproj
new file mode 100644
index 0000000..18de4eb
--- /dev/null
+++ b/src/Model/Model.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/src/Model/Notification.cs b/src/Model/Notification.cs
new file mode 100644
index 0000000..8a2617a
--- /dev/null
+++ b/src/Model/Notification.cs
@@ -0,0 +1,6 @@
+namespace Model;
+
+public class Notification
+{
+
+}
\ No newline at end of file
diff --git a/src/Model/RelationshipRequest.cs b/src/Model/RelationshipRequest.cs
new file mode 100644
index 0000000..9024b50
--- /dev/null
+++ b/src/Model/RelationshipRequest.cs
@@ -0,0 +1,6 @@
+namespace Model;
+
+public class RelationshipRequest
+{
+
+}
\ No newline at end of file
diff --git a/src/Model/Role.cs b/src/Model/Role.cs
new file mode 100644
index 0000000..5353ea7
--- /dev/null
+++ b/src/Model/Role.cs
@@ -0,0 +1,42 @@
+namespace Model;
+
+public abstract class Role
+{
+ protected List UsersList { get; set; } = [];
+ protected List UsersRequests { get; set; } = [];
+ protected List TrainingList { get; set; } = [];
+ public abstract bool CheckAdd(User user);
+
+ public bool AddUser(User user)
+ {
+ if (!CheckAdd(user)) return false;
+ UsersList.Add(user);
+ return true;
+ }
+
+ public bool RemoveUser(User user)
+ {
+ return UsersList.Remove(user);
+ }
+
+ public void AddTraining(Training training)
+ {
+ TrainingList.Add(training);
+ }
+
+ public bool RemoveTraining(Training training)
+ {
+ return TrainingList.Remove(training);
+ }
+
+ public void AddUserRequest(RelationshipRequest request)
+ {
+ UsersRequests.Add(request);
+ }
+
+ public bool RemoveUserRequest(RelationshipRequest request)
+ {
+ return UsersRequests.Remove(request);
+
+ }
+}
\ No newline at end of file
diff --git a/src/Model/Training.cs b/src/Model/Training.cs
new file mode 100644
index 0000000..164afbb
--- /dev/null
+++ b/src/Model/Training.cs
@@ -0,0 +1,6 @@
+namespace Model;
+
+public class Training
+{
+
+}
\ No newline at end of file
diff --git a/src/Model/User.cs b/src/Model/User.cs
new file mode 100644
index 0000000..6efffa8
--- /dev/null
+++ b/src/Model/User.cs
@@ -0,0 +1,41 @@
+namespace Model;
+
+public class User
+{
+ public int Id { get; set; }
+ public string Username { get; set; }
+ public string ProfilePicture { get; set; }
+ public string LastName { get; set; }
+ public string FirstName { get; set; }
+ public string Email { get; set; }
+ public string MotDePasse { get; set; }
+ public string Sexe { get; set; }
+ public float Lenght { get; set; }
+ public float Weight { get; set; }
+ public DateTime DateOfBirth { get; set; }
+ public Role Role { get; set; }
+
+ protected List Notifications { get; set; } = new List();
+
+ public User( string username, string profilePicture, string nom, string prenom, string email, string motDePasse, string sexe, float taille, float poids, DateTime dateNaissance, Role role)
+ {
+ Username = username;
+ ProfilePicture = profilePicture;
+ LastName = nom;
+ FirstName = prenom;
+ Email = email;
+ MotDePasse = motDePasse;
+ Sexe = sexe;
+ Lenght = taille;
+ Weight = poids;
+ DateOfBirth = dateNaissance;
+ Role = role;
+ }
+ public User(){}
+
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/src/Shared/AthleteOrderCriteria.cs b/src/Shared/AthleteOrderCriteria.cs
index 2a7085d..681b04e 100644
--- a/src/Shared/AthleteOrderCriteria.cs
+++ b/src/Shared/AthleteOrderCriteria.cs
@@ -4,8 +4,15 @@
{
None,
ByUsername,
+ ByFirstName,
+ ByLastName,
+ BySexe,
+ ByLenght,
+ ByWeight,
+ ByDateOfBirth,
ByEmail,
ByIsCoach
}
+
}
diff --git a/src/Shared/IAthleteService.cs b/src/Shared/IAthleteService.cs
deleted file mode 100644
index 17ff7f2..0000000
--- a/src/Shared/IAthleteService.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Dto;
-
-namespace Shared;
-
-public interface IAthleteService
-{
- public Task> GetAllAthletesAsync();
- public Task> GetSomeAthletesAsync(int index, int count, AthleteOrderCriteria criterium);
- public Task GetAthleteByIdAsync(int id);
- public Task> GetAthleteByUsernameAsync(string username, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByEmailAsync(string email, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByFirstNameAsync(string firstName, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByLastNameAsync(string lastName, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesBySexeAsync(string sexe, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByLenghtAsync(double lenght, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByWeightAsync(float weight, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByDateOfBirthAsync(DateTime dateOfBirth, int index, int count, AthleteOrderCriteria criterium);
- public Task> GetAthletesByIsCoachAsync(bool isCoach, int index, int count, AthleteOrderCriteria criterium);
- public Task AddAthleteAsync(AthleteDto athlete, AthleteOrderCriteria criterium);
- public Task UpdateAthleteAsync(int id, AthleteDto athlete, AthleteOrderCriteria criterium);
- public Task DeleteAthleteAsync(int id, AthleteOrderCriteria criterium);
-
-}
\ No newline at end of file
diff --git a/src/StubAPI/AthleteService.cs b/src/StubAPI/AthleteService.cs
new file mode 100644
index 0000000..9591e51
--- /dev/null
+++ b/src/StubAPI/AthleteService.cs
@@ -0,0 +1,67 @@
+using Model;
+using Shared;
+
+namespace StubAPI;
+
+public class UserService : IUserService
+{
+ private List athletes =
+ [
+ new User
+ {
+ Id = 1, Username = "Athlete1", ProfilePicture = "default.png", FirstName = "First1", LastName = "Last1",
+ Sexe = "M", Lenght = 180, Weight = 70, DateOfBirth = new DateTime(1990, 1, 1),
+ Email = "athlete1@example.com", Role = new Athlete()
+ },
+
+ new User
+ {
+ Id = 2, Username = "Athlete2", ProfilePicture = "default.png", FirstName = "First2", LastName = "Last2",
+ Sexe = "F", Lenght = 170, Weight = 60, DateOfBirth = new DateTime(1992, 2, 2),
+ Email = "athlete2@example.com", Role = new Coach()
+ },
+
+ new User
+ {
+ Id = 3, Username = "Athlete3", ProfilePicture = "default.png", FirstName = "First3", LastName = "Last3",
+ Sexe = "M", Lenght = 190, Weight = 80, DateOfBirth = new DateTime(1994, 3, 3), Email = "ath@ex.fr",
+ Role = new Athlete()
+ }
+
+ ];
+
+ public async Task> GetUsers(int index, int count, AthleteOrderCriteria criteria,
+ bool descending = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ public async Task GetUserByIdAsync(int id)
+ {
+ return await Task.FromResult(athletes.FirstOrDefault(s => s.Id == id));
+ }
+
+ public async Task AddUser(User athlete)
+ {
+ return await athletes.AddItem(athlete);
+ }
+
+ public async Task UpdateUser(int id, User user)
+ {
+ var oldUser = athletes.FirstOrDefault(s => s.Id == id);
+ if (oldUser == null) return null;
+ return await athletes.UpdateItem(oldUser, user);
+ }
+
+ public async Task DeleteUser(int id)
+ {
+ var user = athletes.FirstOrDefault(s => s.Id == id);
+ if (user == null) return false;
+ return await athletes.DeleteItem(user);
+ }
+
+ public async Task GetNbItems()
+ {
+ return await Task.FromResult(athletes.Count);
+ }
+}
\ No newline at end of file
diff --git a/src/StubAPI/Extensions.cs b/src/StubAPI/Extensions.cs
new file mode 100644
index 0000000..e7a036c
--- /dev/null
+++ b/src/StubAPI/Extensions.cs
@@ -0,0 +1,40 @@
+namespace StubAPI;
+
+
+public static class Extensions
+{
+ internal static Task AddItem(this IList collection, T? item)
+ {
+ if(item == null || collection.Contains(item))
+ {
+ return Task.FromResult(default(T));
+ }
+ collection.Add(item);
+ return Task.FromResult(item);
+ }
+
+ internal static Task DeleteItem(this IList collection, T? item)
+ {
+ if(item == null)
+ {
+ return Task.FromResult(false);
+ }
+ bool result = collection.Remove(item!);
+ return Task.FromResult(result);
+ }
+
+ internal static Task UpdateItem(this IList collection, T? oldItem, T? newItem)
+ {
+ if(oldItem == null || newItem == null) return Task.FromResult(default(T));
+
+ if(!collection.Contains(oldItem))
+ {
+ return Task.FromResult(default(T));
+ }
+
+ collection.Remove(oldItem!);
+ collection.Add(newItem!);
+ return Task.FromResult(newItem);
+ }
+
+}
\ No newline at end of file
diff --git a/src/StubAPI/StubAPI.csproj b/src/StubAPI/StubAPI.csproj
new file mode 100644
index 0000000..b0ff0a6
--- /dev/null
+++ b/src/StubAPI/StubAPI.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/src/StubApi/AthleteStubDto.cs b/src/StubApi/AthleteStubDto.cs
new file mode 100644
index 0000000..48952e4
--- /dev/null
+++ b/src/StubApi/AthleteStubDto.cs
@@ -0,0 +1,4 @@
+using Shared;
+
+namespace
+
diff --git a/src/StubbedDtoLib/StubbedDtoLib.csproj b/src/StubApi/StubApi.csproj
similarity index 87%
rename from src/StubbedDtoLib/StubbedDtoLib.csproj
rename to src/StubApi/StubApi.csproj
index aa1b3e2..3c5171a 100644
--- a/src/StubbedDtoLib/StubbedDtoLib.csproj
+++ b/src/StubApi/StubApi.csproj
@@ -1,14 +1,15 @@
-
-
-
-
-
-
-
-
- net8.0
- enable
- enable
-
-
-
+
+
+
+
+
+
+
+
+ net8.0
+ enable
+ enable
+ StubbedDtoLib
+
+
+
diff --git a/src/StubbedDtoLib/AthleteStubDto.cs b/src/StubbedDtoLib/AthleteStubDto.cs
deleted file mode 100644
index 67876f2..0000000
--- a/src/StubbedDtoLib/AthleteStubDto.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using Shared;
-
-namespace StubbedDtoLib;
-
-public class AthleteStubDto : IAthleteService
-{
-}
\ No newline at end of file