Files
clawshow-api/schema.sql
2026-03-19 18:37:53 +08:00

133 lines
4.0 KiB
SQL

CREATE TABLE IF NOT EXISTS "user" (
"id" TEXT PRIMARY KEY NOT NULL,
"name" TEXT,
"email" TEXT NOT NULL,
"email_verified" INTEGER NOT NULL DEFAULT 0,
"image" TEXT,
"created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS "user_email_unique" ON "user" ("email");
CREATE TABLE IF NOT EXISTS "session" (
"id" TEXT PRIMARY KEY NOT NULL,
"expires_at" INTEGER NOT NULL,
"token" TEXT NOT NULL,
"created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL,
"ip_address" TEXT,
"user_agent" TEXT,
"user_id" TEXT NOT NULL,
FOREIGN KEY ("user_id") REFERENCES "user"("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "session_token_unique" ON "session" ("token");
CREATE INDEX IF NOT EXISTS "session_user_id_idx" ON "session" ("user_id");
CREATE TABLE IF NOT EXISTS "account" (
"id" TEXT PRIMARY KEY NOT NULL,
"account_id" TEXT NOT NULL,
"provider_id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"access_token" TEXT,
"refresh_token" TEXT,
"id_token" TEXT,
"access_token_expires_at" INTEGER,
"refresh_token_expires_at" INTEGER,
"scope" TEXT,
"password" TEXT,
"created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL,
FOREIGN KEY ("user_id") REFERENCES "user"("id")
);
CREATE INDEX IF NOT EXISTS "account_user_id_idx" ON "account" ("user_id");
CREATE INDEX IF NOT EXISTS "account_provider_account_idx" ON "account" ("provider_id", "account_id");
CREATE TABLE IF NOT EXISTS "verification" (
"id" TEXT PRIMARY KEY NOT NULL,
"identifier" TEXT NOT NULL,
"value" TEXT NOT NULL,
"expires_at" INTEGER NOT NULL,
"created_at" INTEGER,
"updated_at" INTEGER
);
CREATE INDEX IF NOT EXISTS "verification_identifier_idx" ON "verification" ("identifier");
CREATE TABLE IF NOT EXISTS "apikey" (
"id" TEXT PRIMARY KEY NOT NULL,
"config_id" TEXT,
"name" TEXT,
"start" TEXT,
"prefix" TEXT,
"key" TEXT NOT NULL,
"reference_id" TEXT,
"enabled" INTEGER DEFAULT 1,
"rate_limit_enabled" INTEGER DEFAULT 1,
"rate_limit_time_window" INTEGER,
"rate_limit_max" INTEGER,
"request_count" INTEGER DEFAULT 0,
"remaining" INTEGER,
"refill_interval" INTEGER,
"refill_amount" INTEGER,
"last_refill_at" INTEGER,
"last_request" INTEGER,
"permissions" TEXT,
"metadata" TEXT,
"expires_at" INTEGER,
"created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL,
"avatar_id" TEXT,
FOREIGN KEY ("avatar_id") REFERENCES "avatars"("id") ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS "apikey_reference_id_idx" ON "apikey" ("reference_id");
CREATE INDEX IF NOT EXISTS "apikey_key_idx" ON "apikey" ("key");
-- 形象/表情包集合表
CREATE TABLE IF NOT EXISTS "avatars" (
"id" TEXT PRIMARY KEY NOT NULL,
"user_id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"created_at" INTEGER NOT NULL,
"updated_at" INTEGER NOT NULL,
FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS "avatars_user_id_idx" ON "avatars" ("user_id");
-- 表情表
CREATE TABLE IF NOT EXISTS "emojis" (
"id" TEXT PRIMARY KEY NOT NULL,
"avatar_id" TEXT NOT NULL,
"label" TEXT NOT NULL,
"url" TEXT NOT NULL,
"description" TEXT,
"trigger_type" TEXT NOT NULL DEFAULT 'message',
"trigger_result" TEXT,
"sort_order" INTEGER DEFAULT 0,
"created_at" INTEGER NOT NULL,
FOREIGN KEY ("avatar_id") REFERENCES "avatars"("id") ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS "emojis_avatar_id_idx" ON "emojis" ("avatar_id");
CREATE UNIQUE INDEX IF NOT EXISTS "emojis_avatar_default_unique_idx" ON "emojis" ("avatar_id") WHERE "trigger_type" = 'default';
CREATE TABLE IF NOT EXISTS "user_file" (
"id" TEXT PRIMARY KEY NOT NULL,
"user_id" TEXT NOT NULL,
"filename" TEXT NOT NULL,
"original_name" TEXT NOT NULL,
"content_type" TEXT NOT NULL,
"size" INTEGER NOT NULL,
"s3_key" TEXT NOT NULL,
"url" TEXT NOT NULL,
"uploaded_at" INTEGER NOT NULL,
FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS "user_file_user_id_idx" ON "user_file" ("user_id");