Files
pfm/PostFundManagement.Infrastructure/Security/SkorubaUserService.cs
T
2026-10-04 14:31:06 +02:00

82 lines
4.1 KiB
C#

using PostFundManagement.Domain.Abstractions;
using PostFundManagement.Domain.Errors;
using PostFundManagement.Domain.Models.Security;
using static PostFundManagement.Domain.Extensions.Constants;
namespace PostFundManagement.Infrastructure.Security;
public class SkorubaUserService([FromKeyedServices(SkorubaHttpClient)] IHttpClientFactory httpClientFactory) : ISkorubaUserService
{
public async Task<Result<string>> CreateUserAsync(CreateUserRequest request, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result<string>>>)(async () =>
{
var httpClient = httpClientFactory.CreateClient();
var response = await httpClient.PostAsJsonAsync("api/users", request, cancellationToken);
response.EnsureSuccessStatusCode();
var created = await response.Content.ReadFromJsonAsync<UserResponse>(cancellationToken: cancellationToken);
return Result.FailIf(created is null, CreateError.Create("User ID missing from creation response."))
.ToResult(created?.Id!);
}));
public async Task<Result<UserResponse>> GetUserAsync(string userId, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result<UserResponse>>>)(async () =>
{
var httpClient = httpClientFactory.CreateClient();
var result = await httpClient.GetFromJsonAsync<UserResponse>($"api/users/{userId}", cancellationToken);
return Result.FailIf(result is null, NotFoundError.Create($"User {userId} not found."))
.ToResult(result!);
}));
public async Task<Result> UpdateUserAsync(UpdateUserRequest request, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result>>)(async () =>
{
var httpClient = httpClientFactory.CreateClient();
var response = await httpClient.PutAsJsonAsync("api/users", request, cancellationToken);
return Result.OkIf(response.IsSuccessStatusCode, UpdateError.Create("Failed to update user."));
}));
public async Task<Result> SetUserLockoutAsync(string userId, bool disabled, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result>>)(async () =>
{
var httpClient = httpClientFactory.CreateClient();
var user = await httpClient.GetFromJsonAsync<UpdateUserRequest>($"api/users/{userId}", cancellationToken);
if(user is null)
return Result.Fail(NotFoundError.Create($"User {userId} not found."));
var updated = user with
{
LockoutEnabled = true,
LockoutEnd = disabled ? DateTimeOffset.UtcNow.AddYears(100) : null
};
var response = await httpClient.PutAsJsonAsync("api/users", updated, cancellationToken);
return Result.OkIf(response.IsSuccessStatusCode, UpdateError.Create("Failed to update user lockout status."));
}));
public async Task<Result> AddClaimAsync(string userId, string claimType, string claimValue, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result>>)(async () =>
{
var httpClient = httpClientFactory.CreateClient();
var payload = new { UserId = userId, ClaimType = claimType, ClaimValue = claimValue };
var response = await httpClient.PostAsJsonAsync($"api/users/{userId}/claims", payload, cancellationToken);
return Result.OkIf(response.IsSuccessStatusCode, CreateError.Create("Failed to add user claim."));
}));
public async Task<Result> RemoveClaimAsync(string userId, int claimId, CancellationToken cancellationToken = default) =>
await Result.Try((Func<Task<Result>>)(async () =>
{
var httpClient = httpClientFactory.CreateClient();
var response = await httpClient.DeleteAsync($"api/users/{userId}/claims/{claimId}", cancellationToken);
return Result.OkIf(response.IsSuccessStatusCode, CreateError.Create("Failed to remove user claim."));
}));
}