Files
tiku-backend.net/Tiku.Api/Modules/Student/Content/Errors/ContentExceptionProblemDetailsMapper.cs

96 lines
4.9 KiB
C#

using Tiku.Api.Middleware;
using Tiku.Application.Assets;
using Tiku.Application.Content;
using Tiku.Application.Profile;
using Tiku.Application.QuestionBanks;
using Tiku.Application.Scoreline;
namespace Tiku.Api.Modules.Student.Content.Errors;
internal sealed class ContentExceptionProblemDetailsMapper : ExceptionProblemDetailsMapper
{
public override IReadOnlyCollection<Type> HandledExceptionTypes { get; } =
[
typeof(RequiredFieldException), typeof(ContentNavigationNotFoundException),
typeof(QuestionBankRequiredFieldException),
typeof(QuestionBankNotFoundException), typeof(AssetAccessException), typeof(AssetManagementException),
typeof(VideoPlaybackException), typeof(ContentManagementException), typeof(ScorelineQueryException),
typeof(ProfileException), typeof(ContentV2Exception)
];
public override bool TryMap(Exception exception, out ExceptionProblemDetailsMapping mapping)
{
return exception switch
{
RequiredFieldException => Mapped(exception, StatusCodes.Status400BadRequest, "required_field", out mapping),
ContentNavigationNotFoundException => Mapped(exception, StatusCodes.Status404NotFound,
"content_navigation_not_found", out mapping),
QuestionBankRequiredFieldException => Mapped(exception, StatusCodes.Status400BadRequest, "required_field",
out mapping),
QuestionBankNotFoundException => Mapped(exception, StatusCodes.Status404NotFound, "question_not_found",
out mapping),
AssetAccessException asset => Mapped(asset, AssetAccessStatus(asset.Code), asset.Code.ToLowerInvariant(),
out mapping),
AssetManagementException asset => Mapped(asset, AssetManagementStatus(asset.Code), asset.Code, out mapping),
VideoPlaybackException video => Mapped(video, VideoStatus(video.Code), video.Code, out mapping),
ContentManagementException content => Mapped(content, ContentStatus(content.Code), content.Code, out mapping),
ContentV2Exception content => Mapped(content, ContentV2Status(content.Code), content.Code, out mapping),
ScorelineQueryException scoreline => Mapped(scoreline, StatusCodes.Status400BadRequest, scoreline.Code,
out mapping),
ProfileException profile => Mapped(profile, ProfileStatus(profile.Code), profile.Code, out mapping),
_ => NotMapped(out mapping)
};
}
private static int AssetAccessStatus(string code) => code switch
{
"ASSET_NOT_FOUND" => StatusCodes.Status404NotFound,
"AUTH_REQUIRED" => StatusCodes.Status401Unauthorized,
"ASSET_HIDDEN" or "ASSET_MEMBERSHIP_REQUIRED" or "ASSET_SVIP_REQUIRED" => StatusCodes.Status403Forbidden,
"ASSET_UPLOAD_NOT_VERIFIED" or "ASSET_SECURITY_SCAN_NOT_PASSED" => StatusCodes.Status409Conflict,
_ => StatusCodes.Status400BadRequest
};
private static int AssetManagementStatus(string code) => code switch
{
"asset_not_found" or "import_job_not_found" => StatusCodes.Status404NotFound,
"asset_upload_missing" => StatusCodes.Status409Conflict,
"tenant_content_access_denied" => StatusCodes.Status403Forbidden,
_ => StatusCodes.Status400BadRequest
};
private static int VideoStatus(string code) => code switch
{
"video_access_denied" => StatusCodes.Status403Forbidden,
"video_not_found" or "question_video_not_found" => StatusCodes.Status404NotFound,
_ => StatusCodes.Status400BadRequest
};
private static int ContentStatus(string code) => code switch
{
"entry_not_found" or "node_not_found" or "collection_not_found" or "question_not_found" or
"import_type_invalid" => StatusCodes.Status404NotFound,
"tenant_content_access_denied" => StatusCodes.Status403Forbidden,
_ when code.EndsWith("_not_found", StringComparison.Ordinal) => StatusCodes.Status404NotFound,
_ => StatusCodes.Status400BadRequest
};
private static int ProfileStatus(string code) => code switch
{
"profile_access_denied" => StatusCodes.Status403Forbidden,
"profile_user_not_found" or "check_in_task_not_found" or "region_not_found" or "school_not_found" or
"major_not_found" => StatusCodes.Status404NotFound,
_ when code.EndsWith("_not_found", StringComparison.Ordinal) => StatusCodes.Status404NotFound,
_ => StatusCodes.Status400BadRequest
};
private static int ContentV2Status(string code) => code switch
{
"question_asset_owner_forbidden" => StatusCodes.Status403Forbidden,
"question_exact_duplicate_exists" => StatusCodes.Status409Conflict,
_ when code.EndsWith("_not_found", StringComparison.Ordinal) ||
code.EndsWith("_missing", StringComparison.Ordinal) => StatusCodes.Status404NotFound,
_ => StatusCodes.Status400BadRequest
};
}