Add LastLogin and CreatedAt to User

This commit is contained in:
Oleksandr Bezdieniezhnykh
2025-09-21 23:57:37 +03:00
parent 1fcaba383e
commit 0af74ec278
7 changed files with 49 additions and 3 deletions
+2
View File
@@ -8,6 +8,8 @@ public class User
public string? Hardware { get; set; }
public RoleEnum Role { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? LastLogin { get; set; }
public UserConfig? UserConfig { get; set; } = null!;
public static string GetCacheKey(string email) =>
+13 -1
View File
@@ -34,7 +34,8 @@ public class UserService(IDbFactory dbFactory, ICache cache) : IUserService
Id = Guid.NewGuid(),
Email = request.Email,
PasswordHash = request.Password.ToHash(),
Role = request.Role
Role = request.Role,
CreatedAt = DateTime.UtcNow
}, token: ct);
});
}
@@ -108,12 +109,23 @@ public class UserService(IDbFactory dbFactory, ICache cache) : IUserService
{
await UpdateHardware(user.Email, hardware, ct);
cache.Invalidate(User.GetCacheKey(user.Email));
await UpdateLastLoginDate(user, ct);
return requestHWHash;
}
var userHWHash = Security.GetHWHash(user.Hardware);
if (userHWHash != requestHWHash)
throw new BusinessException(ExceptionEnum.HardwareIdMismatch);
await UpdateLastLoginDate(user, ct);
return userHWHash;
}
private async Task UpdateLastLoginDate(User user, CancellationToken ct = default)
{
await dbFactory.Run(async db =>
await db.Users.UpdateAsync(x => x.Email == user.Email, u => new User
{
LastLogin = DateTime.UtcNow
}, ct));
}
}
+25
View File
@@ -0,0 +1,25 @@
using Azaion.Common.Configs;
using Azaion.Common.Database;
using Azaion.Services;
using Microsoft.Extensions.Options;
using Xunit;
namespace Azaion.Test;
public class UserServiceTest
{
[Fact]
public async Task CheckHardwareHashTest()
{
var dbFactory = new DbFactory(new OptionsWrapper<ConnectionStrings>(new ConnectionStrings
{
AzaionDb = "Host=188.245.120.247;Port=4312;Database=azaion;Username=azaion_reader;Password=A@1n_zxre@d!only@$Az",
AzaionDbAdmin = "Host=188.245.120.247;Port=4312;Database=azaion;Username=azaion_admin;Password=Az@1on_Oddmin$$@r"
}));
var userService = new UserService(dbFactory, new MemoryCache());
var user = await userService.GetByEmail("spielberg@azaion.com");
var res = await userService.CheckHardwareHash(user,
"CPU: AMD Ryzen 9 3900XT 12-Core Processor. GPU: Microsoft Remote Display Adapter. Memory: 67037080. DriveSerial: PHMB746301G6480DGN _00000001.");
}
}
+2
View File
@@ -20,6 +20,7 @@ tee -a docker.azaion.com << END
server {
listen 443 ssl;
server_name docker.azaion.com;
client_max_body_size 900M;
ssl_certificate /etc/letsencrypt/live/docker.azaion.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/docker.azaion.com/privkey.pem;
@@ -39,6 +40,7 @@ server {
server {
listen 80;
server_name docker.azaion.com;
client_max_body_size 900M;
location / {
auth_basic "Registry";
+3 -1
View File
@@ -8,7 +8,9 @@ create table users
hardware text null,
hardware_hash varchar(120) null,
role varchar(20) not null,
user_config varchar(512) null
user_config varchar(512) null,
created_at timestamp not null default now(),
last_login timestamp null
);
grant select, insert, update, delete on public.users to azaion_admin;
grant select on table public.users to azaion_reader;
+3
View File
@@ -0,0 +1,3 @@
ALTER TABLE public.users
ADD COLUMN IF NOT EXISTS created_at timestamp not null default now(),
ADD COLUMN IF NOT EXISTS last_login timestamp null;