-- CreateSchemas (added for shadow database compatibility) CREATE SCHEMA IF NOT EXISTS "admin_schema"; CREATE SCHEMA IF NOT EXISTS "agent_schema"; CREATE SCHEMA IF NOT EXISTS "aia_schema"; CREATE SCHEMA IF NOT EXISTS "asl_schema"; CREATE SCHEMA IF NOT EXISTS "capability_schema"; CREATE SCHEMA IF NOT EXISTS "common_schema"; CREATE SCHEMA IF NOT EXISTS "dc_schema"; CREATE SCHEMA IF NOT EXISTS "ekb_schema"; CREATE SCHEMA IF NOT EXISTS "iit_schema"; CREATE SCHEMA IF NOT EXISTS "pkb_schema"; CREATE SCHEMA IF NOT EXISTS "platform_schema"; CREATE SCHEMA IF NOT EXISTS "protocol_schema"; CREATE SCHEMA IF NOT EXISTS "rvw_schema"; CREATE SCHEMA IF NOT EXISTS "ssa_schema"; CREATE SCHEMA IF NOT EXISTS "st_schema"; -- CreateTable CREATE TABLE "users" ( "id" TEXT NOT NULL, "email" TEXT NOT NULL, "password" TEXT NOT NULL, "name" TEXT, "avatar_url" TEXT, "role" TEXT NOT NULL DEFAULT 'user', "status" TEXT NOT NULL DEFAULT 'active', "kb_quota" INTEGER NOT NULL DEFAULT 3, "kb_used" INTEGER NOT NULL DEFAULT 0, "trial_ends_at" TIMESTAMP(3), "is_trial" BOOLEAN NOT NULL DEFAULT true, "last_login_at" TIMESTAMP(3), "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "projects" ( "id" TEXT NOT NULL, "user_id" TEXT NOT NULL, "name" TEXT NOT NULL, "description" TEXT NOT NULL, "conversation_count" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "projects_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "conversations" ( "id" TEXT NOT NULL, "user_id" TEXT NOT NULL, "project_id" TEXT, "agent_id" TEXT NOT NULL, "title" TEXT NOT NULL, "model_name" TEXT NOT NULL DEFAULT 'deepseek-v3', "message_count" INTEGER NOT NULL DEFAULT 0, "total_tokens" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "conversations_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "messages" ( "id" TEXT NOT NULL, "conversation_id" TEXT NOT NULL, "role" TEXT NOT NULL, "content" TEXT NOT NULL, "metadata" JSONB, "tokens" INTEGER, "is_pinned" BOOLEAN NOT NULL DEFAULT false, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "messages_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "knowledge_bases" ( "id" TEXT NOT NULL, "user_id" TEXT NOT NULL, "name" TEXT NOT NULL, "description" TEXT, "dify_dataset_id" TEXT NOT NULL, "file_count" INTEGER NOT NULL DEFAULT 0, "total_size_bytes" BIGINT NOT NULL DEFAULT 0, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "knowledge_bases_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "documents" ( "id" TEXT NOT NULL, "kb_id" TEXT NOT NULL, "user_id" TEXT NOT NULL, "filename" TEXT NOT NULL, "file_type" TEXT NOT NULL, "file_size_bytes" BIGINT NOT NULL, "file_url" TEXT NOT NULL, "dify_document_id" TEXT NOT NULL, "status" TEXT NOT NULL DEFAULT 'uploading', "progress" INTEGER NOT NULL DEFAULT 0, "error_message" TEXT, "segments_count" INTEGER, "tokens_count" INTEGER, "uploaded_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "processed_at" TIMESTAMP(3), CONSTRAINT "documents_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "admin_logs" ( "id" SERIAL NOT NULL, "admin_id" TEXT NOT NULL, "action" TEXT NOT NULL, "resource_type" TEXT, "resource_id" TEXT, "details" JSONB, "ip_address" TEXT, "user_agent" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "admin_logs_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE INDEX "users_email_idx" ON "users"("email"); -- CreateIndex CREATE INDEX "users_status_idx" ON "users"("status"); -- CreateIndex CREATE INDEX "users_created_at_idx" ON "users"("created_at"); -- CreateIndex CREATE INDEX "projects_user_id_idx" ON "projects"("user_id"); -- CreateIndex CREATE INDEX "projects_created_at_idx" ON "projects"("created_at"); -- CreateIndex CREATE INDEX "conversations_user_id_idx" ON "conversations"("user_id"); -- CreateIndex CREATE INDEX "conversations_project_id_idx" ON "conversations"("project_id"); -- CreateIndex CREATE INDEX "conversations_agent_id_idx" ON "conversations"("agent_id"); -- CreateIndex CREATE INDEX "conversations_created_at_idx" ON "conversations"("created_at"); -- CreateIndex CREATE INDEX "messages_conversation_id_idx" ON "messages"("conversation_id"); -- CreateIndex CREATE INDEX "messages_created_at_idx" ON "messages"("created_at"); -- CreateIndex CREATE INDEX "messages_is_pinned_idx" ON "messages"("is_pinned"); -- CreateIndex CREATE INDEX "knowledge_bases_user_id_idx" ON "knowledge_bases"("user_id"); -- CreateIndex CREATE INDEX "knowledge_bases_dify_dataset_id_idx" ON "knowledge_bases"("dify_dataset_id"); -- CreateIndex CREATE INDEX "documents_kb_id_idx" ON "documents"("kb_id"); -- CreateIndex CREATE INDEX "documents_user_id_idx" ON "documents"("user_id"); -- CreateIndex CREATE INDEX "documents_status_idx" ON "documents"("status"); -- CreateIndex CREATE INDEX "documents_dify_document_id_idx" ON "documents"("dify_document_id"); -- CreateIndex CREATE INDEX "admin_logs_admin_id_idx" ON "admin_logs"("admin_id"); -- CreateIndex CREATE INDEX "admin_logs_created_at_idx" ON "admin_logs"("created_at"); -- CreateIndex CREATE INDEX "admin_logs_action_idx" ON "admin_logs"("action"); -- AddForeignKey ALTER TABLE "projects" ADD CONSTRAINT "projects_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "conversations" ADD CONSTRAINT "conversations_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "conversations" ADD CONSTRAINT "conversations_project_id_fkey" FOREIGN KEY ("project_id") REFERENCES "projects"("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 "knowledge_bases" ADD CONSTRAINT "knowledge_bases_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "documents" ADD CONSTRAINT "documents_kb_id_fkey" FOREIGN KEY ("kb_id") REFERENCES "knowledge_bases"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "documents" ADD CONSTRAINT "documents_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "admin_logs" ADD CONSTRAINT "admin_logs_admin_id_fkey" FOREIGN KEY ("admin_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;