Changed method to insert userId in endpoint with claim of the token

This commit is contained in:
2026-02-21 20:12:40 +01:00
parent 9740d92cbf
commit 115f4de993
18 changed files with 89 additions and 75 deletions
@@ -3,5 +3,4 @@
public class UnlockAchievementDto public class UnlockAchievementDto
{ {
public int AchievementId { get; set; } public int AchievementId { get; set; }
public int UserId { get; set; }
} }
@@ -2,6 +2,5 @@
public class PatchUserDesignationDto public class PatchUserDesignationDto
{ {
public int Id { get; set; }
public int DesignationId { get; set; } public int DesignationId { get; set; }
} }
@@ -2,6 +2,5 @@
public class PatchUserPasswordDto public class PatchUserPasswordDto
{ {
public int Id { get; set; }
public string? Password { get; set; } public string? Password { get; set; }
} }
@@ -2,7 +2,6 @@
public class UpdateUserDto public class UpdateUserDto
{ {
public int Id { get; set; }
public string? FirstName { get; set; } public string? FirstName { get; set; }
public string? Name { get; set; } public string? Name { get; set; }
public string? Username { get; set; } public string? Username { get; set; }
@@ -9,7 +9,6 @@ public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepos
public override void Configure() public override void Configure()
{ {
Get("/Achievements/"); Get("/Achievements/");
AllowAnonymous();
} }
public override async Task HandleAsync(CancellationToken ct) public override async Task HandleAsync(CancellationToken ct)
@@ -1,31 +1,29 @@
using BeReadyBackend.DTO.Achievements; using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Achievements; using BeReadyBackend.Specifications.Achievements;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
namespace BeReadyBackend.Endpoints.Achievements; namespace BeReadyBackend.Endpoints.Achievements;
public class UserAchievementsLockedRequest
{
public int UserId { get; set; }
}
public class GetLockedAchievementsEndpoint( public class GetLockedAchievementsEndpoint(
UsersRepository usersRepository, UsersRepository usersRepository,
AchievementsRepository achievementsRepository) AchievementsRepository achievementsRepository,
: Endpoint<UserAchievementsLockedRequest, List<GetAchievementDto>> UserService userService)
: EndpointWithoutRequest<List<GetAchievementDto>>
{ {
public override void Configure() public override void Configure()
{ {
Get("/Achievements/Locked/Users/{@UserId}/", x => new {x.UserId}); Get("/Achievements/Locked/Users/");
AllowAnonymous();
} }
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) if (user is null)
{ {
@@ -33,7 +31,7 @@ public class GetLockedAchievementsEndpoint(
return; return;
} }
List<GetAchievementDto> achievementsLocked = await achievementsRepository.ProjectToListAsync<GetAchievementDto>(new GetLockedAchievementsSpec(req.UserId), ct); List<GetAchievementDto> achievementsLocked = await achievementsRepository.ProjectToListAsync<GetAchievementDto>(new GetLockedAchievementsSpec(userId), ct);
await Send.OkAsync(achievementsLocked, ct); await Send.OkAsync(achievementsLocked, ct);
} }
@@ -1,31 +1,29 @@
using BeReadyBackend.DTO.Achievements; using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.UserAchievements; using BeReadyBackend.Specifications.UserAchievements;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
namespace BeReadyBackend.Endpoints.Achievements; namespace BeReadyBackend.Endpoints.Achievements;
public class UserAchievementsRequest
{
public int UserId { get; set; }
}
public class GetUserAchievementsEndpoint( public class GetUserAchievementsEndpoint(
UsersRepository usersRepository, UsersRepository usersRepository,
UserAchievementsRepository userAchievementsRepository) UserAchievementsRepository userAchievementsRepository,
: Endpoint<UserAchievementsRequest, List<GetAchievementDto>> UserService userService)
: EndpointWithoutRequest<List<GetAchievementDto>>
{ {
public override void Configure() public override void Configure()
{ {
Get("/Achievements/Users/{@UserId}/", x => new {x.UserId}); Get("/Achievements/Users/");
AllowAnonymous();
} }
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) if (user is null)
{ {
@@ -33,7 +31,7 @@ public class GetUserAchievementsEndpoint(
return; return;
} }
List<GetAchievementDto> userAchievements = await userAchievementsRepository.ProjectToListAsync<GetAchievementDto>(new GetUserAchievementByUserIdSpec(req.UserId), ct); List<GetAchievementDto> userAchievements = await userAchievementsRepository.ProjectToListAsync<GetAchievementDto>(new GetUserAchievementByUserIdSpec(userId), ct);
await Send.OkAsync(userAchievements, ct); await Send.OkAsync(userAchievements, ct);
} }
@@ -1,6 +1,7 @@
using BeReadyBackend.DTO.Achievements; using BeReadyBackend.DTO.Achievements;
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Achievements; using BeReadyBackend.Specifications.Achievements;
using BeReadyBackend.Specifications.UserAchievements; using BeReadyBackend.Specifications.UserAchievements;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
@@ -12,17 +13,19 @@ public class UnlockAchievementEndpoint(
UserAchievementsRepository userAchievementsRepository, UserAchievementsRepository userAchievementsRepository,
AchievementsRepository achievementsRepository, AchievementsRepository achievementsRepository,
UsersRepository usersRepository, UsersRepository usersRepository,
UserService userService,
AutoMapper.IMapper mapper) : Endpoint<UnlockAchievementDto> AutoMapper.IMapper mapper) : Endpoint<UnlockAchievementDto>
{ {
public override void Configure() public override void Configure()
{ {
Post("/Achievements/{@AchievementId}/Users/{@UserId}/", x => new {x.AchievementId, x.UserId}); Post("/Achievements/{@AchievementId}/Users/");
AllowAnonymous();
} }
public override async Task HandleAsync(UnlockAchievementDto req, CancellationToken ct) 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); Achievement? achievement = await achievementsRepository.SingleOrDefaultAsync(new GetAchievementByIdSpec(req.AchievementId), ct);
if (user is null || achievement is null) if (user is null || achievement is null)
@@ -31,7 +34,7 @@ public class UnlockAchievementEndpoint(
return; 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) if (userAchievement is not null)
{ {
await Send.StringAsync("Le succès est déjà attribué à cet utilisateur", 500, cancellation: ct); await Send.StringAsync("Le succès est déjà attribué à cet utilisateur", 500, cancellation: ct);
@@ -9,7 +9,6 @@ public class GetAllDesignationsEndpoint(DesignationsRepository designationsRepos
public override void Configure() public override void Configure()
{ {
Get("/Designations/"); Get("/Designations/");
AllowAnonymous();
} }
public override async Task HandleAsync(CancellationToken ct) public override async Task HandleAsync(CancellationToken ct)
@@ -1,26 +1,23 @@
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users; namespace BeReadyBackend.Endpoints.Users;
public class DeleteUserRequest public class DeleteUserEndpoint(UsersRepository usersRepository, UserService userService) : EndpointWithoutRequest
{
public int Id { get; set; }
}
public class DeleteUserEndpoint(UsersRepository usersRepository) : Endpoint<DeleteUserRequest>
{ {
public override void Configure() public override void Configure()
{ {
Delete("/Users/{@id}", x=>new {x.Id}); Delete("/Users/");
AllowAnonymous();
} }
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) if (user == null)
{ {
@@ -1,26 +1,21 @@
using BeReadyBackend.DTO.Users; using BeReadyBackend.DTO.Users;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users; 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 GetAllUsersEndpoint(UsersRepository usersRepository, UserService userService) : EndpointWithoutRequest<List<GetUserDto>>
public class GetAllUserRequest
{
public int Id { get; set; }
}
public class GetAllUsersEndpoint(UsersRepository usersRepository) : Endpoint<GetAllUserRequest, List<GetUserDto>>
{ {
public override void Configure() public override void Configure()
{ {
Get("/Users/"); 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<GetUserDto>(new GetUserNotFriendSpec(req.Id), ct), ct); int userId = userService.GetUserIdFromToken();
await Send.OkAsync(await usersRepository.ProjectToListAsync<GetUserDto>(new GetUserNotFriendSpec(userId), ct), ct);
} }
} }
@@ -10,7 +10,6 @@ public class GetOverallRankingEndpoint(UsersRepository usersRepository) : Endpoi
public override void Configure() public override void Configure()
{ {
Get("/OverallRanking/"); Get("/OverallRanking/");
AllowAnonymous();
} }
public override async Task HandleAsync(CancellationToken ct) public override async Task HandleAsync(CancellationToken ct)
@@ -1,23 +1,24 @@
using BeReadyBackend.DTO.Users; using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
using PasswordGenerator;
namespace BeReadyBackend.Endpoints.Users; namespace BeReadyBackend.Endpoints.Users;
public class PatchUserDesignationEndpoint(UsersRepository usersRepository, AutoMapper.IMapper mapper) : Endpoint<PatchUserDesignationDto> public class PatchUserDesignationEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : Endpoint<PatchUserDesignationDto>
{ {
public override void Configure() public override void Configure()
{ {
Patch("/Users/{@Id}/Designation", x => new {x.Id}); Patch("/Users/Designation");
AllowAnonymous();
} }
public override async Task HandleAsync(PatchUserDesignationDto req, CancellationToken ct) 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) if (user is null)
{ {
@@ -1,23 +1,25 @@
using BeReadyBackend.DTO.Users; using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
using PasswordGenerator; using PasswordGenerator;
namespace BeReadyBackend.Endpoints.Users; namespace BeReadyBackend.Endpoints.Users;
public class PatchUserPasswordEndpoint(UsersRepository usersRepository) : Endpoint<PatchUserPasswordDto> public class PatchUserPasswordEndpoint(UsersRepository usersRepository, UserService userService) : Endpoint<PatchUserPasswordDto>
{ {
public override void Configure() public override void Configure()
{ {
Patch("/Users/{@Id}/Password", x => new {x.Id}); Patch("/Users/Password");
AllowAnonymous();
} }
public override async Task HandleAsync(PatchUserPasswordDto req, CancellationToken ct) 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) if (user is null)
{ {
@@ -1,22 +1,25 @@
using BeReadyBackend.DTO.Users; using BeReadyBackend.DTO.Users;
using BeReadyBackend.Models; using BeReadyBackend.Models;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Users; using BeReadyBackend.Specifications.Users;
using FastEndpoints; using FastEndpoints;
namespace BeReadyBackend.Endpoints.Users; namespace BeReadyBackend.Endpoints.Users;
public class UpdateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMapper mapper) : Endpoint<UpdateUserDto> public class UpdateUserEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : Endpoint<UpdateUserDto>
{ {
public override void Configure() public override void Configure()
{ {
Put("/Users/{@Id}/", x => new {x.Id}); Put("/Users/");
AllowAnonymous(); AllowAnonymous();
} }
public override async Task HandleAsync(UpdateUserDto req, CancellationToken ct) 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) if (user is not null)
{ {
@@ -24,7 +27,7 @@ public class UpdateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMap
return; return;
} }
user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(req.Id), ct); user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
if (user is null) if (user is null)
{ {
@@ -12,9 +12,7 @@ public class DtoToEntityMappings : Profile
CreateMap<UnlockAchievementDto, UserAchievement>(); CreateMap<UnlockAchievementDto, UserAchievement>();
CreateMap<CreateUserDto, User>(); CreateMap<CreateUserDto, User>();
CreateMap<UpdateUserDto, User>() CreateMap<UpdateUserDto, User>();
.ForMember(dest => dest.Id, opt => opt.Ignore()); CreateMap<PatchUserDesignationDto, User>();
CreateMap<PatchUserDesignationDto, User>()
.ForMember(dest => dest.Id, opt => opt.Ignore());
} }
} }
+5
View File
@@ -7,6 +7,7 @@ using FastEndpoints.Swagger;
using FastEndpoints.Security; using FastEndpoints.Security;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using BeReadyBackend.Repositories; using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args); WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
@@ -44,6 +45,10 @@ builder.Services.AddScoped<UserGroupsRepository>();
builder.Services.AddScoped<UserRandomChallengesRepository>(); builder.Services.AddScoped<UserRandomChallengesRepository>();
builder.Services.AddScoped<UsersRepository>(); builder.Services.AddScoped<UsersRepository>();
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped<UserService>();
MapperConfiguration mappingConfig = new(mc => MapperConfiguration mappingConfig = new(mc =>
{ {
mc.AddCollectionMappers(); mc.AddCollectionMappers();
+21
View File
@@ -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!);
}
}