Skip to content

Commit

Permalink
Implementation of redis
Browse files Browse the repository at this point in the history
  • Loading branch information
ReallyWeirdCat committed Nov 6, 2024
1 parent bfccb43 commit 951e9db
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 11 deletions.
17 changes: 9 additions & 8 deletions AuthService/AuthService.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,19 @@
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="Serilog" Version="4.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.3.0" />
<PackageReference Include="Serilog" Version="4.1.0" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="3.0.1" />
<PackageReference Include="Serilog.Exceptions" Version="8.4.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Formatting.OpenSearch" Version="1.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageReference Include="Serilog.Sinks.Debug" Version="2.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.OpenSearch" Version="1.0.0" />
<PackageReference Include="Serilog.Formatting.OpenSearch" Version="1.2.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.OpenSearch" Version="1.2.0" />
<PackageReference Include="StackExchange.Redis" Version="2.8.16" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.2.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.10" />
</ItemGroup>

</Project>
8 changes: 6 additions & 2 deletions AuthService/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,13 @@

builder.Services.AddSingleton<IConfiguration>(builder.Configuration);

builder.Services.AddStackExchangeRedisCache(options => {
options.Configuration = builder.Configuration["RedisCacheOptions:Configuration"];
options.InstanceName = builder.Configuration["RedisCacheOptions:InstanceName"];
});

builder.Services.AddScoped<IAccessDataCacheService, AccessDataCacheService>();
builder.Services.AddScoped<IJwtService, JwtService>();
// TODO: implementation :D
//builder.Services.AddScoped<IAccessDataCacheService, AccessDataCacheService>();
builder.Services.AddScoped<IAuthenticationService, AuthenticationService>();

app.Run();
80 changes: 80 additions & 0 deletions AuthService/Services/AccessDataCache/AccessDataCacheService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using System.Text.Json;
using AuthService.Models.AccessDataCache.Requests;
using AuthService.Models.AccessDataCache.Responses;
using AuthService.Services.Models;
using Microsoft.Extensions.Caching.Distributed;

namespace AuthService.Services.AccessDataCache;

public class AccessDataCacheService(IDistributedCache cache, ILogger<AccessDataCacheService> logger) : IAccessDataCacheService
{
private readonly IDistributedCache _cache = cache;
private readonly ILogger<AccessDataCacheService> _logger = logger;

public async Task<UserAccessData?> Get(string username)
{
_logger.LogDebug("Retrieving user from cache...");
try
{
var userBytes = await _cache.GetAsync(username);

return userBytes == null ? null : JsonSerializer.Deserialize<UserAccessData>(userBytes);
}
catch (JsonException)
{
// Clear cache if deserialization fails
_logger.LogError("Deserialization failed, removing user from cache...");
await _cache.RemoveAsync(username);
throw;
}
catch (Exception)
{
_logger.LogWarning("Failed to retrieve user {user} from cache", username);
throw;
}
}

public async Task<RecacheUserResponse> RecacheUser(RecacheUserRequest user)
{
// TODO: some validation checks

_logger.LogDebug("Received request to recache user {user}...", user.Username);
try
{
await _cache.SetStringAsync(user.Username, JsonSerializer.Serialize(user));
_logger.LogDebug("User {user} was successfully recached", user.Username);
}
catch (Exception)
{
_logger.LogWarning("Failed to recache user {user}", user.Username);
throw;
}
return new RecacheUserResponse { IsSuccess = true };
}

public async Task<UserAccessData?> RequestAndCacheUser(string username)
{
_logger.LogDebug("Retrieving user from cache...");
try
{
var userBytes = await _cache.GetAsync(username);

if (userBytes == null)
{
_logger.LogDebug("User not found in cache, requesting user from userservice...");

// TODO: Implement communication with userservice
throw new NotImplementedException("Communication with userservice not implemented");
}

return userBytes == null ? null : JsonSerializer.Deserialize<UserAccessData>(userBytes);
}
catch (JsonException)
{
// Clear cache if deserialization fails
_logger.LogError("Deserialization failed, removing user from cache...");
await _cache.RemoveAsync(username);
throw;
}
}
}
6 changes: 5 additions & 1 deletion AuthService/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,9 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"RedisCacheOptions": {
"Configuration": "vtb_authservice_redis:6379",
"InstanceName": "AuthServiceRedis"
}
}

0 comments on commit 951e9db

Please sign in to comment.