-- CreateEnum CREATE TYPE "AccountStatus" AS ENUM ('ACTIVE', 'SUSPENDED', 'DELETED'); -- CreateEnum CREATE TYPE "AuthProvider" AS ENUM ('PHONE', 'APPLE', 'WECHAT'); -- CreateEnum CREATE TYPE "ReviewStatus" AS ENUM ('DRAFT', 'REVIEWING', 'REJECTED', 'MANUAL_REVIEW', 'APPROVED'); -- CreateEnum CREATE TYPE "BottlePoolStatus" AS ENUM ('IN_POOL', 'LEASED', 'CONSUMED', 'REMOVED', 'CLOSED'); -- CreateEnum CREATE TYPE "BottlePickLeaseStatus" AS ENUM ('ACTIVE', 'RETURNED', 'EXPIRED', 'CONSUMED'); -- CreateEnum CREATE TYPE "ConversationStatus" AS ENUM ('ACTIVE', 'CLOSED'); -- CreateEnum CREATE TYPE "MessageStatus" AS ENUM ('SENT', 'DELETED', 'MODERATED'); -- CreateEnum CREATE TYPE "ReportStatus" AS ENUM ('PENDING', 'REVIEWING', 'RESOLVED', 'DISMISSED'); -- CreateEnum CREATE TYPE "ModerationTaskStatus" AS ENUM ('PENDING', 'PROCESSING', 'COMPLETED'); -- CreateEnum CREATE TYPE "SanctionType" AS ENUM ('WARNING', 'MUTE', 'SUSPENSION', 'BAN'); -- CreateEnum CREATE TYPE "NotificationStatus" AS ENUM ('PENDING', 'SENT', 'READ', 'FAILED'); -- CreateEnum CREATE TYPE "OutboxStatus" AS ENUM ('PENDING', 'PROCESSING', 'PUBLISHED', 'FAILED'); -- CreateTable CREATE TABLE "accounts" ( "id" UUID NOT NULL, "phone_ciphertext" BYTEA NOT NULL, "phone_hmac" VARCHAR(128) NOT NULL, "status" "AccountStatus" NOT NULL DEFAULT 'ACTIVE', "token_version" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "accounts_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "anonymous_profiles" ( "id" UUID NOT NULL, "account_id" UUID NOT NULL, "public_id" UUID NOT NULL, "nickname" VARCHAR(64) NOT NULL, "avatar_key" VARCHAR(255), "avatar_color" VARCHAR(16) NOT NULL, "bio" VARCHAR(500), "review_status" "ReviewStatus" NOT NULL DEFAULT 'REVIEWING', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "anonymous_profiles_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "auth_identities" ( "id" UUID NOT NULL, "account_id" UUID NOT NULL, "provider" "AuthProvider" NOT NULL, "provider_subject" VARCHAR(255) NOT NULL, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "auth_identities_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "sessions" ( "id" UUID NOT NULL, "account_id" UUID NOT NULL, "refresh_token_hash" VARCHAR(255) NOT NULL, "device_id" VARCHAR(255), "expires_at" TIMESTAMPTZ(3) NOT NULL, "revoked_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "sessions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "bottles" ( "id" UUID NOT NULL, "author_id" UUID NOT NULL, "content_text" TEXT NOT NULL, "review_status" "ReviewStatus" NOT NULL DEFAULT 'DRAFT', "pool_status" "BottlePoolStatus" NOT NULL DEFAULT 'CLOSED', "version" INTEGER NOT NULL DEFAULT 1, "approved_at" TIMESTAMPTZ(3), "consumed_at" TIMESTAMPTZ(3), "expires_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "bottles_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "bottle_pick_leases" ( "id" UUID NOT NULL, "bottle_id" UUID NOT NULL, "picker_id" UUID NOT NULL, "lease_token_hash" VARCHAR(255) NOT NULL, "expires_at" TIMESTAMPTZ(3) NOT NULL, "status" "BottlePickLeaseStatus" NOT NULL DEFAULT 'ACTIVE', "ended_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "bottle_pick_leases_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "bottle_pick_history" ( "id" UUID NOT NULL, "bottle_id" UUID NOT NULL, "picker_id" UUID NOT NULL, "picked_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "bottle_pick_history_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "daily_usage" ( "id" UUID NOT NULL, "account_id" UUID NOT NULL, "usage_date" DATE NOT NULL, "bottles_created" INTEGER NOT NULL DEFAULT 0, "bottles_picked" INTEGER NOT NULL DEFAULT 0, "messages_sent" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "daily_usage_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "conversations" ( "id" UUID NOT NULL, "source_bottle_id" UUID NOT NULL, "status" "ConversationStatus" NOT NULL DEFAULT 'ACTIVE', "next_seq" BIGINT NOT NULL DEFAULT 1, "last_message_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "conversations_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "conversation_members" ( "id" UUID NOT NULL, "conversation_id" UUID NOT NULL, "account_id" UUID NOT NULL, "joined_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "left_at" TIMESTAMPTZ(3), "last_read_seq" BIGINT NOT NULL DEFAULT 0, "peer_alias_snapshot" VARCHAR(64) NOT NULL, "blocked_at" TIMESTAMPTZ(3), CONSTRAINT "conversation_members_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "messages" ( "id" UUID NOT NULL, "conversation_id" UUID NOT NULL, "sender_id" UUID NOT NULL, "client_msg_id" VARCHAR(128) NOT NULL, "seq" BIGINT NOT NULL, "content_text" TEXT NOT NULL, "status" "MessageStatus" NOT NULL DEFAULT 'SENT', "review_status" "ReviewStatus" NOT NULL DEFAULT 'REVIEWING', "sent_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "recalled_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "messages_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "blocks" ( "id" UUID NOT NULL, "blocker_id" UUID NOT NULL, "blocked_id" UUID NOT NULL, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "blocks_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "reports" ( "id" UUID NOT NULL, "reporter_id" UUID NOT NULL, "reported_account_id" UUID, "bottle_id" UUID, "conversation_id" UUID, "message_id" UUID, "reason" VARCHAR(100) NOT NULL, "details" TEXT, "target_snapshot" JSONB NOT NULL, "resolution" TEXT, "status" "ReportStatus" NOT NULL DEFAULT 'PENDING', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "reports_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "moderation_tasks" ( "id" UUID NOT NULL, "target_type" VARCHAR(50) NOT NULL, "target_id" UUID NOT NULL, "provider" VARCHAR(100) NOT NULL, "result" JSONB, "risk_labels" TEXT[], "payload_hash" VARCHAR(128) NOT NULL, "report_id" UUID, "assigned_to_id" UUID, "status" "ModerationTaskStatus" NOT NULL DEFAULT 'PENDING', "decision" TEXT, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "reviewed_at" TIMESTAMPTZ(3), "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "moderation_tasks_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "sanctions" ( "id" UUID NOT NULL, "account_id" UUID NOT NULL, "issued_by_id" UUID, "moderation_task_id" UUID, "type" "SanctionType" NOT NULL, "reason" TEXT NOT NULL, "starts_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "expires_at" TIMESTAMPTZ(3), "revoked_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "sanctions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "notifications" ( "id" UUID NOT NULL, "account_id" UUID NOT NULL, "type" VARCHAR(100) NOT NULL, "payload" JSONB NOT NULL, "status" "NotificationStatus" NOT NULL DEFAULT 'PENDING', "sent_at" TIMESTAMPTZ(3), "read_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "notifications_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "outbox_events" ( "id" UUID NOT NULL, "aggregate_type" VARCHAR(100) NOT NULL, "aggregate_id" UUID NOT NULL, "event_type" VARCHAR(150) NOT NULL, "payload" JSONB NOT NULL, "status" "OutboxStatus" NOT NULL DEFAULT 'PENDING', "attempts" INTEGER NOT NULL DEFAULT 0, "next_retry_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "published_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "outbox_events_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "audit_logs" ( "id" UUID NOT NULL, "actor_id" UUID, "action" VARCHAR(150) NOT NULL, "entity_type" VARCHAR(100) NOT NULL, "entity_id" UUID, "request_id" VARCHAR(128), "ip_hash" VARCHAR(128), "metadata" JSONB, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "accounts_phone_hmac_key" ON "accounts"("phone_hmac"); -- CreateIndex CREATE UNIQUE INDEX "anonymous_profiles_account_id_key" ON "anonymous_profiles"("account_id"); -- CreateIndex CREATE UNIQUE INDEX "anonymous_profiles_public_id_key" ON "anonymous_profiles"("public_id"); -- CreateIndex CREATE INDEX "auth_identities_account_id_idx" ON "auth_identities"("account_id"); -- CreateIndex CREATE UNIQUE INDEX "auth_identities_provider_provider_subject_key" ON "auth_identities"("provider", "provider_subject"); -- CreateIndex CREATE UNIQUE INDEX "sessions_refresh_token_hash_key" ON "sessions"("refresh_token_hash"); -- CreateIndex CREATE INDEX "sessions_account_id_expires_at_idx" ON "sessions"("account_id", "expires_at"); -- CreateIndex CREATE INDEX "bottles_pool_status_created_at_idx" ON "bottles"("pool_status", "created_at"); -- CreateIndex CREATE INDEX "bottles_review_status_created_at_idx" ON "bottles"("review_status", "created_at"); -- CreateIndex CREATE INDEX "bottles_author_id_created_at_idx" ON "bottles"("author_id", "created_at"); -- CreateIndex CREATE UNIQUE INDEX "bottle_pick_leases_lease_token_hash_key" ON "bottle_pick_leases"("lease_token_hash"); -- CreateIndex CREATE INDEX "bottle_pick_leases_picker_id_expires_at_idx" ON "bottle_pick_leases"("picker_id", "expires_at"); -- CreateIndex CREATE INDEX "bottle_pick_leases_bottle_id_expires_at_idx" ON "bottle_pick_leases"("bottle_id", "expires_at"); -- CreateIndex CREATE INDEX "bottle_pick_history_picker_id_picked_at_idx" ON "bottle_pick_history"("picker_id", "picked_at"); -- CreateIndex CREATE UNIQUE INDEX "bottle_pick_history_bottle_id_picker_id_key" ON "bottle_pick_history"("bottle_id", "picker_id"); -- CreateIndex CREATE INDEX "daily_usage_usage_date_idx" ON "daily_usage"("usage_date"); -- CreateIndex CREATE UNIQUE INDEX "daily_usage_account_id_usage_date_key" ON "daily_usage"("account_id", "usage_date"); -- CreateIndex CREATE UNIQUE INDEX "conversations_source_bottle_id_key" ON "conversations"("source_bottle_id"); -- CreateIndex CREATE INDEX "conversations_status_updated_at_idx" ON "conversations"("status", "updated_at"); -- CreateIndex CREATE INDEX "conversation_members_account_id_joined_at_idx" ON "conversation_members"("account_id", "joined_at"); -- CreateIndex CREATE UNIQUE INDEX "conversation_members_conversation_id_account_id_key" ON "conversation_members"("conversation_id", "account_id"); -- CreateIndex CREATE INDEX "messages_sender_id_created_at_idx" ON "messages"("sender_id", "created_at"); -- CreateIndex CREATE UNIQUE INDEX "messages_conversation_id_client_msg_id_key" ON "messages"("conversation_id", "client_msg_id"); -- CreateIndex CREATE UNIQUE INDEX "messages_conversation_id_seq_key" ON "messages"("conversation_id", "seq"); -- CreateIndex CREATE INDEX "blocks_blocked_id_idx" ON "blocks"("blocked_id"); -- CreateIndex CREATE UNIQUE INDEX "blocks_blocker_id_blocked_id_key" ON "blocks"("blocker_id", "blocked_id"); -- CreateIndex CREATE INDEX "reports_status_created_at_idx" ON "reports"("status", "created_at"); -- CreateIndex CREATE INDEX "reports_reported_account_id_created_at_idx" ON "reports"("reported_account_id", "created_at"); -- CreateIndex CREATE INDEX "moderation_tasks_status_created_at_idx" ON "moderation_tasks"("status", "created_at"); -- CreateIndex CREATE INDEX "moderation_tasks_target_type_target_id_idx" ON "moderation_tasks"("target_type", "target_id"); -- CreateIndex CREATE INDEX "moderation_tasks_assigned_to_id_status_idx" ON "moderation_tasks"("assigned_to_id", "status"); -- CreateIndex CREATE INDEX "sanctions_account_id_expires_at_idx" ON "sanctions"("account_id", "expires_at"); -- CreateIndex CREATE INDEX "notifications_account_id_status_created_at_idx" ON "notifications"("account_id", "status", "created_at"); -- CreateIndex CREATE INDEX "outbox_events_status_next_retry_at_idx" ON "outbox_events"("status", "next_retry_at"); -- CreateIndex CREATE INDEX "outbox_events_aggregate_type_aggregate_id_idx" ON "outbox_events"("aggregate_type", "aggregate_id"); -- CreateIndex CREATE INDEX "audit_logs_actor_id_created_at_idx" ON "audit_logs"("actor_id", "created_at"); -- CreateIndex CREATE INDEX "audit_logs_entity_type_entity_id_created_at_idx" ON "audit_logs"("entity_type", "entity_id", "created_at"); -- CreateIndex CREATE INDEX "audit_logs_request_id_idx" ON "audit_logs"("request_id"); -- AddForeignKey ALTER TABLE "anonymous_profiles" ADD CONSTRAINT "anonymous_profiles_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "auth_identities" ADD CONSTRAINT "auth_identities_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sessions" ADD CONSTRAINT "sessions_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "bottles" ADD CONSTRAINT "bottles_author_id_fkey" FOREIGN KEY ("author_id") REFERENCES "accounts"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "bottle_pick_leases" ADD CONSTRAINT "bottle_pick_leases_bottle_id_fkey" FOREIGN KEY ("bottle_id") REFERENCES "bottles"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "bottle_pick_leases" ADD CONSTRAINT "bottle_pick_leases_picker_id_fkey" FOREIGN KEY ("picker_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "bottle_pick_history" ADD CONSTRAINT "bottle_pick_history_bottle_id_fkey" FOREIGN KEY ("bottle_id") REFERENCES "bottles"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "bottle_pick_history" ADD CONSTRAINT "bottle_pick_history_picker_id_fkey" FOREIGN KEY ("picker_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "daily_usage" ADD CONSTRAINT "daily_usage_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "conversations" ADD CONSTRAINT "conversations_source_bottle_id_fkey" FOREIGN KEY ("source_bottle_id") REFERENCES "bottles"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "conversation_members" ADD CONSTRAINT "conversation_members_conversation_id_fkey" FOREIGN KEY ("conversation_id") REFERENCES "conversations"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "conversation_members" ADD CONSTRAINT "conversation_members_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "messages" ADD CONSTRAINT "messages_conversation_id_fkey" FOREIGN KEY ("conversation_id") REFERENCES "conversations"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "messages" ADD CONSTRAINT "messages_sender_id_fkey" FOREIGN KEY ("sender_id") REFERENCES "accounts"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "blocks" ADD CONSTRAINT "blocks_blocker_id_fkey" FOREIGN KEY ("blocker_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "blocks" ADD CONSTRAINT "blocks_blocked_id_fkey" FOREIGN KEY ("blocked_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reports" ADD CONSTRAINT "reports_reporter_id_fkey" FOREIGN KEY ("reporter_id") REFERENCES "accounts"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reports" ADD CONSTRAINT "reports_reported_account_id_fkey" FOREIGN KEY ("reported_account_id") REFERENCES "accounts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reports" ADD CONSTRAINT "reports_bottle_id_fkey" FOREIGN KEY ("bottle_id") REFERENCES "bottles"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reports" ADD CONSTRAINT "reports_conversation_id_fkey" FOREIGN KEY ("conversation_id") REFERENCES "conversations"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "reports" ADD CONSTRAINT "reports_message_id_fkey" FOREIGN KEY ("message_id") REFERENCES "messages"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "moderation_tasks" ADD CONSTRAINT "moderation_tasks_report_id_fkey" FOREIGN KEY ("report_id") REFERENCES "reports"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "moderation_tasks" ADD CONSTRAINT "moderation_tasks_assigned_to_id_fkey" FOREIGN KEY ("assigned_to_id") REFERENCES "accounts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sanctions" ADD CONSTRAINT "sanctions_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sanctions" ADD CONSTRAINT "sanctions_issued_by_id_fkey" FOREIGN KEY ("issued_by_id") REFERENCES "accounts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sanctions" ADD CONSTRAINT "sanctions_moderation_task_id_fkey" FOREIGN KEY ("moderation_task_id") REFERENCES "moderation_tasks"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "notifications" ADD CONSTRAINT "notifications_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_actor_id_fkey" FOREIGN KEY ("actor_id") REFERENCES "accounts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- Database-only invariants unsupported by Prisma schema syntax. CREATE UNIQUE INDEX "bottle_pick_leases_one_active_per_bottle" ON "bottle_pick_leases"("bottle_id") WHERE "status" = 'ACTIVE'; ALTER TABLE "blocks" ADD CONSTRAINT "blocks_no_self_block" CHECK ("blocker_id" <> "blocked_id"); ALTER TABLE "daily_usage" ADD CONSTRAINT "daily_usage_nonnegative" CHECK ( "bottles_created" >= 0 AND "bottles_picked" >= 0 AND "messages_sent" >= 0 ); ALTER TABLE "conversations" ADD CONSTRAINT "conversations_next_seq_positive" CHECK ("next_seq" >= 1); ALTER TABLE "conversation_members" ADD CONSTRAINT "conversation_members_last_read_seq_nonnegative" CHECK ("last_read_seq" >= 0); ALTER TABLE "messages" ADD CONSTRAINT "messages_seq_positive" CHECK ("seq" >= 1); ALTER TABLE "outbox_events" ADD CONSTRAINT "outbox_events_attempts_nonnegative" CHECK ("attempts" >= 0); ALTER TABLE "reports" ADD CONSTRAINT "reports_exactly_one_target" CHECK ( num_nonnulls("reported_account_id", "bottle_id", "conversation_id", "message_id") = 1 );