37 lines
1.6 KiB
C#
37 lines
1.6 KiB
C#
using PostFundManagement.Application.Services.Shared;
|
|
using static PostFundManagement.Application.Extensions.General;
|
|
using static PostFundManagement.Domain.Extensions.Constants;
|
|
|
|
namespace PostFundManagement.Application.Filters;
|
|
|
|
public sealed class ActiveUserFilter(IdentityService identityService) : IEndpointFilter
|
|
{
|
|
public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
|
|
{
|
|
var principal = context.HttpContext.User;
|
|
|
|
if (principal.Identity is null || !principal.Identity.IsAuthenticated)
|
|
return Results.Unauthorized();
|
|
|
|
var (decoded, userId) = principal.GetUserId();
|
|
var (emailDecoded, email) = principal.GetUserEmail();
|
|
|
|
if (!decoded)
|
|
return Results.Json(new { message = "Invalid user identifier in token." }, statusCode: StatusCodes.Status400BadRequest);
|
|
|
|
if (!emailDecoded)
|
|
return Results.Json(new { message = "Invalid/missing user email in token." }, statusCode: StatusCodes.Status400BadRequest);
|
|
|
|
var path = context.HttpContext.Request.Path.Value;
|
|
|
|
if (!string.IsNullOrWhiteSpace(path) && !path!.EndsWith("integration/sync", StringComparison.InvariantCultureIgnoreCase))
|
|
if ((await identityService.UserIsAuthorisedAsync(userId, context.HttpContext.RequestAborted)).IsFailed)
|
|
return (object?)Results.Json(new { message = "Account approval is pending or inactive." }, statusCode: StatusCodes.Status403Forbidden);
|
|
|
|
context.HttpContext.Items[UserIdItemKey] = userId;
|
|
context.HttpContext.Items[EmailtemKey] = email;
|
|
|
|
return await next(context);
|
|
}
|
|
}
|