using Deal.Api.Services; using Deal.Api.Dtos; namespace Deal.Api.Http; /// /// Общие ответы ошибок минимальных API: HTTP-код + {"detail":"…"} (формат прототипа, Ruling 10). /// /// /// Единая точка для всех Endpoints-файлов (Auth/Settings/Ai-проверка): сообщения деталей — /// фиксированные строки прототипа (FastAPI HTTPException), задаются вызывающим. /// public static class EndpointResults { /// /// 401-ответ: сессия не разрешена/учётные данные не приняты. /// /// Текст ошибки (напр. ). /// JSON-ответ {detail} со статусом 401. public static IResult Unauthorized(string detail) => Results.Json(new { detail }, statusCode: StatusCodes.Status401Unauthorized); /// /// 400-ответ: некорректный запрос (тело/значения). /// /// Текст ошибки. /// JSON-ответ {detail} со статусом 400. public static IResult BadRequest(string detail) => Results.Json(new { detail }, statusCode: StatusCodes.Status400BadRequest); /// /// 404-ответ: ресурс не найден (формат прототипа, Ruling 10). /// /// Текст ошибки. /// JSON-ответ {detail} со статусом 404. public static IResult NotFound(string detail) => Results.Json(new { detail }, statusCode: StatusCodes.Status404NotFound); /// /// 403-ответ: запрос понятен, но доступ запрещён (приостановленный тенант, план Task 7/Ruling 10(5)). /// /// Текст ошибки. /// JSON-ответ {detail} со статусом 403. public static IResult Forbidden(string detail) => Results.Json(new { detail }, statusCode: StatusCodes.Status403Forbidden); /// /// 429-ответ: превышен лимит запросов/попыток входа (план Task 11, Ruling 5: LoginAttemptGuard). /// /// Текст ошибки. /// JSON-ответ {detail} со статусом 429. public static IResult TooManyRequests(string detail) => Results.Json(new { detail }, statusCode: StatusCodes.Status429TooManyRequests); /// /// 410-ответ: ресурс больше недоступен (Ruling 4: файл без objectKey — «Файл не сохранён /// в объектном хранилище»; api-map §1: 410 в списке кодов ошибок прототипа). /// /// Текст ошибки. /// JSON-ответ {detail} со статусом 410. public static IResult Gone(string detail) => Results.Json(new { detail }, statusCode: StatusCodes.Status410Gone); }