Add D1 migration baseline
This commit is contained in:
@@ -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);
|
||||
@@ -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)
|
||||
);
|
||||
@@ -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)
|
||||
);
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user