GET /api/v1/agency/rewards-exports/{jobId} — Статус выгрузки и ссылка на скачивание
Опрос задачи Excel-выгрузки вознаграждений, поставленной операцией create-rewards-export.md: текущий статус жизненного цикла и — для завершённой задачи — короткоживущая подписанная ссылка на скачивание файла из приватного объектного хранилища (ADR-0041).
Назначение
Владелец/руководитель агентства после постановки выгрузки опрашивает её статус («готовится» → «готово»)
и получает ссылку на XLSX-файл. Ссылка живёт ограниченное время (1 час) — при истечении клиент повторяет
запрос и получает новую, пока файл не удалён по retention. Feature group — rewards-exports.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | rewards |
| API area | agency |
| Feature group | rewards-exports |
| Статус | draft |
| Документ | docs/06-services/rewards/api/agency/get-rewards-export-job.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (владелец/руководитель агентства) |
| Auth policy / Permissions | rewards.commission.view-all |
| Scope (RBAC) | организация: компания Type ∈ {Agency, Broker, Pin} |
| Record-level | не применяется (доступ на уровне tenant: задача своего агентства) |
| Tenant isolation | TenantId из claims; чужая задача невидима → 404 |
| Audit | выдача ссылки на скачивание — audit-запись ExportSensitive (актор, JobId, время выдачи URL) |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/v1/agency/rewards-exports/{jobId} |
| Success status | 200 |
| Idempotency header | не применяется (read; каждая выдача ссылки генерирует новый signed URL) |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
TenantId | identity claims (tenant_id) | Guid | Да | Required | Tenant isolation |
ActorUserId | identity claims (sub) | Guid | Да | Required | audit выдачи ссылки |
JobId | route {jobId} | Guid | Да | Required, непустой | — |
Модель ответа RewardsExportJobModel
Дом модели — README.md («Общие контрактные модели»). Особенности этого ответа:
DownloadUrl заполняется только при Status = Completed и непросроченном файле — подписанная ссылка
на объектное хранилище с TTL 1 час; в остальных статусах DownloadUrl = null. FailureCode
заполняется только при Status = Failed (например, REWARDS_EXPORT_ROW_LIMIT_EXCEEDED).
Алгоритм
- Контекст и доступ. Операцию выполняет владелец/руководитель агентства; scope — организация
(
TenantIdиз claims); требуется правоrewards.commission.view-all. - Проверка входа и существования.
JobIdнепустой; задача существует в tenant-е агентства — иначеREWARDS_EXPORT_JOB_NOT_FOUND(чужая задача не раскрывается). - Проекция статуса. Возвращается текущее состояние задачи (
Queued/Running/Completed/Failed/Expired). ДляCompleted: если retention файла (7 дней) ещё не истёк — генерируется подписанная ссылка с TTL 1 час,DownloadUrlзаполняется, пишется audit-запись выдачи; если файл уже удалён по retention — задача отдается какExpired,DownloadUrl = null. - Результат.
RewardsExportJobModel→200. Клиент приQueued/Runningповторяет опрос (рекомендованный интервал — 5–10 с); приExpired— ставит новую выгрузку (create-rewards-export.md); приFailed— читаетFailureCodeи сужает фильтры.
Ошибки и failure modes
Общие коды (ValidationError, FORBIDDEN, UNAUTHORIZED) — дом README.md «Общие
ошибки». Дельта операции:
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
REWARDS_EXPORT_JOB_NOT_FOUND | 404 | Задача не существует или принадлежит чужому tenant | «Выгрузка не найдена» | no retry |
Статус Failed самой задачи — не HTTP-ошибка: ответ 200 с Status = Failed и FailureCode
(причины — create-rewards-export.md, «Ошибки»).
Acceptance criteria
- AC-1 (готовый файл). Given задача в
Completed, файл в хранилище (retention не истёк); WhenGET; Then200,Status = Completed,DownloadUrl— подписанная ссылка с TTL 1 час; выдача зафиксирована audit-записьюExportSensitive. - AC-2 (повторная выдача ссылки). Given прежняя ссылка истекла (прошло > 1 часа), файл ещё жив;
When повторный
GET; Then200с новой действующей ссылкой (каждая выдача — новый signed URL и новая audit-запись). - AC-3 (в процессе). Given задача
QueuedилиRunning; WhenGET; Then200, соответствующий статус,DownloadUrl = null; клиент продолжает опрос. - AC-4 (retention истёк). Given с момента готовности файла прошло > 7 дней; When
GET; Then200,Status = Expired,DownloadUrl = null— клиент ставит новую выгрузку. - AC-5 (неуспех генерации). Given задача упала (например, превышен лимит 100 000 строк); When
GET; Then200,Status = Failed,FailureCode = REWARDS_EXPORT_ROW_LIMIT_EXCEEDED,DownloadUrl = null. - AC-6 (чужой tenant). Given
JobIdзадачи другого агентства; WhenGET; ThenREWARDS_EXPORT_JOB_NOT_FOUND(404) — без раскрытия существования.
Совместимость и наблюдаемость
- Новые optional поля модели задачи — additive; новые значения статуса задачи — additive (unknown статус клиент трактует как «в процессе»).
- Logs:
JobId,TenantId,Status, факт выдачи ссылки (сам URL не логируется); metrics:rewards_export_download_url_issued_total; traces: OTel, correlation черезtraceparent. - Скачивание файла идёт напрямую из объектного хранилища по подписанной ссылке — минуя API
rewards(SLA API не зависит от размера файла, ADR-0041).
Обратные ссылки
Автоссылки: где используется этот документ.
- API (2): POST /api/v1/agency/rewards-exports — Постановка Excel-выгрузки вознаграждений агентства, Rewards API — реестр операций и общие контрактные модели
- Use Cases (2): UC-RWD-012. Владелец агентства выгружает отчёты по вознаграждениям в Excel, US-реестр: Владелец агентства (US-OWN-AG)
- Отчёты (2): Отчет/Export: Вознаграждения агентства по сотрудникам и сделкам (agency-rewards-by-employee-per-deal), Отчет/Export: Сводка вознаграждений агентства за период (agency-rewards-period-summary)
- registries (1): Реестр API-методов PIN
- index.md (1): Rewards Service
Связанные документы
- Постановка выгрузки, лимиты и жизненный цикл задачи: create-rewards-export.md.
- Контракты отчётов: ../../reports/agency-rewards-by-employee-per-deal.md, ../../reports/agency-rewards-period-summary.md.
- Модель задачи и общие ошибки: README.md.
- ADR-0041 (signed URL, TTL, retention).