diff --git a/PaperMania/Server.Tests/Application/Player/GetPlayerLevelUseCaseTests.cs b/PaperMania/Server.Tests/Application/Player/GetPlayerLevelUseCaseTests.cs index 9832ac0..38c227b 100644 --- a/PaperMania/Server.Tests/Application/Player/GetPlayerLevelUseCaseTests.cs +++ b/PaperMania/Server.Tests/Application/Player/GetPlayerLevelUseCaseTests.cs @@ -2,6 +2,7 @@ using Moq; using Server.Api.Dto.Response; using Server.Application.Exceptions; +using Server.Application.Port.Output.Cache; using Server.Application.Port.Output.Persistence; using Server.Application.Port.Output.StaticData; using Server.Application.UseCase.Player; @@ -15,16 +16,26 @@ public class GetPlayerLevelUseCaseTests { private readonly Mock _repositoryMock = new(); private readonly Mock _levelStoreMock = new(); + private readonly Mock _cacheMock = new(); private GetPlayerLevelUseCase CreateUseCase() => - new(_repositoryMock.Object, _levelStoreMock.Object); + new(_repositoryMock.Object, _levelStoreMock.Object, _cacheMock.Object); + + private void SetupCache(PlayerData? returnValue) + { + _cacheMock + .Setup(x => x.GetOrSetAsync( + It.IsAny(), + It.IsAny>>(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(returnValue); + } [Fact] public async Task ExecuteAsync_Should_Throw_When_Player_Not_Found() { - _repositoryMock - .Setup(x => x.FindByUserIdAsync(It.IsAny(), It.IsAny())) - .ReturnsAsync((PlayerData?)null); + SetupCache(null); var useCase = CreateUseCase(); var command = new GetPlayerLevelCommand(1); @@ -40,9 +51,7 @@ public async Task ExecuteAsync_Should_Throw_When_Level_Not_Found() { var gameData = PlayerData.Create(1, "Player"); - _repositoryMock - .Setup(x => x.FindByUserIdAsync(1, It.IsAny())) - .ReturnsAsync(gameData); + SetupCache(gameData); _levelStoreMock .Setup(x => x.GetLevelDefinition(It.IsAny())) @@ -61,11 +70,9 @@ public async Task ExecuteAsync_Should_Throw_When_Level_Not_Found() public async Task ExecuteAsync_Should_Return_Level_Info_When_Success() { var gameData = PlayerData.Create(1, "Player"); - var levelDefinition = new LevelDefinition(1,100, 50); + var levelDefinition = new LevelDefinition(1, 100, 50); - _repositoryMock - .Setup(x => x.FindByUserIdAsync(1, It.IsAny())) - .ReturnsAsync(gameData); + SetupCache(gameData); _levelStoreMock .Setup(x => x.GetLevelDefinition(1)) diff --git a/PaperMania/Server/Application/UseCase/Player/GetPlayerLevelUseCase.cs b/PaperMania/Server/Application/UseCase/Player/GetPlayerLevelUseCase.cs index 40f8bf6..fd179df 100644 --- a/PaperMania/Server/Application/UseCase/Player/GetPlayerLevelUseCase.cs +++ b/PaperMania/Server/Application/UseCase/Player/GetPlayerLevelUseCase.cs @@ -1,10 +1,12 @@ using Server.Api.Dto.Response; using Server.Application.Exceptions; using Server.Application.Port.Input.Player; +using Server.Application.Port.Output.Cache; using Server.Application.Port.Output.Persistence; using Server.Application.Port.Output.StaticData; using Server.Application.UseCase.Player.Command; using Server.Application.UseCase.Player.Result; +using Server.Infrastructure.Cache; namespace Server.Application.UseCase.Player; @@ -12,34 +14,43 @@ public class GetPlayerLevelUseCase : IGetPlayerLevelUseCase { private readonly IDataRepository _repository; private readonly ILevelDefinitionStore _store; + private readonly ICacheAsideService _cache; public GetPlayerLevelUseCase( IDataRepository repository, - ILevelDefinitionStore store + ILevelDefinitionStore store, + ICacheAsideService cache ) { _repository = repository; _store = store; + _cache = cache; } public async Task ExecuteAsync(GetPlayerLevelCommand request, CancellationToken ct) { - var data = await _repository.FindByUserIdAsync(request.UserId, ct) - ?? throw new RequestException( + var player = await _cache.GetOrSetAsync( + CacheKey.Profile.ByUserId(request.UserId), + async (token) => await _repository.FindByUserIdAsync(request.UserId, token), + TimeSpan.FromDays(30), + ct + ); + + if (player == null) + throw new RequestException( ErrorStatusCode.NotFound, - "PLAYER_NOT_FOUND", - new { UserId = request.UserId }); + "PLAYER_NOT_FOUND"); - var levelDef = _store.GetLevelDefinition(data.Level) + var levelDef = _store.GetLevelDefinition(player.Level) ?? throw new RequestException( ErrorStatusCode.NotFound, "LEVEL_NOT_FOUND", - new { Level = data.Level }); + new { Level = player.Level }); return new GetPlayerLevelResult( - data.Level, - data.Exp, + player.Level, + player.Exp, levelDef.MaxExp ); }