From 8ea3e8803c31786ad8aeba2a9fce329d74e0bebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Can=20Karag=C3=B6z?= Date: Sun, 29 Mar 2026 00:27:04 +0300 Subject: [PATCH 1/4] Reviewed Credential Client API --- .../Dialogs/CredentialDialog.razor.cs | 2 +- .../Dialogs/IdentifierDialog.razor.cs | 8 ++--- .../Dialogs/PermissionDialog.razor.cs | 3 +- .../Components/Dialogs/ResetDialog.razor.cs | 2 +- .../Components/Dialogs/RoleDialog.razor.cs | 7 +++-- .../Dialogs/UserRoleDialog.razor.cs | 16 ++++++++-- .../Components/Pages/ResetCredential.razor.cs | 2 +- .../Dialogs/CredentialDialog.razor.cs | 2 +- .../Dialogs/IdentifierDialog.razor.cs | 8 ++--- .../Dialogs/PermissionDialog.razor.cs | 3 +- .../Components/Dialogs/ResetDialog.razor.cs | 2 +- .../Components/Dialogs/RoleDialog.razor.cs | 7 +++-- .../Dialogs/UserRoleDialog.razor.cs | 16 ++++++++-- .../Components/Pages/ResetCredential.razor.cs | 2 +- .../Dialogs/CredentialDialog.razor.cs | 2 +- .../Dialogs/IdentifierDialog.razor.cs | 8 ++--- .../Dialogs/PermissionDialog.razor.cs | 3 +- .../Components/Dialogs/ResetDialog.razor.cs | 2 +- .../Components/Dialogs/RoleDialog.razor.cs | 7 +++-- .../Dialogs/UserRoleDialog.razor.cs | 16 ++++++++-- .../Pages/ResetCredential.razor.cs | 2 +- .../Contracts/Common/DeleteMode.cs | 4 +-- .../Contracts/Common/PageRequest.cs | 2 +- .../Dtos/RoleQuery.cs | 2 +- .../Requests/AssignRoleRequest.cs | 9 ++++-- .../Requests/AuthorizationCheckRequest.cs | 2 +- .../Requests/CreateRoleRequest.cs | 6 ++-- .../Requests/DeleteRoleRequest.cs | 5 ++-- .../Requests/RemoveRoleRequest.cs | 9 ++++++ .../Requests/RenameRoleRequest.cs | 5 ++-- .../Requests/SetPermissionsRequest.cs | 5 ++-- .../Endpoints/AuthorizationEndpointHandler.cs | 4 +-- .../Abstractions/IAuthorizationClient.cs | 10 +++---- .../Abstractions/ICredentialClient.cs | 16 +++++----- .../Services/UAuthAuthorizationClient.cs | 26 +++++++--------- .../Services/UAuthCredentialClient.cs | 28 ++++++++--------- .../Request/AddCredentialRequest.cs | 6 ++-- .../Request/BeginCredentialResetRequest.cs | 12 -------- .../Request/BeginResetCredentialRequest.cs | 12 ++++++++ ...t.cs => CompleteResetCredentialRequest.cs} | 4 +-- .../Request/CredentialActionRequest.cs | 7 ----- .../Request/DeleteCredentialRequest.cs | 4 +-- .../Request/ResetPasswordRequest.cs | 2 +- .../Request/RevokeAllCredentialsRequest.cs | 8 ----- .../Request/SetInitialCredentialRequest.cs | 17 ----------- .../Request/ValidateCredentialsRequest.cs | 11 ------- .../Endpoints/CredentialEndpointHandler.cs | 8 ++--- .../Services/CredentialManagementService.cs | 4 +-- .../Services/ICredentialManagementService.cs | 4 +-- .../Dtos/UserQuery.cs | 2 +- .../Requests/AddUserIdentifierRequest.cs | 2 +- .../Requests/ChangeUserStatusAdminRequest.cs | 2 +- .../Requests/ChangeUserStatusSelfRequest.cs | 2 +- .../Requests/CompleteMfaSetupRequest.cs | 2 +- .../Requests/DeleteUserIdentifierRequest.cs | 4 +-- .../Requests/DeleteUserRequest.cs | 4 +-- .../Requests/IdentifierExistsRequest.cs | 6 ++-- .../Requests/LogoutDeviceRequest.cs | 2 +- .../LogoutOtherDevicesAdminRequest.cs | 2 +- .../Requests/LogoutOtherDevicesSelfRequest.cs | 2 +- .../Requests/RegisterUserRequest.cs | 2 +- .../SetPrimaryUserIdentifierRequest.cs | 2 +- .../UnsetPrimaryUserIdentifierRequest.cs | 2 +- .../Requests/UserIdentifierQuery.cs | 6 ++-- .../Requests/VerifyUserIdentifierRequest.cs | 2 +- .../Contracts/UserLifecycleQuery.cs | 2 +- .../Contracts/UserProfileQuery.cs | 2 +- .../Services/UserApplicationService.cs | 13 ++++---- .../Credentials/ResetPasswordTests.cs | 30 +++++++++---------- .../UserIdentifierApplicationServiceTests.cs | 2 +- 70 files changed, 228 insertions(+), 217 deletions(-) create mode 100644 src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RemoveRoleRequest.cs delete mode 100644 src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginCredentialResetRequest.cs create mode 100644 src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginResetCredentialRequest.cs rename src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/{CompleteCredentialResetRequest.cs => CompleteResetCredentialRequest.cs} (64%) delete mode 100644 src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CredentialActionRequest.cs delete mode 100644 src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/RevokeAllCredentialsRequest.cs delete mode 100644 src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/SetInitialCredentialRequest.cs delete mode 100644 src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ValidateCredentialsRequest.cs diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CredentialDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CredentialDialog.razor.cs index f9829141..5f419abf 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CredentialDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CredentialDialog.razor.cs @@ -69,7 +69,7 @@ private async Task ChangePasswordAsync() } else { - result = await UAuthClient.Credentials.ChangeCredentialAsync(UserKey.Value, request); + result = await UAuthClient.Credentials.ChangeUserAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs index c07885b3..cd2aae10 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs @@ -203,7 +203,7 @@ This will only mark the identifier as verified in UltimateAuth. return; } - VerifyUserIdentifierRequest request = new() { IdentifierId = id }; + VerifyUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -229,7 +229,7 @@ This will only mark the identifier as verified in UltimateAuth. private async Task SetPrimaryAsync(Guid id) { - SetPrimaryUserIdentifierRequest request = new() { IdentifierId = id }; + SetPrimaryUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -255,7 +255,7 @@ private async Task SetPrimaryAsync(Guid id) private async Task UnsetPrimaryAsync(Guid id) { - UnsetPrimaryUserIdentifierRequest request = new() { IdentifierId = id }; + UnsetPrimaryUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -281,7 +281,7 @@ private async Task UnsetPrimaryAsync(Guid id) private async Task DeleteIdentifier(Guid id) { - DeleteUserIdentifierRequest request = new() { IdentifierId = id }; + DeleteUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs index 99c3b75b..5d2e0b06 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs @@ -65,10 +65,11 @@ private async Task Save() var req = new SetPermissionsRequest { + Id = Role.Id, Permissions = permissions }; - var result = await UAuthClient.Authorization.SetPermissionsAsync(Role.Id, req); + var result = await UAuthClient.Authorization.SetPermissionsAsync(req); if (!result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ResetDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ResetDialog.razor.cs index 55f5195c..a819f039 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ResetDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ResetDialog.razor.cs @@ -20,7 +20,7 @@ public partial class ResetDialog private async Task RequestResetAsync() { - var request = new BeginCredentialResetRequest + var request = new BeginResetCredentialRequest { CredentialType = CredentialType.Password, ResetCodeType = ResetCodeType.Code, diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/RoleDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/RoleDialog.razor.cs index 349ef670..931687d8 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/RoleDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/RoleDialog.razor.cs @@ -53,10 +53,11 @@ private async Task CommittedItemChanges(RoleInfo role) { var req = new RenameRoleRequest { + Id = role.Id, Name = role.Name }; - var result = await UAuthClient.Authorization.RenameRoleAsync(role.Id, req); + var result = await UAuthClient.Authorization.RenameRoleAsync(req); if (result.IsSuccess) { @@ -109,8 +110,8 @@ private async Task DeleteRole(RoleId roleId) if (confirm != true) return; - var req = new DeleteRoleRequest(); - var result = await UAuthClient.Authorization.DeleteRoleAsync(roleId, req); + var req = new DeleteRoleRequest() { Id = roleId }; + var result = await UAuthClient.Authorization.DeleteRoleAsync(req); if (result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserRoleDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserRoleDialog.razor.cs index 94ec688a..b1693a25 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserRoleDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserRoleDialog.razor.cs @@ -49,7 +49,13 @@ private async Task AddRole() if (string.IsNullOrWhiteSpace(_selectedRole)) return; - var result = await UAuthClient.Authorization.AssignRoleToUserAsync(UserKey, _selectedRole); + var request = new AssignRoleRequest + { + UserKey = UserKey, + RoleName = _selectedRole + }; + + var result = await UAuthClient.Authorization.AssignRoleToUserAsync(request); if (result.IsSuccess) { @@ -95,7 +101,13 @@ private async Task RemoveRole(string role) } } - var result = await UAuthClient.Authorization.RemoveRoleFromUserAsync(UserKey, role); + var request = new RemoveRoleRequest + { + UserKey = UserKey, + RoleName = role + }; + + var result = await UAuthClient.Authorization.RemoveRoleFromUserAsync(request); if (result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/ResetCredential.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/ResetCredential.razor.cs index 3bdd9f68..21fad18a 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/ResetCredential.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/ResetCredential.razor.cs @@ -25,7 +25,7 @@ private async Task ResetPasswordAsync() return; } - var request = new CompleteCredentialResetRequest + var request = new CompleteResetCredentialRequest { ResetToken = _code, NewSecret = _newPassword ?? string.Empty, diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CredentialDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CredentialDialog.razor.cs index f81d2b1b..ee48c215 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CredentialDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CredentialDialog.razor.cs @@ -69,7 +69,7 @@ private async Task ChangePasswordAsync() } else { - result = await UAuthClient.Credentials.ChangeCredentialAsync(UserKey.Value, request); + result = await UAuthClient.Credentials.ChangeUserAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs index e14d8671..e33d5a21 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs @@ -203,7 +203,7 @@ This will only mark the identifier as verified in UltimateAuth. return; } - VerifyUserIdentifierRequest request = new() { IdentifierId = id }; + VerifyUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -229,7 +229,7 @@ This will only mark the identifier as verified in UltimateAuth. private async Task SetPrimaryAsync(Guid id) { - SetPrimaryUserIdentifierRequest request = new() { IdentifierId = id }; + SetPrimaryUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -255,7 +255,7 @@ private async Task SetPrimaryAsync(Guid id) private async Task UnsetPrimaryAsync(Guid id) { - UnsetPrimaryUserIdentifierRequest request = new() { IdentifierId = id }; + UnsetPrimaryUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -281,7 +281,7 @@ private async Task UnsetPrimaryAsync(Guid id) private async Task DeleteIdentifier(Guid id) { - DeleteUserIdentifierRequest request = new() { IdentifierId = id }; + DeleteUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs index 16cf08fd..7aafd31a 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs @@ -65,10 +65,11 @@ private async Task Save() var req = new SetPermissionsRequest { + Id = Role.Id, Permissions = permissions }; - var result = await UAuthClient.Authorization.SetPermissionsAsync(Role.Id, req); + var result = await UAuthClient.Authorization.SetPermissionsAsync(req); if (!result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ResetDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ResetDialog.razor.cs index c66f8adc..9ca66fc3 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ResetDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ResetDialog.razor.cs @@ -20,7 +20,7 @@ public partial class ResetDialog private async Task RequestResetAsync() { - var request = new BeginCredentialResetRequest + var request = new BeginResetCredentialRequest { CredentialType = CredentialType.Password, ResetCodeType = ResetCodeType.Code, diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/RoleDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/RoleDialog.razor.cs index 75a673ad..453acb8c 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/RoleDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/RoleDialog.razor.cs @@ -53,10 +53,11 @@ private async Task CommittedItemChanges(RoleInfo role) { var req = new RenameRoleRequest { + Id = role.Id, Name = role.Name }; - var result = await UAuthClient.Authorization.RenameRoleAsync(role.Id, req); + var result = await UAuthClient.Authorization.RenameRoleAsync(req); if (result.IsSuccess) { @@ -109,8 +110,8 @@ private async Task DeleteRole(RoleId roleId) if (confirm != true) return; - var req = new DeleteRoleRequest(); - var result = await UAuthClient.Authorization.DeleteRoleAsync(roleId, req); + var req = new DeleteRoleRequest() { Id = roleId }; + var result = await UAuthClient.Authorization.DeleteRoleAsync(req); if (result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserRoleDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserRoleDialog.razor.cs index ac927232..21683f5b 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserRoleDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserRoleDialog.razor.cs @@ -49,7 +49,13 @@ private async Task AddRole() if (string.IsNullOrWhiteSpace(_selectedRole)) return; - var result = await UAuthClient.Authorization.AssignRoleToUserAsync(UserKey, _selectedRole); + var request = new AssignRoleRequest + { + UserKey = UserKey, + RoleName = _selectedRole + }; + + var result = await UAuthClient.Authorization.AssignRoleToUserAsync(request); if (result.IsSuccess) { @@ -95,7 +101,13 @@ private async Task RemoveRole(string role) } } - var result = await UAuthClient.Authorization.RemoveRoleFromUserAsync(UserKey, role); + var request = new RemoveRoleRequest + { + UserKey = UserKey, + RoleName = role + }; + + var result = await UAuthClient.Authorization.RemoveRoleFromUserAsync(request); if (result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/ResetCredential.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/ResetCredential.razor.cs index fd66181e..db40becc 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/ResetCredential.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/ResetCredential.razor.cs @@ -25,7 +25,7 @@ private async Task ResetPasswordAsync() return; } - var request = new CompleteCredentialResetRequest + var request = new CompleteResetCredentialRequest { ResetToken = _code, NewSecret = _newPassword ?? string.Empty, diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CredentialDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CredentialDialog.razor.cs index 79568ae4..926eba3d 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CredentialDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CredentialDialog.razor.cs @@ -69,7 +69,7 @@ private async Task ChangePasswordAsync() } else { - result = await UAuthClient.Credentials.ChangeCredentialAsync(UserKey.Value, request); + result = await UAuthClient.Credentials.ChangeUserAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs index 3ba6b5a4..deac5511 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs @@ -205,7 +205,7 @@ This will only mark the identifier as verified in UltimateAuth. return; } - VerifyUserIdentifierRequest request = new() { IdentifierId = id }; + VerifyUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -231,7 +231,7 @@ This will only mark the identifier as verified in UltimateAuth. private async Task SetPrimaryAsync(Guid id) { - SetPrimaryUserIdentifierRequest request = new() { IdentifierId = id }; + SetPrimaryUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -257,7 +257,7 @@ private async Task SetPrimaryAsync(Guid id) private async Task UnsetPrimaryAsync(Guid id) { - UnsetPrimaryUserIdentifierRequest request = new() { IdentifierId = id }; + UnsetPrimaryUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) @@ -283,7 +283,7 @@ private async Task UnsetPrimaryAsync(Guid id) private async Task DeleteIdentifier(Guid id) { - DeleteUserIdentifierRequest request = new() { IdentifierId = id }; + DeleteUserIdentifierRequest request = new() { Id = id }; UAuthResult result; if (UserKey is null) diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs index 5fad228d..a4d3f9d3 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs @@ -65,10 +65,11 @@ private async Task Save() var req = new SetPermissionsRequest { + Id = Role.Id, Permissions = permissions }; - var result = await UAuthClient.Authorization.SetPermissionsAsync(Role.Id, req); + var result = await UAuthClient.Authorization.SetPermissionsAsync(req); if (!result.IsSuccess) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ResetDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ResetDialog.razor.cs index 4f5fb818..977d1e38 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ResetDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ResetDialog.razor.cs @@ -20,7 +20,7 @@ public partial class ResetDialog private async Task RequestResetAsync() { - var request = new BeginCredentialResetRequest + var request = new BeginResetCredentialRequest { CredentialType = CredentialType.Password, ResetCodeType = ResetCodeType.Code, diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/RoleDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/RoleDialog.razor.cs index 712e351a..22c6ea7d 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/RoleDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/RoleDialog.razor.cs @@ -65,10 +65,11 @@ private async Task CommittedItemChanges(RoleInfo role) { var req = new RenameRoleRequest { + Id = role.Id, Name = role.Name }; - var result = await UAuthClient.Authorization.RenameRoleAsync(role.Id, req); + var result = await UAuthClient.Authorization.RenameRoleAsync(req); if (result.IsSuccess) { @@ -121,8 +122,8 @@ private async Task DeleteRole(RoleId roleId) if (confirm != true) return; - var req = new DeleteRoleRequest(); - var result = await UAuthClient.Authorization.DeleteRoleAsync(roleId, req); + var req = new DeleteRoleRequest() { Id = roleId }; + var result = await UAuthClient.Authorization.DeleteRoleAsync(req); if (result.IsSuccess) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserRoleDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserRoleDialog.razor.cs index 349361a4..e89d60ff 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserRoleDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserRoleDialog.razor.cs @@ -49,7 +49,13 @@ private async Task AddRole() if (string.IsNullOrWhiteSpace(_selectedRole)) return; - var result = await UAuthClient.Authorization.AssignRoleToUserAsync(UserKey, _selectedRole); + var request = new AssignRoleRequest + { + UserKey = UserKey, + RoleName = _selectedRole + }; + + var result = await UAuthClient.Authorization.AssignRoleToUserAsync(request); if (result.IsSuccess) { @@ -95,7 +101,13 @@ private async Task RemoveRole(string role) } } - var result = await UAuthClient.Authorization.RemoveRoleFromUserAsync(UserKey, role); + var request = new RemoveRoleRequest + { + UserKey = UserKey, + RoleName = role + }; + + var result = await UAuthClient.Authorization.RemoveRoleFromUserAsync(request); if (result.IsSuccess) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/ResetCredential.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/ResetCredential.razor.cs index ee8b4919..726c4864 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/ResetCredential.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/ResetCredential.razor.cs @@ -25,7 +25,7 @@ private async Task ResetPasswordAsync() return; } - var request = new CompleteCredentialResetRequest + var request = new CompleteResetCredentialRequest { ResetToken = _code, NewSecret = _newPassword ?? string.Empty, diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Common/DeleteMode.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Common/DeleteMode.cs index 5063bda6..8e95af9e 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Common/DeleteMode.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Common/DeleteMode.cs @@ -2,6 +2,6 @@ public enum DeleteMode { - Soft, - Hard + Soft = 0, + Hard = 10 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Common/PageRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Common/PageRequest.cs index b236c0e5..1dc6aed7 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Common/PageRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Common/PageRequest.cs @@ -1,6 +1,6 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public class PageRequest +public record PageRequest { public int PageNumber { get; init; } = 1; public int PageSize { get; init; } = 250; diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Dtos/RoleQuery.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Dtos/RoleQuery.cs index f9515966..e0262ebb 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Dtos/RoleQuery.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Dtos/RoleQuery.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed class RoleQuery : PageRequest +public sealed record RoleQuery : PageRequest { public string? Search { get; set; } public bool IncludeDeleted { get; set; } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AssignRoleRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AssignRoleRequest.cs index 6afebc1d..dd258fbb 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AssignRoleRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AssignRoleRequest.cs @@ -1,6 +1,9 @@ -namespace CodeBeam.UltimateAuth.Authorization.Contracts; +using CodeBeam.UltimateAuth.Core.Domain; -public sealed class AssignRoleRequest +namespace CodeBeam.UltimateAuth.Authorization.Contracts; + +public sealed record AssignRoleRequest { - public required string Role { get; init; } + public required UserKey UserKey { get; init; } + public required string RoleName { get; init; } } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AuthorizationCheckRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AuthorizationCheckRequest.cs index 4a1958d1..1046ce61 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AuthorizationCheckRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/AuthorizationCheckRequest.cs @@ -1,6 +1,6 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed class AuthorizationCheckRequest +public sealed record AuthorizationCheckRequest { public required string Action { get; init; } public string? Resource { get; init; } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/CreateRoleRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/CreateRoleRequest.cs index 539f7f86..e1edb5d8 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/CreateRoleRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/CreateRoleRequest.cs @@ -1,7 +1,7 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed class CreateRoleRequest +public sealed record CreateRoleRequest { - public string Name { get; set; } = default!; - public IEnumerable? Permissions { get; set; } + public required string Name { get; init; } + public IEnumerable? Permissions { get; init; } } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/DeleteRoleRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/DeleteRoleRequest.cs index cdc013f3..810be03f 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/DeleteRoleRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/DeleteRoleRequest.cs @@ -2,7 +2,8 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed class DeleteRoleRequest +public sealed record DeleteRoleRequest { - public DeleteMode Mode { get; set; } + public required RoleId Id { get; init; } + public DeleteMode Mode { get; init; } } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RemoveRoleRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RemoveRoleRequest.cs new file mode 100644 index 00000000..37bb4a22 --- /dev/null +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RemoveRoleRequest.cs @@ -0,0 +1,9 @@ +using CodeBeam.UltimateAuth.Core.Domain; + +namespace CodeBeam.UltimateAuth.Authorization.Contracts; + +public sealed record RemoveRoleRequest +{ + public required UserKey UserKey { get; init; } + public required string RoleName { get; init; } +} diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RenameRoleRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RenameRoleRequest.cs index 4d33d28e..b30df8db 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RenameRoleRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RenameRoleRequest.cs @@ -1,6 +1,7 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed class RenameRoleRequest +public sealed record RenameRoleRequest { - public string Name { get; set; } = default!; + public required RoleId Id { get; init; } + public required string Name { get; init; } } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs index be5237b6..cabccb76 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs @@ -1,6 +1,7 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed class SetPermissionsRequest +public sealed record SetPermissionsRequest { - public IEnumerable Permissions { get; set; } = []; + public required RoleId Id { get; init; } + public IEnumerable Permissions { get; init; } = []; } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs index 172bad57..f3ecf1c4 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs @@ -126,7 +126,7 @@ public async Task AssignRoleAsync(UserKey userKey, HttpContext ctx) resourceId: userKey.Value ); - await _userRoles.AssignAsync(accessContext, userKey, req.Role, ctx.RequestAborted); + await _userRoles.AssignAsync(accessContext, userKey, req.RoleName, ctx.RequestAborted); return Results.Ok(); } @@ -145,7 +145,7 @@ public async Task RemoveRoleAsync(UserKey userKey, HttpContext ctx) resourceId: userKey.Value ); - await _userRoles.RemoveAsync(accessContext, userKey, req.Role, ctx.RequestAborted); + await _userRoles.RemoveAsync(accessContext, userKey, req.RoleName, ctx.RequestAborted); return Results.Ok(); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs index ca9ec42b..7c3f8b10 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs @@ -9,12 +9,12 @@ public interface IAuthorizationClient Task> CheckAsync(AuthorizationCheckRequest request); Task> GetMyRolesAsync(PageRequest? request = null); Task> GetUserRolesAsync(UserKey userKey, PageRequest? request = null); - Task AssignRoleToUserAsync(UserKey userKey, string role); - Task RemoveRoleFromUserAsync(UserKey userKey, string role); + Task AssignRoleToUserAsync(AssignRoleRequest request); + Task RemoveRoleFromUserAsync(RemoveRoleRequest request); Task> CreateRoleAsync(CreateRoleRequest request); Task>> QueryRolesAsync(RoleQuery request); - Task RenameRoleAsync(RoleId roleId, RenameRoleRequest request); - Task SetPermissionsAsync(RoleId roleId, SetPermissionsRequest request); - Task> DeleteRoleAsync(RoleId roleId, DeleteRoleRequest request); + Task RenameRoleAsync(RenameRoleRequest request); + Task SetPermissionsAsync(SetPermissionsRequest request); + Task> DeleteRoleAsync(DeleteRoleRequest request); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/ICredentialClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/ICredentialClient.cs index 1bd06422..b9241513 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/ICredentialClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/ICredentialClient.cs @@ -9,13 +9,13 @@ public interface ICredentialClient Task> AddMyAsync(AddCredentialRequest request); Task> ChangeMyAsync(ChangeCredentialRequest request); Task RevokeMyAsync(RevokeCredentialRequest request); - Task> BeginResetMyAsync(BeginCredentialResetRequest request); - Task> CompleteResetMyAsync(CompleteCredentialResetRequest request); + Task> BeginResetMyAsync(BeginResetCredentialRequest request); + Task> CompleteResetMyAsync(CompleteResetCredentialRequest request); - Task> AddCredentialAsync(UserKey userKey, AddCredentialRequest request); - Task> ChangeCredentialAsync(UserKey userKey, ChangeCredentialRequest request); - Task RevokeCredentialAsync(UserKey userKey, RevokeCredentialRequest request); - Task> BeginResetCredentialAsync(UserKey userKey, BeginCredentialResetRequest request); - Task> CompleteResetCredentialAsync(UserKey userKey, CompleteCredentialResetRequest request); - Task DeleteCredentialAsync(UserKey userKey); + Task> AddUserAsync(UserKey userKey, AddCredentialRequest request); + Task> ChangeUserAsync(UserKey userKey, ChangeCredentialRequest request); + Task RevokeUserAsync(UserKey userKey, RevokeCredentialRequest request); + Task> BeginResetUserAsync(UserKey userKey, BeginResetCredentialRequest request); + Task> CompleteResetUserAsync(UserKey userKey, CompleteResetCredentialRequest request); + Task DeleteUserAsync(UserKey userKey, DeleteCredentialRequest request); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs index 425a3f27..7e5b5cb5 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs @@ -43,12 +43,9 @@ public async Task> GetUserRolesAsync(UserKey user return UAuthResultMapper.FromJson(raw); } - public async Task AssignRoleToUserAsync(UserKey userKey, string role) + public async Task AssignRoleToUserAsync(AssignRoleRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/authorization/users/{userKey}/roles/assign"), new AssignRoleRequest - { - Role = role - }); + var raw = await _request.SendJsonAsync(Url($"/admin/authorization/users/{request.UserKey.Value}/roles/assign"), request.RoleName); var result = UAuthResultMapper.From(raw); @@ -60,12 +57,9 @@ public async Task AssignRoleToUserAsync(UserKey userKey, string rol return result; } - public async Task RemoveRoleFromUserAsync(UserKey userKey, string role) + public async Task RemoveRoleFromUserAsync(RemoveRoleRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/authorization/users/{userKey}/roles/remove"), new AssignRoleRequest - { - Role = role - }); + var raw = await _request.SendJsonAsync(Url($"/admin/authorization/users/{request.UserKey.Value}/roles/remove"), request.RoleName); var result = UAuthResultMapper.From(raw); @@ -89,9 +83,9 @@ public async Task>> QueryRolesAsync(RoleQuery return UAuthResultMapper.FromJson>(raw); } - public async Task RenameRoleAsync(RoleId roleId, RenameRoleRequest request) + public async Task RenameRoleAsync(RenameRoleRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{roleId}/rename"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{request.Id.Value}/rename"), request); var result = UAuthResultMapper.From(raw); if (result.IsSuccess) @@ -102,9 +96,9 @@ public async Task RenameRoleAsync(RoleId roleId, RenameRoleRequest return result; } - public async Task SetPermissionsAsync(RoleId roleId, SetPermissionsRequest request) + public async Task SetPermissionsAsync(SetPermissionsRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{roleId}/permissions"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{request.Id.Value}/permissions"), request); var result = UAuthResultMapper.From(raw); if (result.IsSuccess) @@ -115,9 +109,9 @@ public async Task SetPermissionsAsync(RoleId roleId, SetPermissions return result; } - public async Task> DeleteRoleAsync(RoleId roleId, DeleteRoleRequest request) + public async Task> DeleteRoleAsync(DeleteRoleRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{roleId}/delete"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{request.Id.Value}/delete"), request); var result = UAuthResultMapper.FromJson(raw); if (result.IsSuccess) diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthCredentialClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthCredentialClient.cs index ca73037a..1d02db68 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthCredentialClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthCredentialClient.cs @@ -49,13 +49,13 @@ public async Task RevokeMyAsync(RevokeCredentialRequest request) return UAuthResultMapper.From(raw); } - public async Task> BeginResetMyAsync(BeginCredentialResetRequest request) + public async Task> BeginResetMyAsync(BeginResetCredentialRequest request) { var raw = await _request.SendJsonAsync(Url($"/me/credentials/reset/begin"), request); return UAuthResultMapper.FromJson(raw); } - public async Task> CompleteResetMyAsync(CompleteCredentialResetRequest request) + public async Task> CompleteResetMyAsync(CompleteResetCredentialRequest request) { var raw = await _request.SendJsonAsync(Url($"/me/credentials/reset/complete"), request); if (raw.Ok) @@ -66,39 +66,39 @@ public async Task> CompleteResetMyAsync(Comp } - public async Task> AddCredentialAsync(UserKey userKey, AddCredentialRequest request) + public async Task> AddUserAsync(UserKey userKey, AddCredentialRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/add"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/credentials/add"), request); return UAuthResultMapper.FromJson(raw); } - public async Task> ChangeCredentialAsync(UserKey userKey, ChangeCredentialRequest request) + public async Task> ChangeUserAsync(UserKey userKey, ChangeCredentialRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/change"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/credentials/change"), request); return UAuthResultMapper.FromJson(raw); } - public async Task RevokeCredentialAsync(UserKey userKey, RevokeCredentialRequest request) + public async Task RevokeUserAsync(UserKey userKey, RevokeCredentialRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/revoke"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/credentials/revoke"), request); return UAuthResultMapper.From(raw); } - public async Task> BeginResetCredentialAsync(UserKey userKey, BeginCredentialResetRequest request) + public async Task> BeginResetUserAsync(UserKey userKey, BeginResetCredentialRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/reset/begin"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/credentials/reset/begin"), request); return UAuthResultMapper.FromJson(raw); } - public async Task> CompleteResetCredentialAsync(UserKey userKey, CompleteCredentialResetRequest request) + public async Task> CompleteResetUserAsync(UserKey userKey, CompleteResetCredentialRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/reset/complete"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/credentials/reset/complete"), request); return UAuthResultMapper.FromJson(raw); } - public async Task DeleteCredentialAsync(UserKey userKey) + public async Task DeleteUserAsync(UserKey userKey, DeleteCredentialRequest request) { - var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/credentials/delete")); + var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/credentials/delete")); return UAuthResultMapper.From(raw); } } diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/AddCredentialRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/AddCredentialRequest.cs index 2f6b46dd..fcb84bed 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/AddCredentialRequest.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/AddCredentialRequest.cs @@ -4,7 +4,7 @@ namespace CodeBeam.UltimateAuth.Credentials.Contracts; public sealed record AddCredentialRequest() { - public CredentialType Type { get; set; } - public required string Secret { get; set; } - public string? Source { get; set; } + public CredentialType Type { get; init; } + public required string Secret { get; init; } + public string? Source { get; init; } } diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginCredentialResetRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginCredentialResetRequest.cs deleted file mode 100644 index dd96bf98..00000000 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginCredentialResetRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using CodeBeam.UltimateAuth.Core.Domain; - -namespace CodeBeam.UltimateAuth.Credentials.Contracts; - -public sealed record BeginCredentialResetRequest -{ - public string Identifier { get; init; } = default!; - public CredentialType CredentialType { get; set; } = CredentialType.Password; - public ResetCodeType ResetCodeType { get; set; } - public string? Channel { get; init; } - public TimeSpan? Validity { get; init; } -} diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginResetCredentialRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginResetCredentialRequest.cs new file mode 100644 index 00000000..437ce3e5 --- /dev/null +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/BeginResetCredentialRequest.cs @@ -0,0 +1,12 @@ +using CodeBeam.UltimateAuth.Core.Domain; + +namespace CodeBeam.UltimateAuth.Credentials.Contracts; + +public sealed record BeginResetCredentialRequest +{ + public required string Identifier { get; init; } + public CredentialType CredentialType { get; init; } + public ResetCodeType ResetCodeType { get; init; } + public string? Channel { get; init; } + public TimeSpan? Validity { get; init; } +} diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CompleteCredentialResetRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CompleteResetCredentialRequest.cs similarity index 64% rename from src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CompleteCredentialResetRequest.cs rename to src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CompleteResetCredentialRequest.cs index ec7abac5..bd49cb6d 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CompleteCredentialResetRequest.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CompleteResetCredentialRequest.cs @@ -2,10 +2,10 @@ namespace CodeBeam.UltimateAuth.Credentials.Contracts; -public sealed record CompleteCredentialResetRequest +public sealed record CompleteResetCredentialRequest { public string? Identifier { get; init; } - public CredentialType CredentialType { get; set; } = CredentialType.Password; + public CredentialType CredentialType { get; init; } public string? ResetToken { get; init; } public required string NewSecret { get; init; } } diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CredentialActionRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CredentialActionRequest.cs deleted file mode 100644 index d0f3465f..00000000 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/CredentialActionRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CodeBeam.UltimateAuth.Credentials.Contracts; - -public sealed record CredentialActionRequest -{ - public Guid Id { get; set; } - public string? Reason { get; set; } -} diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/DeleteCredentialRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/DeleteCredentialRequest.cs index b1bf31fa..1f808da5 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/DeleteCredentialRequest.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/DeleteCredentialRequest.cs @@ -2,8 +2,8 @@ namespace CodeBeam.UltimateAuth.Credentials.Contracts; -public class DeleteCredentialRequest +public sealed record DeleteCredentialRequest { public Guid Id { get; init; } - public DeleteMode Mode { get; set; } = DeleteMode.Soft; + public DeleteMode Mode { get; init; } } diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ResetPasswordRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ResetPasswordRequest.cs index 0f185532..710efa1a 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ResetPasswordRequest.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ResetPasswordRequest.cs @@ -2,7 +2,7 @@ public sealed record ResetPasswordRequest { - public Guid Id { get; set; } + public Guid Id { get; init; } public required string NewPassword { get; init; } /// diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/RevokeAllCredentialsRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/RevokeAllCredentialsRequest.cs deleted file mode 100644 index 855b606e..00000000 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/RevokeAllCredentialsRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CodeBeam.UltimateAuth.Core.Domain; - -namespace CodeBeam.UltimateAuth.Credentials.Contracts; - -public sealed class RevokeAllCredentialsRequest -{ - public required UserKey UserKey { get; init; } -} diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/SetInitialCredentialRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/SetInitialCredentialRequest.cs deleted file mode 100644 index a40a8345..00000000 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/SetInitialCredentialRequest.cs +++ /dev/null @@ -1,17 +0,0 @@ -using CodeBeam.UltimateAuth.Core.Domain; - -namespace CodeBeam.UltimateAuth.Credentials.Contracts; - -public sealed record SetInitialCredentialRequest -{ - /// - /// Credential type to initialize (Password, Passkey, External, etc.). - /// - public required CredentialType Type { get; init; } - - /// - /// Plain secret (password, passkey public data, external token reference). - /// Will be hashed / processed by the credential service. - /// - public required string Secret { get; init; } -} diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ValidateCredentialsRequest.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ValidateCredentialsRequest.cs deleted file mode 100644 index 0268a697..00000000 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Contracts/Request/ValidateCredentialsRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CodeBeam.UltimateAuth.Core.Domain; - -namespace CodeBeam.UltimateAuth.Credentials.Contracts; - -public sealed record ValidateCredentialsRequest -{ - public string Identifier { get; init; } = default!; - public string Secret { get; init; } = default!; - - public CredentialType? CredentialType { get; init; } -} diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Endpoints/CredentialEndpointHandler.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Endpoints/CredentialEndpointHandler.cs index c95daf58..cd214a18 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Endpoints/CredentialEndpointHandler.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Endpoints/CredentialEndpointHandler.cs @@ -92,7 +92,7 @@ public async Task BeginResetAsync(HttpContext ctx) // Don't call TryGetSelf here, as the user might be locked out and thus not authenticated. var flow = _authFlow.Current; - var request = await ctx.ReadJsonAsync(ctx.RequestAborted); + var request = await ctx.ReadJsonAsync(ctx.RequestAborted); var accessContext = await _accessContextFactory.CreateAsync( flow, @@ -109,7 +109,7 @@ public async Task CompleteResetAsync(HttpContext ctx) // Don't call TryGetSelf here, as the user might be locked out and thus not authenticated. var flow = _authFlow.Current; - var request = await ctx.ReadJsonAsync(ctx.RequestAborted); + var request = await ctx.ReadJsonAsync(ctx.RequestAborted); var accessContext = await _accessContextFactory.CreateAsync( flow, @@ -216,7 +216,7 @@ public async Task BeginResetAdminAsync(UserKey userKey, HttpContext ctx if (!TryGetSelf(out var flow, out var error)) return error!; - var request = await ctx.ReadJsonAsync(ctx.RequestAborted); + var request = await ctx.ReadJsonAsync(ctx.RequestAborted); var accessContext = await _accessContextFactory.CreateAsync( flow, @@ -233,7 +233,7 @@ public async Task CompleteResetAdminAsync(UserKey userKey, HttpContext if (!TryGetSelf(out var flow, out var error)) return error!; - var request = await ctx.ReadJsonAsync(ctx.RequestAborted); + var request = await ctx.ReadJsonAsync(ctx.RequestAborted); var accessContext = await _accessContextFactory.CreateAsync( flow, diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/CredentialManagementService.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/CredentialManagementService.cs index ad0a4ae0..71d051d6 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/CredentialManagementService.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/CredentialManagementService.cs @@ -193,7 +193,7 @@ public async Task RevokeAsync(AccessContext context, Rev return await _accessOrchestrator.ExecuteAsync(context, cmd, ct); } - public async Task BeginResetAsync(AccessContext context, BeginCredentialResetRequest request, CancellationToken ct = default) + public async Task BeginResetAsync(AccessContext context, BeginResetCredentialRequest request, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); @@ -249,7 +249,7 @@ public async Task BeginResetAsync(AccessContext cont return await _accessOrchestrator.ExecuteAsync(context, cmd, ct); } - public async Task CompleteResetAsync(AccessContext context, CompleteCredentialResetRequest request, CancellationToken ct = default) + public async Task CompleteResetAsync(AccessContext context, CompleteResetCredentialRequest request, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); diff --git a/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/ICredentialManagementService.cs b/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/ICredentialManagementService.cs index 549659bf..4816c180 100644 --- a/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/ICredentialManagementService.cs +++ b/src/credentials/CodeBeam.UltimateAuth.Credentials.Reference/Services/ICredentialManagementService.cs @@ -13,9 +13,9 @@ public interface ICredentialManagementService Task RevokeAsync(AccessContext context, RevokeCredentialRequest request, CancellationToken ct = default); - Task BeginResetAsync(AccessContext context, BeginCredentialResetRequest request, CancellationToken ct = default); + Task BeginResetAsync(AccessContext context, BeginResetCredentialRequest request, CancellationToken ct = default); - Task CompleteResetAsync(AccessContext context, CompleteCredentialResetRequest request, CancellationToken ct = default); + Task CompleteResetAsync(AccessContext context, CompleteResetCredentialRequest request, CancellationToken ct = default); Task DeleteAsync(AccessContext context, DeleteCredentialRequest request, CancellationToken ct = default); } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/UserQuery.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/UserQuery.cs index f3a44e63..43e1fcf8 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/UserQuery.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/UserQuery.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class UserQuery : PageRequest +public sealed record UserQuery : PageRequest { public string? Search { get; set; } public UserStatus? Status { get; set; } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/AddUserIdentifierRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/AddUserIdentifierRequest.cs index 0ae55149..745b40d3 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/AddUserIdentifierRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/AddUserIdentifierRequest.cs @@ -3,6 +3,6 @@ public sealed record AddUserIdentifierRequest { public UserIdentifierType Type { get; init; } - public string Value { get; init; } = default!; + public required string Value { get; init; } public bool IsPrimary { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs index f3511af5..17315bb8 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class ChangeUserStatusAdminRequest +public sealed record ChangeUserStatusAdminRequest { public required UserStatus NewStatus { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs index f9c82d6e..af097266 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs @@ -1,6 +1,6 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public class ChangeUserStatusSelfRequest +public sealed record ChangeUserStatusSelfRequest { public required SelfUserStatus NewStatus { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs index ad398643..330e3d65 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs @@ -3,5 +3,5 @@ public sealed record CompleteMfaSetupRequest { public MfaMethod Method { get; init; } - public string VerificationCode { get; init; } = default!; + public required string VerificationCode { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserIdentifierRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserIdentifierRequest.cs index 0ef75570..e63a67ba 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserIdentifierRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserIdentifierRequest.cs @@ -4,6 +4,6 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; public sealed record DeleteUserIdentifierRequest { - public Guid IdentifierId { get; set; } - public DeleteMode Mode { get; set; } = DeleteMode.Soft; + public Guid Id { get; init; } + public DeleteMode Mode { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserRequest.cs index a6721e42..d416b9ee 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DeleteUserRequest.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class DeleteUserRequest +public sealed record DeleteUserRequest { - public DeleteMode Mode { get; init; } = DeleteMode.Soft; + public DeleteMode Mode { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/IdentifierExistsRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/IdentifierExistsRequest.cs index c2d9ef05..72218125 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/IdentifierExistsRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/IdentifierExistsRequest.cs @@ -1,7 +1,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class IdentifierExistsRequest +public sealed record IdentifierExistsRequest { - public UserIdentifierType Type { get; set; } - public string Value { get; set; } = default!; + public UserIdentifierType Type { get; init; } + public required string Value { get; set; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutDeviceRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutDeviceRequest.cs index 4d744bd7..6ed81237 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutDeviceRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutDeviceRequest.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class LogoutDeviceRequest +public sealed record LogoutDeviceRequest { public required SessionChainId ChainId { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs index 7865c876..956b5b74 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class LogoutOtherDevicesAdminRequest +public sealed record LogoutOtherDevicesAdminRequest { public required SessionChainId CurrentChainId { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs index 6f6b4e97..f37a8091 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class LogoutOtherDevicesSelfRequest +public sealed record LogoutOtherDevicesSelfRequest { public required SessionChainId CurrentChainId { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/RegisterUserRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/RegisterUserRequest.cs index 985e12e5..cbc4924f 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/RegisterUserRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/RegisterUserRequest.cs @@ -5,7 +5,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; /// /// Request to register a new user with credentials. /// -public sealed class RegisterUserRequest +public sealed record RegisterUserRequest { /// /// Unique user identifier (username, email, or external id). diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/SetPrimaryUserIdentifierRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/SetPrimaryUserIdentifierRequest.cs index 9cd43c8a..e396c161 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/SetPrimaryUserIdentifierRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/SetPrimaryUserIdentifierRequest.cs @@ -2,5 +2,5 @@ public sealed record SetPrimaryUserIdentifierRequest { - public Guid IdentifierId { get; set; } + public Guid Id { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UnsetPrimaryUserIdentifierRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UnsetPrimaryUserIdentifierRequest.cs index 7638a2cd..8e7675db 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UnsetPrimaryUserIdentifierRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UnsetPrimaryUserIdentifierRequest.cs @@ -2,5 +2,5 @@ public sealed record UnsetPrimaryUserIdentifierRequest { - public Guid IdentifierId { get; set; } + public Guid Id { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UserIdentifierQuery.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UserIdentifierQuery.cs index f425570d..40233262 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UserIdentifierQuery.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/UserIdentifierQuery.cs @@ -3,9 +3,9 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed class UserIdentifierQuery : PageRequest +public sealed record UserIdentifierQuery : PageRequest { - public UserKey? UserKey { get; set; } + public UserKey? UserKey { get; init; } - public bool IncludeDeleted { get; init; } = false; + public bool IncludeDeleted { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/VerifyUserIdentifierRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/VerifyUserIdentifierRequest.cs index 0e04c873..205c5460 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/VerifyUserIdentifierRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/VerifyUserIdentifierRequest.cs @@ -2,5 +2,5 @@ public sealed record VerifyUserIdentifierRequest { - public Guid IdentifierId { get; init; } + public Guid Id { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserLifecycleQuery.cs b/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserLifecycleQuery.cs index b1dc66e0..d308ff45 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserLifecycleQuery.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserLifecycleQuery.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Reference; -public sealed class UserLifecycleQuery : PageRequest +public sealed record UserLifecycleQuery : PageRequest { public bool IncludeDeleted { get; init; } public UserStatus? Status { get; init; } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserProfileQuery.cs b/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserProfileQuery.cs index 7b2808a9..3c3835e6 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserProfileQuery.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Reference/Contracts/UserProfileQuery.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Reference; -public sealed class UserProfileQuery : PageRequest +public sealed record UserProfileQuery : PageRequest { public bool IncludeDeleted { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs b/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs index b122e142..c748c36c 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs @@ -323,7 +323,10 @@ public async Task> GetIdentifiersByUserAsync(Acc var targetUserKey = context.GetTargetUserKey(); query ??= new UserIdentifierQuery(); - query.UserKey = targetUserKey; + query = query with + { + UserKey = targetUserKey + }; var identifierStore = _identifierStoreFactory.Create(context.ResourceTenant); var result = await identifierStore.QueryAsync(query, innerCt); var dtoItems = result.Items.Select(UserIdentifierMapper.ToDto).ToList().AsReadOnly(); @@ -524,7 +527,7 @@ public async Task SetPrimaryUserIdentifierAsync(AccessContext context, SetPrimar EnsureOverrideAllowed(context); var identifierStore = _identifierStoreFactory.Create(context.ResourceTenant); - var identifier = await identifierStore.GetByIdAsync(request.IdentifierId, innerCt); + var identifier = await identifierStore.GetByIdAsync(request.Id, innerCt); if (identifier is null) throw new UAuthIdentifierNotFoundException("identifier_not_found"); @@ -554,7 +557,7 @@ public async Task UnsetPrimaryUserIdentifierAsync(AccessContext context, UnsetPr EnsureOverrideAllowed(context); var identifierStore = _identifierStoreFactory.Create(context.ResourceTenant); - var identifier = await identifierStore.GetByIdAsync(request.IdentifierId, innerCt); + var identifier = await identifierStore.GetByIdAsync(request.Id, innerCt); if (identifier is null) throw new UAuthIdentifierNotFoundException("identifier_not_found"); @@ -592,7 +595,7 @@ public async Task VerifyUserIdentifierAsync(AccessContext context, VerifyUserIde EnsureOverrideAllowed(context); var identifierStore = _identifierStoreFactory.Create(context.ResourceTenant); - var identifier = await identifierStore.GetByIdAsync(request.IdentifierId, innerCt); + var identifier = await identifierStore.GetByIdAsync(request.Id, innerCt); if (identifier is null) throw new UAuthIdentifierNotFoundException("identifier_not_found"); @@ -611,7 +614,7 @@ public async Task DeleteUserIdentifierAsync(AccessContext context, DeleteUserIde EnsureOverrideAllowed(context); var identifierStore = _identifierStoreFactory.Create(context.ResourceTenant); - var identifier = await identifierStore.GetByIdAsync(request.IdentifierId, innerCt); + var identifier = await identifierStore.GetByIdAsync(request.Id, innerCt); if (identifier is null) throw new UAuthIdentifierNotFoundException("identifier_not_found"); diff --git a/tests/CodeBeam.UltimateAuth.Tests.Unit/Credentials/ResetPasswordTests.cs b/tests/CodeBeam.UltimateAuth.Tests.Unit/Credentials/ResetPasswordTests.cs index 431b8579..fced32ec 100644 --- a/tests/CodeBeam.UltimateAuth.Tests.Unit/Credentials/ResetPasswordTests.cs +++ b/tests/CodeBeam.UltimateAuth.Tests.Unit/Credentials/ResetPasswordTests.cs @@ -18,7 +18,7 @@ public async Task Begin_reset_with_token_should_return_token() var context = TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous); var result = await service.BeginResetAsync(context, - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -39,7 +39,7 @@ public async Task Begin_reset_with_code_should_return_numeric_code() var context = TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous); var result = await service.BeginResetAsync(context, - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -59,7 +59,7 @@ public async Task Begin_reset_for_unknown_user_should_not_fail() var context = TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous); var result = await service.BeginResetAsync(context, - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "unknown@test.com", CredentialType = CredentialType.Password, @@ -77,7 +77,7 @@ public async Task Reset_password_with_valid_token_should_succeed() var begin = await service.BeginResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous), - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -86,7 +86,7 @@ public async Task Reset_password_with_valid_token_should_succeed() var result = await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -105,7 +105,7 @@ public async Task Reset_password_with_same_password_should_fail() var begin = await service.BeginResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous), - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -115,7 +115,7 @@ public async Task Reset_password_with_same_password_should_fail() Func act = async () => await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -134,7 +134,7 @@ public async Task Reset_token_should_lock_after_max_attempts() var begin = await service.BeginResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous), - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -147,7 +147,7 @@ public async Task Reset_token_should_lock_after_max_attempts() { await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -161,7 +161,7 @@ await service.CompleteResetAsync( Func act = async () => await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -180,7 +180,7 @@ public async Task Reset_token_should_be_single_use() var begin = await service.BeginResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous), - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -189,7 +189,7 @@ public async Task Reset_token_should_be_single_use() await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -200,7 +200,7 @@ await service.CompleteResetAsync( Func act = async () => await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -220,7 +220,7 @@ public async Task Reset_token_should_fail_if_expired() var begin = await service.BeginResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.BeginResetAnonymous), - new BeginCredentialResetRequest + new BeginResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, @@ -232,7 +232,7 @@ public async Task Reset_token_should_fail_if_expired() Func act = async () => await service.CompleteResetAsync( TestAccessContext.WithAction(UAuthActions.Credentials.CompleteResetAnonymous), - new CompleteCredentialResetRequest + new CompleteResetCredentialRequest { Identifier = "admin", CredentialType = CredentialType.Password, diff --git a/tests/CodeBeam.UltimateAuth.Tests.Unit/Users/UserIdentifierApplicationServiceTests.cs b/tests/CodeBeam.UltimateAuth.Tests.Unit/Users/UserIdentifierApplicationServiceTests.cs index 049eeefc..7122902a 100644 --- a/tests/CodeBeam.UltimateAuth.Tests.Unit/Users/UserIdentifierApplicationServiceTests.cs +++ b/tests/CodeBeam.UltimateAuth.Tests.Unit/Users/UserIdentifierApplicationServiceTests.cs @@ -203,7 +203,7 @@ public async Task Unsetting_last_login_identifier_should_fail() await service.UnsetPrimaryUserIdentifierAsync(context, new UnsetPrimaryUserIdentifierRequest { - IdentifierId = email.Id + Id = email.Id }); await act.Should().ThrowAsync(); From 9056fdfeb4578168055d25e9e7e406bf430b04de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Can=20Karag=C3=B6z?= Date: Sun, 29 Mar 2026 00:40:22 +0300 Subject: [PATCH 2/4] Reviewed Authorization Client API --- .../Components/Dialogs/PermissionDialog.razor.cs | 6 +++--- .../Components/Dialogs/PermissionDialog.razor.cs | 6 +++--- .../Components/Dialogs/PermissionDialog.razor.cs | 6 +++--- ...etPermissionsRequest.cs => SetRolePermissionsRequest.cs} | 4 ++-- .../Endpoints/AuthorizationEndpointHandler.cs | 2 +- .../Services/Abstractions/IAuthorizationClient.cs | 2 +- .../Services/UAuthAuthorizationClient.cs | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) rename src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/{SetPermissionsRequest.cs => SetRolePermissionsRequest.cs} (58%) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs index 5d2e0b06..0e755f76 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/PermissionDialog.razor.cs @@ -63,13 +63,13 @@ private async Task Save() { var permissions = _groups.SelectMany(g => g.Items).Where(x => x.Selected).Select(x => Permission.From(x.Value)).ToList(); - var req = new SetPermissionsRequest + var req = new SetRolePermissionsRequest { - Id = Role.Id, + RoleId = Role.Id, Permissions = permissions }; - var result = await UAuthClient.Authorization.SetPermissionsAsync(req); + var result = await UAuthClient.Authorization.SetRolePermissionsAsync(req); if (!result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs index 7aafd31a..3f085402 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/PermissionDialog.razor.cs @@ -63,13 +63,13 @@ private async Task Save() { var permissions = _groups.SelectMany(g => g.Items).Where(x => x.Selected).Select(x => Permission.From(x.Value)).ToList(); - var req = new SetPermissionsRequest + var req = new SetRolePermissionsRequest { - Id = Role.Id, + RoleId = Role.Id, Permissions = permissions }; - var result = await UAuthClient.Authorization.SetPermissionsAsync(req); + var result = await UAuthClient.Authorization.SetRolePermissionsAsync(req); if (!result.IsSuccess) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs index a4d3f9d3..e676d6ed 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/PermissionDialog.razor.cs @@ -63,13 +63,13 @@ private async Task Save() { var permissions = _groups.SelectMany(g => g.Items).Where(x => x.Selected).Select(x => Permission.From(x.Value)).ToList(); - var req = new SetPermissionsRequest + var req = new SetRolePermissionsRequest { - Id = Role.Id, + RoleId = Role.Id, Permissions = permissions }; - var result = await UAuthClient.Authorization.SetPermissionsAsync(req); + var result = await UAuthClient.Authorization.SetRolePermissionsAsync(req); if (!result.IsSuccess) { diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetRolePermissionsRequest.cs similarity index 58% rename from src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs rename to src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetRolePermissionsRequest.cs index cabccb76..2286ecd9 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetPermissionsRequest.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/SetRolePermissionsRequest.cs @@ -1,7 +1,7 @@ namespace CodeBeam.UltimateAuth.Authorization.Contracts; -public sealed record SetPermissionsRequest +public sealed record SetRolePermissionsRequest { - public required RoleId Id { get; init; } + public required RoleId RoleId { get; init; } public IEnumerable Permissions { get; init; } = []; } diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs index f3ecf1c4..ae13fda7 100644 --- a/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs +++ b/src/authorization/CodeBeam.UltimateAuth.Authorization.Reference/Endpoints/AuthorizationEndpointHandler.cs @@ -217,7 +217,7 @@ public async Task SetRolePermissionsAsync(RoleId roleId, HttpContext ct if (!flow.IsAuthenticated) return Results.Unauthorized(); - var req = await ctx.ReadJsonAsync(ctx.RequestAborted); + var req = await ctx.ReadJsonAsync(ctx.RequestAborted); var accessContext = await _accessContextFactory.CreateAsync( flow, diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs index 7c3f8b10..78b6ffd9 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IAuthorizationClient.cs @@ -15,6 +15,6 @@ public interface IAuthorizationClient Task> CreateRoleAsync(CreateRoleRequest request); Task>> QueryRolesAsync(RoleQuery request); Task RenameRoleAsync(RenameRoleRequest request); - Task SetPermissionsAsync(SetPermissionsRequest request); + Task SetRolePermissionsAsync(SetRolePermissionsRequest request); Task> DeleteRoleAsync(DeleteRoleRequest request); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs index 7e5b5cb5..40484f0f 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs @@ -96,9 +96,9 @@ public async Task RenameRoleAsync(RenameRoleRequest request) return result; } - public async Task SetPermissionsAsync(SetPermissionsRequest request) + public async Task SetRolePermissionsAsync(SetRolePermissionsRequest request) { - var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{request.Id.Value}/permissions"), request); + var raw = await _request.SendJsonAsync(Url($"/admin/authorization/roles/{request.RoleId.Value}/permissions"), request); var result = UAuthResultMapper.From(raw); if (result.IsSuccess) From bbd10f428e6b6a23453f7ee2da7576d4820fa562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Can=20Karag=C3=B6z?= Date: Sun, 29 Mar 2026 01:57:35 +0300 Subject: [PATCH 3/4] Reviewed Flow Client API --- README.md | 4 +- .../Components/Dialogs/SessionDialog.razor.cs | 10 ++-- .../Components/Dialogs/SessionDialog.razor.cs | 10 ++-- .../Components/Dialogs/SessionDialog.razor.cs | 10 ++-- .../Abstractions/Issuers/ISessionIssuer.cs | 2 +- .../Contracts/Access/AccessScope.cs | 8 ++-- .../Contracts/Authority/AuthOperation.cs | 14 +++--- .../Authority/AuthorizationDecision.cs | 6 +-- .../Authority/DeviceMismatchBehavior.cs | 6 +-- .../Contracts/Common/CaseHandling.cs | 6 +-- .../Contracts/Login/ExternalLoginRequest.cs | 10 ++-- .../Contracts/Login/LoginContinuationType.cs | 6 +-- .../Contracts/Login/LoginStatus.cs | 6 +-- .../Contracts/Login/ReauthRequest.cs | 3 +- .../Contracts/Login/UAuthLoginType.cs | 4 +- .../Contracts/Logout/LogoutAllRequest.cs | 7 +-- .../Contracts/Logout/LogoutReason.cs | 11 +++-- .../Contracts/Logout/LogoutRequest.cs | 3 -- .../Contracts/Mfa/BeginMfaRequest.cs | 2 +- .../Contracts/Mfa/CompleteMfaRequest.cs | 4 +- .../Contracts/Mfa/MfaChallengeResult.cs | 4 +- .../Contracts/Pkce/PkceAuthorizeCommand.cs | 4 +- .../Contracts/Pkce/PkceAuthorizeResponse.cs | 2 +- .../Contracts/Pkce/PkceCompleteRequest.cs | 14 +++--- .../Contracts/Pkce/TryPkceLoginResult.cs | 2 +- .../Contracts/Refresh/RefreshFlowRequest.cs | 3 +- .../Contracts/Refresh/RefreshStrategy.cs | 10 ++-- .../Refresh/RefreshTokenPersistence.cs | 4 +- .../Refresh/RefreshTokenValidationContext.cs | 2 +- .../Contracts/Session/Dtos/AuthSnapshotDto.cs | 8 ---- .../Session/Dtos/AuthSnapshotInfo.cs | 8 ++++ .../Dtos/{ClaimsDto.cs => ClaimsInfo.cs} | 2 +- ...{SessionIdentityDto.cs => IdentityInfo.cs} | 2 +- ...idationDto.cs => SessionValidationInfo.cs} | 4 +- ...onContext.cs => SessionIssuanceContext.cs} | 2 +- .../Session/SessionRefreshRequest.cs | 9 ---- .../Contracts/Session/SessionTouchMode.cs | 4 +- .../Contracts/Token/AuthTokens.cs | 2 +- .../Contracts/Token/PrimaryTokenKind.cs | 4 +- .../Contracts/Token/TokenFormat.cs | 5 +- .../Contracts/Token/TokenInvalidReason.cs | 20 ++++---- .../Contracts/Token/TokenIssueContext.cs | 11 ----- .../Contracts/User/UserStatus.cs | 2 +- .../Infrastructure/SessionValidationMapper.cs | 2 +- .../Endpoints/LogoutEndpointHandler.cs | 6 +-- .../Endpoints/RefreshEndpointHandler.cs | 5 +- .../Flows/Login/LoginOrchestrator.cs | 2 +- .../Issuers/UAuthSessionIssuer.cs | 2 +- .../Orchestrator/CreateLoginSessionCommand.cs | 2 +- .../ResourceApi/RemoteSessionValidator.cs | 2 +- .../Services/RefreshFlowService.cs | 48 ++++++++----------- .../Services/UAuthFlowService.cs | 14 ++++-- .../{Dtos => Requests}/RoleQuery.cs | 0 .../Services/Abstractions/IFlowClient.cs | 12 ++--- .../Services/UAuthFlowClient.cs | 12 ++--- .../Requests/BeginMfaSetupRequest.cs | 6 --- .../Requests/CompleteMfaSetupRequest.cs | 7 --- .../Requests/DisableMfaRequest.cs | 6 --- .../LogoutOtherDevicesAdminRequest.cs | 8 ---- ...equest.cs => LogoutOtherDevicesRequest.cs} | 2 +- .../Fake/FakeFlowClient.cs | 24 +++++++++- 61 files changed, 190 insertions(+), 230 deletions(-) delete mode 100644 src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotDto.cs create mode 100644 src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotInfo.cs rename src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/{ClaimsDto.cs => ClaimsInfo.cs} (89%) rename src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/{SessionIdentityDto.cs => IdentityInfo.cs} (86%) rename src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/{SessionValidationDto.cs => SessionValidationInfo.cs} (60%) rename src/CodeBeam.UltimateAuth.Core/Contracts/Session/{AuthenticatedSessionContext.cs => SessionIssuanceContext.cs} (95%) delete mode 100644 src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionRefreshRequest.cs delete mode 100644 src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenIssueContext.cs rename src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/{Dtos => Requests}/RoleQuery.cs (100%) delete mode 100644 src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/BeginMfaSetupRequest.cs delete mode 100644 src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs delete mode 100644 src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DisableMfaRequest.cs delete mode 100644 src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs rename src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/{LogoutOtherDevicesSelfRequest.cs => LogoutOtherDevicesRequest.cs} (76%) diff --git a/README.md b/README.md index d1c63fa8..39ee5ee2 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ app.MapRazorComponents() ``` ### 4) Add UAuth Script -Place this in `App.razor` or `index.html` +Place this in `App.razor` or `index.html` in your Blazor client application: ```csharp ``` @@ -281,7 +281,7 @@ LogoutAll But Keep Current Device private async Task LogoutOthersAsync() { - var result = await UAuthClient.Flows.LogoutOtherDevicesSelfAsync(); + var result = await UAuthClient.Flows.LogoutMyOtherDevicesAsync(); Console.WriteLine(result.IsSuccess); } ``` diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/SessionDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/SessionDialog.razor.cs index 5ec8d396..fb86d0cf 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/SessionDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/SessionDialog.razor.cs @@ -118,11 +118,11 @@ private async Task LogoutAllAsync() if (UserKey is null) { - result = await UAuthClient.Flows.LogoutAllDevicesSelfAsync(); + result = await UAuthClient.Flows.LogoutAllMyDevicesAsync(); } else { - result = await UAuthClient.Flows.LogoutAllDevicesAdminAsync(UserKey.Value); + result = await UAuthClient.Flows.LogoutAllUserDevicesAsync(UserKey.Value); } if (result.IsSuccess) @@ -139,7 +139,7 @@ private async Task LogoutAllAsync() private async Task LogoutOthersAsync() { - var result = await UAuthClient.Flows.LogoutOtherDevicesSelfAsync(); + var result = await UAuthClient.Flows.LogoutMyOtherDevicesAsync(); if (result.IsSuccess) { @@ -158,11 +158,11 @@ private async Task LogoutDeviceAsync(SessionChainId chainId) if (UserKey is null) { - result = await UAuthClient.Flows.LogoutDeviceSelfAsync(request); + result = await UAuthClient.Flows.LogoutMyDeviceAsync(request); } else { - result = await UAuthClient.Flows.LogoutDeviceAdminAsync(UserKey.Value, request); + result = await UAuthClient.Flows.LogoutUserDeviceAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/SessionDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/SessionDialog.razor.cs index f5d5822f..17af4337 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/SessionDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/SessionDialog.razor.cs @@ -118,11 +118,11 @@ private async Task LogoutAllAsync() if (UserKey is null) { - result = await UAuthClient.Flows.LogoutAllDevicesSelfAsync(); + result = await UAuthClient.Flows.LogoutAllMyDevicesAsync(); } else { - result = await UAuthClient.Flows.LogoutAllDevicesAdminAsync(UserKey.Value); + result = await UAuthClient.Flows.LogoutAllUserDevicesAsync(UserKey.Value); } if (result.IsSuccess) @@ -139,7 +139,7 @@ private async Task LogoutAllAsync() private async Task LogoutOthersAsync() { - var result = await UAuthClient.Flows.LogoutOtherDevicesSelfAsync(); + var result = await UAuthClient.Flows.LogoutMyOtherDevicesAsync(); if (result.IsSuccess) { @@ -158,11 +158,11 @@ private async Task LogoutDeviceAsync(SessionChainId chainId) if (UserKey is null) { - result = await UAuthClient.Flows.LogoutDeviceSelfAsync(request); + result = await UAuthClient.Flows.LogoutMyDeviceAsync(request); } else { - result = await UAuthClient.Flows.LogoutDeviceAdminAsync(UserKey.Value, request); + result = await UAuthClient.Flows.LogoutUserDeviceAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/SessionDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/SessionDialog.razor.cs index b6179488..1aaceacb 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/SessionDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/SessionDialog.razor.cs @@ -120,11 +120,11 @@ private async Task LogoutAllAsync() if (UserKey is null) { - result = await UAuthClient.Flows.LogoutAllDevicesSelfAsync(); + result = await UAuthClient.Flows.LogoutAllMyDevicesAsync(); } else { - result = await UAuthClient.Flows.LogoutAllDevicesAdminAsync(UserKey.Value); + result = await UAuthClient.Flows.LogoutAllUserDevicesAsync(UserKey.Value); } if (result.IsSuccess) @@ -141,7 +141,7 @@ private async Task LogoutAllAsync() private async Task LogoutOthersAsync() { - var result = await UAuthClient.Flows.LogoutOtherDevicesSelfAsync(); + var result = await UAuthClient.Flows.LogoutMyOtherDevicesAsync(); if (result.IsSuccess) { @@ -160,11 +160,11 @@ private async Task LogoutDeviceAsync(SessionChainId chainId) if (UserKey is null) { - result = await UAuthClient.Flows.LogoutDeviceSelfAsync(request); + result = await UAuthClient.Flows.LogoutMyDeviceAsync(request); } else { - result = await UAuthClient.Flows.LogoutDeviceAdminAsync(UserKey.Value, request); + result = await UAuthClient.Flows.LogoutUserDeviceAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/src/CodeBeam.UltimateAuth.Core/Abstractions/Issuers/ISessionIssuer.cs b/src/CodeBeam.UltimateAuth.Core/Abstractions/Issuers/ISessionIssuer.cs index b427fb04..db00ab92 100644 --- a/src/CodeBeam.UltimateAuth.Core/Abstractions/Issuers/ISessionIssuer.cs +++ b/src/CodeBeam.UltimateAuth.Core/Abstractions/Issuers/ISessionIssuer.cs @@ -6,7 +6,7 @@ namespace CodeBeam.UltimateAuth.Core.Abstractions; public interface ISessionIssuer { - Task IssueSessionAsync(AuthenticatedSessionContext context, CancellationToken cancellationToken = default); + Task IssueSessionAsync(SessionIssuanceContext context, CancellationToken cancellationToken = default); Task RotateSessionAsync(SessionRotationContext context, CancellationToken cancellationToken = default); diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Access/AccessScope.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Access/AccessScope.cs index 0a881359..f8c98d61 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Access/AccessScope.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Access/AccessScope.cs @@ -2,8 +2,8 @@ public enum ActionScope { - Anonymous, - Self, - Admin, - System + Anonymous = 0, + Self = 10, + Admin = 20, + System = 30 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthOperation.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthOperation.cs index 1671ed53..2e6bb373 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthOperation.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthOperation.cs @@ -2,11 +2,11 @@ public enum AuthOperation { - Login, - Access, - ResourceAccess, - Refresh, - Revoke, - Logout, - System + Login = 0, + Access = 10, + ResourceAccess = 20, + Refresh = 30, + Revoke = 40, + Logout = 50, + System = 100, } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthorizationDecision.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthorizationDecision.cs index 5f329623..4634154a 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthorizationDecision.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/AuthorizationDecision.cs @@ -2,7 +2,7 @@ public enum AuthorizationDecision { - Allow, - Deny, - Challenge + Allow = 0, + Deny = 10, + Challenge = 20 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/DeviceMismatchBehavior.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/DeviceMismatchBehavior.cs index 46d8241a..1c1e11f2 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/DeviceMismatchBehavior.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Authority/DeviceMismatchBehavior.cs @@ -2,7 +2,7 @@ public enum DeviceMismatchBehavior { - Reject, - Allow, - AllowAndRebind + Reject = 0, + Allow = 10, + AllowAndRebind = 20 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Common/CaseHandling.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Common/CaseHandling.cs index 08e57fe5..214d213a 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Common/CaseHandling.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Common/CaseHandling.cs @@ -2,7 +2,7 @@ public enum CaseHandling { - Preserve, - ToLower, - ToUpper + Preserve = 0, + ToLower = 10, + ToUpper = 20 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ExternalLoginRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ExternalLoginRequest.cs index 9a9555bd..32da871e 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ExternalLoginRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ExternalLoginRequest.cs @@ -1,11 +1,11 @@ -using CodeBeam.UltimateAuth.Core.MultiTenancy; +using CodeBeam.UltimateAuth.Core.Domain; +using CodeBeam.UltimateAuth.Core.MultiTenancy; namespace CodeBeam.UltimateAuth.Core.Contracts; public sealed record ExternalLoginRequest { - public TenantKey Tenant { get; init; } - public string Provider { get; init; } = default!; - public string ExternalToken { get; init; } = default!; - public string? DeviceId { get; init; } + public required string Provider { get; init; } + public required string ExternalToken { get; init; } + public required DeviceContext Device { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginContinuationType.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginContinuationType.cs index d8d953d3..33e3269f 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginContinuationType.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginContinuationType.cs @@ -2,7 +2,7 @@ public enum LoginContinuationType { - Mfa, - Pkce, - External + Mfa = 0, + Pkce = 10, + External = 20 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginStatus.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginStatus.cs index 95a03a12..95802a57 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginStatus.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/LoginStatus.cs @@ -2,7 +2,7 @@ public enum LoginStatus { - Success, - RequiresContinuation, - Failed + Success = 0, + RequiresContinuation = 10, + Failed = 20 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ReauthRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ReauthRequest.cs index 5717252f..f5089e7a 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ReauthRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/ReauthRequest.cs @@ -5,7 +5,6 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; public sealed record ReauthRequest { - public TenantKey Tenant { get; init; } public AuthSessionId SessionId { get; init; } - public string Secret { get; init; } = default!; + public required string Secret { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/UAuthLoginType.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/UAuthLoginType.cs index 2395ccb4..3a386fc8 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Login/UAuthLoginType.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Login/UAuthLoginType.cs @@ -2,6 +2,6 @@ public enum UAuthLoginType { - Password, // /auth/login - Pkce // /auth/pkce/complete + Password = 0, + Pkce = 10 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutAllRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutAllRequest.cs index 5cc76251..052ef9f6 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutAllRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutAllRequest.cs @@ -1,12 +1,9 @@ using CodeBeam.UltimateAuth.Core.Domain; -using CodeBeam.UltimateAuth.Core.MultiTenancy; namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class LogoutAllRequest +public sealed record LogoutAllRequest { - public TenantKey Tenant { get; init; } - /// /// The current session initiating the logout-all operation. /// Used to resolve the active chain when ExceptCurrent is true. @@ -17,6 +14,4 @@ public sealed class LogoutAllRequest /// If true, the current session will NOT be revoked. /// public bool ExceptCurrent { get; init; } - - public DateTimeOffset? At { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutReason.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutReason.cs index c53276d3..b8612931 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutReason.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutReason.cs @@ -2,9 +2,10 @@ public enum LogoutReason { - Explicit, - SessionExpired, - SecurityPolicy, - AdminForced, - TenantDisabled + UserIntend = 0, + Explicit = 10, + SessionExpired = 20, + SecurityPolicy = 30, + AdminForced = 40, + TenantDisabled = 50 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutRequest.cs index 050a9b9d..9878f927 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Logout/LogoutRequest.cs @@ -1,11 +1,8 @@ using CodeBeam.UltimateAuth.Core.Domain; -using CodeBeam.UltimateAuth.Core.MultiTenancy; namespace CodeBeam.UltimateAuth.Core.Contracts; public sealed record LogoutRequest { - public TenantKey Tenant { get; init; } public AuthSessionId SessionId { get; init; } - public DateTimeOffset? At { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/BeginMfaRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/BeginMfaRequest.cs index 38f945b1..536ed568 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/BeginMfaRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/BeginMfaRequest.cs @@ -2,5 +2,5 @@ public sealed record BeginMfaRequest { - public string MfaToken { get; init; } = default!; + public required string MfaToken { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/CompleteMfaRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/CompleteMfaRequest.cs index abf719ff..7aa5d7f0 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/CompleteMfaRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/CompleteMfaRequest.cs @@ -2,6 +2,6 @@ public sealed record CompleteMfaRequest { - public string ChallengeId { get; init; } = default!; - public string Code { get; init; } = default!; + public required string ChallengeId { get; init; } + public required string Code { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/MfaChallengeResult.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/MfaChallengeResult.cs index f12ccedd..c0a4aad6 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/MfaChallengeResult.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Mfa/MfaChallengeResult.cs @@ -2,6 +2,6 @@ public sealed record MfaChallengeResult { - public string ChallengeId { get; init; } = default!; - public string Method { get; init; } = default!; // totp, sms, email etc. + public required string ChallengeId { get; init; } + public required string Method { get; init; } // totp, sms, email etc. } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeCommand.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeCommand.cs index bcb1e132..39068268 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeCommand.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeCommand.cs @@ -6,8 +6,8 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; public sealed record PkceAuthorizeCommand { - public string CodeChallenge { get; init; } = default!; - public string ChallengeMethod { get; init; } = "S256"; + public required string CodeChallenge { get; init; } + public required string ChallengeMethod { get; init; } = "S256"; public required DeviceContext Device { get; init; } public string? RedirectUri { get; init; } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeResponse.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeResponse.cs index 152afcae..b9f80bfa 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeResponse.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceAuthorizeResponse.cs @@ -2,6 +2,6 @@ public sealed class PkceAuthorizeResponse { - public string AuthorizationCode { get; init; } = default!; + public required string AuthorizationCode { get; init; } public int ExpiresIn { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceCompleteRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceCompleteRequest.cs index 22cb7bab..b951e1ec 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceCompleteRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/PkceCompleteRequest.cs @@ -2,21 +2,21 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class PkceCompleteRequest +public sealed record PkceCompleteRequest { [JsonPropertyName("authorization_code")] - public string AuthorizationCode { get; init; } = default!; + public required string AuthorizationCode { get; init; } [JsonPropertyName("code_verifier")] - public string CodeVerifier { get; init; } = default!; + public required string CodeVerifier { get; init; } - public string Identifier { get; init; } = default!; - public string Secret { get; init; } = default!; + public required string Identifier { get; init; } + public required string Secret { get; init; } [JsonPropertyName("return_url")] - public string ReturnUrl { get; init; } = default!; + public string ReturnUrl { get; init; } [JsonPropertyName("hub_session_id")] - public string HubSessionId { get; init; } = default!; + public string HubSessionId { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/TryPkceLoginResult.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/TryPkceLoginResult.cs index fb0b7913..aef8a634 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/TryPkceLoginResult.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Pkce/TryPkceLoginResult.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class TryPkceLoginResult : IUAuthTryResult +public sealed record TryPkceLoginResult : IUAuthTryResult { public bool Success { get; init; } public AuthFailureReason? Reason { get; init; } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshFlowRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshFlowRequest.cs index a6120541..321cb061 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshFlowRequest.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshFlowRequest.cs @@ -2,11 +2,10 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class RefreshFlowRequest +public sealed record RefreshFlowRequest { public AuthSessionId? SessionId { get; init; } public string? RefreshToken { get; init; } public required DeviceContext Device { get; init; } - public DateTimeOffset Now { get; init; } public SessionTouchMode TouchMode { get; init; } = SessionTouchMode.IfNeeded; } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshStrategy.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshStrategy.cs index 3c22c330..731248f6 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshStrategy.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshStrategy.cs @@ -2,9 +2,9 @@ public enum RefreshStrategy { - NotSupported, - SessionOnly, // PureOpaque - TokenOnly, // PureJwt - TokenWithSessionCheck, // SemiHybrid - SessionAndToken // Hybrid + NotSupported = 0, + SessionOnly = 10, // PureOpaque + TokenOnly = 20, // PureJwt + TokenWithSessionCheck = 30, // SemiHybrid + SessionAndToken = 40 // Hybrid } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenPersistence.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenPersistence.cs index a9d308d0..a3cea858 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenPersistence.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenPersistence.cs @@ -6,12 +6,12 @@ public enum RefreshTokenPersistence /// Refresh token store'a yazılır. /// Login, first-issue gibi normal akışlar için. /// - Persist, + Persist = 0, /// /// Refresh token store'a yazılmaz. /// Rotation gibi özel akışlarda, /// caller tarafından kontrol edilir. /// - DoNotPersist + DoNotPersist = 10 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenValidationContext.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenValidationContext.cs index 01d25a1e..a7cda668 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenValidationContext.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Refresh/RefreshTokenValidationContext.cs @@ -6,7 +6,7 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; public sealed record RefreshTokenValidationContext { public TenantKey Tenant { get; init; } - public string RefreshToken { get; init; } = default!; + public required string RefreshToken { get; init; } public DateTimeOffset Now { get; init; } public required DeviceContext Device { get; init; } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotDto.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotDto.cs deleted file mode 100644 index e4d4f0cc..00000000 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotDto.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace CodeBeam.UltimateAuth.Core.Contracts; - -public sealed class AuthSnapshotDto -{ - public IdentityDto? Identity { get; set; } - - public ClaimsDto? Claims { get; set; } -} diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotInfo.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotInfo.cs new file mode 100644 index 00000000..79654c8c --- /dev/null +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/AuthSnapshotInfo.cs @@ -0,0 +1,8 @@ +namespace CodeBeam.UltimateAuth.Core.Contracts; + +public sealed class AuthSnapshotInfo +{ + public IdentityInfo? Identity { get; set; } + + public ClaimsInfo? Claims { get; set; } +} diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/ClaimsDto.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/ClaimsInfo.cs similarity index 89% rename from src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/ClaimsDto.cs rename to src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/ClaimsInfo.cs index 76482332..005895b3 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/ClaimsDto.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/ClaimsInfo.cs @@ -1,6 +1,6 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class ClaimsDto +public sealed class ClaimsInfo { public Dictionary Claims { get; set; } = new(); diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionIdentityDto.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/IdentityInfo.cs similarity index 86% rename from src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionIdentityDto.cs rename to src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/IdentityInfo.cs index e962875e..4f008972 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionIdentityDto.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/IdentityInfo.cs @@ -1,6 +1,6 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class IdentityDto +public sealed class IdentityInfo { public string Tenant { get; set; } = default!; diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionValidationDto.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionValidationInfo.cs similarity index 60% rename from src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionValidationDto.cs rename to src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionValidationInfo.cs index 353b8de5..c4519080 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionValidationDto.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/Dtos/SessionValidationInfo.cs @@ -1,10 +1,10 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; -public sealed class SessionValidationDto +public sealed class SessionValidationInfo { public int State { get; set; } = default!; public bool IsValid { get; set; } - public AuthSnapshotDto? Snapshot { get; set; } + public AuthSnapshotInfo? Snapshot { get; set; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/AuthenticatedSessionContext.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionIssuanceContext.cs similarity index 95% rename from src/CodeBeam.UltimateAuth.Core/Contracts/Session/AuthenticatedSessionContext.cs rename to src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionIssuanceContext.cs index 070c1551..1b7886a7 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/AuthenticatedSessionContext.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionIssuanceContext.cs @@ -7,7 +7,7 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; /// Represents the context in which a session is issued /// (login, refresh, reauthentication). /// -public sealed class AuthenticatedSessionContext +public sealed class SessionIssuanceContext { public TenantKey Tenant { get; init; } public required UserKey UserKey { get; init; } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionRefreshRequest.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionRefreshRequest.cs deleted file mode 100644 index d15f1cfc..00000000 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionRefreshRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -using CodeBeam.UltimateAuth.Core.MultiTenancy; - -namespace CodeBeam.UltimateAuth.Core.Contracts; - -public sealed record SessionRefreshRequest -{ - public TenantKey Tenant { get; init; } - public string RefreshToken { get; init; } = default!; -} diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionTouchMode.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionTouchMode.cs index 820f19fd..ff3d61d6 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionTouchMode.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Session/SessionTouchMode.cs @@ -5,10 +5,10 @@ public enum SessionTouchMode /// /// Touch only if store policy allows (interval, throttling, etc.) /// - IfNeeded, + IfNeeded = 0, /// /// Always update session activity, ignoring store heuristics. /// - Force + Force = 10 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/AuthTokens.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/AuthTokens.cs index 1b13c185..182bd3e0 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/AuthTokens.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/AuthTokens.cs @@ -10,7 +10,7 @@ public sealed record AuthTokens /// The issued access token. /// Always present when is returned. /// - public AccessToken AccessToken { get; init; } = default!; + public required AccessToken AccessToken { get; init; } public RefreshTokenInfo? RefreshToken { get; init; } } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/PrimaryTokenKind.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/PrimaryTokenKind.cs index 0ef2e9f6..06cd52af 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/PrimaryTokenKind.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/PrimaryTokenKind.cs @@ -2,6 +2,6 @@ public enum PrimaryTokenKind { - Session = 1, - AccessToken = 2 + Session = 0, + AccessToken = 10 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenFormat.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenFormat.cs index 3e17fc19..a50157ce 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenFormat.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenFormat.cs @@ -1,8 +1,9 @@ namespace CodeBeam.UltimateAuth.Core.Contracts; +// TODO: It's same as TokenType // It's not primary token kind, it's about transport format. public enum TokenFormat { - Opaque = 1, - Jwt = 2 + Opaque = 0, + Jwt = 10 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenInvalidReason.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenInvalidReason.cs index 5e80df5d..3e2dfb49 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenInvalidReason.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenInvalidReason.cs @@ -2,14 +2,14 @@ public enum TokenInvalidReason { - Invalid, - Expired, - Revoked, - Malformed, - SignatureInvalid, - AudienceMismatch, - IssuerMismatch, - MissingSubject, - Unknown, - NotImplemented + Invalid = 0, + Expired = 10, + Revoked = 20, + Malformed = 30, + SignatureInvalid = 40, + AudienceMismatch = 50, + IssuerMismatch = 60, + MissingSubject = 70, + NotImplemented = 80, + Unknown = 100 } diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenIssueContext.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenIssueContext.cs deleted file mode 100644 index d440a7e6..00000000 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/Token/TokenIssueContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CodeBeam.UltimateAuth.Core.Domain; -using CodeBeam.UltimateAuth.Core.MultiTenancy; - -namespace CodeBeam.UltimateAuth.Core.Contracts; - -public sealed record TokenIssueContext -{ - public TenantKey Tenant { get; init; } - public UAuthSession Session { get; init; } = default!; - public DateTimeOffset At { get; init; } -} diff --git a/src/CodeBeam.UltimateAuth.Core/Contracts/User/UserStatus.cs b/src/CodeBeam.UltimateAuth.Core/Contracts/User/UserStatus.cs index f822f02c..8bc8a155 100644 --- a/src/CodeBeam.UltimateAuth.Core/Contracts/User/UserStatus.cs +++ b/src/CodeBeam.UltimateAuth.Core/Contracts/User/UserStatus.cs @@ -16,5 +16,5 @@ public enum UserStatus PendingActivation = 60, PendingVerification = 70, - Unknown = 99 + Unknown = 100 } diff --git a/src/CodeBeam.UltimateAuth.Core/Infrastructure/SessionValidationMapper.cs b/src/CodeBeam.UltimateAuth.Core/Infrastructure/SessionValidationMapper.cs index f605ed94..0e0ab036 100644 --- a/src/CodeBeam.UltimateAuth.Core/Infrastructure/SessionValidationMapper.cs +++ b/src/CodeBeam.UltimateAuth.Core/Infrastructure/SessionValidationMapper.cs @@ -6,7 +6,7 @@ namespace CodeBeam.UltimateAuth.Core.Infrastructure; public static class SessionValidationMapper { - public static SessionValidationResult ToDomain(SessionValidationDto dto) + public static SessionValidationResult ToDomain(SessionValidationInfo dto) { var state = (SessionState)dto.State; diff --git a/src/CodeBeam.UltimateAuth.Server/Endpoints/LogoutEndpointHandler.cs b/src/CodeBeam.UltimateAuth.Server/Endpoints/LogoutEndpointHandler.cs index 4c04143d..dd7b1e36 100644 --- a/src/CodeBeam.UltimateAuth.Server/Endpoints/LogoutEndpointHandler.cs +++ b/src/CodeBeam.UltimateAuth.Server/Endpoints/LogoutEndpointHandler.cs @@ -42,9 +42,7 @@ public async Task LogoutAsync(HttpContext ctx) { var request = new LogoutRequest { - Tenant = authFlow.Tenant, - SessionId = session.SessionId, - At = _clock.UtcNow, + SessionId = session.SessionId }; await _flow.LogoutAsync(request, ctx.RequestAborted); @@ -128,7 +126,7 @@ public async Task LogoutOthersAdminAsync(HttpContext ctx, UserKey userK if (!flow.IsAuthenticated) return Results.Unauthorized(); - var request = await ctx.ReadJsonAsync(ctx.RequestAborted); + var request = await ctx.ReadJsonAsync(ctx.RequestAborted); var access = await _accessContextFactory.CreateAsync( flow, diff --git a/src/CodeBeam.UltimateAuth.Server/Endpoints/RefreshEndpointHandler.cs b/src/CodeBeam.UltimateAuth.Server/Endpoints/RefreshEndpointHandler.cs index 1d3c3f3a..bc59d6b0 100644 --- a/src/CodeBeam.UltimateAuth.Server/Endpoints/RefreshEndpointHandler.cs +++ b/src/CodeBeam.UltimateAuth.Server/Endpoints/RefreshEndpointHandler.cs @@ -44,10 +44,9 @@ public async Task RefreshAsync(HttpContext ctx) var request = new RefreshFlowRequest { - SessionId = flow?.Session?.SessionId, + SessionId = flow.Session?.SessionId, RefreshToken = _refreshTokenResolver.Resolve(ctx), - Device = flow!.Device, - Now = DateTimeOffset.UtcNow + Device = flow.Device, }; var result = await _refreshFlow.RefreshAsync(flow, request, ctx.RequestAborted); diff --git a/src/CodeBeam.UltimateAuth.Server/Flows/Login/LoginOrchestrator.cs b/src/CodeBeam.UltimateAuth.Server/Flows/Login/LoginOrchestrator.cs index 18734ab8..54c018d5 100644 --- a/src/CodeBeam.UltimateAuth.Server/Flows/Login/LoginOrchestrator.cs +++ b/src/CodeBeam.UltimateAuth.Server/Flows/Login/LoginOrchestrator.cs @@ -217,7 +217,7 @@ public async Task LoginAsync(AuthFlowContext flow, LoginRequest req var claims = await _claimsProvider.GetClaimsAsync(flow.Tenant, userKey.Value, ct); - var sessionContext = new AuthenticatedSessionContext + var sessionContext = new SessionIssuanceContext { Tenant = flow.Tenant, UserKey = userKey.Value, diff --git a/src/CodeBeam.UltimateAuth.Server/Infrastructure/Issuers/UAuthSessionIssuer.cs b/src/CodeBeam.UltimateAuth.Server/Infrastructure/Issuers/UAuthSessionIssuer.cs index 66d5b8ee..38cf330d 100644 --- a/src/CodeBeam.UltimateAuth.Server/Infrastructure/Issuers/UAuthSessionIssuer.cs +++ b/src/CodeBeam.UltimateAuth.Server/Infrastructure/Issuers/UAuthSessionIssuer.cs @@ -23,7 +23,7 @@ public UAuthSessionIssuer(ISessionStoreFactory storeFactory, IOpaqueTokenGenerat _options = options.Value; } - public async Task IssueSessionAsync(AuthenticatedSessionContext context, CancellationToken ct = default) + public async Task IssueSessionAsync(SessionIssuanceContext context, CancellationToken ct = default) { // Defensive guard — enforcement belongs to Authority if (context.Mode == UAuthMode.PureJwt) diff --git a/src/CodeBeam.UltimateAuth.Server/Infrastructure/Orchestrator/CreateLoginSessionCommand.cs b/src/CodeBeam.UltimateAuth.Server/Infrastructure/Orchestrator/CreateLoginSessionCommand.cs index 8252f34c..b756516f 100644 --- a/src/CodeBeam.UltimateAuth.Server/Infrastructure/Orchestrator/CreateLoginSessionCommand.cs +++ b/src/CodeBeam.UltimateAuth.Server/Infrastructure/Orchestrator/CreateLoginSessionCommand.cs @@ -3,7 +3,7 @@ namespace CodeBeam.UltimateAuth.Server.Infrastructure; -internal sealed record CreateLoginSessionCommand(AuthenticatedSessionContext LoginContext) : ISessionCommand +internal sealed record CreateLoginSessionCommand(SessionIssuanceContext LoginContext) : ISessionCommand { public Task ExecuteAsync(AuthContext _, ISessionIssuer issuer, CancellationToken ct) { diff --git a/src/CodeBeam.UltimateAuth.Server/ResourceApi/RemoteSessionValidator.cs b/src/CodeBeam.UltimateAuth.Server/ResourceApi/RemoteSessionValidator.cs index 5bfe197b..f5bab9db 100644 --- a/src/CodeBeam.UltimateAuth.Server/ResourceApi/RemoteSessionValidator.cs +++ b/src/CodeBeam.UltimateAuth.Server/ResourceApi/RemoteSessionValidator.cs @@ -40,7 +40,7 @@ public async Task ValidateSessionAsync(SessionValidatio if (!response.IsSuccessStatusCode) return SessionValidationResult.Invalid(SessionState.NotFound, sessionId: context.SessionId); - var dto = await response.Content.ReadFromJsonAsync(cancellationToken: ct); + var dto = await response.Content.ReadFromJsonAsync(cancellationToken: ct); if (dto is null) return SessionValidationResult.Invalid(SessionState.NotFound, sessionId: context.SessionId); diff --git a/src/CodeBeam.UltimateAuth.Server/Services/RefreshFlowService.cs b/src/CodeBeam.UltimateAuth.Server/Services/RefreshFlowService.cs index e3db3a89..249de06c 100644 --- a/src/CodeBeam.UltimateAuth.Server/Services/RefreshFlowService.cs +++ b/src/CodeBeam.UltimateAuth.Server/Services/RefreshFlowService.cs @@ -1,4 +1,5 @@ using CodeBeam.UltimateAuth.Core; +using CodeBeam.UltimateAuth.Core.Abstractions; using CodeBeam.UltimateAuth.Core.Contracts; using CodeBeam.UltimateAuth.Core.Domain; using CodeBeam.UltimateAuth.Server.Auth; @@ -11,15 +12,18 @@ internal sealed class RefreshFlowService : IRefreshFlowService private readonly ISessionValidator _sessionValidator; private readonly ISessionTouchService _sessionRefresh; private readonly IRefreshTokenRotationService _tokenRotation; + private readonly IClock _clock; public RefreshFlowService( ISessionValidator sessionValidator, ISessionTouchService sessionRefresh, - IRefreshTokenRotationService tokenRotation) + IRefreshTokenRotationService tokenRotation, + IClock clock) { _sessionValidator = sessionValidator; _sessionRefresh = sessionRefresh; _tokenRotation = tokenRotation; + _clock = clock; } public async Task RefreshAsync(AuthFlowContext flow, RefreshFlowRequest request, CancellationToken ct = default) @@ -47,12 +51,14 @@ private async Task HandleSessionOnlyAsync(AuthFlowContext flo if (request.SessionId is null) return RefreshFlowResult.ReauthRequired(); + var now = _clock.UtcNow; + var validation = await _sessionValidator.ValidateSessionAsync( new SessionValidationContext { Tenant = flow.Tenant, SessionId = request.SessionId.Value, - Now = request.Now, + Now = now, Device = request.Device }, ct); @@ -65,7 +71,7 @@ private async Task HandleSessionOnlyAsync(AuthFlowContext flo TouchInterval = flow.EffectiveOptions.Options.Session.TouchInterval }; - var refresh = await _sessionRefresh.RefreshAsync(validation, touchPolicy, request.TouchMode, request.Now, ct); + var refresh = await _sessionRefresh.RefreshAsync(validation, touchPolicy, request.TouchMode, now, ct); if (!refresh.IsSuccess || refresh.SessionId is null) return RefreshFlowResult.ReauthRequired(); @@ -78,12 +84,14 @@ private async Task HandleTokenOnlyAsync(AuthFlowContext flow, if (string.IsNullOrWhiteSpace(request.RefreshToken)) return RefreshFlowResult.ReauthRequired(); + var now = _clock.UtcNow; + var rotation = await _tokenRotation.RotateAsync( flow, new RefreshTokenRotationContext { RefreshToken = request.RefreshToken!, - Now = request.Now, + Now = now, Device = request.Device }, ct); @@ -91,24 +99,6 @@ private async Task HandleTokenOnlyAsync(AuthFlowContext flow, if (!rotation.Result.IsSuccess) return RefreshFlowResult.ReauthRequired(); - //if (rotation.Result.RefreshToken is not null) - //{ - // var converter = _userIdConverterResolver.GetConverter(); - - // await _refreshTokenStore.StoreAsync( - // flow.TenantId, - // new StoredRefreshToken - // { - // TokenHash = rotation.Result.RefreshToken.TokenHash, - // UserId = rotation.UserId!, - // SessionId = rotation.SessionId!.Value, - // ChainId = rotation.ChainId, - // ExpiresAt = rotation.Result.RefreshToken.ExpiresAt, - // IssuedAt = request.Now - // }, - // ct); - //} - return RefreshFlowResult.Success( outcome: RefreshOutcome.Rotated, accessToken: rotation.Result.AccessToken, @@ -120,12 +110,14 @@ private async Task HandleHybridAsync(AuthFlowContext flow, Re if (request.SessionId is null || string.IsNullOrWhiteSpace(request.RefreshToken)) return RefreshFlowResult.ReauthRequired(); + var now = _clock.UtcNow; + var validation = await _sessionValidator.ValidateSessionAsync( new SessionValidationContext { Tenant = flow.Tenant, SessionId = request.SessionId.Value, - Now = request.Now, + Now = now, Device = request.Device }, ct); @@ -138,7 +130,7 @@ private async Task HandleHybridAsync(AuthFlowContext flow, Re new RefreshTokenRotationContext { RefreshToken = request.RefreshToken!, - Now = request.Now, + Now = now, Device = request.Device, ExpectedSessionId = request.SessionId.Value }, @@ -152,7 +144,7 @@ private async Task HandleHybridAsync(AuthFlowContext flow, Re TouchInterval = flow.EffectiveOptions.Options.Session.TouchInterval }; - var refresh = await _sessionRefresh.RefreshAsync(validation, touchPolicy, request.TouchMode, request.Now, ct); + var refresh = await _sessionRefresh.RefreshAsync(validation, touchPolicy, request.TouchMode, now, ct); if (!refresh.IsSuccess || refresh.SessionId is null) return RefreshFlowResult.ReauthRequired(); @@ -171,12 +163,14 @@ private async Task HandleSemiHybridAsync(AuthFlowContext flow if (request.SessionId is null || string.IsNullOrWhiteSpace(request.RefreshToken)) return RefreshFlowResult.ReauthRequired(); + var now = _clock.UtcNow; + var validation = await _sessionValidator.ValidateSessionAsync( new SessionValidationContext { Tenant = flow.Tenant, SessionId = request.SessionId.Value, - Now = request.Now, + Now = now, Device = request.Device }, ct); @@ -189,7 +183,7 @@ private async Task HandleSemiHybridAsync(AuthFlowContext flow new RefreshTokenRotationContext { RefreshToken = request.RefreshToken!, - Now = request.Now, + Now = now, Device = request.Device, ExpectedSessionId = request.SessionId.Value }, diff --git a/src/CodeBeam.UltimateAuth.Server/Services/UAuthFlowService.cs b/src/CodeBeam.UltimateAuth.Server/Services/UAuthFlowService.cs index 23b7e174..95b91315 100644 --- a/src/CodeBeam.UltimateAuth.Server/Services/UAuthFlowService.cs +++ b/src/CodeBeam.UltimateAuth.Server/Services/UAuthFlowService.cs @@ -1,4 +1,5 @@ -using CodeBeam.UltimateAuth.Core.Contracts; +using CodeBeam.UltimateAuth.Core.Abstractions; +using CodeBeam.UltimateAuth.Core.Contracts; using CodeBeam.UltimateAuth.Core.Domain; using CodeBeam.UltimateAuth.Core.Events; using CodeBeam.UltimateAuth.Core.Options; @@ -17,6 +18,7 @@ internal sealed class UAuthFlowService : IUAuthFlowService, IUAuthInternalFlowSe private readonly IInternalLoginOrchestrator _internalLoginOrchestrator; private readonly ISessionOrchestrator _orchestrator; private readonly UAuthEventDispatcher _events; + private readonly IClock _clock; public UAuthFlowService( IAuthFlowContextAccessor authFlow, @@ -24,7 +26,8 @@ public UAuthFlowService( ILoginOrchestrator loginOrchestrator, IInternalLoginOrchestrator internalLoginOrchestrator, ISessionOrchestrator orchestrator, - UAuthEventDispatcher events) + UAuthEventDispatcher events, + IClock clock) { _authFlow = authFlow; _authFlowContextFactory = authFlowContextFactory; @@ -32,6 +35,7 @@ public UAuthFlowService( _internalLoginOrchestrator = internalLoginOrchestrator; _orchestrator = orchestrator; _events = events; + _clock = clock; } public Task LoginAsync(AuthFlowContext flow, LoginRequest request, CancellationToken ct = default) @@ -69,7 +73,7 @@ public async Task LoginAsync(AuthFlowContext flow, AuthExecutionCon public async Task LogoutAsync(LogoutRequest request, CancellationToken ct = default) { var authFlow = _authFlow.Current; - var now = request.At ?? DateTimeOffset.UtcNow; + var now = _clock.UtcNow; var authContext = authFlow.ToAuthContext(now); var revoked = await _orchestrator.ExecuteAsync(authContext, new RevokeSessionCommand(request.SessionId), ct); @@ -80,13 +84,13 @@ public async Task LogoutAsync(LogoutRequest request, CancellationToken ct = defa if (authFlow.UserKey is not UserKey uaKey) return; - await _events.DispatchAsync(new UserLoggedOutContext(request.Tenant, uaKey, request.At ?? DateTimeOffset.Now, LogoutReason.Explicit, request.SessionId)); + await _events.DispatchAsync(new UserLoggedOutContext(authFlow.Tenant, uaKey, now, LogoutReason.Explicit, request.SessionId)); } public async Task LogoutAllAsync(LogoutAllRequest request, CancellationToken ct = default) { var authFlow = _authFlow.Current; - var now = request.At ?? DateTimeOffset.UtcNow; + var now = _clock.UtcNow; if (authFlow.Session is not SessionSecurityContext session) throw new InvalidOperationException("LogoutAll requires an active session."); diff --git a/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Dtos/RoleQuery.cs b/src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RoleQuery.cs similarity index 100% rename from src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Dtos/RoleQuery.cs rename to src/authorization/CodeBeam.UltimateAuth.Authorization.Contracts/Requests/RoleQuery.cs diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IFlowClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IFlowClient.cs index a97d3294..f2cda9e5 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IFlowClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IFlowClient.cs @@ -20,10 +20,10 @@ public interface IFlowClient Task TryCompletePkceLoginAsync(PkceCompleteRequest request, UAuthSubmitMode mode); Task CompletePkceLoginAsync(PkceCompleteRequest request); - Task> LogoutDeviceSelfAsync(LogoutDeviceRequest request); - Task LogoutOtherDevicesSelfAsync(); - Task LogoutAllDevicesSelfAsync(); - Task> LogoutDeviceAdminAsync(UserKey userKey, LogoutDeviceRequest request); - Task LogoutOtherDevicesAdminAsync(UserKey userKey, LogoutOtherDevicesAdminRequest request); - Task LogoutAllDevicesAdminAsync(UserKey userKey); + Task> LogoutMyDeviceAsync(LogoutDeviceRequest request); + Task LogoutMyOtherDevicesAsync(); + Task LogoutAllMyDevicesAsync(); + Task> LogoutUserDeviceAsync(UserKey userKey, LogoutDeviceRequest request); + Task LogoutUserOtherDevicesAsync(UserKey userKey, LogoutOtherDevicesRequest request); + Task LogoutAllUserDevicesAsync(UserKey userKey); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthFlowClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthFlowClient.cs index 849e6fe0..988c0ab2 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthFlowClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthFlowClient.cs @@ -341,7 +341,7 @@ public async Task CompletePkceLoginAsync(PkceCompleteRequest request) await _post.NavigateAsync(url, payload); } - public async Task> LogoutDeviceSelfAsync(LogoutDeviceRequest request) + public async Task> LogoutMyDeviceAsync(LogoutDeviceRequest request) { var raw = await _post.SendJsonAsync(Url($"/me/logout-device"), request); @@ -360,25 +360,25 @@ public async Task> LogoutDeviceSelfAsync(LogoutDeviceR return UAuthResultMapper.FromJson(raw); } - public async Task> LogoutDeviceAdminAsync(UserKey userKey, LogoutDeviceRequest request) + public async Task> LogoutUserDeviceAsync(UserKey userKey, LogoutDeviceRequest request) { var raw = await _post.SendJsonAsync(Url($"/admin/users/{userKey.Value}/logout-device"), request); return UAuthResultMapper.FromJson(raw); } - public async Task LogoutOtherDevicesSelfAsync() + public async Task LogoutMyOtherDevicesAsync() { var raw = await _post.SendJsonAsync(Url("/me/logout-others")); return UAuthResultMapper.From(raw); } - public async Task LogoutOtherDevicesAdminAsync(UserKey userKey, LogoutOtherDevicesAdminRequest request) + public async Task LogoutUserOtherDevicesAsync(UserKey userKey, LogoutOtherDevicesRequest request) { var raw = await _post.SendJsonAsync(Url($"/admin/users/{userKey.Value}/logout-others"), request); return UAuthResultMapper.From(raw); } - public async Task LogoutAllDevicesSelfAsync() + public async Task LogoutAllMyDevicesAsync() { var raw = await _post.SendJsonAsync(Url("/me/logout-all")); if (raw.Ok) @@ -388,7 +388,7 @@ public async Task LogoutAllDevicesSelfAsync() return UAuthResultMapper.From(raw); } - public async Task LogoutAllDevicesAdminAsync(UserKey userKey) + public async Task LogoutAllUserDevicesAsync(UserKey userKey) { var raw = await _post.SendJsonAsync(Url($"/admin/users/{userKey.Value}/logout-all")); return UAuthResultMapper.From(raw); diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/BeginMfaSetupRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/BeginMfaSetupRequest.cs deleted file mode 100644 index c14eef0d..00000000 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/BeginMfaSetupRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CodeBeam.UltimateAuth.Users.Contracts; - -public sealed record BeginMfaSetupRequest -{ - public MfaMethod Method { get; init; } -} diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs deleted file mode 100644 index 330e3d65..00000000 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/CompleteMfaSetupRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CodeBeam.UltimateAuth.Users.Contracts; - -public sealed record CompleteMfaSetupRequest -{ - public MfaMethod Method { get; init; } - public required string VerificationCode { get; init; } -} diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DisableMfaRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DisableMfaRequest.cs deleted file mode 100644 index 755a8de7..00000000 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/DisableMfaRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CodeBeam.UltimateAuth.Users.Contracts; - -public sealed record DisableMfaRequest -{ - public MfaMethod? Method { get; init; } // null = all -} diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs deleted file mode 100644 index 956b5b74..00000000 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesAdminRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CodeBeam.UltimateAuth.Core.Domain; - -namespace CodeBeam.UltimateAuth.Users.Contracts; - -public sealed record LogoutOtherDevicesAdminRequest -{ - public required SessionChainId CurrentChainId { get; init; } -} diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesRequest.cs similarity index 76% rename from src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs rename to src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesRequest.cs index f37a8091..ec7763df 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesSelfRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/LogoutOtherDevicesRequest.cs @@ -2,7 +2,7 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public sealed record LogoutOtherDevicesSelfRequest +public sealed record LogoutOtherDevicesRequest { public required SessionChainId CurrentChainId { get; init; } } diff --git a/tests/CodeBeam.UltimateAuth.Tests.Unit/Fake/FakeFlowClient.cs b/tests/CodeBeam.UltimateAuth.Tests.Unit/Fake/FakeFlowClient.cs index 4dda4404..c09a2df2 100644 --- a/tests/CodeBeam.UltimateAuth.Tests.Unit/Fake/FakeFlowClient.cs +++ b/tests/CodeBeam.UltimateAuth.Tests.Unit/Fake/FakeFlowClient.cs @@ -62,6 +62,16 @@ public Task LogoutAllDevicesSelfAsync() throw new NotImplementedException(); } + public Task LogoutAllMyDevicesAsync() + { + throw new NotImplementedException(); + } + + public Task LogoutAllUserDevicesAsync(UserKey userKey) + { + throw new NotImplementedException(); + } + public Task LogoutAsync() { throw new NotImplementedException(); @@ -82,12 +92,12 @@ public Task> LogoutDeviceSelfAsync(LogoutDeviceRequest throw new NotImplementedException(); } - public Task LogoutOtherDevicesAdminAsync(LogoutOtherDevicesAdminRequest request) + public Task> LogoutMyDeviceAsync(LogoutDeviceRequest request) { throw new NotImplementedException(); } - public Task LogoutOtherDevicesAdminAsync(UserKey userKey, LogoutOtherDevicesAdminRequest request) + public Task LogoutMyOtherDevicesAsync() { throw new NotImplementedException(); } @@ -97,6 +107,16 @@ public Task LogoutOtherDevicesSelfAsync() throw new NotImplementedException(); } + public Task> LogoutUserDeviceAsync(UserKey userKey, LogoutDeviceRequest request) + { + throw new NotImplementedException(); + } + + public Task LogoutUserOtherDevicesAsync(UserKey userKey, LogoutOtherDevicesRequest request) + { + throw new NotImplementedException(); + } + public Task NavigateToHubLoginAsync(string authorizationCode, string codeVerifier, string? returnUrl = null) { throw new NotImplementedException(); From 3ca3c6ef6faa9d852bf7aaef59eecc8e9cb40486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Can=20Karag=C3=B6z?= Date: Sun, 29 Mar 2026 13:21:34 +0300 Subject: [PATCH 4/4] Reviewed User Client API --- .../Dialogs/AccountStatusDialog.razor.cs | 4 +- .../Dialogs/CreateUserDialog.razor.cs | 2 +- .../Dialogs/IdentifierDialog.razor.cs | 56 +++++++++---------- .../Components/Dialogs/ProfileDialog.razor.cs | 4 +- .../Components/Dialogs/UserDetailDialog.razor | 4 +- .../Dialogs/UserDetailDialog.razor.cs | 10 ++-- .../Components/Dialogs/UsersDialog.razor.cs | 2 +- .../Components/Pages/Home.razor.cs | 4 +- .../Dialogs/AccountStatusDialog.razor.cs | 4 +- .../Dialogs/CreateUserDialog.razor.cs | 2 +- .../Dialogs/IdentifierDialog.razor.cs | 52 ++++++++--------- .../Components/Dialogs/ProfileDialog.razor.cs | 4 +- .../Components/Dialogs/UserDetailDialog.razor | 4 +- .../Dialogs/UserDetailDialog.razor.cs | 10 ++-- .../Components/Dialogs/UsersDialog.razor.cs | 2 +- .../Components/Pages/Home.razor.cs | 4 +- .../Dialogs/AccountStatusDialog.razor.cs | 4 +- .../Dialogs/CreateUserDialog.razor.cs | 2 +- .../Dialogs/IdentifierDialog.razor.cs | 36 ++++++------ .../Components/Dialogs/ProfileDialog.razor.cs | 4 +- .../Components/Dialogs/UserDetailDialog.razor | 4 +- .../Dialogs/UserDetailDialog.razor.cs | 12 ++-- .../Components/Dialogs/UsersDialog.razor.cs | 2 +- .../Pages/Home.razor.cs | 4 +- ...ispatch.razor => UAuthLoginDispatch.razor} | 0 .../Services/Abstractions/IUserClient.cs | 12 ++-- .../Abstractions/IUserIdentifierClient.cs | 28 +++++----- .../Services/UAuthUserClient.cs | 12 ++-- .../Services/UAuthUserIdentifierClient.cs | 28 +++++----- .../Dtos/AdminAssignableUserStatus.cs | 17 ++++++ ...rStatus.cs => SelfAssignableUserStatus.cs} | 2 +- .../Mappers/UserStatusMapper.cs | 56 ++++++++++++++++++- .../Requests/ChangeUserStatusAdminRequest.cs | 6 +- .../Requests/ChangeUserStatusSelfRequest.cs | 2 +- .../Services/UserApplicationService.cs | 2 +- 35 files changed, 233 insertions(+), 168 deletions(-) rename src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/{UALoginDispatch.razor => UAuthLoginDispatch.razor} (100%) create mode 100644 src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/AdminAssignableUserStatus.cs rename src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/{SelfUserStatus.cs => SelfAssignableUserStatus.cs} (72%) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/AccountStatusDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/AccountStatusDialog.razor.cs index edeedaa0..195f1fbd 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/AccountStatusDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/AccountStatusDialog.razor.cs @@ -31,8 +31,8 @@ You can still active your account later. return; } - ChangeUserStatusSelfRequest request = new() { NewStatus = SelfUserStatus.SelfSuspended }; - var result = await UAuthClient.Users.ChangeStatusSelfAsync(request); + ChangeUserStatusSelfRequest request = new() { NewStatus = SelfAssignableUserStatus.SelfSuspended }; + var result = await UAuthClient.Users.ChangeMyStatusAsync(request); if (result.IsSuccess) { Snackbar.Add("Your account suspended successfully.", Severity.Success); diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CreateUserDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CreateUserDialog.razor.cs index 778ad577..820b1119 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CreateUserDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/CreateUserDialog.razor.cs @@ -37,7 +37,7 @@ private async Task CreateUserAsync() Password = _password }; - var result = await UAuthClient.Users.CreateAdminAsync(request); + var result = await UAuthClient.Users.CreateAsAdminAsync(request); if (!result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs index cd2aae10..67a76cff 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/IdentifierDialog.razor.cs @@ -31,7 +31,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (firstRender) { - var result = await UAuthClient.Identifiers.GetMyIdentifiersAsync(); + var result = await UAuthClient.Identifiers.GetMyAsync(); if (result != null && result.IsSuccess && result.Value != null) { await ReloadAsync(); @@ -56,11 +56,11 @@ private async Task> LoadServerData(GridState CommittedItemChanges(UserIdentifierIn if (UserKey is null) { - result = await UAuthClient.Identifiers.UpdateSelfAsync(updateRequest); + result = await UAuthClient.Identifiers.UpdateMyAsync(updateRequest); } else { - result = await UAuthClient.Identifiers.UpdateAdminAsync(UserKey.Value, updateRequest); + result = await UAuthClient.Identifiers.UpdateUserAsync(UserKey.Value, updateRequest); } if (result.IsSuccess) { - Snackbar.Add("Identifier updated successfully", Severity.Success); + Snackbar.Add("Identifier updated successfully.", Severity.Success); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to update identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to update identifier.", Severity.Error); } await ReloadAsync(); @@ -165,29 +165,29 @@ private async Task AddNewIdentifier() if (UserKey is null) { - result = await UAuthClient.Identifiers.AddSelfAsync(request); + result = await UAuthClient.Identifiers.AddMyAsync(request); } else { - result = await UAuthClient.Identifiers.AddAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.AddUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier added successfully", Severity.Success); + Snackbar.Add("Identifier added successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to add identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to add identifier.", Severity.Error); } } private async Task VerifyAsync(Guid id) { var demoInfo = await DialogService.ShowMessageBoxAsync( - title: "Demo verification", + title: "Demo Verification", markupMessage: (MarkupString) """ This is a demo action.

@@ -208,22 +208,22 @@ This will only mark the identifier as verified in UltimateAuth. if (UserKey is null) { - result = await UAuthClient.Identifiers.VerifySelfAsync(request); + result = await UAuthClient.Identifiers.VerifyMyAsync(request); } else { - result = await UAuthClient.Identifiers.VerifyAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.VerifyUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier verified successfully", Severity.Success); + Snackbar.Add("Identifier verified successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to verify primary identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to verify primary identifier.", Severity.Error); } } @@ -234,22 +234,22 @@ private async Task SetPrimaryAsync(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.SetPrimarySelfAsync(request); + result = await UAuthClient.Identifiers.SetMyPrimaryAsync(request); } else { - result = await UAuthClient.Identifiers.SetPrimaryAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.SetUserPrimaryAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Primary identifier set successfully", Severity.Success); + Snackbar.Add("Primary identifier set successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to set primary identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to set primary identifier.", Severity.Error); } } @@ -260,22 +260,22 @@ private async Task UnsetPrimaryAsync(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.UnsetPrimarySelfAsync(request); + result = await UAuthClient.Identifiers.UnsetMyPrimaryAsync(request); } else { - result = await UAuthClient.Identifiers.UnsetPrimaryAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.UnsetUserPrimaryAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Primary identifier unset successfully", Severity.Success); + Snackbar.Add("Primary identifier unset successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to unset primary identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to unset primary identifier.", Severity.Error); } } @@ -286,22 +286,22 @@ private async Task DeleteIdentifier(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.DeleteSelfAsync(request); + result = await UAuthClient.Identifiers.DeleteMyAsync(request); } else { - result = await UAuthClient.Identifiers.DeleteAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.DeleteUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier deleted successfully", Severity.Success); + Snackbar.Add("Identifier deleted successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to delete identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to delete identifier.", Severity.Error); } } diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ProfileDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ProfileDialog.razor.cs index 868c9c05..955e8e98 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ProfileDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/ProfileDialog.razor.cs @@ -39,7 +39,7 @@ protected override async Task OnInitializedAsync() } else { - result = await UAuthClient.Users.GetProfileAsync(UserKey.Value); + result = await UAuthClient.Users.GetUserAsync(UserKey.Value); } if (result.IsSuccess && result.Value is not null) @@ -96,7 +96,7 @@ private async Task SaveAsync() } else { - result = await UAuthClient.Users.UpdateProfileAsync(UserKey.Value, request); + result = await UAuthClient.Users.UpdateUserAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor index 28bb738d..73fafa48 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor @@ -44,8 +44,8 @@ Status @_user?.Status - - @foreach (var s in Enum.GetValues()) + + @foreach (var s in Enum.GetValues()) { @s } diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor.cs index e5bd3a08..8a1a76a3 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UserDetailDialog.razor.cs @@ -11,7 +11,7 @@ namespace CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore.Components.Dialogs; public partial class UserDetailDialog { private UserView? _user; - private UserStatus _status; + private AdminAssignableUserStatus _status; [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!; @@ -25,12 +25,12 @@ public partial class UserDetailDialog protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - var result = await UAuthClient.Users.GetProfileAsync(UserKey); + var result = await UAuthClient.Users.GetUserAsync(UserKey); if (result.IsSuccess) { _user = result.Value; - _status = _user?.Status ?? UserStatus.Unknown; + _status = _user?.Status.ToAdminAssignableUserStatus() ?? AdminAssignableUserStatus.Unknown; } } @@ -69,12 +69,12 @@ private async Task ChangeStatusAsync() NewStatus = _status }; - var result = await UAuthClient.Users.ChangeStatusAdminAsync(_user.UserKey, request); + var result = await UAuthClient.Users.ChangeUserStatusAsync(_user.UserKey, request); if (result.IsSuccess) { Snackbar.Add("User status updated", Severity.Success); - _user = _user with { Status = _status }; + _user = _user with { Status = _status.ToUserStatus() }; } else { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UsersDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UsersDialog.razor.cs index 2344bdf8..e6807ab6 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UsersDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Dialogs/UsersDialog.razor.cs @@ -36,7 +36,7 @@ private async Task> LoadUsers(GridState state Descending = sort?.Descending ?? false }; - var res = await UAuthClient.Users.QueryUsersAsync(req); + var res = await UAuthClient.Users.QueryAsync(req); if (!res.IsSuccess || res.Value == null) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/Home.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/Home.razor.cs index c5d1da90..ab0018b8 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/Home.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/Home.razor.cs @@ -200,8 +200,8 @@ private DialogParameters GetDialogParameters() private async Task SetAccountActiveAsync() { - ChangeUserStatusSelfRequest request = new() { NewStatus = SelfUserStatus.Active }; - var result = await UAuthClient.Users.ChangeStatusSelfAsync(request); + ChangeUserStatusSelfRequest request = new() { NewStatus = SelfAssignableUserStatus.Active }; + var result = await UAuthClient.Users.ChangeMyStatusAsync(request); if (result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/AccountStatusDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/AccountStatusDialog.razor.cs index 2981e9c5..4fda31ea 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/AccountStatusDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/AccountStatusDialog.razor.cs @@ -31,8 +31,8 @@ You can still active your account later. return; } - ChangeUserStatusSelfRequest request = new() { NewStatus = SelfUserStatus.SelfSuspended }; - var result = await UAuthClient.Users.ChangeStatusSelfAsync(request); + ChangeUserStatusSelfRequest request = new() { NewStatus = SelfAssignableUserStatus.SelfSuspended }; + var result = await UAuthClient.Users.ChangeMyStatusAsync(request); if (result.IsSuccess) { Snackbar.Add("Your account suspended successfully.", Severity.Success); diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CreateUserDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CreateUserDialog.razor.cs index 5986ae68..ec16e78f 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CreateUserDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/CreateUserDialog.razor.cs @@ -37,7 +37,7 @@ private async Task CreateUserAsync() Password = _password }; - var result = await UAuthClient.Users.CreateAdminAsync(request); + var result = await UAuthClient.Users.CreateAsAdminAsync(request); if (!result.IsSuccess) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs index e33d5a21..1a2f0a76 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/IdentifierDialog.razor.cs @@ -31,7 +31,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (firstRender) { - var result = await UAuthClient.Identifiers.GetMyIdentifiersAsync(); + var result = await UAuthClient.Identifiers.GetMyAsync(); if (result != null && result.IsSuccess && result.Value != null) { await ReloadAsync(); @@ -56,11 +56,11 @@ private async Task> LoadServerData(GridState CommittedItemChanges(UserIdentifierIn if (UserKey is null) { - result = await UAuthClient.Identifiers.UpdateSelfAsync(updateRequest); + result = await UAuthClient.Identifiers.UpdateMyAsync(updateRequest); } else { - result = await UAuthClient.Identifiers.UpdateAdminAsync(UserKey.Value, updateRequest); + result = await UAuthClient.Identifiers.UpdateUserAsync(UserKey.Value, updateRequest); } if (result.IsSuccess) { - Snackbar.Add("Identifier updated successfully", Severity.Success); + Snackbar.Add("Identifier updated successfully.", Severity.Success); } else { @@ -165,29 +165,29 @@ private async Task AddNewIdentifier() if (UserKey is null) { - result = await UAuthClient.Identifiers.AddSelfAsync(request); + result = await UAuthClient.Identifiers.AddMyAsync(request); } else { - result = await UAuthClient.Identifiers.AddAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.AddUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier added successfully", Severity.Success); + Snackbar.Add("Identifier added successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to add identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to add identifier.", Severity.Error); } } private async Task VerifyAsync(Guid id) { var demoInfo = await DialogService.ShowMessageBoxAsync( - title: "Demo verification", + title: "Demo Verification", markupMessage: (MarkupString) """ This is a demo action.

@@ -208,22 +208,22 @@ This will only mark the identifier as verified in UltimateAuth. if (UserKey is null) { - result = await UAuthClient.Identifiers.VerifySelfAsync(request); + result = await UAuthClient.Identifiers.VerifyMyAsync(request); } else { - result = await UAuthClient.Identifiers.VerifyAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.VerifyUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier verified successfully", Severity.Success); + Snackbar.Add("Identifier verified successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to verify primary identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to verify primary identifier.", Severity.Error); } } @@ -234,22 +234,22 @@ private async Task SetPrimaryAsync(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.SetPrimarySelfAsync(request); + result = await UAuthClient.Identifiers.SetMyPrimaryAsync(request); } else { - result = await UAuthClient.Identifiers.SetPrimaryAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.SetUserPrimaryAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Primary identifier set successfully", Severity.Success); + Snackbar.Add("Primary identifier set successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to set primary identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to set primary identifier.", Severity.Error); } } @@ -260,22 +260,22 @@ private async Task UnsetPrimaryAsync(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.UnsetPrimarySelfAsync(request); + result = await UAuthClient.Identifiers.UnsetMyPrimaryAsync(request); } else { - result = await UAuthClient.Identifiers.UnsetPrimaryAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.UnsetUserPrimaryAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Primary identifier unset successfully", Severity.Success); + Snackbar.Add("Primary identifier unset successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } else { - Snackbar.Add(result?.ErrorText ?? "Failed to unset primary identifier", Severity.Error); + Snackbar.Add(result?.ErrorText ?? "Failed to unset primary identifier.", Severity.Error); } } @@ -286,16 +286,16 @@ private async Task DeleteIdentifier(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.DeleteSelfAsync(request); + result = await UAuthClient.Identifiers.DeleteMyAsync(request); } else { - result = await UAuthClient.Identifiers.DeleteAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.DeleteUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier deleted successfully", Severity.Success); + Snackbar.Add("Identifier deleted successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ProfileDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ProfileDialog.razor.cs index 364a3eb3..24fd603e 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ProfileDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/ProfileDialog.razor.cs @@ -39,7 +39,7 @@ protected override async Task OnInitializedAsync() } else { - result = await UAuthClient.Users.GetProfileAsync(UserKey.Value); + result = await UAuthClient.Users.GetUserAsync(UserKey.Value); } if (result.IsSuccess && result.Value is not null) @@ -96,7 +96,7 @@ private async Task SaveAsync() } else { - result = await UAuthClient.Users.UpdateProfileAsync(UserKey.Value, request); + result = await UAuthClient.Users.UpdateUserAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor index 4cd64ff5..52b9c527 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor @@ -44,8 +44,8 @@ Status @_user?.Status - - @foreach (var s in Enum.GetValues()) + + @foreach (var s in Enum.GetValues()) { @s } diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor.cs index 0e131d3b..7228a3d2 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UserDetailDialog.razor.cs @@ -11,7 +11,7 @@ namespace CodeBeam.UltimateAuth.Sample.BlazorServer.Components.Dialogs; public partial class UserDetailDialog { private UserView? _user; - private UserStatus _status; + private AdminAssignableUserStatus _status; [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!; @@ -25,12 +25,12 @@ public partial class UserDetailDialog protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - var result = await UAuthClient.Users.GetProfileAsync(UserKey); + var result = await UAuthClient.Users.GetUserAsync(UserKey); if (result.IsSuccess) { _user = result.Value; - _status = _user?.Status ?? UserStatus.Unknown; + _status = _user?.Status.ToAdminAssignableUserStatus() ?? AdminAssignableUserStatus.Unknown; } } @@ -69,12 +69,12 @@ private async Task ChangeStatusAsync() NewStatus = _status }; - var result = await UAuthClient.Users.ChangeStatusAdminAsync(_user.UserKey, request); + var result = await UAuthClient.Users.ChangeUserStatusAsync(_user.UserKey, request); if (result.IsSuccess) { Snackbar.Add("User status updated", Severity.Success); - _user = _user with { Status = _status }; + _user = _user with { Status = _status.ToUserStatus() }; } else { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UsersDialog.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UsersDialog.razor.cs index 7fc91cc2..3168085d 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UsersDialog.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Dialogs/UsersDialog.razor.cs @@ -36,7 +36,7 @@ private async Task> LoadUsers(GridState state Descending = sort?.Descending ?? false }; - var res = await UAuthClient.Users.QueryUsersAsync(req); + var res = await UAuthClient.Users.QueryAsync(req); if (!res.IsSuccess || res.Value == null) { diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor.cs b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor.cs index b25944b1..3faeca19 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor.cs +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor.cs @@ -200,8 +200,8 @@ private DialogParameters GetDialogParameters() private async Task SetAccountActiveAsync() { - ChangeUserStatusSelfRequest request = new() { NewStatus = SelfUserStatus.Active }; - var result = await UAuthClient.Users.ChangeStatusSelfAsync(request); + ChangeUserStatusSelfRequest request = new() { NewStatus = SelfAssignableUserStatus.Active }; + var result = await UAuthClient.Users.ChangeMyStatusAsync(request); if (result.IsSuccess) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/AccountStatusDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/AccountStatusDialog.razor.cs index a4f18940..0bd13951 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/AccountStatusDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/AccountStatusDialog.razor.cs @@ -31,8 +31,8 @@ You can still active your account later. return; } - ChangeUserStatusSelfRequest request = new() { NewStatus = SelfUserStatus.SelfSuspended }; - var result = await UAuthClient.Users.ChangeStatusSelfAsync(request); + ChangeUserStatusSelfRequest request = new() { NewStatus = SelfAssignableUserStatus.SelfSuspended }; + var result = await UAuthClient.Users.ChangeMyStatusAsync(request); if (result.IsSuccess) { Snackbar.Add("Your account suspended successfully.", Severity.Success); diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CreateUserDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CreateUserDialog.razor.cs index a1ac5b5c..61aa56fb 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CreateUserDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/CreateUserDialog.razor.cs @@ -37,7 +37,7 @@ private async Task CreateUserAsync() Password = _password }; - var result = await UAuthClient.Users.CreateAdminAsync(request); + var result = await UAuthClient.Users.CreateAsAdminAsync(request); if (!result.IsSuccess) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs index deac5511..d0e89b89 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/IdentifierDialog.razor.cs @@ -33,7 +33,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (firstRender) { _loaded = true; - var result = await UAuthClient.Identifiers.GetMyIdentifiersAsync(); + var result = await UAuthClient.Identifiers.GetMyAsync(); if (result != null && result.IsSuccess && result.Value != null) { await ReloadAsync(); @@ -58,11 +58,11 @@ private async Task> LoadServerData(GridState CommittedItemChanges(UserIdentifierIn if (UserKey is null) { - result = await UAuthClient.Identifiers.UpdateSelfAsync(updateRequest); + result = await UAuthClient.Identifiers.UpdateMyAsync(updateRequest); } else { - result = await UAuthClient.Identifiers.UpdateAdminAsync(UserKey.Value, updateRequest); + result = await UAuthClient.Identifiers.UpdateUserAsync(UserKey.Value, updateRequest); } if (result.IsSuccess) @@ -167,11 +167,11 @@ private async Task AddNewIdentifier() if (UserKey is null) { - result = await UAuthClient.Identifiers.AddSelfAsync(request); + result = await UAuthClient.Identifiers.AddMyAsync(request); } else { - result = await UAuthClient.Identifiers.AddAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.AddUserAsync(UserKey.Value, request); } if (result.IsSuccess) @@ -210,11 +210,11 @@ This will only mark the identifier as verified in UltimateAuth. if (UserKey is null) { - result = await UAuthClient.Identifiers.VerifySelfAsync(request); + result = await UAuthClient.Identifiers.VerifyMyAsync(request); } else { - result = await UAuthClient.Identifiers.VerifyAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.VerifyUserAsync(UserKey.Value, request); } if (result.IsSuccess) @@ -236,16 +236,16 @@ private async Task SetPrimaryAsync(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.SetPrimarySelfAsync(request); + result = await UAuthClient.Identifiers.SetMyPrimaryAsync(request); } else { - result = await UAuthClient.Identifiers.SetPrimaryAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.SetUserPrimaryAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Primary identifier set successfully", Severity.Success); + Snackbar.Add("Primary identifier set successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } @@ -262,16 +262,16 @@ private async Task UnsetPrimaryAsync(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.UnsetPrimarySelfAsync(request); + result = await UAuthClient.Identifiers.UnsetMyPrimaryAsync(request); } else { - result = await UAuthClient.Identifiers.UnsetPrimaryAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.UnsetUserPrimaryAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Primary identifier unset successfully", Severity.Success); + Snackbar.Add("Primary identifier unset successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } @@ -288,16 +288,16 @@ private async Task DeleteIdentifier(Guid id) if (UserKey is null) { - result = await UAuthClient.Identifiers.DeleteSelfAsync(request); + result = await UAuthClient.Identifiers.DeleteMyAsync(request); } else { - result = await UAuthClient.Identifiers.DeleteAdminAsync(UserKey.Value, request); + result = await UAuthClient.Identifiers.DeleteUserAsync(UserKey.Value, request); } if (result.IsSuccess) { - Snackbar.Add("Identifier deleted successfully", Severity.Success); + Snackbar.Add("Identifier deleted successfully.", Severity.Success); await ReloadAsync(); StateHasChanged(); } diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ProfileDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ProfileDialog.razor.cs index 2117a915..c0442702 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ProfileDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/ProfileDialog.razor.cs @@ -40,7 +40,7 @@ protected override async Task OnInitializedAsync() } else { - result = await UAuthClient.Users.GetProfileAsync(UserKey.Value); + result = await UAuthClient.Users.GetUserAsync(UserKey.Value); } if (result.IsSuccess && result.Value is not null) @@ -98,7 +98,7 @@ private async Task SaveAsync() } else { - result = await UAuthClient.Users.UpdateProfileAsync(UserKey.Value, request); + result = await UAuthClient.Users.UpdateUserAsync(UserKey.Value, request); } if (result.IsSuccess) diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor index 3a950e53..b8f511f8 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor @@ -44,8 +44,8 @@ Status @_user?.Status - - @foreach (var s in Enum.GetValues()) + + @foreach (var s in Enum.GetValues()) { @s } diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor.cs index c917f086..5d3e3455 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UserDetailDialog.razor.cs @@ -11,7 +11,7 @@ namespace CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm.Components.Dialogs; public partial class UserDetailDialog { private UserView? _user; - private UserStatus _status; + private AdminAssignableUserStatus _status; [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!; @@ -25,12 +25,12 @@ public partial class UserDetailDialog protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - var result = await UAuthClient.Users.GetProfileAsync(UserKey); + var result = await UAuthClient.Users.GetUserAsync(UserKey); if (result.IsSuccess) { _user = result.Value; - _status = _user?.Status ?? UserStatus.Unknown; + _status = _user?.Status.ToAdminAssignableUserStatus() ?? AdminAssignableUserStatus.Unknown; } } @@ -66,15 +66,15 @@ private async Task ChangeStatusAsync() ChangeUserStatusAdminRequest request = new() { - NewStatus = _status + NewStatus = _status, }; - var result = await UAuthClient.Users.ChangeStatusAdminAsync(_user.UserKey, request); + var result = await UAuthClient.Users.ChangeUserStatusAsync(_user.UserKey, request); if (result.IsSuccess) { Snackbar.Add("User status updated", Severity.Success); - _user = _user with { Status = _status }; + _user = _user with { Status = _status.ToUserStatus() }; } else { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UsersDialog.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UsersDialog.razor.cs index 31aa7e68..a215a013 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UsersDialog.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Components/Dialogs/UsersDialog.razor.cs @@ -48,7 +48,7 @@ private async Task> LoadUsers(GridState state Descending = sort?.Descending ?? false }; - var res = await UAuthClient.Users.QueryUsersAsync(req); + var res = await UAuthClient.Users.QueryAsync(req); if (!res.IsSuccess || res.Value == null) { diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/Home.razor.cs b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/Home.razor.cs index 9ee407b9..6c8122d8 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/Home.razor.cs +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/Home.razor.cs @@ -205,8 +205,8 @@ private DialogParameters GetDialogParameters() private async Task SetAccountActiveAsync() { - ChangeUserStatusSelfRequest request = new() { NewStatus = SelfUserStatus.Active }; - var result = await UAuthClient.Users.ChangeStatusSelfAsync(request); + ChangeUserStatusSelfRequest request = new() { NewStatus = SelfAssignableUserStatus.Active }; + var result = await UAuthClient.Users.ChangeMyStatusAsync(request); if (result.IsSuccess) { diff --git a/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/UALoginDispatch.razor b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/UAuthLoginDispatch.razor similarity index 100% rename from src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/UALoginDispatch.razor rename to src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/UAuthLoginDispatch.razor diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserClient.cs index c4f10ce0..3034f685 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserClient.cs @@ -6,17 +6,17 @@ namespace CodeBeam.UltimateAuth.Client.Services; public interface IUserClient { - Task>> QueryUsersAsync(UserQuery query); + Task>> QueryAsync(UserQuery query); Task> CreateAsync(CreateUserRequest request); - Task> CreateAdminAsync(CreateUserRequest request); - Task> ChangeStatusSelfAsync(ChangeUserStatusSelfRequest request); - Task> ChangeStatusAdminAsync(UserKey userKey, ChangeUserStatusAdminRequest request); + Task> CreateAsAdminAsync(CreateUserRequest request); + Task> ChangeMyStatusAsync(ChangeUserStatusSelfRequest request); + Task> ChangeUserStatusAsync(UserKey userKey, ChangeUserStatusAdminRequest request); Task DeleteMeAsync(); Task> DeleteUserAsync(UserKey userKey, DeleteUserRequest request); Task> GetMeAsync(); Task UpdateMeAsync(UpdateProfileRequest request); - Task> GetProfileAsync(UserKey userKey); - Task UpdateProfileAsync(UserKey userKey, UpdateProfileRequest request); + Task> GetUserAsync(UserKey userKey); + Task UpdateUserAsync(UserKey userKey, UpdateProfileRequest request); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserIdentifierClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserIdentifierClient.cs index 9b1ee616..6ce76868 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserIdentifierClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/Abstractions/IUserIdentifierClient.cs @@ -6,19 +6,19 @@ namespace CodeBeam.UltimateAuth.Client.Services; public interface IUserIdentifierClient { - Task>> GetMyIdentifiersAsync(PageRequest? request = null); - Task AddSelfAsync(AddUserIdentifierRequest request); - Task UpdateSelfAsync(UpdateUserIdentifierRequest request); - Task SetPrimarySelfAsync(SetPrimaryUserIdentifierRequest request); - Task UnsetPrimarySelfAsync(UnsetPrimaryUserIdentifierRequest request); - Task VerifySelfAsync(VerifyUserIdentifierRequest request); - Task DeleteSelfAsync(DeleteUserIdentifierRequest request); + Task>> GetMyAsync(PageRequest? request = null); + Task AddMyAsync(AddUserIdentifierRequest request); + Task UpdateMyAsync(UpdateUserIdentifierRequest request); + Task SetMyPrimaryAsync(SetPrimaryUserIdentifierRequest request); + Task UnsetMyPrimaryAsync(UnsetPrimaryUserIdentifierRequest request); + Task VerifyMyAsync(VerifyUserIdentifierRequest request); + Task DeleteMyAsync(DeleteUserIdentifierRequest request); - Task>> GetUserIdentifiersAsync(UserKey userKey, PageRequest? request = null); - Task AddAdminAsync(UserKey userKey, AddUserIdentifierRequest request); - Task UpdateAdminAsync(UserKey userKey, UpdateUserIdentifierRequest request); - Task SetPrimaryAdminAsync(UserKey userKey, SetPrimaryUserIdentifierRequest request); - Task UnsetPrimaryAdminAsync(UserKey userKey, UnsetPrimaryUserIdentifierRequest request); - Task VerifyAdminAsync(UserKey userKey, VerifyUserIdentifierRequest request); - Task DeleteAdminAsync(UserKey userKey, DeleteUserIdentifierRequest request); + Task>> GetUserAsync(UserKey userKey, PageRequest? request = null); + Task AddUserAsync(UserKey userKey, AddUserIdentifierRequest request); + Task UpdateUserAsync(UserKey userKey, UpdateUserIdentifierRequest request); + Task SetUserPrimaryAsync(UserKey userKey, SetPrimaryUserIdentifierRequest request); + Task UnsetUserPrimaryAsync(UserKey userKey, UnsetPrimaryUserIdentifierRequest request); + Task VerifyUserAsync(UserKey userKey, VerifyUserIdentifierRequest request); + Task DeleteUserAsync(UserKey userKey, DeleteUserIdentifierRequest request); } diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserClient.cs index 38b7e610..001afe2e 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserClient.cs @@ -49,7 +49,7 @@ public async Task DeleteMeAsync() return UAuthResultMapper.From(raw); } - public async Task>> QueryUsersAsync(UserQuery query) + public async Task>> QueryAsync(UserQuery query) { query ??= new UserQuery(); var raw = await _request.SendJsonAsync(Url("/admin/users/query"), query); @@ -62,13 +62,13 @@ public async Task> CreateAsync(CreateUserRequest r return UAuthResultMapper.FromJson(raw); } - public async Task> CreateAdminAsync(CreateUserRequest request) + public async Task> CreateAsAdminAsync(CreateUserRequest request) { var raw = await _request.SendJsonAsync(Url("/admin/users/create"), request); return UAuthResultMapper.FromJson(raw); } - public async Task> ChangeStatusSelfAsync(ChangeUserStatusSelfRequest request) + public async Task> ChangeMyStatusAsync(ChangeUserStatusSelfRequest request) { var raw = await _request.SendJsonAsync(Url("/me/status"), request); if (raw.Ok) @@ -78,7 +78,7 @@ public async Task> ChangeStatusSelfAsync(Cha return UAuthResultMapper.FromJson(raw); } - public async Task> ChangeStatusAdminAsync(UserKey userKey, ChangeUserStatusAdminRequest request) + public async Task> ChangeUserStatusAsync(UserKey userKey, ChangeUserStatusAdminRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/status"), request); return UAuthResultMapper.FromJson(raw); @@ -90,13 +90,13 @@ public async Task> DeleteUserAsync(UserKey userKey return UAuthResultMapper.FromJson(raw); } - public async Task> GetProfileAsync(UserKey userKey) + public async Task> GetUserAsync(UserKey userKey) { var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/profile/get")); return UAuthResultMapper.FromJson(raw); } - public async Task UpdateProfileAsync(UserKey userKey, UpdateProfileRequest request) + public async Task UpdateUserAsync(UserKey userKey, UpdateProfileRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/profile/update"), request); return UAuthResultMapper.From(raw); diff --git a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserIdentifierClient.cs b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserIdentifierClient.cs index 15d6593f..d6313944 100644 --- a/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserIdentifierClient.cs +++ b/src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserIdentifierClient.cs @@ -23,14 +23,14 @@ public UAuthUserIdentifierClient(IUAuthRequestClient request, IUAuthClientEvents private string Url(string path) => UAuthUrlBuilder.Build(_options.Endpoints.BasePath, path, _options.MultiTenant); - public async Task>> GetMyIdentifiersAsync(PageRequest? request = null) + public async Task>> GetMyAsync(PageRequest? request = null) { request ??= new PageRequest(); var raw = await _request.SendJsonAsync(Url("/me/identifiers/get"), request); return UAuthResultMapper.FromJson>(raw); } - public async Task AddSelfAsync(AddUserIdentifierRequest request) + public async Task AddMyAsync(AddUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url("/me/identifiers/add"), request); if (raw.Ok) @@ -40,7 +40,7 @@ public async Task AddSelfAsync(AddUserIdentifierRequest request) return UAuthResultMapper.From(raw); } - public async Task UpdateSelfAsync(UpdateUserIdentifierRequest request) + public async Task UpdateMyAsync(UpdateUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url("/me/identifiers/update"), request); if (raw.Ok) @@ -50,7 +50,7 @@ public async Task UpdateSelfAsync(UpdateUserIdentifierRequest reque return UAuthResultMapper.From(raw); } - public async Task SetPrimarySelfAsync(SetPrimaryUserIdentifierRequest request) + public async Task SetMyPrimaryAsync(SetPrimaryUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url("/me/identifiers/set-primary"), request); if (raw.Ok) @@ -60,7 +60,7 @@ public async Task SetPrimarySelfAsync(SetPrimaryUserIdentifierReque return UAuthResultMapper.From(raw); } - public async Task UnsetPrimarySelfAsync(UnsetPrimaryUserIdentifierRequest request) + public async Task UnsetMyPrimaryAsync(UnsetPrimaryUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url("/me/identifiers/unset-primary"), request); if (raw.Ok) @@ -70,7 +70,7 @@ public async Task UnsetPrimarySelfAsync(UnsetPrimaryUserIdentifierR return UAuthResultMapper.From(raw); } - public async Task VerifySelfAsync(VerifyUserIdentifierRequest request) + public async Task VerifyMyAsync(VerifyUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url("/me/identifiers/verify"), request); if (raw.Ok) @@ -80,7 +80,7 @@ public async Task VerifySelfAsync(VerifyUserIdentifierRequest reque return UAuthResultMapper.From(raw); } - public async Task DeleteSelfAsync(DeleteUserIdentifierRequest request) + public async Task DeleteMyAsync(DeleteUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url("/me/identifiers/delete"), request); if (raw.Ok) @@ -90,44 +90,44 @@ public async Task DeleteSelfAsync(DeleteUserIdentifierRequest reque return UAuthResultMapper.From(raw); } - public async Task>> GetUserIdentifiersAsync(UserKey userKey, PageRequest? request = null) + public async Task>> GetUserAsync(UserKey userKey, PageRequest? request = null) { request ??= new PageRequest(); var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/get"), request); return UAuthResultMapper.FromJson>(raw); } - public async Task AddAdminAsync(UserKey userKey, AddUserIdentifierRequest request) + public async Task AddUserAsync(UserKey userKey, AddUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/add"), request); return UAuthResultMapper.From(raw); } - public async Task UpdateAdminAsync(UserKey userKey, UpdateUserIdentifierRequest request) + public async Task UpdateUserAsync(UserKey userKey, UpdateUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/update"), request); return UAuthResultMapper.From(raw); } - public async Task SetPrimaryAdminAsync(UserKey userKey, SetPrimaryUserIdentifierRequest request) + public async Task SetUserPrimaryAsync(UserKey userKey, SetPrimaryUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/set-primary"), request); return UAuthResultMapper.From(raw); } - public async Task UnsetPrimaryAdminAsync(UserKey userKey, UnsetPrimaryUserIdentifierRequest request) + public async Task UnsetUserPrimaryAsync(UserKey userKey, UnsetPrimaryUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/unset-primary"), request); return UAuthResultMapper.From(raw); } - public async Task VerifyAdminAsync(UserKey userKey, VerifyUserIdentifierRequest request) + public async Task VerifyUserAsync(UserKey userKey, VerifyUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/verify"), request); return UAuthResultMapper.From(raw); } - public async Task DeleteAdminAsync(UserKey userKey, DeleteUserIdentifierRequest request) + public async Task DeleteUserAsync(UserKey userKey, DeleteUserIdentifierRequest request) { var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/delete"), request); return UAuthResultMapper.From(raw); diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/AdminAssignableUserStatus.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/AdminAssignableUserStatus.cs new file mode 100644 index 00000000..035ec61c --- /dev/null +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/AdminAssignableUserStatus.cs @@ -0,0 +1,17 @@ +namespace CodeBeam.UltimateAuth.Users.Contracts; + +public enum AdminAssignableUserStatus +{ + Active = 0, + + Disabled = 20, + Suspended = 30, + + Locked = 40, + RiskHold = 50, + + PendingActivation = 60, + PendingVerification = 70, + + Unknown = 100 +} diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/SelfUserStatus.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/SelfAssignableUserStatus.cs similarity index 72% rename from src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/SelfUserStatus.cs rename to src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/SelfAssignableUserStatus.cs index 752fc7eb..2ceed312 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/SelfUserStatus.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Dtos/SelfAssignableUserStatus.cs @@ -1,6 +1,6 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; -public enum SelfUserStatus +public enum SelfAssignableUserStatus { Active = 0, SelfSuspended = 10, diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Mappers/UserStatusMapper.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Mappers/UserStatusMapper.cs index b1b30e2b..2effff52 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Mappers/UserStatusMapper.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Mappers/UserStatusMapper.cs @@ -4,16 +4,66 @@ namespace CodeBeam.UltimateAuth.Users.Contracts; public static class UserStatusMapper { - public static UserStatus ToUserStatus(this SelfUserStatus selfStatus) + public static UserStatus ToUserStatus(this SelfAssignableUserStatus selfStatus) { switch (selfStatus) { - case SelfUserStatus.Active: + case SelfAssignableUserStatus.Active: return UserStatus.Active; - case SelfUserStatus.SelfSuspended: + case SelfAssignableUserStatus.SelfSuspended: return UserStatus.SelfSuspended; default: throw new NotImplementedException(); } } + + public static UserStatus ToUserStatus(this AdminAssignableUserStatus status) + { + switch (status) + { + case AdminAssignableUserStatus.Active: + return UserStatus.Active; + case AdminAssignableUserStatus.Suspended: + return UserStatus.Suspended; + case AdminAssignableUserStatus.Disabled: + return UserStatus.Disabled; + case AdminAssignableUserStatus.Locked: + return UserStatus.Locked; + case AdminAssignableUserStatus.RiskHold: + return UserStatus.RiskHold; + case AdminAssignableUserStatus.PendingActivation: + return UserStatus.PendingActivation; + case AdminAssignableUserStatus.PendingVerification: + return UserStatus.PendingActivation; + case AdminAssignableUserStatus.Unknown: + return UserStatus.Unknown; + default: + throw new NotImplementedException(); + } + } + + public static AdminAssignableUserStatus ToAdminAssignableUserStatus(this UserStatus status) + { + switch (status) + { + case UserStatus.Active: + return AdminAssignableUserStatus.Active; + case UserStatus.Suspended: + return AdminAssignableUserStatus.Suspended; + case UserStatus.Disabled: + return AdminAssignableUserStatus.Disabled; + case UserStatus.Locked: + return AdminAssignableUserStatus.Locked; + case UserStatus.RiskHold: + return AdminAssignableUserStatus.RiskHold; + case UserStatus.PendingActivation: + return AdminAssignableUserStatus.PendingActivation; + case UserStatus.PendingVerification: + return AdminAssignableUserStatus.PendingActivation; + case UserStatus.Unknown: + return AdminAssignableUserStatus.Unknown; + default: + throw new NotImplementedException(); + } + } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs index 17315bb8..68e33657 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusAdminRequest.cs @@ -1,8 +1,6 @@ -using CodeBeam.UltimateAuth.Core.Contracts; - -namespace CodeBeam.UltimateAuth.Users.Contracts; +namespace CodeBeam.UltimateAuth.Users.Contracts; public sealed record ChangeUserStatusAdminRequest { - public required UserStatus NewStatus { get; init; } + public required AdminAssignableUserStatus NewStatus { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs index af097266..f19968a2 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Contracts/Requests/ChangeUserStatusSelfRequest.cs @@ -2,5 +2,5 @@ public sealed record ChangeUserStatusSelfRequest { - public required SelfUserStatus NewStatus { get; init; } + public required SelfAssignableUserStatus NewStatus { get; init; } } diff --git a/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs b/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs index c748c36c..aa354974 100644 --- a/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs +++ b/src/users/CodeBeam.UltimateAuth.Users.Reference/Services/UserApplicationService.cs @@ -151,7 +151,7 @@ public async Task ChangeUserStatusAsync(AccessContext context, object request, C var newStatus = request switch { ChangeUserStatusSelfRequest r => UserStatusMapper.ToUserStatus(r.NewStatus), - ChangeUserStatusAdminRequest r => r.NewStatus, + ChangeUserStatusAdminRequest r => UserStatusMapper.ToUserStatus(r.NewStatus), _ => throw new InvalidOperationException("invalid_request") };