/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Application/Models/DocumentJobModels.cs
181 строка
4 KB
IBS\NAfanasev
Field validation, integration tests, UI polish
06 июл 2026, 17:18
06 июл 2026, 17:18
0e936b0
Код
Авторство
О чём код?
using PdfEncoder.Domain.Enums; using PdfEncoder.Domain.Models; namespace PdfEncoder.Application.Models; /// <summary> /// Ошибка job для API. /// </summary> public sealed record JobError { /// <summary> /// Код ошибки. /// </summary> public string Code { get; init; } = string.Empty; /// <summary> /// Сообщение для клиента. /// </summary> public string Message { get; init; } = string.Empty; } /// <summary> /// Ответ API по job документа. /// </summary> public sealed record DocumentJobResponse { /// <summary> /// Идентификатор документа. /// </summary> public Guid DocumentId { get; init; } /// <summary> /// Текущий статус job. /// </summary> public DocumentJobStatus Status { get; init; } /// <summary> /// Время создания job (UTC). /// </summary> public DateTimeOffset CreatedAt { get; init; } /// <summary> /// Время завершения job (UTC). /// </summary> public DateTimeOffset? CompletedAt { get; init; } /// <summary> /// Результат парсинга при Completed. /// </summary> public GenericParseResult? Result { get; init; } /// <summary> /// Ошибка при Failed. /// </summary> public JobError? Error { get; init; } } /// <summary> /// Элемент списка history. /// </summary> public sealed record DocumentListItem { /// <summary> /// Идентификатор документа. /// </summary> public Guid DocumentId { get; init; } /// <summary> /// Исходное имя файла. /// </summary> public string OriginalFileName { get; init; } = string.Empty; /// <summary> /// Определённый тип документа. /// </summary> public string DetectedDocumentType { get; init; } = "unknown"; /// <summary> /// Общая confidence. /// </summary> public double OverallConfidence { get; init; } /// <summary> /// Статус job. /// </summary> public DocumentJobStatus Status { get; init; } /// <summary> /// Время создания (UTC). /// </summary> public DateTimeOffset CreatedAt { get; init; } /// <summary> /// Краткое описание ошибки для UI (только при Failed). /// </summary> public string? ErrorSummary { get; init; } /// <summary> /// Код ошибки (только при Failed). /// </summary> public string? ErrorCode { get; init; } } /// <summary> /// Ответ списка документов. /// </summary> public sealed record DocumentListResponse { /// <summary> /// Элементы страницы. /// </summary> public IReadOnlyList<DocumentListItem> Items { get; init; } = []; /// <summary> /// Общее число записей. /// </summary> public int Total { get; init; } } /// <summary> /// Запрос на создание job. /// </summary> public sealed record SubmitDocumentJobRequest { /// <summary> /// Содержимое PDF. /// </summary> public ReadOnlyMemory<byte> Content { get; init; } /// <summary> /// Имя файла. /// </summary> public string FileName { get; init; } = "document.pdf"; /// <summary> /// Опции парсинга. /// </summary> public ParseOptions Options { get; init; } = new(); } /// <summary> /// Результат submit с HTTP status для controller. /// </summary> public sealed record DocumentJobSubmitResult { /// <summary> /// Ответ API. /// </summary> public DocumentJobResponse Response { get; init; } = null!; /// <summary> /// Рекомендуемый HTTP status (200 или 202). /// </summary> public int StatusCode { get; init; } /// <summary> /// Признак cache hit по ContentHash. /// </summary> public bool FromCache { get; init; } } /// <summary> /// Параметры списка документов. /// </summary> public sealed record ListDocumentsQuery { /// <summary> /// Размер страницы. /// </summary> public int Limit { get; init; } = 20; /// <summary> /// Смещение. /// </summary> public int Offset { get; init; } /// <summary> /// Фильтр по статусу. /// </summary> public DocumentJobStatus? Status { get; init; } }