- 5 reversible migrations: extensions/enums, tables, indexes, views, config seed - Tables: event, user, session, upload, hashtag, upload_hashtag, comment, comment_hashtag, like, export_job, config - Views: v_feed (uploads with like/comment counts), v_hashtag_counts - Indexes optimised for feed queries, session lookup, hashtag filtering - Config table seeded with default rate limits and quotas - db.rs module: PgPool creation with auto-migration on startup - docker-compose.override.yml: expose db port 5432 for local dev - Fix crate names: async_zip, tower_governor (underscore, not hyphen) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
42 lines
1.1 KiB
SQL
42 lines
1.1 KiB
SQL
-- Feed main query (covers >90% of all DB requests)
|
|
CREATE INDEX idx_upload_event_created
|
|
ON upload(event_id, created_at DESC)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
-- A user's own uploads (quota check, "My Account")
|
|
CREATE INDEX idx_upload_user
|
|
ON upload(user_id)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
-- Comments per upload
|
|
CREATE INDEX idx_comment_upload
|
|
ON comment(upload_id)
|
|
WHERE deleted_at IS NULL;
|
|
|
|
-- Like count per upload
|
|
CREATE INDEX idx_like_upload
|
|
ON "like"(upload_id);
|
|
|
|
-- Hashtag filtering
|
|
CREATE INDEX idx_upload_hashtag_hashtag
|
|
ON upload_hashtag(hashtag_id);
|
|
|
|
CREATE INDEX idx_hashtag_event_tag
|
|
ON hashtag(event_id, tag);
|
|
|
|
-- Session lookup (runs on every authenticated API request)
|
|
CREATE UNIQUE INDEX idx_session_token_hash
|
|
ON session(token_hash);
|
|
|
|
-- Expired session cleanup
|
|
CREATE INDEX idx_session_expires
|
|
ON session(expires_at);
|
|
|
|
-- User lookup for recovery flow
|
|
CREATE INDEX idx_user_event_name
|
|
ON "user"(event_id, display_name);
|
|
|
|
-- Export job status
|
|
CREATE UNIQUE INDEX idx_export_job_event_type
|
|
ON export_job(event_id, type);
|