| Category | Requirement |
|----------|-------------|
| Performance | PDF upload should finish (including virus scan) within 30 seconds for ≤ 150 MB files. |
| Scalability | Storage bucket must support unlimited number of PDFs; API should be stateless, horizontally scalable behind a load balancer. |
| Reliability | Upload operation is transactional – if any step fails (scan, storage, DB write), the system rolls back and returns an error. |
| Observability | Log every upload/rollback with userId, version, fileSize, outcome. Emit metrics: pdf_upload_success_total, pdf_upload_failure_total, pdf_rollback_total. |
| Compliance | PDFs are treated as user‑generated content; retain them for at least 12 months (per content‑retention policy) before auto‑deletion. |
| Internationalisation | All UI strings externalised; default English, ready for translation. |
| Accessibility | WCAG 2.1 AA compliance for the upload modal and version history table. |
| Backup/Recovery | Bucket versioning + daily RDS snapshot of the magazine_pdf table. Provide a one‑click “restore to last snapshot” admin tool. |
| Endpoint | Method | Auth | Request | Response | Description |
|----------|--------|------|---------|----------|-------------|
| /api/v1/magazine/pdf | GET | Public | – | url: string, version: int, uploadedAt: ISO8601, notes?: string | Returns the URL of the current PDF (signed URL valid 5 min). |
| /api/v1/magazine/pdf/upload | POST | Editor or PDF‑Uploader role | multipart/form-data (file + notes field) | version: int, url: string, uploadedAt: ISO8601 | Stores the file, creates a new version, updates the “current” pointer. |
| /api/v1/magazine/pdf/versions | GET | Editor | – | [ version, url, uploadedAt, size, notes, uploadedBy ] | List all historic PDFs. |
| /api/v1/magazine/pdf/rollback/:version | POST | Editor | – | version: int, url: string | Marks the supplied version as current. |
| /api/v1/magazine/pdf/delete/:version | DELETE | Editor | – | success: true | Soft‑delete (marks as archived). Actual file removed by lifecycle policy. |
| /api/v1/magazine/pdf/notify | POST (internal) | Service‑to‑service | version, url | queued: true | Triggers email notification to all subscriber emails (via existing mailer service). | rodox magazine pdf upd
-------------------------------------------------------------
| Rodox Magazine – Issue #7 (Spring 2026) |
|-----------------------------------------------------------|
| 📄 Download PDF (large blue button) |
| |
| ------------------------------------------------------ |
| | ⎈ Replace PDF (only visible to Editors) | |
| ------------------------------------------------------ |
| |
| ------------------------------------------------------ |
| | Version History (Editor view) | |
| ------------------------------------------------------ |
| | v7 | Uploaded 2026‑04‑12 | 24 MB | [Preview] | |
| | v6 | Uploaded 2025‑12‑03 | 22 MB | [Preview] | |
| | ... ... |
| ------------------------------------------------------ |
-------------------------------------------------------------