Skip to content

Commit cc15c73

Browse files
committed
Added User Status Change
1 parent fb0771b commit cc15c73

File tree

13 files changed

+79
-25
lines changed

13 files changed

+79
-25
lines changed

samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ private async Task HandleGetMe()
8686

8787
private async Task ChangeUserInactive()
8888
{
89-
ChangeUserStatusRequest request = new ChangeUserStatusRequest
89+
ChangeUserStatusAdminRequest request = new ChangeUserStatusAdminRequest
9090
{
9191
UserKey = UserKey.FromString("user"),
9292
NewStatus = UserStatus.Disabled
9393
};
94-
var result = await UAuth.Users.ChangeStatusAsync(request);
94+
var result = await UAuth.Users.ChangeStatusAdminAsync(request);
9595
if (result.Ok)
9696
{
9797
Snackbar.Add($"User is disabled.", Severity.Info);

src/CodeBeam.UltimateAuth.Client/Services/DefaultUserClient.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,16 @@ public async Task<UAuthResult<UserCreateResult>> CreateAsync(CreateUserRequest r
3939
return UAuthResultMapper.FromJson<UserCreateResult>(raw);
4040
}
4141

42-
public async Task<UAuthResult<UserStatusChangeResult>> ChangeStatusAsync(ChangeUserStatusRequest request)
42+
public async Task<UAuthResult<UserStatusChangeResult>> ChangeStatusSelfAsync(ChangeUserStatusSelfRequest request)
4343
{
44-
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, "/users/status");
44+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/users/status");
45+
var raw = await _request.SendJsonAsync(url, request);
46+
return UAuthResultMapper.FromJson<UserStatusChangeResult>(raw);
47+
}
48+
49+
public async Task<UAuthResult<UserStatusChangeResult>> ChangeStatusAdminAsync(ChangeUserStatusAdminRequest request)
50+
{
51+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/admin/users/{request.UserKey.Value}/status");
4552
var raw = await _request.SendJsonAsync(url, request);
4653
return UAuthResultMapper.FromJson<UserStatusChangeResult>(raw);
4754
}

src/CodeBeam.UltimateAuth.Client/Services/IUserClient.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ namespace CodeBeam.UltimateAuth.Client.Services
77
public interface IUserClient
88
{
99
Task<UAuthResult<UserCreateResult>> CreateAsync(CreateUserRequest request);
10-
Task<UAuthResult<UserStatusChangeResult>> ChangeStatusAsync(ChangeUserStatusRequest request);
10+
Task<UAuthResult<UserStatusChangeResult>> ChangeStatusSelfAsync(ChangeUserStatusSelfRequest request);
11+
Task<UAuthResult<UserStatusChangeResult>> ChangeStatusAdminAsync(ChangeUserStatusAdminRequest request);
1112
Task<UAuthResult<UserDeleteResult>> DeleteAsync(DeleteUserRequest request);
1213

1314
Task<UAuthResult<UserViewDto>> GetMeAsync();

src/CodeBeam.UltimateAuth.Server/Defaults/UAuthActions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public static class Users
66
{
77
public const string Create = "users.create";
88
public const string Delete = "users.delete";
9-
public const string ChangeStatus = "users.status.change";
9+
public const string ChangeStatusSelf = "users.status.change.self";
1010
public const string ChangeStatusAdmin = "users.status.change.admin";
1111
}
1212

src/CodeBeam.UltimateAuth.Server/Endpoints/Abstractions/IUserEndpointHandler.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ namespace CodeBeam.UltimateAuth.Server.Endpoints;
66
public interface IUserEndpointHandler
77
{
88
Task<IResult> CreateAsync(HttpContext ctx);
9-
Task<IResult> ChangeStatusAsync(HttpContext ctx);
9+
Task<IResult> ChangeStatusSelfAsync(HttpContext ctx);
10+
Task<IResult> ChangeStatusAdminAsync(UserKey userKey, HttpContext ctx);
1011
Task<IResult> DeleteAsync(HttpContext ctx);
1112

1213
Task<IResult> GetMeAsync(HttpContext ctx);

src/CodeBeam.UltimateAuth.Server/Endpoints/UAuthEndpointRegistrar.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.AspNetCore.Http;
66
using Microsoft.AspNetCore.Mvc;
77
using Microsoft.AspNetCore.Routing;
8+
using static CodeBeam.UltimateAuth.Server.Defaults.UAuthActions;
89

910
namespace CodeBeam.UltimateAuth.Server.Endpoints
1011
{
@@ -114,7 +115,7 @@ public void MapEndpoints(RouteGroupBuilder rootGroup, UAuthServerOptions options
114115
=> await h.CreateAsync(ctx)).WithMetadata(new AuthFlowMetadata(AuthFlowType.UserManagement));
115116

116117
users.MapPost("/status", async ([FromServices] IUserEndpointHandler h, HttpContext ctx)
117-
=> await h.ChangeStatusAsync(ctx)).WithMetadata(new AuthFlowMetadata(AuthFlowType.UserManagement));
118+
=> await h.ChangeStatusSelfAsync(ctx)).WithMetadata(new AuthFlowMetadata(AuthFlowType.UserManagement));
118119

119120
// Post is intended for Auth
120121
users.MapPost("/delete", async ([FromServices] IUserEndpointHandler h, HttpContext ctx)
@@ -136,6 +137,9 @@ public void MapEndpoints(RouteGroupBuilder rootGroup, UAuthServerOptions options
136137
{
137138
var admin = group.MapGroup("/admin/users");
138139

140+
admin.MapPost("/{userKey}/status", async ([FromServices] IUserEndpointHandler h, UserKey userKey, HttpContext ctx)
141+
=> await h.ChangeStatusAdminAsync(userKey, ctx)).WithMetadata(new AuthFlowMetadata(AuthFlowType.UserManagement));
142+
139143
admin.MapPost("/{userKey}/profile/get", async ([FromServices] IUserEndpointHandler h, UserKey userKey, HttpContext ctx)
140144
=> await h.GetUserAsync(userKey, ctx)).WithMetadata(new AuthFlowMetadata(AuthFlowType.UserManagement));
141145

src/CodeBeam.UltimateAuth.Server/Options/UAuthServerOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public void ReplaceSessionCookieManager<T>() where T : class, IUAuthCookieManage
110110

111111
public bool EnableUserLifecycleEndpoints { get; set; } = true;
112112
public bool EnableUserProfileEndpoints { get; set; } = true;
113-
public bool EnableAdminChangeUserProfileEndpoints { get; set; } = false;
113+
public bool EnableAdminChangeUserProfileEndpoints { get; set; } = true;
114114
public bool EnableCredentialsEndpoints { get; set; } = true;
115115
public bool EnableAuthorizationEndpoints { get; set; } = true;
116116

src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/UserStatus.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,20 @@
22
{
33
public enum UserStatus
44
{
5-
// Normal state
5+
66
Active = 0,
77

8-
// User initiated
98
SelfSuspended = 10,
109

11-
// Administrative actions
1210
Disabled = 20,
1311
Suspended = 30,
1412

15-
// Security / risk based
1613
Locked = 40,
1714
RiskHold = 50,
1815

19-
// Lifecycle
2016
PendingActivation = 60,
2117
PendingVerification = 70,
2218

23-
// Terminal (soft-delete)
2419
Deactivated = 80,
25-
26-
// Soft // TODO: User domain already have IsDeleted, this may remove
27-
Deleted = 90
2820
}
2921
}

src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusRequest.cs renamed to src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace CodeBeam.UltimateAuth.Users.Contracts
44
{
5-
public sealed class ChangeUserStatusRequest
5+
public sealed class ChangeUserStatusAdminRequest
66
{
77
public required UserKey UserKey { get; init; }
88
public required UserStatus NewStatus { get; init; }
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace CodeBeam.UltimateAuth.Users.Contracts
2+
{
3+
public class ChangeUserStatusSelfRequest
4+
{
5+
public required UserStatus NewStatus { get; init; }
6+
}
7+
}

0 commit comments

Comments
 (0)