Files
tiku-backend.net/Tiku.Api/Modules/System/Auth/Errors/AuthExceptionProblemDetailsMapper.cs

52 lines
2.3 KiB
C#

using Tiku.Api.Middleware;
using Tiku.Api.Controllers;
using Tiku.Application.Auth;
using Tiku.Application.Security;
namespace Tiku.Api.Modules.System.Auth.Errors;
internal sealed class AuthExceptionProblemDetailsMapper : ExceptionProblemDetailsMapper
{
public override IReadOnlyCollection<Type> HandledExceptionTypes { get; } =
[
typeof(AuthorizationSecurityUnavailableException), typeof(AuthException), typeof(OwnerActivationException),
typeof(BrowserOriginException), typeof(FeatureAccessException)
];
public override bool TryMap(Exception exception, out ExceptionProblemDetailsMapping mapping)
{
return exception switch
{
AuthorizationSecurityUnavailableException => Mapped(exception, StatusCodes.Status503ServiceUnavailable,
"auth_security_unavailable", out mapping),
AuthException auth => Mapped(auth, AuthStatus(auth.Code), auth.Code, out mapping),
OwnerActivationException activation => Mapped(activation,
activation.Code == "owner_activation_consumed"
? StatusCodes.Status409Conflict
: StatusCodes.Status400BadRequest, activation.Code, out mapping),
BrowserOriginException => Mapped(exception, StatusCodes.Status403Forbidden, "browser_origin_rejected",
out mapping),
FeatureAccessException feature => Mapped(feature,
feature.Code == "feature_quota_exhausted"
? StatusCodes.Status409Conflict
: StatusCodes.Status403Forbidden, feature.Code, out mapping),
_ => NotMapped(out mapping)
};
}
private static int AuthStatus(string code)
{
return code switch
{
"tenant_access_denied" => StatusCodes.Status403Forbidden,
"auth_session_not_found" => StatusCodes.Status404NotFound,
"current_auth_session_cannot_be_revoked" => StatusCodes.Status409Conflict,
"sms_rate_limited" => StatusCodes.Status429TooManyRequests,
"auth_provider_not_configured" or "auth_security_unavailable" =>
StatusCodes.Status503ServiceUnavailable,
"session_revoked" => StatusCodes.Status401Unauthorized,
_ => StatusCodes.Status401Unauthorized
};
}
}