Summary: - Add 4 new database tables: iit_field_metadata, iit_qc_logs, iit_record_summary, iit_qc_project_stats - Implement pg-boss debounce mechanism in WebhookController - Refactor QC Worker for dual output: QC logs + record summary - Enhance HardRuleEngine to support form-based rule filtering - Create QcService for QC data queries - Optimize ChatService with new intents: query_enrollment, query_qc_status - Add admin batch operations: one-click full QC + one-click full summary - Create IIT Admin management module: project config, QC rules, user mapping Status: Code complete, pending end-to-end testing Co-authored-by: Cursor <cursoragent@cursor.com>
221 lines
7.1 KiB
SQL
221 lines
7.1 KiB
SQL
-- 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;
|