Michael J Wright Archive Documentation

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:

  1. Discovery: User visits data.michaeljwright.com.au
  2. Call-to-Action: Clicks "Submit Content" button
  3. Authentication: Zero Trust validates via Google (example)
  4. Form Step 1: Selects "Painting", "Coastal Studies Series", "2024"
  5. Form Step 2: Uploads 40 coastal painting JPEGs via drag-drop
  6. Form Step 3: Reviews auto-generated IDs (MJW-P-2024-001 through 040)
  7. Form Step 4: Fills bulk metadata (description, keywords, medium, dimensions)
  8. Form Step 5: Adds unique title for each painting
  9. Form Step 6: Reviews and clicks "Submit to Archive"
  10. Processing: Worker ingests all 40 files to Fedora with auto-generated catalog IDs
  11. Success: User redirected to archive homepage
  12. Discovery: Paintings appear in collection within seconds

Result:


Architecture Last Updated: November 6, 2025