# JSON Upload API v3.0 ## Endpoint `POST /json_upload_v3` ## Description This endpoint allows PWDLV3 (or any compatible client) to submit test data in a standardized JSON v3.0 format to the Report-Generator. The data includes test metadata, configuration for PDF generation, and detailed information about each question, including image URLs. Report-Generator will validate the schema, download images in parallel, store the data, and optionally generate a PDF or provide an edit URL. ## Headers * `Content-Type: application/json` (Required) * `Authorization: Bearer ` (Optional, if authentication is enabled on Report-Generator) ## Request Body The request body must be a JSON object conforming to the following schema: ```json { "type": "object", "properties": { "version": { "type": "string", "const": "3.0", "description": "API version, must be '3.0'" }, "source": { "type": "string", "description": "Source of the data, e.g., 'pwdlv3'", "default": "manual" }, "test_name": { "type": "string", "description": "Name of the test" }, "test_id": { "type": "string", "description": "Unique ID of the test from the source system" }, "test_mapping_id": { "type": "string", "description": "Unique ID for mapping purposes, often same as test_id or a derivative" }, "metadata": { "type": "object", "patternProperties": { ".*": { "type": "string" } }, "description": "Arbitrary key-value metadata for the session" }, "config": { "type": "object", "properties": { "statuses_to_include": { "type": "array", "items": { "type": "string", "enum": ["wrong", "unattempted", "correct"] }, "description": "Question statuses to include in generated reports" }, "layout": { "type": "object", "properties": { "images_per_page": { "type": "integer", "minimum": 1 }, "orientation": { "type": "string", "enum": ["portrait", "landscape"] } }, "required": ["images_per_page", "orientation"] } }, "required": ["statuses_to_include", "layout"] }, "questions": { "type": "array", "items": { "type": "object", "properties": { "question_number": { "type": "string", "description": "Display number for the question" }, "image_url": { "type": "string", "format": "uri", "description": "URL of the question image" }, "status": { "type": "string", "enum": ["wrong", "unattempted", "correct"], "description": "User's attempt status" }, "marked_solution": { "type": "string", "description": "User's marked option/answer" }, "correct_solution": { "type": "string", "description": "Correct option/answer" }, "subject": { "type": "string", "description": "Subject of the question" }, "chapter": { "type": "string", "description": "Chapter of the question" }, "topic": { "type": "string", "description": "Topic of the question" }, "time_taken": { "type": "integer", "minimum": 0, "description": "Time taken by user in seconds" } }, "required": ["question_number", "image_url", "status", "marked_solution", "correct_solution", "subject", "time_taken"] }, "minItems": 1 }, "view": { "type": "boolean", "description": "If true, Report-Generator will auto-generate PDF; if false, returns edit URL." } }, "required": ["version", "source", "test_name", "test_id", "test_mapping_id", "config", "questions", "view"] } ``` ## Response ### Success Response (HTTP 200 OK) ```json { "status": "success", "message": "Data processed successfully", "session_id": "uuid-of-new-session", "edit_url": "/question_entry_v2/uuid-of-new-session", "pdf_url": "/view_pdf/uuid-of-new-session.pdf" // Only if 'view' was true } ``` ### Error Response (HTTP 400 Bad Request / 500 Internal Server Error) ```json { "status": "error", "message": "Detailed error description, e.g., 'Schema validation failed: Missing required field test_id'", "errors": [...] // Optional: specific validation errors } ``` ## Examples ### Curl Example: Submit Test Data for Manual Review This example sends a minimal payload for a single test, opting for manual review in Report-Generator (i.e., `view: false`). ```bash curl -X POST "http://localhost:5000/json_upload_v3" \ -H "Content-Type: application/json" \ -d '{ "version": "3.0", "source": "pwdlv3", "test_name": "Physics Midterm", "test_id": "PHY101-MID-2024", "test_mapping_id": "PHY101-MID-2024-STUDENT001", "metadata": { "student_id": "STU001", "attempt_date": "2024-11-01" }, "config": { "statuses_to_include": ["wrong", "unattempted"], "layout": { "images_per_page": 4, "orientation": "portrait" } }, "questions": [ { "question_number": "1", "image_url": "https://example.com/question1.png", "status": "wrong", "marked_solution": "B", "correct_solution": "C", "subject": "Physics", "time_taken": 90 }, { "question_number": "2", "image_url": "https://example.com/question2.png", "status": "unattempted", "marked_solution": "", "correct_solution": "A", "subject": "Physics", "time_taken": 0 } ], "view": false }' ``` ### Curl Example: Submit Test Data for Auto-PDF Generation This example sends a similar payload but instructs Report-Generator to automatically generate and save the PDF report (`view: true`). ```bash curl -X POST "http://localhost:5000/json_upload_v3" \ -H "Content-Type: application/json" \ -d '{ "version": "3.0", "source": "pwdlv3", "test_name": "Chemistry Final", "test_id": "CHM202-FIN-2024", "test_mapping_id": "CHM202-FIN-2024-STUDENT002", "metadata": { "student_id": "STU002", "attempt_date": "2024-12-05" }, "config": { "statuses_to_include": ["wrong", "unattempted"], "layout": { "images_per_page": 6, "orientation": "landscape" } }, "questions": [ { "question_number": "1", "image_url": "https://example.com/chem_q1.png", "status": "wrong", "marked_solution": "D", "correct_solution": "B", "subject": "Chemistry", "time_taken": 110 } ], "view": true }' ```