36 — TestimonialMediaAsset Model & Processing Pipeline (Blueprint §5.8)
Cursor-ready plan for media storage metadata, processing lifecycle, callback handling, and storefront-readiness guarantees.
36 — TestimonialMediaAsset Model & Processing Pipeline (Blueprint §5.8)
Section titled “36 — TestimonialMediaAsset Model & Processing Pipeline (Blueprint §5.8)”Source: 02-Implementation-Blueprint.md — §5.8 New model: TestimonialMediaAsset.
This document is a build spec only. No code changes are implied until a task references this file.
Related: 06 (public submission/upload), 10 (submission detail preview), 11/05 (published/storefront eligibility), 08 (security), 20 (schema migration flow).
0) Goal (one sentence)
Section titled “0) Goal (one sentence)”Implement a robust media asset model and lifecycle so uploaded customer videos/photos move from raw upload to processing to storefront-ready playback with reliable metadata and failure visibility.
1) Blueprint model recap
Section titled “1) Blueprint model recap”Blueprint §5.8 fields:
idshopIdsubmissionIdstorageProvider// stream | mux | s3storageKeyplaybackUrlthumbnailUrlmimeTypedurationSecwidthheightfileSizeBytesprocessingStatus// uploaded | processing | ready | failedprocessingErrortranscriptText- timestamps
Indexes:
@@index([submissionId])@@index([shopId, processingStatus])
2) Scope boundaries
Section titled “2) Scope boundaries”In scope
Section titled “In scope”- Prisma model + migration
- upload metadata persistence
- processing status transitions
- callback/worker update contract
- storefront-ready eligibility rules
Out of scope
Section titled “Out of scope”- complex transcoding orchestration internals for every provider
- subtitle editor UI
- AI transcript quality improvements
3) Media lifecycle state machine
Section titled “3) Media lifecycle state machine”Canonical processingStatus transitions:
uploadedprocessingreadyorfailed
Rules:
- no direct
uploaded -> readyunless provider guarantees synchronous completion failedmay transition back toprocessingonly via explicit retry flow
Document allowed transitions in constants/helper module.
4) Upload flow contract (public submit integration)
Section titled “4) Upload flow contract (public submit integration)”4.1 At upload-url creation
Section titled “4.1 At upload-url creation”Create provisional asset row (or post-upload row) with:
shopIdsubmissionId(or temporary linkage key if submission row not created yet)storageProviderstorageKeyprocessingStatus='uploaded'- known file hints (
mimeType,fileSizeBytesif available)
4.2 At final submit
Section titled “4.2 At final submit”Ensure TestimonialSubmission links to the created asset.
If submission is created first and asset second, use transaction-safe linkage.
5) Processing worker/callback contract
Section titled “5) Processing worker/callback contract”5.1 Inputs
Section titled “5.1 Inputs”- provider job/callback payload with media identifiers
- asset correlation key (
assetId,storageKey, provider id mapping)
5.2 Outputs
Section titled “5.2 Outputs”Update asset row with:
processingStatusplaybackUrlthumbnailUrldurationSecwidth,heightprocessingErroron failure- optional
transcriptText
5.3 Idempotency
Section titled “5.3 Idempotency”Callbacks may replay. Updates should be idempotent:
- repeated
readyupdate should be safe - ignore stale status regressions (e.g. do not move
readyback toprocessingwithout explicit reprocess intent)
6) Provider abstraction strategy
Section titled “6) Provider abstraction strategy”Support storageProvider enum values from blueprint:
streammuxs3
Recommendation:
- use adapter pattern per provider with common normalize step:
- normalize duration units
- normalize dimensions
- normalize playback URL format
Store only provider-agnostic fields in main table; provider-specific raw payload can be saved in callback logs if needed.
7) Storefront eligibility rules
Section titled “7) Storefront eligibility rules”For any API/widget public response:
only include testimonials where asset is:
processingStatus='ready'playbackUrlpresent for video (or image URL for photo)
If submission is approved/published but asset not ready:
- keep hidden from storefront
- show processing indicator in admin screens
8) Admin UX implications
Section titled “8) Admin UX implications”8.1 Inbox and detail screens
Section titled “8.1 Inbox and detail screens”-
show clear asset state badge:
- Uploaded
- Processing
- Ready
- Failed
-
on failed state:
- show concise error summary (
processingError) - optional “Retry processing” action (future)
- show concise error summary (
8.2 Metadata display
Section titled “8.2 Metadata display”In submission detail:
- duration
- resolution
- file size
- source provider
Use placeholders when metadata not available yet.
9) Security and privacy notes
Section titled “9) Security and privacy notes”storageKeyis internal; do not expose raw key in public API response unless necessary.- Signed upload URLs must be short-lived and never persisted as-is.
transcriptTextmay contain PII; treat as sensitive in logs/export.
Align with 08-security-compliance-and-privacy.md.
10) Performance and storage considerations
Section titled “10) Performance and storage considerations”- Keep file-size values as
BigInt(fileSizeBytes) from blueprint. - Avoid loading transcript text in list queries by default.
- Optional retention policy:
- archive/delete orphaned uploaded assets with no linked submission after N hours.
11) Acceptance criteria
Section titled “11) Acceptance criteria”- New uploads create asset records with valid provider/key linkage.
- Asset transitions
uploaded -> processing -> ready/failedare reflected correctly. - Admin detail view shows metadata when available.
- Storefront API excludes non-ready assets.
- Callback replay does not corrupt final asset state.
12) Suggested implementation order (for Cursor)
Section titled “12) Suggested implementation order (for Cursor)”- Add Prisma model and migration for
TestimonialMediaAsset. - Add upload-url flow persistence hooks.
- Add processing worker/callback endpoint and idempotent updater.
- Integrate readiness predicate into storefront API filters.
- Add admin status/metadata display in inbox/detail.
- Add orphan cleanup task (optional hardening).
13) References
Section titled “13) References”02-Implementation-Blueprint.md— §5.806-public-submission-page-screen-13.md10-submission-detail-screen-6.md05-storefront-widgets-and-read-api.md11-published-content-screen-7.md20-database-design-and-migrations-blueprint-section-5.md
14) Note on numbering
Section titled “14) Note on numbering”This folder already includes 05 through 35 plans. This file is 36-....