Add D1 migration baseline

This commit is contained in:
2026-05-08 17:05:29 -04:00
parent edced5f5c0
commit 0ff5585b96
10 changed files with 383 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
CREATE TABLE IF NOT EXISTS user_devices (
user_id TEXT NOT NULL,
device_id TEXT NOT NULL,
public_key TEXT NOT NULL,
device_name TEXT NOT NULL,
platform TEXT NOT NULL,
approval_status TEXT NOT NULL CHECK (approval_status IN ('pending', 'approved', 'revoked')),
created_at INTEGER NOT NULL,
approved_at INTEGER,
last_active_at INTEGER,
revoked_at INTEGER,
idempotency_key TEXT NOT NULL,
PRIMARY KEY (user_id, device_id),
UNIQUE (user_id, idempotency_key)
);
CREATE INDEX IF NOT EXISTS idx_user_devices_user_active
ON user_devices (user_id, revoked_at, last_active_at);
CREATE TABLE IF NOT EXISTS device_approvals (
user_id TEXT NOT NULL,
approval_id TEXT NOT NULL,
device_id TEXT NOT NULL,
requester_device_id TEXT NOT NULL,
status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired')),
requested_at INTEGER NOT NULL,
decided_at INTEGER,
expires_at INTEGER NOT NULL,
idempotency_key TEXT NOT NULL,
PRIMARY KEY (user_id, approval_id),
UNIQUE (user_id, idempotency_key),
FOREIGN KEY (user_id, device_id) REFERENCES user_devices (user_id, device_id)
);
CREATE INDEX IF NOT EXISTS idx_device_approvals_user_status
ON device_approvals (user_id, status, expires_at);
+62
View File
@@ -0,0 +1,62 @@
CREATE TABLE IF NOT EXISTS sync_objects (
user_id TEXT NOT NULL,
object_id TEXT NOT NULL,
object_type TEXT NOT NULL,
payload_inline BLOB,
payload_r2_key TEXT,
payload_hash TEXT NOT NULL,
schema_rev INTEGER NOT NULL,
logical_clock INTEGER NOT NULL,
device_id TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
deleted_at INTEGER,
PRIMARY KEY (user_id, object_id),
CHECK (payload_inline IS NULL OR payload_r2_key IS NULL),
CHECK (deleted_at IS NOT NULL OR payload_inline IS NOT NULL OR payload_r2_key IS NOT NULL)
);
CREATE INDEX IF NOT EXISTS idx_sync_objects_delta
ON sync_objects (user_id, object_type, logical_clock, updated_at);
CREATE TABLE IF NOT EXISTS sync_change_log (
change_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
object_id TEXT NOT NULL,
object_type TEXT NOT NULL,
operation TEXT NOT NULL CHECK (operation IN ('upsert', 'delete')),
payload_hash TEXT NOT NULL,
logical_clock INTEGER NOT NULL,
device_id TEXT NOT NULL,
created_at INTEGER NOT NULL,
UNIQUE (user_id, object_id, logical_clock, device_id, operation)
);
CREATE INDEX IF NOT EXISTS idx_sync_change_log_pull
ON sync_change_log (user_id, change_id);
CREATE TABLE IF NOT EXISTS sync_snapshots (
user_id TEXT NOT NULL,
snapshot_id TEXT NOT NULL,
r2_key TEXT NOT NULL,
payload_hash TEXT NOT NULL,
schema_rev INTEGER NOT NULL,
logical_clock INTEGER NOT NULL,
device_id TEXT NOT NULL,
size_bytes INTEGER NOT NULL CHECK (size_bytes > 0),
created_at INTEGER NOT NULL,
PRIMARY KEY (user_id, snapshot_id)
);
CREATE INDEX IF NOT EXISTS idx_sync_snapshots_latest
ON sync_snapshots (user_id, created_at);
CREATE TABLE IF NOT EXISTS sync_tombstones (
user_id TEXT NOT NULL,
object_id TEXT NOT NULL,
object_type TEXT NOT NULL,
logical_clock INTEGER NOT NULL,
device_id TEXT NOT NULL,
deleted_at INTEGER NOT NULL,
PRIMARY KEY (user_id, object_id)
);
+44
View File
@@ -0,0 +1,44 @@
CREATE TABLE IF NOT EXISTS plugin_registry (
plugin_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
author TEXT NOT NULL,
permissions_json TEXT NOT NULL,
signature_state TEXT NOT NULL CHECK (signature_state IN ('valid', 'revoked')),
min_ely_build TEXT NOT NULL,
package_r2_key TEXT NOT NULL,
package_sha256 TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
revoked_at INTEGER
);
CREATE INDEX IF NOT EXISTS idx_plugin_registry_signature
ON plugin_registry (signature_state, updated_at);
CREATE TABLE IF NOT EXISTS plugin_packages (
plugin_id TEXT NOT NULL,
package_version TEXT NOT NULL,
r2_key TEXT NOT NULL,
sha256 TEXT NOT NULL,
signature_key_id TEXT NOT NULL,
signature_value TEXT NOT NULL,
size_bytes INTEGER NOT NULL CHECK (size_bytes > 0),
published_at INTEGER NOT NULL,
revoked_at INTEGER,
PRIMARY KEY (plugin_id, package_version),
FOREIGN KEY (plugin_id) REFERENCES plugin_registry (plugin_id)
);
CREATE INDEX IF NOT EXISTS idx_plugin_packages_active
ON plugin_packages (plugin_id, revoked_at, published_at);
CREATE TABLE IF NOT EXISTS plugin_reviews (
review_id TEXT PRIMARY KEY,
plugin_id TEXT NOT NULL,
reviewer_user_id TEXT NOT NULL,
review_status TEXT NOT NULL CHECK (review_status IN ('pending', 'approved', 'rejected')),
notes_hash TEXT,
created_at INTEGER NOT NULL,
decided_at INTEGER,
FOREIGN KEY (plugin_id) REFERENCES plugin_registry (plugin_id)
);
+15
View File
@@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS release_manifests (
channel TEXT NOT NULL CHECK (channel IN ('stable', 'beta', 'nightly')),
platform TEXT NOT NULL,
architecture TEXT NOT NULL,
release_version TEXT NOT NULL,
artifact_r2_key TEXT NOT NULL,
artifact_sha256 TEXT NOT NULL,
artifact_signature TEXT NOT NULL,
size_bytes INTEGER NOT NULL CHECK (size_bytes > 0),
generated_at INTEGER NOT NULL,
PRIMARY KEY (channel, platform, architecture, release_version)
);
CREATE INDEX IF NOT EXISTS idx_release_manifests_latest
ON release_manifests (channel, platform, architecture, generated_at);
+17
View File
@@ -0,0 +1,17 @@
CREATE TABLE IF NOT EXISTS audit_events (
event_id TEXT PRIMARY KEY,
user_id TEXT,
actor_device_id TEXT,
event_type TEXT NOT NULL,
subject_type TEXT NOT NULL,
subject_id TEXT,
outcome TEXT NOT NULL CHECK (outcome IN ('success', 'failure', 'denied')),
metadata_hash TEXT,
created_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_audit_events_user_time
ON audit_events (user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_audit_events_type_time
ON audit_events (event_type, created_at);