Files
Deal/src/core/Deal.Api/Http/EndpointResults.cs
T
Rustam Khalimov 410194b0cb Разбить Infrastructure и корень Deal.Api по назначению
Integrations -> Abstractions/Exceptions/Extensions/Models/Options/
Services (включая Storage); Persistence-конфигурации -> Configurations;
корень Deal.Api (оркестратор/планировщики/DTO) -> Services/Dtos.
namespace приведён к путям, using добавлены/дедуплицированы, FQN
обновлены.
2026-09-11 13:20:10 +03:00

64 lines
3.4 KiB
C#

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