ATP - ایجاد سند مبدأ (POST /api/v1/invention-cases/{invention_case_id}/source-documents/)
Endpoint
POST /api/v1/invention-cases/{invention_case_id}/source-documents/
هدف آزمون
آپلود ۱ تا N سند مبدأ، ذخیره در S3 و enqueue استخراج async.
شرایط آزمون
- سرویس core-api در حال اجرا باشد
- هدر Authorization با access token معتبر
- کاربر مجوز update روی پرونده داشته باشد
- S3/MinIO و RabbitMQ در دسترس باشند
- extraction-mock یا info-extraction worker در حال اجرا باشد (محیط local)
فرآیند آزمون
- آمادهسازی فایل(ها) و document_type متناظر
- ارسال multipart/form-data با files و document_types
- دریافت 201 با extraction_request_id برای هر فایل
- poll GET document-extraction-requests/{id} یا workflow-state
- بررسی transition به completed و ready_to_continue
معرفی ویژگی
مرحله اول intake: فایل خام در S3 ذخیره میشود، DocumentExtractionRequest با وضعیت pending ایجاد میشود و رویداد document.extraction.requested (schema_version: 2 + workspace_id) از transactional outbox به RabbitMQ publish میشود. پس از تأیید broker، وضعیت به queued میرود. worker خارجی (info-extraction / extraction-mock) متن استخراجشده را برمیگرداند و Core متن نرمالشده را در S3 مینویسد.
- multipart: فیلد
files(چندفایلی) +document_types(JSON array یا تکرار فیلد) - document_type: invention_description | prior_art_reference | ... (از enum مدل)
- محدودیت batch: تعداد فایل ≤ SOURCE_DOCUMENT_BATCH_UPLOAD_MAX_FILES
- RabbitMQ exchange: patent_genie.events
- routing key: document.extraction.requested
- inbox queue: core.document.extraction.events
- lifecycle: pending → queued (confirm) → completed | needs_review | failed
running: unused — not in status enum
سناریوی آزمون
سناریو 1: مسیر موفق
- ارسال
POST /api/v1/invention-cases/{invention_case_id}/source-documents/ - دریافت پاسخ موفق
- بررسی ساختار پاسخ
سناریو 2: خطا - درخواست نامعتبر
- ارسال درخواست با داده یا شناسه نامعتبر
- دریافت کد خطای 4xx
- بررسی پیام خطای استاندارد API
سناریو 3: آپلود batch دو فایل
- آمادهسازی disclosure.txt و prior_art.pdf
- ارسال ۲ files با ۲ document_types
- دریافت 201 با ۲ extraction_request_id
- poll هر دو تا terminal state
سناریو 4: خطا — document_types ناهمخوان
- ارسال ۲ files ولی ۱ document_type
- دریافت 400
- بررسی پیام "number of document types must match"
قالب API
| مولفه | نوع | نوع داده | اجباری | توضیحات |
|---|---|---|---|---|
| files | Body | file[] | بله | فایلهای آپلود؛ multipart/form-data |
| document_types | Body | string[] | بله | نوع هر فایل؛ تعداد باید با files برابر باشد |
| invention_case_id | Path | uuid | بله | شناسه پرونده اختراع |
Swagger
post:
summary: ایجاد سند مبدأ
responses:
201:
description: منبع ایجاد شد
400:
description: داده ورودی نامعتبر
401:
description: احراز هویت نامعتبر
نمونه ورودی
curl -X POST "http://localhost:8000/api/v1/invention-cases/{invention_case_id}/source-documents/" \
-H "Authorization: Bearer <access>" \
-F "files=@disclosure.txt;type=text/plain" \
-F 'document_types=["invention_description"]'
نمونه خروجی
{
"success": true,
"data": {
"uploads": [
{
"source_document": {
"id": "a1b2c3d4-...",
"original_filename": "disclosure.txt",
"document_type": "invention_description",
"upload_status": "stored",
"extraction_status": "pending"
},
"extraction_request_id": "e5f6g7h8-..."
}
],
"workflow_state": { "revision": 3, "information_collection": { "sub_state": "extracting" } }
}
}
Status Codes
- 201: آپلود و enqueue موفق
- 400: validation (فایل خالی، type نامعتبر، تعداد ناهمخوان)
- 401: احراز هویت نامعتبر
- 403: عدم دسترسی update به پرونده
نتیجه مورد انتظار
201 با آرایه uploads؛ هر آیتم شامل source_document و extraction_request_id. workflow_state.revision افزایش یافته و intake در preparing/extracting است.
روال صحتسنجی
- بررسی 201
- بررسی upload_status=stored
- بررسی extraction_status=pending بلافاصله پس از آپلود
- پس از outbox publisher confirm: extraction_status=queued
- بررسی publish رویداد در outbox (در تست integration) با schema_version=2 و workspace_id
- poll تا extraction_status=completed
توضیحات
- worker پاسخ با document.extraction.completed یا failed میدهد
- ADR-0004 مرجع معماری event-driven document extraction
- در local از extraction-mock استفاده کنید
- exhaustion انتشار با error_code=command_publish_exhausted و امکان re-upload
جریان یکپارچهسازی
1. POST source-documents (multipart)
2. core-api: S3 put + SourceDocument + DocumentExtractionRequest (pending) + command_event_id
3. outbox publisher (confirm) → RabbitMQ: document.extraction.requested
payload: request_id, source_document_id, storage_key, invention_case_id, workspace_id
4. domain → queued
5. info-extraction worker: استخراج متن
6. RabbitMQ: document.extraction.completed | failed
7. core-api inbox (core.document.extraction.events):
- بهروز DocumentExtractionRequest.status (monotonic)
- DocumentProcessingSummary + intake readiness
8. Frontend poll: workflow-state یا GET document-extraction-requests/{id}