WORK-WebAPI
David D'ALMEIDA 1 year ago
parent 7d1a10a281
commit 224f16110f

16
.gitignore vendored

@ -500,6 +500,7 @@ fabric.properties
# Icon must end with two \r # Icon must end with two \r
Icon Icon
# Thumbnails # Thumbnails
._* ._*
@ -548,3 +549,18 @@ xcuserdata/
*.xcscmblueprint *.xcscmblueprint
*.xccheckout *.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

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Dto\Dto.csproj" />
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
</Project>

@ -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());
}
}

@ -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
};
}
}

@ -2,9 +2,9 @@
namespace Dto; namespace Dto;
public class AthleteDto public class UserDto
{ {
public int IdAthlete { get; set; } public int Id { get; set; }
[MaxLength(100)] [MaxLength(100)]
public required string Username { get; set; } public required string Username { get; set; }
[MaxLength(150)] [MaxLength(150)]
@ -13,9 +13,11 @@ public class AthleteDto
public required string FirstName { get; set; } public required string FirstName { get; set; }
public required string Email { get; set; } public required string Email { get; set; }
public required string Sexe { get; set; } public required string Sexe { get; set; }
public double Lenght { get; set; } public float Lenght { get; set; }
public float Weight { get; set; } public float Weight { get; set; }
public required string Password { get; set; } public string? Password { get; set; }
public DateTime DateOfBirth { get; set; } public DateTime DateOfBirth { get; set; }
public string ProfilePicture { get; set; } = "default.jpg";
public bool IsCoach { get; set; } public bool IsCoach { get; set; }
} }

@ -21,14 +21,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeartTrackAPI", "HeartTrack
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}"
EndProject 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}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestsAPI", "TestsAPI", "{30FC2BE9-7397-445A-84AD-043CE70F4281}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientTests", "Tests\TestsAPI\ClientTests\ClientTests.csproj", "{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientTests", "Tests\TestsAPI\ClientTests\ClientTests.csproj", "{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsXUnit", "Tests\TestsAPI\TestsXUnit\TestsXUnit.csproj", "{44C367DC-5FE0-4CF2-9E76-A0282E931853}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsXUnit", "Tests\TestsAPI\TestsXUnit\TestsXUnit.csproj", "{44C367DC-5FE0-4CF2-9E76-A0282E931853}"
EndProject 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 Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU 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}.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.ActiveCfg = Release|Any CPU
{F80C60E1-1E06-46C2-96DE-42B1C7DE65BC}.Release|Any CPU.Build.0 = 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.ActiveCfg = Debug|Any CPU
{9E4D3AC5-E6CA-4753-BD96-BF5EE793931A}.Debug|Any CPU.Build.0 = 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 {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}.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.ActiveCfg = Release|Any CPU
{44C367DC-5FE0-4CF2-9E76-A0282E931853}.Release|Any CPU.Build.0 = 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 EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{477D2129-A6C9-4FF8-8BE9-5E9E8E5282F8} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} {477D2129-A6C9-4FF8-8BE9-5E9E8E5282F8} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18}

@ -1,26 +0,0 @@
using Dto;
using Microsoft.AspNetCore.Mvc;
using Shared;
[ApiController]
[Route("api/athletes")]
public class AthletesController : ControllerBase
{
private readonly ILogger<AthletesController> _logger;
IAthleteService _stubbedDto;
private const int DEFAULT_INDEX = 0, DEFAULT_COUNT = 5;
public AthletesController(ILogger<AthletesController> logger, IAthleteService athletesService)
{
_logger = logger;
_stubbedDto = athletesService;
}
[HttpGet("all")]
[ProducesResponseType(typeof(IEnumerable<AthleteDto>), 200)]
public async Task<IActionResult> GetAllAthletesAsync()
{
var athletes = await _stubbedDto.GetAllAthletesAsync();
return Ok(athletes);
}
}

@ -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<UsersController> _logger;
private readonly IUserService _userService;
public UsersController(ILogger<UsersController> logger, IUserService usersService)
{
_logger = logger;
_userService = usersService;
}
[HttpGet]
[ProducesResponseType(typeof(IEnumerable<UserDto>), 200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public async Task<ActionResult<PageResponse<UserDto>>> 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<UserDto>(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<ActionResult<UserDto>> 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<ActionResult<int>> 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<ActionResult<UserDto>> 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<IActionResult> 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);
}
}
}

@ -13,7 +13,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Share\Share.csproj" /> <ProjectReference Include="..\ApiMappeur\ApiMappeur.csproj" />
<ProjectReference Include="..\Dto\Dto.csproj" />
<ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\Shared\Shared.csproj" />
<ProjectReference Include="..\StubAPI\StubAPI.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,10 +1,14 @@
using Model;
using StubAPI;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); builder.Services.AddSwaggerGen();
builder.Services.AddControllers();
builder.Services.AddSingleton<IUserService, UserService>();
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
@ -16,29 +20,5 @@ if (app.Environment.IsDevelopment())
app.UseHttpsRedirection(); app.UseHttpsRedirection();
var summaries = new[] app.MapControllers();
{
"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(); app.Run();
record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

@ -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;
}

