From 224f16110fcd710f16635c43b44fc9edca536dec Mon Sep 17 00:00:00 2001 From: dave Date: Tue, 5 Mar 2024 00:49:14 +0100 Subject: [PATCH] first --- .gitignore | 18 +- src/ApiMappeur/ApiMappeur.csproj | 14 ++ src/ApiMappeur/AthleteMappeur.cs | 59 +++++++ src/ApiMappeur/EnnumMappeur.cs | 22 +++ src/Dto/AthleteDto.cs | 10 +- src/HeartTrack.sln | 24 ++- .../Controllers/AthleteController.cs | 26 --- .../Controllers/UsersController.cs | 159 ++++++++++++++++++ src/HeartTrackAPI/HeartTrackAPI.csproj | 8 +- src/HeartTrackAPI/Program.cs | 34 +--- src/HeartTrackAPI/Request/PageRequest.cs | 9 + src/HeartTrackAPI/Responce/PageResponse.cs | 22 +++ src/Model/Athlete.cs | 9 + src/Model/Coach.cs | 10 ++ src/Model/IAthleteService.cs | 16 ++ src/Model/Model.csproj | 13 ++ src/Model/Notification.cs | 6 + src/Model/RelationshipRequest.cs | 6 + src/Model/Role.cs | 42 +++++ src/Model/Training.cs | 6 + src/Model/User.cs | 41 +++++ src/Shared/AthleteOrderCriteria.cs | 7 + src/Shared/IAthleteService.cs | 23 --- src/StubAPI/AthleteService.cs | 67 ++++++++ src/StubAPI/Extensions.cs | 40 +++++ src/StubAPI/StubAPI.csproj | 13 ++ src/StubApi/AthleteStubDto.cs | 4 + .../StubApi.csproj} | 29 ++-- src/StubbedDtoLib/AthleteStubDto.cs | 7 - 29 files changed, 634 insertions(+), 110 deletions(-) create mode 100644 src/ApiMappeur/ApiMappeur.csproj create mode 100644 src/ApiMappeur/AthleteMappeur.cs create mode 100644 src/ApiMappeur/EnnumMappeur.cs delete mode 100644 src/HeartTrackAPI/Controllers/AthleteController.cs create mode 100644 src/HeartTrackAPI/Controllers/UsersController.cs create mode 100644 src/HeartTrackAPI/Request/PageRequest.cs create mode 100644 src/HeartTrackAPI/Responce/PageResponse.cs create mode 100644 src/Model/Athlete.cs create mode 100644 src/Model/Coach.cs create mode 100644 src/Model/IAthleteService.cs create mode 100644 src/Model/Model.csproj create mode 100644 src/Model/Notification.cs create mode 100644 src/Model/RelationshipRequest.cs create mode 100644 src/Model/Role.cs create mode 100644 src/Model/Training.cs create mode 100644 src/Model/User.cs delete mode 100644 src/Shared/IAthleteService.cs create mode 100644 src/StubAPI/AthleteService.cs create mode 100644 src/StubAPI/Extensions.cs create mode 100644 src/StubAPI/StubAPI.csproj create mode 100644 src/StubApi/AthleteStubDto.cs rename src/{StubbedDtoLib/StubbedDtoLib.csproj => StubApi/StubApi.csproj} (87%) delete mode 100644 src/StubbedDtoLib/AthleteStubDto.cs 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