526 lines
20 KiB
SQL
526 lines
20 KiB
SQL
-- 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
|
|
);
|