twonly-app/rust/src/database/app/migrations/0005_direct_media_upload.sql
2026-08-31 15:24:18 +02:00

28 lines
1.2 KiB
SQL

CREATE TABLE direct_media_upload_slots (
attachment_id TEXT NOT NULL PRIMARY KEY,
expires_at INTEGER NOT NULL,
maximum_object_bytes INTEGER NOT NULL,
upload_url TEXT NOT NULL,
upload_fields_json TEXT NOT NULL,
capability BLOB NOT NULL,
state TEXT NOT NULL DEFAULT 'cached'
CHECK (state IN ('cached', 'reserved', 'consumed', 'abandoned')),
created_at INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER))
);
CREATE INDEX direct_media_upload_slots_usable_idx
ON direct_media_upload_slots(state, expires_at);
CREATE TABLE direct_media_upload_jobs (
attachment_id TEXT NOT NULL PRIMARY KEY
REFERENCES direct_media_upload_slots(attachment_id) ON DELETE CASCADE,
media_id TEXT NOT NULL,
multipart_path TEXT NOT NULL,
manifest_path TEXT NOT NULL,
complete_body_path TEXT NOT NULL,
native_descriptor_json TEXT NOT NULL,
state TEXT NOT NULL DEFAULT 'prepared'
CHECK (state IN ('prepared', 'scheduled', 'waiting_for_server', 'ready', 'failed')),
expires_at INTEGER NOT NULL,
created_at INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)),
updated_at INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER))
);