-- CreateEnum CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'DISABLED'); -- CreateEnum CREATE TYPE "RoleStatus" AS ENUM ('ACTIVE', 'DISABLED'); -- CreateTable CREATE TABLE "departments" ( "id" CHAR(26) NOT NULL, "code" VARCHAR(64) NOT NULL, "name" VARCHAR(64) NOT NULL, "parent_id" CHAR(26), "leader_user_id" CHAR(26), "sort_order" INTEGER NOT NULL DEFAULT 0, "status" VARCHAR(16) NOT NULL DEFAULT 'ACTIVE', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "departments_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "users" ( "id" CHAR(26) NOT NULL, "account" VARCHAR(64) NOT NULL, "email" VARCHAR(128), "name" VARCHAR(64) NOT NULL, "phone" VARCHAR(20) NOT NULL, "password_hash" VARCHAR(255) NOT NULL, "department_id" CHAR(26) NOT NULL, "job_title" VARCHAR(64), "status" "UserStatus" NOT NULL DEFAULT 'ACTIVE', "must_change_password" BOOLEAN NOT NULL DEFAULT true, "last_login_at" TIMESTAMPTZ(3), "last_login_ip" VARCHAR(64), "disabled_at" TIMESTAMPTZ(3), "remark" VARCHAR(200), "created_by" CHAR(26), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "roles" ( "id" CHAR(26) NOT NULL, "code" VARCHAR(64) NOT NULL, "name" VARCHAR(64) NOT NULL, "description" VARCHAR(255) NOT NULL DEFAULT '', "is_system" BOOLEAN NOT NULL DEFAULT false, "status" "RoleStatus" NOT NULL DEFAULT 'ACTIVE', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "roles_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "user_roles" ( "user_id" CHAR(26) NOT NULL, "role_id" CHAR(26) NOT NULL, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "user_roles_pkey" PRIMARY KEY ("user_id","role_id") ); -- CreateTable CREATE TABLE "role_permissions" ( "role_id" CHAR(26) NOT NULL, "permission_code" VARCHAR(64) NOT NULL, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "role_permissions_pkey" PRIMARY KEY ("role_id","permission_code") ); -- CreateTable CREATE TABLE "refresh_tokens" ( "id" CHAR(26) NOT NULL, "user_id" CHAR(26) NOT NULL, "family_id" CHAR(26) NOT NULL, "token_hash" VARCHAR(64) NOT NULL, "user_agent" VARCHAR(255), "ip" VARCHAR(64), "expires_at" TIMESTAMPTZ(3) NOT NULL, "revoked_at" TIMESTAMPTZ(3), "replaced_by_id" CHAR(26), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "refresh_tokens_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "departments_code_key" ON "departments"("code"); -- CreateIndex CREATE INDEX "departments_parent_id_sort_order_idx" ON "departments"("parent_id", "sort_order"); -- CreateIndex CREATE UNIQUE INDEX "departments_parent_id_name_key" ON "departments"("parent_id", "name"); -- CreateIndex CREATE UNIQUE INDEX "users_account_key" ON "users"("account"); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE UNIQUE INDEX "users_phone_key" ON "users"("phone"); -- CreateIndex CREATE INDEX "users_department_id_status_idx" ON "users"("department_id", "status"); -- CreateIndex CREATE INDEX "users_status_last_login_at_idx" ON "users"("status", "last_login_at"); -- CreateIndex CREATE UNIQUE INDEX "roles_code_key" ON "roles"("code"); -- CreateIndex CREATE INDEX "user_roles_role_id_idx" ON "user_roles"("role_id"); -- CreateIndex CREATE INDEX "role_permissions_permission_code_idx" ON "role_permissions"("permission_code"); -- CreateIndex CREATE UNIQUE INDEX "refresh_tokens_token_hash_key" ON "refresh_tokens"("token_hash"); -- CreateIndex CREATE INDEX "refresh_tokens_user_id_expires_at_idx" ON "refresh_tokens"("user_id", "expires_at"); -- CreateIndex CREATE INDEX "refresh_tokens_family_id_idx" ON "refresh_tokens"("family_id"); -- AddForeignKey ALTER TABLE "departments" ADD CONSTRAINT "departments_parent_id_fkey" FOREIGN KEY ("parent_id") REFERENCES "departments"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "departments" ADD CONSTRAINT "departments_leader_user_id_fkey" FOREIGN KEY ("leader_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "users" ADD CONSTRAINT "users_department_id_fkey" FOREIGN KEY ("department_id") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "refresh_tokens" ADD CONSTRAINT "refresh_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;