-- CreateEnum CREATE TYPE "UserStatus" AS ENUM ('PENDING', 'ACTIVE', 'SUSPENDED'); -- CreateTable CREATE TABLE "users" ( "id" UUID NOT NULL, "organization_id" UUID NOT NULL, "email" VARCHAR(254) NOT NULL, "name" VARCHAR(160) NOT NULL, "password_hash" VARCHAR(256) NOT NULL, "status" "UserStatus" NOT NULL DEFAULT 'PENDING', "is_owner" BOOLEAN NOT NULL DEFAULT false, "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" UUID NOT NULL, "organization_id" UUID NOT NULL, "name" VARCHAR(80) NOT NULL, "is_system" BOOLEAN NOT NULL DEFAULT false, "permissions" TEXT[], CONSTRAINT "roles_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "user_roles" ( "user_id" UUID NOT NULL, "role_id" UUID NOT NULL, "organization_id" UUID NOT NULL, CONSTRAINT "user_roles_pkey" PRIMARY KEY ("user_id","role_id") ); -- CreateTable CREATE TABLE "sessions" ( "id" UUID NOT NULL, "user_id" UUID NOT NULL, "token_hash" CHAR(64) NOT NULL, "expires_at" TIMESTAMPTZ(3) NOT NULL, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "sessions_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "recovery_tokens" ( "id" UUID NOT NULL, "user_id" UUID NOT NULL, "token_hash" CHAR(64) NOT NULL, "expires_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "recovery_tokens_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "audit_events" ( "id" UUID NOT NULL, "organization_id" UUID NOT NULL, "actor_id" UUID, "action" VARCHAR(80) NOT NULL, "target_id" UUID, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "audit_events_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "rate_limits" ( "key" CHAR(64) NOT NULL, "hits" INTEGER NOT NULL, "expires_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "rate_limits_pkey" PRIMARY KEY ("key") ); -- CreateIndex CREATE INDEX "users_organization_id_created_at_id_idx" ON "users"("organization_id", "created_at", "id"); -- CreateIndex CREATE UNIQUE INDEX "users_organization_id_email_key" ON "users"("organization_id", "email"); -- CreateIndex CREATE UNIQUE INDEX "users_id_organization_id_key" ON "users"("id", "organization_id"); -- CreateIndex CREATE UNIQUE INDEX "roles_organization_id_name_key" ON "roles"("organization_id", "name"); -- CreateIndex CREATE UNIQUE INDEX "roles_id_organization_id_key" ON "roles"("id", "organization_id"); -- CreateIndex CREATE INDEX "user_roles_role_id_organization_id_idx" ON "user_roles"("role_id", "organization_id"); -- CreateIndex CREATE UNIQUE INDEX "sessions_token_hash_key" ON "sessions"("token_hash"); -- CreateIndex CREATE INDEX "sessions_user_id_idx" ON "sessions"("user_id"); -- CreateIndex CREATE INDEX "sessions_expires_at_idx" ON "sessions"("expires_at"); -- CreateIndex CREATE UNIQUE INDEX "recovery_tokens_token_hash_key" ON "recovery_tokens"("token_hash"); -- CreateIndex CREATE INDEX "recovery_tokens_user_id_idx" ON "recovery_tokens"("user_id"); -- CreateIndex CREATE INDEX "recovery_tokens_expires_at_idx" ON "recovery_tokens"("expires_at"); -- CreateIndex CREATE INDEX "audit_events_organization_id_created_at_id_idx" ON "audit_events"("organization_id", "created_at", "id"); -- CreateIndex CREATE INDEX "rate_limits_expires_at_idx" ON "rate_limits"("expires_at"); -- AddForeignKey ALTER TABLE "users" ADD CONSTRAINT "users_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "roles" ADD CONSTRAINT "roles_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_organization_id_fkey" FOREIGN KEY ("user_id", "organization_id") REFERENCES "users"("id", "organization_id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_organization_id_fkey" FOREIGN KEY ("role_id", "organization_id") REFERENCES "roles"("id", "organization_id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "recovery_tokens" ADD CONSTRAINT "recovery_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "audit_events" ADD CONSTRAINT "audit_events_organization_id_fkey" FOREIGN KEY ("organization_id") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;