Cleaned code

This commit is contained in:
2026-03-01 14:50:01 +01:00
parent 70de2a5a66
commit 2e868889fc
41 changed files with 94 additions and 98 deletions
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourcePerFileMappings">
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/d39cb28a-f071-4fe6-bb03-b2350028b821/console.sql" value="d39cb28a-f071-4fe6-bb03-b2350028b821" />
</component>
</project>
+4 -4
View File
@@ -15,19 +15,19 @@ public class BeReadyDbContext : DbContext
public DbSet<UserFriend> UserFriends { get; set; }
public DbSet<UserGroup> UserGroups { get; set; }
public DbSet<UserRandomChallenge> UserRandomChallenges { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string connectionString =
"Server=romaric-thibault.fr;" +
"Database=beready;" +
"Server=romaric-thibault.fr;" +
"Database=beready;" +
"User Id=beready;" +
"Password=beready;" +
"TrustServerCertificate=true;";
optionsBuilder.UseSqlServer(connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserFriend>()
@@ -11,7 +11,7 @@ public class GetGroupDetailsDto
public string? Description { get; set; }
public int Duration { get; set; }
public DateTime CreationDate { get; set; }
public List<GetMessageDto>? Messages { get; set; }
public List<GetUserGroupDto>? Users { get; set; }
}
-1
View File
@@ -8,5 +8,4 @@ public class GetUserDto
public string? Username { get; set; }
public int DesignationId { get; set; }
public GetUserStatsDto? GetUserStatsDto { get; set; }
}
@@ -1,6 +1,6 @@
namespace BeReadyBackend.DTO.Users;
public class PatchUserPasswordDto
{
{
public string? Password { get; set; }
}
@@ -19,9 +19,9 @@ public class GetLockedAchievementsEndpoint(
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
List<GetAchievementDto> achievementsLocked = await achievementsRepository.ProjectToListAsync<GetAchievementDto>(new GetLockedAchievementsSpec(userId), ct);
await Send.OkAsync(achievementsLocked, ct);
}
}
@@ -15,13 +15,13 @@ public class GetUserAchievementsEndpoint(
{
Get("/Achievements/Users/");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
List<GetAchievementDto> userAchievements = await userAchievementsRepository.ProjectToListAsync<GetAchievementDto>(new GetUserAchievementByUserIdSpec(userId), ct);
await Send.OkAsync(userAchievements, ct);
}
}
@@ -22,7 +22,7 @@ public class UnlockAchievementEndpoint(
public override async Task HandleAsync(UnlockAchievementDto req, CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
Achievement? achievement = await achievementsRepository.SingleOrDefaultAsync(new GetAchievementByIdSpec(req.AchievementId), ct);
if (achievement is null)
@@ -37,7 +37,7 @@ public class UnlockAchievementEndpoint(
await Send.StringAsync("Le succès est déjà attribué à cet utilisateur", 500, cancellation: ct);
return;
}
await userAchievementsRepository.AddAsync(mapper.Map<UserAchievement>(req), ct);
await Send.OkAsync(ct);
}
@@ -28,7 +28,7 @@ public class AcceptFriendRequestEndpoint(UserService userService, UserFriendsRep
await Send.NotFoundAsync(ct);
return;
}
userFriend.IsAccepted = true;
UserFriend friend = new()
@@ -37,7 +37,7 @@ public class AcceptFriendRequestEndpoint(UserService userService, UserFriendsRep
FriendId = req.FriendId,
IsAccepted = true
};
await userFriendsRepository.AddAsync(friend, ct);
await userFriendsRepository.SaveChangesAsync(ct);
await Send.OkAsync(ct);
@@ -6,7 +6,8 @@ using FastEndpoints;
namespace BeReadyBackend.Endpoints.Friends;
public class GetAllFriendRequestsEndpoint(UserFriendsRepository userFriendsRepository, UserService userService, AutoMapper.IMapper mapper) : EndpointWithoutRequest<List<GetFriendRequestDto>>
public class GetAllFriendRequestsEndpoint(UserFriendsRepository userFriendsRepository, UserService userService, AutoMapper.IMapper mapper)
: EndpointWithoutRequest<List<GetFriendRequestDto>>
{
public override void Configure()
{
@@ -16,7 +17,7 @@ public class GetAllFriendRequestsEndpoint(UserFriendsRepository userFriendsRepos
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
await Send.OkAsync(await userFriendsRepository.ProjectToListAsync<GetFriendRequestDto>(new GetFriendRequestSpec(userId), ct), ct);
}
}
@@ -17,7 +17,7 @@ public class GetAllFriendsEndpoint(UserFriendsRepository userFriendsRepository,
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
await Send.OkAsync(await userFriendsRepository.ProjectToListAsync<GetFriendDto>(new GetFriendsByUserIdSpec(userId), ct), ct);
}
}
@@ -28,7 +28,7 @@ public class RejectFriendRequestEndpoint(UserService userService, UserFriendsRep
await Send.NotFoundAsync(ct);
return;
}
await userFriendsRepository.DeleteAsync(userFriend, ct);
await Send.OkAsync(ct);
}
@@ -15,7 +15,7 @@ public class SendFriendRequestEndpoint(UserFriendsRepository userFriendsReposito
{
public override void Configure()
{
Post("/Friends/{@Id}/", x => new {x.FriendId});
Post("/Friends/{@Id}/", x => new { x.FriendId });
}
public override async Task HandleAsync(SendFriendRequest req, CancellationToken ct)
@@ -28,11 +28,11 @@ public class SendFriendRequestEndpoint(UserFriendsRepository userFriendsReposito
await Send.StringAsync("Cet utilisateur est déjà ami avec cette personne", 400, cancellation: ct);
return;
}
userFriend = mapper.Map<UserFriend>(req);
userFriend.UserId = userId;
userFriend.IsAccepted = false;
await userFriendsRepository.AddAsync(userFriend, ct);
await Send.OkAsync(ct);
}
@@ -29,7 +29,7 @@ public class CreateGroupEndpoint(
group.IsFinished = false;
group.CreationDate = DateTime.Now;
group.UserGroups = [];
await groupsRepository.AddAsync(group, ct);
await groupsRepository.SaveChangesAsync(ct);
@@ -56,7 +56,7 @@ public class CreateGroupEndpoint(
Score = 0
};
group.UserGroups?.Add(userGroup);
await userGroupsRepository.AddRangeAsync(group.UserGroups!, ct);
await userGroupsRepository.SaveChangesAsync(ct);
@@ -41,7 +41,7 @@ public class DeleteGroupEndpoint(GroupsRepository groupsRepository, UserGroupsRe
if (group.UserGroups?.Count > 0)
await userGroupsRepository.DeleteRangeAsync(group.UserGroups, ct);
await groupsRepository.DeleteAsync(group, ct);
await userGroupsRepository.SaveChangesAsync(ct);
await Send.OkAsync(ct);
@@ -14,8 +14,8 @@ public class GroupRankingRequest
}
public class GetGroupRankingEndpoint(
GroupsRepository groupsRepository,
UsersRepository usersRepository,
GroupsRepository groupsRepository,
UsersRepository usersRepository,
UserGroupsRepository userGroupsRepository)
: Endpoint<GroupRankingRequest, List<GetGroupRankingDto>>
{
@@ -41,6 +41,7 @@ public class GetGroupRankingEndpoint(
User? votedUser = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(member.VotedProofId.Value), ct);
if (votedUser is not null) votedUser.Score++;
}
await usersRepository.SaveChangesAsync(ct);
await userGroupsRepository.SaveChangesAsync(ct);
@@ -52,8 +53,9 @@ public class GetGroupRankingEndpoint(
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(groupScore[i].UserId), ct);
if (user != null) user.Score += points[i];
}
await usersRepository.SaveChangesAsync(ct);
await Send.OkAsync(groupScore, ct);
}
}
@@ -24,7 +24,7 @@ public class CreateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMap
await Send.StringAsync("Un utilisateur possède déjà ce pseudo ou cette email", 400, cancellation: ct);
return;
}
string salt = new Password().IncludeLowercase().IncludeUppercase().IncludeNumeric().LengthRequired(24).Next();
user = mapper.Map<User>(req);
@@ -38,7 +38,7 @@ public class CreateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMap
user.TotalPodium = 0;
user.TotalBonusChallenge = 0;
user.Series = 0;
await usersRepository.AddAsync(user, ct);
await Send.OkAsync(ct);
}
@@ -15,7 +15,7 @@ public class DeleteUserEndpoint(UsersRepository usersRepository, UserService use
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
await usersRepository.DeleteAsync((await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct))!, ct);
await Send.OkAsync(ct);
}
@@ -13,11 +13,11 @@ public class GetAllUserChallengesEndpoint(UsersRepository usersRepository, UserS
{
Get("/Users/Challenges/");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetProofOrChallengeByUserIdSpec(userId), ct);
if (user is null)
@@ -25,13 +25,13 @@ public class GetAllUserChallengesEndpoint(UsersRepository usersRepository, UserS
await Send.NotFoundAsync(ct);
return;
}
List<GetUserChallengeDto> challenges = [];
if (user.UserRandomChallenges is not null)
if (user.UserRandomChallenges is not null)
challenges.AddRange(user.UserRandomChallenges.Select(x => mapper.Map<GetUserChallengeDto>(x.RandomChallenge)));
if (user.UserGroups is not null)
challenges.AddRange(user.UserGroups.Select(x => mapper.Map<GetUserChallengeDto>(x.Group)));
await Send.OkAsync(challenges, ct);
}
}
@@ -13,11 +13,11 @@ public class GetAllUserProofsEndpoint(UsersRepository usersRepository, UserServi
{
Get("/Users/Proofs/");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetProofOrChallengeByUserIdSpec(userId), ct);
if (user is null)
@@ -25,13 +25,13 @@ public class GetAllUserProofsEndpoint(UsersRepository usersRepository, UserServi
await Send.NotFoundAsync(ct);
return;
}
List<GetUserProofDto> proofs = [];
if (user.UserRandomChallenges is not null)
if (user.UserRandomChallenges is not null)
proofs.AddRange(user.UserRandomChallenges.Select(x => mapper.Map<GetUserProofDto>(x.RandomChallenge)));
if (user.UserGroups is not null)
proofs.AddRange(user.UserGroups.Select(x => mapper.Map<GetUserProofDto>(x.Group)));
await Send.OkAsync(proofs, ct);
}
}
@@ -12,7 +12,7 @@ public class GetAllUsersEndpoint(UsersRepository usersRepository, UserService us
{
Get("/Users/");
}
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
@@ -17,9 +17,9 @@ public class GetUserDetailsEndpoint(UsersRepository usersRepository, UserService
public override async Task HandleAsync(CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
await Send.OkAsync(mapper.Map<GetUserDetailsDto>(user), ct);
}
}
@@ -16,7 +16,7 @@ public class GetUserEndpoint(UsersRepository usersRepository, UserService userSe
{
public override void Configure()
{
Get("/Users/{@Id}/", x => new {x.Id});
Get("/Users/{@Id}/", x => new { x.Id });
}
public override async Task HandleAsync(UserRequest req, CancellationToken ct)
@@ -28,7 +28,7 @@ public class GetUserEndpoint(UsersRepository usersRepository, UserService userSe
await Send.NotFoundAsync(ct);
return;
}
await Send.OkAsync(mapper.Map<GetUserDto>(user), ct);
}
}
@@ -17,7 +17,7 @@ public class PatchUserDesignationEndpoint(UsersRepository usersRepository, UserS
public override async Task HandleAsync(PatchUserDesignationDto req, CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
if (user is null)
@@ -18,7 +18,7 @@ public class PatchUserPasswordEndpoint(UsersRepository usersRepository, UserServ
public override async Task HandleAsync(PatchUserPasswordDto req, CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
if (user is null)
@@ -26,10 +26,10 @@ public class PatchUserPasswordEndpoint(UsersRepository usersRepository, UserServ
await Send.NotFoundAsync(ct);
return;
}
string salt = new Password().IncludeLowercase().IncludeUppercase().IncludeNumeric().LengthRequired(24).Next();
user.Password = BCrypt.Net.BCrypt.HashPassword(req.Password + salt);
await usersRepository.SaveChangesAsync(ct);
await Send.OkAsync(ct);
}
@@ -18,7 +18,7 @@ public class UpdateUserEndpoint(UsersRepository usersRepository, UserService use
public override async Task HandleAsync(UpdateUserDto req, CancellationToken ct)
{
int userId = userService.GetUserIdFromToken();
User? user = await usersRepository.FirstOrDefaultAsync(new GetUserByCriteriaSpec(req.Username!, req.Email!, userId), ct);
if (user is not null)
@@ -26,17 +26,17 @@ public class UpdateUserEndpoint(UsersRepository usersRepository, UserService use
await Send.StringAsync("Un utilisateur possède déjà ce pseudo ou cette email", 400, cancellation: ct);
return;
}
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);
}
+4 -3
View File
@@ -9,17 +9,17 @@ public class GroupHub : Hub
{
await Clients.Group($"group-{groupId}").SendAsync("ReceiveProof", proofUrl);
}
public async Task SendMessageToGroup(int groupId, string message)
{
await Clients.Group($"group-{groupId}").SendAsync("ReceiveMessage", message);
}
public async Task StartVoteIntoGroup(int groupId)
{
await Clients.Group($"group-{groupId}").SendAsync("StartVote");
}
public override async Task OnConnectedAsync()
{
HttpContext? httpContext = Context.GetHttpContext();
@@ -27,6 +27,7 @@ public class GroupHub : Hub
{
await Groups.AddToGroupAsync(Context.ConnectionId, $"group-{groupId}");
}
await base.OnConnectedAsync();
}
}
@@ -11,12 +11,12 @@ public class DtoToEntityMappings : Profile
public DtoToEntityMappings()
{
CreateMap<UnlockAchievementDto, UserAchievement>();
CreateMap<CreateUserDto, User>();
CreateMap<UpdateUserDto, User>();
CreateMap<PatchUserDesignationDto, User>();
CreateMap<CreateGroupDto, Group>()
CreateMap<CreateGroupDto, Group>()
.ForMember(dest => dest.UserGroups, opt => opt.Ignore());
}
}
@@ -19,22 +19,22 @@ public class EntityToDtoMappings : Profile
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Achievement!.Id))
.ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Achievement!.Label))
.ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Achievement!.Description));
CreateMap<User, GetUserDto>()
.ForMember(dest => dest.GetUserStatsDto, opt => opt.MapFrom(src => src));
CreateMap<User, GetUserDetailsDto>()
.ForMember(dest => dest.GetUserStatsDto, opt => opt.MapFrom(src => src));
CreateMap<User, GetUserStatsDto>();
CreateMap<UserGroup, GetUserProofDto>();
CreateMap<UserRandomChallenge, GetUserProofDto>();
CreateMap<RandomChallenge, GetUserChallengeDto>()
.ForMember(dest => dest.ChallengeTitle, opt => opt.MapFrom(src => src.Libelle))
.ForMember(dest => dest.ChallengeDuration, opt => opt.MapFrom(src => src.Duration));
CreateMap<Group, GetUserChallengeDto>()
.ForMember(dest => dest.ChallengeTitle, opt => opt.MapFrom(src => src.Title))
.ForMember(dest => dest.ChallengeDescription, opt => opt.MapFrom(src => src.Description))
@@ -43,7 +43,7 @@ public class EntityToDtoMappings : Profile
CreateMap<UserFriend, GetFriendDto>()
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.Friend!.Username))
.ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.Friend!.Score));
CreateMap<UserFriend, GetFriendRequestDto>()
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.User!.Username))
.ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.User!.Score));
@@ -57,17 +57,17 @@ public class EntityToDtoMappings : Profile
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.GroupId))
.ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Group!.Label))
.ForMember(dest => dest.IsFinished, opt => opt.MapFrom(src => src.Group!.IsFinished));
CreateMap<Group, GetGroupDetailsDto>()
.ForMember(dest => dest.Users, opt => opt.MapFrom(src => src.UserGroups))
.ForMember(dest => dest.Messages, opt => opt.MapFrom(src => src.Messages));
CreateMap<Message, GetMessageDto>()
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.User!.Username));
CreateMap<UserGroup, GetProofDto>()
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.User!.Username));
CreateMap<UserGroup, GetGroupRankingDto>()
.ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.User!.Username));
}
+1 -1
View File
@@ -7,6 +7,6 @@ public class Achievement
[Key] public int Id { get; set; }
[Required] public string? Label { get; set; }
[Required] public string? Description { get; set; }
public List<UserAchievement>? UserAchievements { get; set; }
}
+1 -1
View File
@@ -6,6 +6,6 @@ public class Designation
{
[Key] public int Id { get; set; }
[Required] public string? Label { get; set; }
public List<User>? Users { get; set; }
}
+2 -2
View File
@@ -7,12 +7,12 @@ public class Group
[Key] public int Id { get; set; }
[Required, MaxLength(100)] public string? Label { get; set; }
[Required] public bool IsFinished { get; set; }
[Required] public string? Title { get; set; }
[Required] public string? Description { get; set; }
[Required] public int Duration { get; set; }
[Required] public DateTime CreationDate { get; set; }
public List<Message>? Messages { get; set; }
public List<UserGroup>? UserGroups { get; set; }
}
+2 -2
View File
@@ -7,10 +7,10 @@ public class Message
[Key] public int Id { get; set; }
[Required] public string? Libelle { get; set; }
[Required] public DateTime SendDate { get; set; }
public User? User { get; set; }
[Required] public int UserId { get; set; }
public Group? Group { get; set; }
[Required] public int GroupId { get; set; }
}
+2 -2
View File
@@ -6,8 +6,8 @@ public class RandomChallenge
{
[Key] public int Id { get; set; }
[Required] public string? Libelle { get; set; }
[Required] public int Duration {get; set;}
[Required] public int Duration { get; set; }
[Required] public bool IsAlreadyPast { get; set; }
public List<UserRandomChallenge>? UserRandomChallenges { get; set; }
}
+3 -3
View File
@@ -12,16 +12,16 @@ public class User
[Required] public DateTime CreationDate { get; set; }
[Required, MaxLength(60)] public string? Password { get; set; }
[Required] public string? Salt { get; set; }
[Required, ] public int Score { get; set; }
[Required,] public int Score { get; set; }
[Required] public int TotalWin { get; set; }
[Required] public int TotalChallenge { get; set; }
[Required] public int TotalPodium { get; set; }
[Required] public int TotalBonusChallenge { get; set; }
[Required] public int Series { get; set; }
public Designation? Designation { get; set; }
public int? DesignationId { get; set; }
public List<UserFriend>? UserFriends { get; set; }
public List<Message>? Messages { get; set; }
public List<UserRandomChallenge>? UserRandomChallenges { get; set; }
+1 -1
View File
@@ -12,6 +12,6 @@ public class UserFriend
public User? Friend { get; set; }
public int FriendId { get; set; }
[Required] public bool IsAccepted { get; set; }
}
+2 -2
View File
@@ -11,9 +11,9 @@ public class UserGroup
public Group? Group { get; set; }
[Required] public int GroupId { get; set; }
public string? Proof { get; set; }
[Required] public string? Grade { get; set; }
public int? VotedProofId { get; set; }
[Required] public int Score { get; set; }
+1 -1
View File
@@ -11,6 +11,6 @@ public class UserRandomChallenge
public RandomChallenge? RandomChallenge { get; set; }
[Required] public int RandomChallengeId { get; set; }
public string? Proof { get; set; }
}
+5 -5
View File
@@ -6,16 +6,16 @@ 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!);
ClaimsPrincipal user = _httpContextAccessor.HttpContext!.User;
string? userId = user.Claims.FirstOrDefault(x => x.Type == "UserId")?.Value;
return int.Parse(userId!);
}
}
@@ -9,6 +9,5 @@ public class GetLockedAchievementsSpec : Specification<Achievement>
{
Query
.Where(x => x.UserAchievements != null && x.UserAchievements.All(y => y.UserId != userId));
}
}
@@ -5,7 +5,7 @@ namespace BeReadyBackend.Specifications.Groups;
public class GetGroupsByUserIdSpec : Specification<UserGroup>
{
public GetGroupsByUserIdSpec(int userId)
public GetGroupsByUserIdSpec(int userId)
{
Query
.Include(x => x.Group)