@ -0,0 +1,22 @@
namespace HeartTrackAPI.Responce;
public class PageResponse<T>
{
// 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<T> Items { get; set; }
public PageResponse(int index, int count, int total, IEnumerable<T> items)
{
Index = index;
Count = count;
Total = total;
Items = items;
}
}

@ -0,0 +1,9 @@
namespace Model;
public class Athlete : Role
{
public override bool CheckAdd(User user)
{
return user.Role is Athlete;
}
}

@ -0,0 +1,10 @@
namespace Model;
public class Coach : Role
{
public override bool CheckAdd(User user)
{
return user.Role is Athlete;
}
}

@ -0,0 +1,16 @@
using Dto;
using Model;
using Shared;
namespace Model;
public interface IUserService
{
public Task<IEnumerable<User>> GetUsers(int index, int count, AthleteOrderCriteria criteria , bool descending = false);
public Task<User?> GetUserByIdAsync(int id);
public Task<User?> AddUser(User athlete);
public Task<User?> UpdateUser(int id, User user);
public Task<bool> DeleteUser(int id);
public Task<int> GetNbItems();
}

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,6 @@
namespace Model;
public class Notification
{
}

@ -0,0 +1,6 @@
namespace Model;
public class RelationshipRequest
{
}

@ -0,0 +1,42 @@
namespace Model;
public abstract class Role
{
protected List<User> UsersList { get; set; } = [];
protected List<RelationshipRequest> UsersRequests { get; set; } = [];
protected List<Training> 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);
}
}

@ -0,0 +1,6 @@
namespace Model;
public class Training
{
}

@ -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<Notification> Notifications { get; set; } = new List<Notification>();
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(){}
}

@ -4,8 +4,15 @@
{ {
None, None,
ByUsername, ByUsername,
ByFirstName,
ByLastName,
BySexe,
ByLenght,
ByWeight,
ByDateOfBirth,
ByEmail, ByEmail,
ByIsCoach ByIsCoach
} }
} }

@ -1,23 +0,0 @@
using Dto;
namespace Shared;
public interface IAthleteService
{
public Task<IEnumerable<AthleteDto>> GetAllAthletesAsync();
public Task<IEnumerable<AthleteDto>> GetSomeAthletesAsync(int index, int count, AthleteOrderCriteria criterium);
public Task<AthleteDto?> GetAthleteByIdAsync(int id);
public Task<IEnumerable<AthleteDto>> GetAthleteByUsernameAsync(string username, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByEmailAsync(string email, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByFirstNameAsync(string firstName, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByLastNameAsync(string lastName, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesBySexeAsync(string sexe, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByLenghtAsync(double lenght, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByWeightAsync(float weight, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByDateOfBirthAsync(DateTime dateOfBirth, int index, int count, AthleteOrderCriteria criterium);
public Task<IEnumerable<AthleteDto>> GetAthletesByIsCoachAsync(bool isCoach, int index, int count, AthleteOrderCriteria criterium);
public Task<AthleteDto> AddAthleteAsync(AthleteDto athlete, AthleteOrderCriteria criterium);
public Task<AthleteDto?> UpdateAthleteAsync(int id, AthleteDto athlete, AthleteOrderCriteria criterium);
public Task<bool> DeleteAthleteAsync(int id, AthleteOrderCriteria criterium);
}

@ -0,0 +1,67 @@
using Model;
using Shared;
namespace StubAPI;
public class UserService : IUserService
{
private List<User> 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<IEnumerable<User>> GetUsers(int index, int count, AthleteOrderCriteria criteria,
bool descending = false)
{
throw new NotImplementedException();
}
public async Task<User?> GetUserByIdAsync(int id)
{
return await Task.FromResult(athletes.FirstOrDefault(s => s.Id == id));
}
public async Task<User?> AddUser(User athlete)
{
return await athletes.AddItem(athlete);
}
public async Task<User?> 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<bool> DeleteUser(int id)
{
var user = athletes.FirstOrDefault(s => s.Id == id);
if (user == null) return false;
return await athletes.DeleteItem(user);
}
public async Task<int> GetNbItems()
{
return await Task.FromResult(athletes.Count);
}
}

@ -0,0 +1,40 @@
namespace StubAPI;
public static class Extensions
{
internal static Task<T?> AddItem<T>(this IList<T> collection, T? item)
{
if(item == null || collection.Contains(item))
{
return Task.FromResult<T?>(default(T));
}
collection.Add(item);
return Task.FromResult<T?>(item);
}
internal static Task<bool> DeleteItem<T>(this IList<T> collection, T? item)
{
if(item == null)
{
return Task.FromResult(false);
}
bool result = collection.Remove(item!);
return Task.FromResult(result);
}
internal static Task<T?> UpdateItem<T>(this IList<T> collection, T? oldItem, T? newItem)
{
if(oldItem == null || newItem == null) return Task.FromResult<T?>(default(T));
if(!collection.Contains(oldItem))
{
return Task.FromResult<T?>(default(T));
}
collection.Remove(oldItem!);
collection.Add(newItem!);
return Task.FromResult<T?>(newItem);
}
}

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,4 @@
using Shared;
namespace

@ -9,6 +9,7 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<RootNamespace>StubbedDtoLib</RootNamespace>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

@ -1,7 +0,0 @@
using Shared;
namespace StubbedDtoLib;
public class AthleteStubDto : IAthleteService
{
}
Loading…
Cancel
Save