diff --git a/Azaion.Api/Program.cs b/Azaion.Api/Program.cs index de73f8c..79e52d6 100644 --- a/Azaion.Api/Program.cs +++ b/Azaion.Api/Program.cs @@ -167,6 +167,21 @@ app.MapPost("/resources/{dataFolder?}", //.WithOpenApi(op => new(op){ Summary = "Upload resource"}); //For some reason doesn't work when this is specified. .DisableAntiforgery(); +app.MapPut("/users/{email}/enable", async (string email, IUserService userService, CancellationToken ct) + => await userService.SetEnableStatus(email, true, ct)) + .RequireAuthorization(apiAdminPolicy) + .WithOpenApi(op => new OpenApiOperation(op) { Summary = "Disable user" }); + +app.MapPut("/users/{email}/disable", async (string email, IUserService userService, CancellationToken ct) + => await userService.SetEnableStatus(email, false, ct)) + .RequireAuthorization(apiAdminPolicy) + .WithOpenApi(op => new OpenApiOperation(op) { Summary = "Disable user" }); + +app.MapDelete("/users/{email}", async (string email, IUserService userService, CancellationToken ct) + => await userService.RemoveUser(email, ct)) + .RequireAuthorization(apiAdminPolicy) + .WithOpenApi(op => new OpenApiOperation(op) { Summary = "Remove user" }); + app.MapGet("/resources/list/{dataFolder?}", async ([FromRoute]string? dataFolder, string? search, IResourcesService resourcesService, CancellationToken ct) => await resourcesService.ListResources(dataFolder, search, ct)) diff --git a/Azaion.Common/Entities/User.cs b/Azaion.Common/Entities/User.cs index 195a2bf..a5e6f57 100644 --- a/Azaion.Common/Entities/User.cs +++ b/Azaion.Common/Entities/User.cs @@ -11,6 +11,7 @@ public class User public DateTime CreatedAt { get; set; } public DateTime? LastLogin { get; set; } public UserConfig? UserConfig { get; set; } = null!; + public bool IsEnabled { get; set; } public static string GetCacheKey(string email) => string.IsNullOrEmpty(email) ? "" : $"{nameof(User)}.{email}"; diff --git a/Azaion.Services/UserService.cs b/Azaion.Services/UserService.cs index 6bc6b02..2707d05 100644 --- a/Azaion.Services/UserService.cs +++ b/Azaion.Services/UserService.cs @@ -4,7 +4,6 @@ using Azaion.Common.Entities; using Azaion.Common.Extensions; using Azaion.Common.Requests; using LinqToDB; -using Newtonsoft.Json; namespace Azaion.Services; @@ -17,6 +16,8 @@ public interface IUserService Task UpdateQueueOffsets(string email, UserQueueOffsets queueOffsets, CancellationToken ct = default); Task> GetUsers(string? searchEmail, RoleEnum? searchRole, CancellationToken ct = default); Task CheckHardwareHash(User user, string hardware, CancellationToken ct = default); + Task SetEnableStatus(string email, bool isEnabled, CancellationToken ct = default); + Task RemoveUser(string email, CancellationToken ct = default); } public class UserService(IDbFactory dbFactory, ICache cache) : IUserService @@ -128,4 +129,20 @@ public class UserService(IDbFactory dbFactory, ICache cache) : IUserService LastLogin = DateTime.UtcNow }, ct)); } + + public async Task SetEnableStatus(string email, bool isEnabled, CancellationToken ct = default) + { + await dbFactory.RunAdmin(async db => + await db.Users.UpdateAsync(x => x.Email == email, u => new User + { + IsEnabled = isEnabled + }, ct)); + } + + + public async Task RemoveUser(string email, CancellationToken ct = default) + { + await dbFactory.RunAdmin(async db => + await db.Users.DeleteAsync(x => x.Email == email, ct)); + } } diff --git a/env/db/03_add_timestamp_columns.sql b/env/db/03_add_timestamp_columns.sql index ad2071d..3b7a962 100644 --- a/env/db/03_add_timestamp_columns.sql +++ b/env/db/03_add_timestamp_columns.sql @@ -1,3 +1,4 @@ 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; \ No newline at end of file +ADD COLUMN IF NOT EXISTS last_login timestamp null, +ADD COLUMN IF NOT EXISTS is_enabled bool not null default true; \ No newline at end of file