diff --git a/BeReadyBackend/DTO/Achievements/UnlockAchievementDto.cs b/BeReadyBackend/DTO/Achievements/UnlockAchievementDto.cs index 20e4d45..a58b57b 100644 --- a/BeReadyBackend/DTO/Achievements/UnlockAchievementDto.cs +++ b/BeReadyBackend/DTO/Achievements/UnlockAchievementDto.cs @@ -3,5 +3,4 @@ public class UnlockAchievementDto { public int AchievementId { get; set; } - public int UserId { get; set; } } \ No newline at end of file diff --git a/BeReadyBackend/DTO/Users/PatchUserDesignationDto.cs b/BeReadyBackend/DTO/Users/PatchUserDesignationDto.cs index 124615a..fbe6a71 100644 --- a/BeReadyBackend/DTO/Users/PatchUserDesignationDto.cs +++ b/BeReadyBackend/DTO/Users/PatchUserDesignationDto.cs @@ -2,6 +2,5 @@ public class PatchUserDesignationDto { - public int Id { get; set; } public int DesignationId { get; set; } } \ No newline at end of file diff --git a/BeReadyBackend/DTO/Users/PatchUserPasswordDto.cs b/BeReadyBackend/DTO/Users/PatchUserPasswordDto.cs index 8682908..cf8287d 100644 --- a/BeReadyBackend/DTO/Users/PatchUserPasswordDto.cs +++ b/BeReadyBackend/DTO/Users/PatchUserPasswordDto.cs @@ -1,7 +1,6 @@ namespace BeReadyBackend.DTO.Users; public class PatchUserPasswordDto -{ - public int Id { get; set; } +{ public string? Password { get; set; } } \ No newline at end of file diff --git a/BeReadyBackend/DTO/Users/UpdateUserDto.cs b/BeReadyBackend/DTO/Users/UpdateUserDto.cs index cd55129..c9da22e 100644 --- a/BeReadyBackend/DTO/Users/UpdateUserDto.cs +++ b/BeReadyBackend/DTO/Users/UpdateUserDto.cs @@ -2,7 +2,6 @@ public class UpdateUserDto { - public int Id { get; set; } public string? FirstName { get; set; } public string? Name { get; set; } public string? Username { get; set; } diff --git a/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs index 08850c4..c536de4 100644 --- a/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Achievements/GetAllAchievementsEndpoint.cs @@ -9,7 +9,6 @@ public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepos public override void Configure() { Get("/Achievements/"); - AllowAnonymous(); } public override async Task HandleAsync(CancellationToken ct) diff --git a/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs index b05edcc..cd59bef 100644 --- a/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Achievements/GetLockedAchievementsEndpoint.cs @@ -1,31 +1,29 @@ using BeReadyBackend.DTO.Achievements; using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Achievements; using BeReadyBackend.Specifications.Users; using FastEndpoints; namespace BeReadyBackend.Endpoints.Achievements; -public class UserAchievementsLockedRequest -{ - public int UserId { get; set; } -} - public class GetLockedAchievementsEndpoint( UsersRepository usersRepository, - AchievementsRepository achievementsRepository) - : Endpoint> + AchievementsRepository achievementsRepository, + UserService userService) + : EndpointWithoutRequest> { public override void Configure() { - Get("/Achievements/Locked/Users/{@UserId}/", x => new {x.UserId}); - AllowAnonymous(); + Get("/Achievements/Locked/Users/"); } - public override async Task HandleAsync(UserAchievementsLockedRequest req, CancellationToken ct) + public override async Task HandleAsync(CancellationToken ct) { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.UserId), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); if (user is null) { @@ -33,7 +31,7 @@ public class GetLockedAchievementsEndpoint( return; } - List achievementsLocked = await achievementsRepository.ProjectToListAsync(new GetLockedAchievementsSpec(req.UserId), ct); + List achievementsLocked = await achievementsRepository.ProjectToListAsync(new GetLockedAchievementsSpec(userId), ct); await Send.OkAsync(achievementsLocked, ct); } diff --git a/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs index b17176a..fafdbb3 100644 --- a/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Achievements/GetUserAchievementsEndpoint.cs @@ -1,31 +1,29 @@ using BeReadyBackend.DTO.Achievements; using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.UserAchievements; using BeReadyBackend.Specifications.Users; using FastEndpoints; namespace BeReadyBackend.Endpoints.Achievements; -public class UserAchievementsRequest -{ - public int UserId { get; set; } -} - public class GetUserAchievementsEndpoint( UsersRepository usersRepository, - UserAchievementsRepository userAchievementsRepository) - : Endpoint> + UserAchievementsRepository userAchievementsRepository, + UserService userService) + : EndpointWithoutRequest> { public override void Configure() { - Get("/Achievements/Users/{@UserId}/", x => new {x.UserId}); - AllowAnonymous(); + Get("/Achievements/Users/"); } - public override async Task HandleAsync(UserAchievementsRequest req, CancellationToken ct) + public override async Task HandleAsync(CancellationToken ct) { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.UserId), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); if (user is null) { @@ -33,7 +31,7 @@ public class GetUserAchievementsEndpoint( return; } - List userAchievements = await userAchievementsRepository.ProjectToListAsync(new GetUserAchievementByUserIdSpec(req.UserId), ct); + List userAchievements = await userAchievementsRepository.ProjectToListAsync(new GetUserAchievementByUserIdSpec(userId), ct); await Send.OkAsync(userAchievements, ct); } diff --git a/BeReadyBackend/Endpoints/Achievements/UnlockAchievementEndpoint.cs b/BeReadyBackend/Endpoints/Achievements/UnlockAchievementEndpoint.cs index b84bb4c..654ee31 100644 --- a/BeReadyBackend/Endpoints/Achievements/UnlockAchievementEndpoint.cs +++ b/BeReadyBackend/Endpoints/Achievements/UnlockAchievementEndpoint.cs @@ -1,6 +1,7 @@ using BeReadyBackend.DTO.Achievements; using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Achievements; using BeReadyBackend.Specifications.UserAchievements; using BeReadyBackend.Specifications.Users; @@ -12,17 +13,19 @@ public class UnlockAchievementEndpoint( UserAchievementsRepository userAchievementsRepository, AchievementsRepository achievementsRepository, UsersRepository usersRepository, + UserService userService, AutoMapper.IMapper mapper) : Endpoint { public override void Configure() { - Post("/Achievements/{@AchievementId}/Users/{@UserId}/", x => new {x.AchievementId, x.UserId}); - AllowAnonymous(); + Post("/Achievements/{@AchievementId}/Users/"); } public override async Task HandleAsync(UnlockAchievementDto req, CancellationToken ct) { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.UserId), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); Achievement? achievement = await achievementsRepository.SingleOrDefaultAsync(new GetAchievementByIdSpec(req.AchievementId), ct); if (user is null || achievement is null) @@ -31,7 +34,7 @@ public class UnlockAchievementEndpoint( return; } - UserAchievement? userAchievement = await userAchievementsRepository.SingleOrDefaultAsync(new GetUserAchievementByIdSpec(req.UserId, req.AchievementId), ct); + UserAchievement? userAchievement = await userAchievementsRepository.SingleOrDefaultAsync(new GetUserAchievementByIdSpec(userId, req.AchievementId), ct); if (userAchievement is not null) { await Send.StringAsync("Le succès est déjà attribué à cet utilisateur", 500, cancellation: ct); diff --git a/BeReadyBackend/Endpoints/Designations/GetAllDesignationsEndpoint.cs b/BeReadyBackend/Endpoints/Designations/GetAllDesignationsEndpoint.cs index 03b405d..95ca647 100644 --- a/BeReadyBackend/Endpoints/Designations/GetAllDesignationsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Designations/GetAllDesignationsEndpoint.cs @@ -9,7 +9,6 @@ public class GetAllDesignationsEndpoint(DesignationsRepository designationsRepos public override void Configure() { Get("/Designations/"); - AllowAnonymous(); } public override async Task HandleAsync(CancellationToken ct) diff --git a/BeReadyBackend/Endpoints/Users/DeleteUserEndpoint.cs b/BeReadyBackend/Endpoints/Users/DeleteUserEndpoint.cs index 1679207..da8cd28 100644 --- a/BeReadyBackend/Endpoints/Users/DeleteUserEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/DeleteUserEndpoint.cs @@ -1,26 +1,23 @@ using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Users; using FastEndpoints; namespace BeReadyBackend.Endpoints.Users; -public class DeleteUserRequest -{ - public int Id { get; set; } -} - -public class DeleteUserEndpoint(UsersRepository usersRepository) : Endpoint +public class DeleteUserEndpoint(UsersRepository usersRepository, UserService userService) : EndpointWithoutRequest { public override void Configure() { - Delete("/Users/{@id}", x=>new {x.Id}); - AllowAnonymous(); + Delete("/Users/"); } - public override async Task HandleAsync(DeleteUserRequest req, CancellationToken ct) + public override async Task HandleAsync(CancellationToken ct) { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.Id), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); if (user == null) { diff --git a/BeReadyBackend/Endpoints/Users/GetAllUsersEndpoint.cs b/BeReadyBackend/Endpoints/Users/GetAllUsersEndpoint.cs index 13ad38b..fdc17e7 100644 --- a/BeReadyBackend/Endpoints/Users/GetAllUsersEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/GetAllUsersEndpoint.cs @@ -1,26 +1,21 @@ using BeReadyBackend.DTO.Users; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Users; using FastEndpoints; namespace BeReadyBackend.Endpoints.Users; -// TODO: Prendre directement dans le token (comme pour partout où je peux recup l'id du user d'ailleurs en vrai) !! -public class GetAllUserRequest -{ - public int Id { get; set; } -} - -public class GetAllUsersEndpoint(UsersRepository usersRepository) : Endpoint> +public class GetAllUsersEndpoint(UsersRepository usersRepository, UserService userService) : EndpointWithoutRequest> { public override void Configure() { Get("/Users/"); - AllowAnonymous(); } - public override async Task HandleAsync(GetAllUserRequest req, CancellationToken ct) + public override async Task HandleAsync(CancellationToken ct) { - await Send.OkAsync(await usersRepository.ProjectToListAsync(new GetUserNotFriendSpec(req.Id), ct), ct); + int userId = userService.GetUserIdFromToken(); + await Send.OkAsync(await usersRepository.ProjectToListAsync(new GetUserNotFriendSpec(userId), ct), ct); } } \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Users/GetOverallRankingEndpoint.cs b/BeReadyBackend/Endpoints/Users/GetOverallRankingEndpoint.cs index 44fdf0d..0d6cb35 100644 --- a/BeReadyBackend/Endpoints/Users/GetOverallRankingEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/GetOverallRankingEndpoint.cs @@ -10,7 +10,6 @@ public class GetOverallRankingEndpoint(UsersRepository usersRepository) : Endpoi public override void Configure() { Get("/OverallRanking/"); - AllowAnonymous(); } public override async Task HandleAsync(CancellationToken ct) diff --git a/BeReadyBackend/Endpoints/Users/PatchUserDesignationEndpoint.cs b/BeReadyBackend/Endpoints/Users/PatchUserDesignationEndpoint.cs index a48e085..f8686bc 100644 --- a/BeReadyBackend/Endpoints/Users/PatchUserDesignationEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/PatchUserDesignationEndpoint.cs @@ -1,32 +1,33 @@ using BeReadyBackend.DTO.Users; using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Users; using FastEndpoints; -using PasswordGenerator; namespace BeReadyBackend.Endpoints.Users; -public class PatchUserDesignationEndpoint(UsersRepository usersRepository, AutoMapper.IMapper mapper) : Endpoint +public class PatchUserDesignationEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : Endpoint { public override void Configure() { - Patch("/Users/{@Id}/Designation", x => new {x.Id}); - AllowAnonymous(); + Patch("/Users/Designation"); } public override async Task HandleAsync(PatchUserDesignationDto req, CancellationToken ct) { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.Id), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); if (user is null) { await Send.NotFoundAsync(ct); return; } - + mapper.Map(req, user); - + await usersRepository.SaveChangesAsync(ct); await Send.OkAsync(ct); } diff --git a/BeReadyBackend/Endpoints/Users/PatchUserPasswordEndpoint.cs b/BeReadyBackend/Endpoints/Users/PatchUserPasswordEndpoint.cs index 7ad833b..b2ec839 100644 --- a/BeReadyBackend/Endpoints/Users/PatchUserPasswordEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/PatchUserPasswordEndpoint.cs @@ -1,23 +1,25 @@ using BeReadyBackend.DTO.Users; using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Users; using FastEndpoints; using PasswordGenerator; namespace BeReadyBackend.Endpoints.Users; -public class PatchUserPasswordEndpoint(UsersRepository usersRepository) : Endpoint +public class PatchUserPasswordEndpoint(UsersRepository usersRepository, UserService userService) : Endpoint { public override void Configure() { - Patch("/Users/{@Id}/Password", x => new {x.Id}); - AllowAnonymous(); + Patch("/Users/Password"); } public override async Task HandleAsync(PatchUserPasswordDto req, CancellationToken ct) { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.Id), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); if (user is null) { diff --git a/BeReadyBackend/Endpoints/Users/UpdateUserEndpoint.cs b/BeReadyBackend/Endpoints/Users/UpdateUserEndpoint.cs index 5120342..dbcacf3 100644 --- a/BeReadyBackend/Endpoints/Users/UpdateUserEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/UpdateUserEndpoint.cs @@ -1,22 +1,25 @@ using BeReadyBackend.DTO.Users; using BeReadyBackend.Models; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; using BeReadyBackend.Specifications.Users; using FastEndpoints; namespace BeReadyBackend.Endpoints.Users; -public class UpdateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMapper mapper) : Endpoint +public class UpdateUserEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : Endpoint { public override void Configure() { - Put("/Users/{@Id}/", x => new {x.Id}); + Put("/Users/"); AllowAnonymous(); } public override async Task HandleAsync(UpdateUserDto req, CancellationToken ct) { - User? user = await usersRepository.FirstOrDefaultAsync(new GetUserByCriteriaSpec(req.Username!, req.Email!, req.Id), ct); + int userId = userService.GetUserIdFromToken(); + + User? user = await usersRepository.FirstOrDefaultAsync(new GetUserByCriteriaSpec(req.Username!, req.Email!, userId), ct); if (user is not null) { @@ -24,7 +27,7 @@ public class UpdateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMap return; } - user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.Id), ct); + user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct); if (user is null) { diff --git a/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs b/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs index 069607f..0f3ed9a 100644 --- a/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs +++ b/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs @@ -12,9 +12,7 @@ public class DtoToEntityMappings : Profile CreateMap(); CreateMap(); - CreateMap() - .ForMember(dest => dest.Id, opt => opt.Ignore()); - CreateMap() - .ForMember(dest => dest.Id, opt => opt.Ignore()); + CreateMap(); + CreateMap(); } } \ No newline at end of file diff --git a/BeReadyBackend/Program.cs b/BeReadyBackend/Program.cs index 660245c..6e0f8a7 100644 --- a/BeReadyBackend/Program.cs +++ b/BeReadyBackend/Program.cs @@ -7,6 +7,7 @@ using FastEndpoints.Swagger; using FastEndpoints.Security; using Microsoft.Net.Http.Headers; using BeReadyBackend.Repositories; +using BeReadyBackend.Services; WebApplicationBuilder builder = WebApplication.CreateBuilder(args); @@ -44,6 +45,10 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddHttpContextAccessor(); + +builder.Services.AddScoped(); + MapperConfiguration mappingConfig = new(mc => { mc.AddCollectionMappers(); diff --git a/BeReadyBackend/Services/UserService.cs b/BeReadyBackend/Services/UserService.cs new file mode 100644 index 0000000..d9cf2b6 --- /dev/null +++ b/BeReadyBackend/Services/UserService.cs @@ -0,0 +1,21 @@ +using System.Security.Claims; +using BeReadyBackend.Models; + +namespace BeReadyBackend.Services; + +public class UserService +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public UserService(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public int GetUserIdFromToken() + { + ClaimsPrincipal user = _httpContextAccessor.HttpContext!.User; + string? userId = user.Claims.FirstOrDefault(x => x.Type == "UserId")?.Value; + return int.Parse(userId!); + } +} \ No newline at end of file