Added AchievementService.cs for gestion of achievements
This commit is contained in:
@@ -1,18 +0,0 @@
|
|||||||
using BeReadyBackend.DTO.Achievements;
|
|
||||||
using BeReadyBackend.Repositories;
|
|
||||||
using FastEndpoints;
|
|
||||||
|
|
||||||
namespace BeReadyBackend.Endpoints.Achievements;
|
|
||||||
|
|
||||||
public class GetAllAchievementsEndpoint(AchievementsRepository achievementsRepository) : EndpointWithoutRequest<List<GetAchievementDto>>
|
|
||||||
{
|
|
||||||
public override void Configure()
|
|
||||||
{
|
|
||||||
Get("/Achievements/");
|
|
||||||
}
|
|
||||||
|
|
||||||
public override async Task HandleAsync(CancellationToken ct)
|
|
||||||
{
|
|
||||||
await Send.OkAsync(await achievementsRepository.ProjectToListAsync<GetAchievementDto>(ct), ct);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
using BeReadyBackend.DTO.Achievements;
|
|
||||||
using BeReadyBackend.Repositories;
|
|
||||||
using BeReadyBackend.Services;
|
|
||||||
using BeReadyBackend.Specifications.Achievements;
|
|
||||||
using FastEndpoints;
|
|
||||||
|
|
||||||
namespace BeReadyBackend.Endpoints.Achievements;
|
|
||||||
|
|
||||||
public class GetLockedAchievementsEndpoint(
|
|
||||||
AchievementsRepository achievementsRepository,
|
|
||||||
UserService userService)
|
|
||||||
: EndpointWithoutRequest<List<GetAchievementDto>>
|
|
||||||
{
|
|
||||||
public override void Configure()
|
|
||||||
{
|
|
||||||
Get("/Achievements/Locked/Users/");
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
using BeReadyBackend.DTO.Achievements;
|
|
||||||
using BeReadyBackend.Models;
|
|
||||||
using BeReadyBackend.Repositories;
|
|
||||||
using BeReadyBackend.Services;
|
|
||||||
using BeReadyBackend.Specifications.Achievements;
|
|
||||||
using BeReadyBackend.Specifications.UserAchievements;
|
|
||||||
using FastEndpoints;
|
|
||||||
|
|
||||||
namespace BeReadyBackend.Endpoints.Achievements;
|
|
||||||
|
|
||||||
public class UnlockAchievementEndpoint(
|
|
||||||
UserAchievementsRepository userAchievementsRepository,
|
|
||||||
AchievementsRepository achievementsRepository,
|
|
||||||
UserService userService) : Endpoint<UnlockAchievementDto>
|
|
||||||
{
|
|
||||||
public override void Configure()
|
|
||||||
{
|
|
||||||
Post("/Achievements/{@AchievementId}/Users/", x => new { x.AchievementId });
|
|
||||||
Description(x => x.Accepts<UnlockAchievementDto>());
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
await Send.NotFoundAsync(ct);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
userAchievement = new UserAchievement
|
|
||||||
{
|
|
||||||
UserId = userId,
|
|
||||||
AchievementId = req.AchievementId
|
|
||||||
};
|
|
||||||
|
|
||||||
await userAchievementsRepository.AddAsync(userAchievement, ct);
|
|
||||||
await Send.NoContentAsync(ct);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,8 +6,7 @@ using FastEndpoints;
|
|||||||
|
|
||||||
namespace BeReadyBackend.Endpoints.Friends;
|
namespace BeReadyBackend.Endpoints.Friends;
|
||||||
|
|
||||||
public class GetAllFriendRequestsEndpoint(UserFriendsRepository userFriendsRepository, UserService userService, AutoMapper.IMapper mapper)
|
public class GetAllFriendRequestsEndpoint(UserFriendsRepository userFriendsRepository, UserService userService): EndpointWithoutRequest<List<GetFriendRequestDto>>
|
||||||
: EndpointWithoutRequest<List<GetFriendRequestDto>>
|
|
||||||
{
|
{
|
||||||
public override void Configure()
|
public override void Configure()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ using FastEndpoints;
|
|||||||
|
|
||||||
namespace BeReadyBackend.Endpoints.Friends;
|
namespace BeReadyBackend.Endpoints.Friends;
|
||||||
|
|
||||||
public class GetAllFriendsEndpoint(UserFriendsRepository userFriendsRepository, UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper)
|
public class GetAllFriendsEndpoint(UserFriendsRepository userFriendsRepository, UserService userService) : EndpointWithoutRequest<List<GetFriendDto>>
|
||||||
: EndpointWithoutRequest<List<GetFriendDto>>
|
|
||||||
{
|
{
|
||||||
public override void Configure()
|
public override void Configure()
|
||||||
{
|
{
|
||||||
@@ -17,7 +16,6 @@ public class GetAllFriendsEndpoint(UserFriendsRepository userFriendsRepository,
|
|||||||
public override async Task HandleAsync(CancellationToken ct)
|
public override async Task HandleAsync(CancellationToken ct)
|
||||||
{
|
{
|
||||||
int userId = userService.GetUserIdFromToken();
|
int userId = userService.GetUserIdFromToken();
|
||||||
|
|
||||||
await Send.OkAsync(await userFriendsRepository.ProjectToListAsync<GetFriendDto>(new GetFriendsByUserIdSpec(userId), ct), ct);
|
await Send.OkAsync(await userFriendsRepository.ProjectToListAsync<GetFriendDto>(new GetFriendsByUserIdSpec(userId), ct), ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,8 @@ using FastEndpoints;
|
|||||||
|
|
||||||
namespace BeReadyBackend.Endpoints.Users;
|
namespace BeReadyBackend.Endpoints.Users;
|
||||||
|
|
||||||
public class GetUserDetailsEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper) : EndpointWithoutRequest<GetUserDetailsDto>
|
public class GetUserDetailsEndpoint(UsersRepository usersRepository, UserService userService, AutoMapper.IMapper mapper, AchievementService achievementService)
|
||||||
|
: EndpointWithoutRequest<GetUserDetailsDto>
|
||||||
{
|
{
|
||||||
public override void Configure()
|
public override void Configure()
|
||||||
{
|
{
|
||||||
@@ -18,6 +19,7 @@ public class GetUserDetailsEndpoint(UsersRepository usersRepository, UserService
|
|||||||
{
|
{
|
||||||
int userId = userService.GetUserIdFromToken();
|
int userId = userService.GetUserIdFromToken();
|
||||||
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
|
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId), ct);
|
||||||
|
await achievementService.CheckAchievement(userId);
|
||||||
|
|
||||||
await Send.OkAsync(mapper.Map<GetUserDetailsDto>(user), ct);
|
await Send.OkAsync(mapper.Map<GetUserDetailsDto>(user), ct);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,144 @@
|
|||||||
|
using BeReadyBackend.Models;
|
||||||
|
using BeReadyBackend.Repositories;
|
||||||
|
using BeReadyBackend.Specifications.Achievements;
|
||||||
|
using BeReadyBackend.Specifications.Friends;
|
||||||
|
using BeReadyBackend.Specifications.Posts;
|
||||||
|
using BeReadyBackend.Specifications.UserAchievements;
|
||||||
|
using BeReadyBackend.Specifications.Users;
|
||||||
|
|
||||||
|
namespace BeReadyBackend.Services;
|
||||||
|
|
||||||
|
public class AchievementService(
|
||||||
|
UsersRepository usersRepository,
|
||||||
|
AchievementsRepository achievementsRepository,
|
||||||
|
UserAchievementsRepository userAchievementsRepository,
|
||||||
|
UserPostsRepository userPostsRepository,
|
||||||
|
UserFriendsRepository userFriendsRepository)
|
||||||
|
{
|
||||||
|
public async Task Unlock(int userId, int achievementId)
|
||||||
|
{
|
||||||
|
Achievement? achievement = await achievementsRepository.SingleOrDefaultAsync(new GetAchievementByIdSpec(achievementId));
|
||||||
|
|
||||||
|
if (achievement is null) return;
|
||||||
|
|
||||||
|
bool alreadyUnlocked = await userAchievementsRepository.CountAsync(new GetUserAchievementByIdSpec(userId, achievement.Id)) > 0;
|
||||||
|
|
||||||
|
if (alreadyUnlocked) return;
|
||||||
|
|
||||||
|
UserAchievement userAchievement = new()
|
||||||
|
{
|
||||||
|
UserId = userId,
|
||||||
|
AchievementId = achievement.Id
|
||||||
|
};
|
||||||
|
|
||||||
|
await userAchievementsRepository.AddAsync(userAchievement);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task CheckAchievement(int userId)
|
||||||
|
{
|
||||||
|
User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(userId));
|
||||||
|
if (user is null) return;
|
||||||
|
|
||||||
|
int challengesCounter = await usersRepository.CountAsync(new GetProofOrChallengeByUserIdSpec(userId));
|
||||||
|
int likedCounter = await userPostsRepository.CountAsync(new GetPostsLikedByUserSpec(userId));
|
||||||
|
int friendsCounter = await userFriendsRepository.CountAsync(new GetFriendsByUserIdSpec(userId));
|
||||||
|
int friendsRequestsCounter = await userFriendsRepository.CountAsync(new GetFriendRequestSpec(userId));
|
||||||
|
int achievementsCounter = await userAchievementsRepository.CountAsync(new GetAchievementUnlockedSpec(userId));
|
||||||
|
|
||||||
|
switch (challengesCounter)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
await Unlock(userId, 1);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
await Unlock(userId, 12);
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
await Unlock(userId, 3);
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
await Unlock(userId, 29);
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
await Unlock(userId, 32);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (user.Series)
|
||||||
|
{
|
||||||
|
case 5:
|
||||||
|
await Unlock(userId, 2);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
await Unlock(userId, 39);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
await Unlock(userId, 4);
|
||||||
|
break;
|
||||||
|
case 30:
|
||||||
|
await Unlock(userId, 40);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (likedCounter)
|
||||||
|
{
|
||||||
|
case 50:
|
||||||
|
await Unlock(userId, 37);
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
await Unlock(userId, 9);
|
||||||
|
break;
|
||||||
|
case 200:
|
||||||
|
await Unlock(userId, 38);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (user.TotalLikes)
|
||||||
|
{
|
||||||
|
case 50:
|
||||||
|
await Unlock(userId, 13);
|
||||||
|
break;
|
||||||
|
case 500:
|
||||||
|
await Unlock(userId, 44);
|
||||||
|
break;
|
||||||
|
case 1000:
|
||||||
|
await Unlock(userId, 33);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (friendsCounter)
|
||||||
|
{
|
||||||
|
case 5:
|
||||||
|
await Unlock(userId, 18);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
await Unlock(userId, 19);
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
await Unlock(userId, 36);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (friendsRequestsCounter)
|
||||||
|
{
|
||||||
|
case 10:
|
||||||
|
await Unlock(userId, 21);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (achievementsCounter)
|
||||||
|
{
|
||||||
|
case 5:
|
||||||
|
await Unlock(userId,22);
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
await Unlock(userId, 23);
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
await Unlock(userId, 46);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DateTime.Now >= DateTime.Today.AddHours(20)) await Unlock(userId, 25);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using Ardalis.Specification;
|
||||||
|
using BeReadyBackend.Models;
|
||||||
|
|
||||||
|
namespace BeReadyBackend.Specifications.Achievements;
|
||||||
|
|
||||||
|
public class GetAchievementUnlockedSpec : Specification<UserAchievement>
|
||||||
|
{
|
||||||
|
public GetAchievementUnlockedSpec(int userId)
|
||||||
|
{
|
||||||
|
Query
|
||||||
|
.Where(x => x.UserId == userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using Ardalis.Specification;
|
|
||||||
using BeReadyBackend.Models;
|
|
||||||
|
|
||||||
namespace BeReadyBackend.Specifications.Achievements;
|
|
||||||
|
|
||||||
public class GetLockedAchievementsSpec : Specification<Achievement>
|
|
||||||
{
|
|
||||||
public GetLockedAchievementsSpec(int userId)
|
|
||||||
{
|
|
||||||
Query
|
|
||||||
.Where(x => x.UserAchievements != null && x.UserAchievements.All(y => y.UserId != userId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using Ardalis.Specification;
|
||||||
|
using BeReadyBackend.Models;
|
||||||
|
|
||||||
|
namespace BeReadyBackend.Specifications.Posts;
|
||||||
|
|
||||||
|
public class GetPostsLikedByUserSpec : Specification<UserPost>
|
||||||
|
{
|
||||||
|
public GetPostsLikedByUserSpec(int userId)
|
||||||
|
{
|
||||||
|
Query
|
||||||
|
.Where(x => x.UserId == userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user