Submit Worker Architecture
System Overview
┌─────────────────────────────────────────────────────────────────────────┐
│ Michael J Wright Archive - Ingest Flow │
└─────────────────────────────────────────────────────────────────────────┘
User (Non-Technical)
│
│ (Opens browser)
▼
┌──────────────────────────────────────┐
│ Cloudflare Zero Trust Gateway │ ← SSO Authentication
│ (Google, GitHub, or other IdP) │ (Managed via Cloudflare Access)
└──────────────────────────────────────┘
│
│ (Authenticated request)
▼
┌──────────────────────────────────────────────────────────────┐
│ Cloudflare Edge Network │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Submit Worker: submit.michaeljwright.com.au │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ GET / → Serves 6-Step Form UI │ │ │
│ │ │ POST /api/submit → Ingests to Fedora │ │ │
│ │ │ GET /api/validate-id → Check catalog ID avail. │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Features: │ │
│ │ • 6-step wizard form │ │
│ │ • Multi-file upload (100 files, 50MB each) │ │
│ │ • Auto-generate catalog IDs │ │
│ │ • Bulk + individual metadata editing │ │
│ │ • Dublin Core mapping │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
│
│ (Form submission with files + metadata)
▼
┌──────────────────────────────────────────────────────────────┐
│ Fedora 6 Repository (via Cloudflare Tunnel) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ /fcrepo/rest/ │ │
│ │ ├── paintings/ │ │
│ │ │ └── MJW-P-2024-001/ │ │
│ │ ├── drawings/ │ │
│ │ │ └── MJW-D-2024-001/ │ │
│ │ ├── sculptures/ │ │
│ │ │ └── MJW-S-2024-001/ │ │
│ │ ├── photographs/ │ │
│ │ │ └── MJW-PH-2024-001/ │ │
│ │ ├── poems/ │ │
│ │ │ └── MJW-PM-2024-001/ │ │
│ │ └── notebooks/ │ │
│ │ └── MJW-NB-2024-001/ │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
│
│ (Immediate availability)
▼
┌──────────────────────────────────────────────────────────────┐
│ Public Archive & API │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Cloudflare Pages: data.michaeljwright.com.au │ │
│ │ Cloudflare Worker: api.michaeljwright.com.au │ │
│ │ (Browse collections, download files, etc.) │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
Form Flow (6-Step Wizard)
Step 1: Content Type & Series
├─ Select type: P, D, S, PH, PM, NB
├─ Enter series name (optional)
└─ Enter creation year
│
▼
Step 2: Upload Files
├─ Drag-drop zone or file browser
├─ Max 100 files, 50MB each
└─ Real-time file list
│
▼
Step 3: Catalog ID Assignment
├─ Start sequential number
├─ Preview auto-generated IDs
└─ Format: MJW-{TYPE}-{YEAR}-{NNN}
│
▼
Step 4: Bulk Metadata
├─ Description (all files)
├─ Keywords (all files)
├─ Medium/Format (all files)
├─ Dimensions (all files)
└─ Condition (all files)
│
▼
Step 5: Individual Titles & Overrides
├─ Unique title required per file
├─ Optional per-file metadata overrides
└─ Field-by-field customization
│
▼
Step 6: Review & Submit
├─ Summary of all details
└─ Submit to Fedora
│
▼
✅ Files ingested, redirect to archive
Data Flow: Single File Ingestion
FILE: "coastal-sunset.jpg"
METADATA: Title="Coastal Sunset Study", Keywords="Coast, Landscape"
│
▼
GENERATE CATALOG ID
├─ Type: P (Painting)
├─ Year: 2024
├─ Sequential: 001
└─ Result: MJW-P-2024-001
│
▼
MERGE METADATA
├─ Bulk metadata (all files)
├─ Individual overrides (this file)
└─ Result: Complete Dublin Core record
│
▼
CREATE FEDORA CONTAINER
URL: /fcrepo/rest/paintings/mjw-p-2024-001/
Content: {
"dc:title": "MJW-P-2024-001: Coastal Sunset Study",
"dc:creator": "Michael J Wright",
"dc:date": "2024",
"dc:type": "Painting",
"dc:format": "Oil on canvas",
"dc:rights": "Copyright © Michael J Wright. All rights reserved.",
"dc:identifier": "MJW-P-2024-001",
"dc:subject": ["Coast", "Landscape", "Australian art"],
"dc:description": "A coastal landscape...",
"dcterms:series": "Coastal Studies Series",
"mjw:dimensions": "76 x 101 cm",
"mjw:condition": "Excellent"
}
│
▼
UPLOAD BINARY FILE
URL: /fcrepo/rest/paintings/mjw-p-2024-001/coastal-sunset.jpg
Content: [binary image data]
│
▼
✅ File + Metadata in Fedora
Immediately accessible via:
- https://fcrepo.michaeljwright.com.au/fcrepo/rest/paintings/mjw-p-2024-001/
- https://api.michaeljwright.com.au/fcrepo/rest/paintings/mjw-p-2024-001/
Catalog ID Generation Example
Scenario: Batch of 40 coastal paintings, creation year 2024
Input:
Type: P (Painting)
Year: 2024
Starting Number: 001
Files: 40 images
Output: MJW-P-2024-{NNN}
├─ MJW-P-2024-001 ← image-1.jpg
├─ MJW-P-2024-002 ← image-2.jpg
├─ MJW-P-2024-003 ← image-3.jpg
├─ ...
└─ MJW-P-2024-040 ← image-40.jpg
Next submission starts at 041:
├─ MJW-P-2024-041
├─ MJW-P-2024-042
└─ ...
Bulk + Individual Metadata Example
BULK METADATA (Applies to all 40 files):
├─ Description: "Coastal landscape studies from 2024 expedition"
├─ Keywords: "Coast, Landscape, Australian art, Blue Mountains"
├─ Medium: "Oil on canvas"
├─ Dimensions: "76 x 101 cm"
└─ Condition: "Excellent"
INDIVIDUAL OVERRIDES (Example - file 5):
└─ MJW-P-2024-005
├─ Title: "Storm Approaching Byron Bay" ← Custom
├─ Description: null ← Use bulk
├─ Keywords: "Storm, Sky, Dramatic" ← Override
└─ [other fields use bulk]
RESULT (Merged for MJW-P-2024-005):
├─ Title: "MJW-P-2024-005: Storm Approaching Byron Bay"
├─ Description: "Coastal landscape studies from 2024 expedition"
├─ Keywords: ["Storm", "Sky", "Dramatic"]
├─ Medium: "Oil on canvas"
├─ Dimensions: "76 x 101 cm"
└─ Condition: "Excellent"
Deployment Architecture
Developer Workstation
├─ /workers/submit-ingest/
│ ├─ wrangler.toml
│ └─ src/index.js
└─ (git push)
│
▼
GitHub Repository: Rob142857/fedoraMJWArtist
│
▼ (manual or CI/CD)
Cloudflare Dashboard
├─ Account: your@email.com
├─ Zone: michaeljwright.com.au
└─ Worker: mjw-submit-ingest
├─ Route: submit.michaeljwright.com.au/*
└─ Environment: FEDORA_URL, FEDORA_BASIC_AUTH (secret)
│
▼
Cloudflare Edge (Global CDN)
├─ Location: Nearest to user
└─ Executes: submit-ingest worker
│
▼
Fedora 6 (via tunnel)
├─ Container: fcrepo.michaeljwright.com.au
└─ Ingests: Files + Metadata
Security Flow
User Request
│
▼
Cloudflare Access Gateway
├─ Check IdP (Google/GitHub/etc.)
├─ Verify JWT token
└─ Allow/Deny
│ (if allowed)
▼
Worker Route Intercepted
├─ GET / → Serve form
└─ POST /api/submit → Process
│
▼
Fedora Request
├─ Header: Authorization: Basic {FEDORA_BASIC_AUTH}
├─ (secret stored in Cloudflare, not exposed in code)
└─ Create container + upload file
│
▼
✅ Authenticated & Authorized
Integration Points
┌─────────────────────────────────────────────────────────┐
│ Main Archive Site │
│ https://data.michaeljwright.com.au/ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Pages: │ │
│ │ ├─ Hero: "Submit Content" CTA Button │ │
│ │ ├─ Card: "Submit Content" with description │ │
│ │ ├─ Browse Documentation │ │
│ │ └─ Other operational cards │ │
│ └───────────────────────────────────────────────────┘ │
│ ↑ ↓ │
│ [Back link] [Submit link] │
└─────────────────────────────────────────────────────────┘
│
└──── https://submit.michaeljwright.com.au/
Submit Worker
┌───────────────────────────┐
│ 6-Step Form │
│ File Upload │
│ Metadata Editor │
│ Fedora Ingest │
└───────────────────────────┘
File Structure
fedoraDockerCloudflare/
│
├─ workers/
│ └─ submit-ingest/ ← NEW
│ ├─ wrangler.toml ← Worker config (route, vars)
│ ├─ src/
│ │ └─ index.js ← Complete worker logic (~600 lines)
│ └─ package.json ← (generated by npm)
│
├─ pages/
│ └─ index.html ← UPDATED (added submit links)
│
├─ docs/
│ ├─ curators-guide.md
│ ├─ metadata-standards.md
│ └─ [other existing docs]
│
├─ SUBMIT_WORKER_SETUP.md ← NEW (full documentation)
├─ SUBMIT_WORKER_DEPLOYMENT_CHECKLIST.md ← NEW (quick guide)
├─ SUBMIT_WORKER_SUMMARY.md ← NEW (overview + features)
├─ deploy-submit-worker.ps1 ← NEW (deployment script)
│
└─ [other existing files]
Deployment Sequence
1. Developer runs: ./deploy-submit-worker.ps1
│
├─ cd workers/submit-ingest
├─ npm install wrangler
├─ npx wrangler secret put FEDORA_BASIC_AUTH
└─ npx wrangler deploy
│
▼
2. Wrangler publishes to Cloudflare
│
├─ Uploads worker code (index.js)
├─ Sets route: submit.michaeljwright.com.au/*
└─ Activates deployment
│
▼
3. Worker lives on Cloudflare Edge
│
├─ GET requests → Serve form
├─ POST requests → Ingest to Fedora
└─ Available globally
│
▼
✅ submit.michaeljwright.com.au is live
Example Usage
User Journey:
- Discovery: User visits
data.michaeljwright.com.au - Call-to-Action: Clicks "Submit Content" button
- Authentication: Zero Trust validates via Google (example)
- Form Step 1: Selects "Painting", "Coastal Studies Series", "2024"
- Form Step 2: Uploads 40 coastal painting JPEGs via drag-drop
- Form Step 3: Reviews auto-generated IDs (MJW-P-2024-001 through 040)
- Form Step 4: Fills bulk metadata (description, keywords, medium, dimensions)
- Form Step 5: Adds unique title for each painting
- Form Step 6: Reviews and clicks "Submit to Archive"
- Processing: Worker ingests all 40 files to Fedora with auto-generated catalog IDs
- Success: User redirected to archive homepage
- Discovery: Paintings appear in collection within seconds
Result:
- 40 paintings in Fedora
- Full Dublin Core metadata
- Searchable catalog IDs
- Individual metadata customization
- Ready for immediate public access
Architecture Last Updated: November 6, 2025