Files
studio-auth-be/prisma/migrations/20260602033000_add_user_licenses/migration.sql
T
2026-07-01 17:36:34 +09:00

69 lines
3.5 KiB
SQL

CREATE TYPE "LicenseCode" AS ENUM ('FREE', 'EDUCATION', 'PROFESSIONAL');
CREATE TABLE "licenses" (
"id" UUID NOT NULL DEFAULT gen_random_uuid(),
"code" "LicenseCode" NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"is_active" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "licenses_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "user_licenses" (
"id" UUID NOT NULL DEFAULT gen_random_uuid(),
"user_id" UUID NOT NULL,
"license_id" UUID NOT NULL,
"starts_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"expires_at" TIMESTAMP(3),
"assigned_by" UUID,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "user_licenses_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "licenses_code_key" ON "licenses"("code");
CREATE INDEX "licenses_is_active_idx" ON "licenses"("is_active");
CREATE INDEX "user_licenses_user_id_starts_at_idx" ON "user_licenses"("user_id", "starts_at");
CREATE INDEX "user_licenses_license_id_idx" ON "user_licenses"("license_id");
ALTER TABLE "user_licenses" ADD CONSTRAINT "user_licenses_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "user_licenses" ADD CONSTRAINT "user_licenses_license_id_fkey" FOREIGN KEY ("license_id") REFERENCES "licenses"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
INSERT INTO "licenses" ("code", "name", "description", "updated_at")
VALUES
('FREE', 'Free', '기본 무료 라이선스', CURRENT_TIMESTAMP),
('EDUCATION', 'Education', '교육기관용 라이선스', CURRENT_TIMESTAMP),
('PROFESSIONAL', 'Professional', '전문가용 라이선스', CURRENT_TIMESTAMP);
INSERT INTO "user_licenses" ("user_id", "license_id", "starts_at")
SELECT u."id", l."id", CURRENT_TIMESTAMP
FROM "users" u
CROSS JOIN "licenses" l
WHERE l."code" = 'PROFESSIONAL'
AND NOT EXISTS (
SELECT 1
FROM "user_licenses" ul
WHERE ul."user_id" = u."id"
);
COMMENT ON TYPE "LicenseCode" IS '라이선스 코드. 무료, 교육용, 전문가용 플랜을 구분한다.';
COMMENT ON TABLE "licenses" IS 'Autonomy Studio 라이선스 마스터. 플랜 코드와 표시명을 관리한다.';
COMMENT ON COLUMN "licenses"."id" IS '라이선스 UUID.';
COMMENT ON COLUMN "licenses"."code" IS '라이선스 코드.';
COMMENT ON COLUMN "licenses"."name" IS '화면에 표시할 라이선스명.';
COMMENT ON COLUMN "licenses"."description" IS '라이선스 설명.';
COMMENT ON COLUMN "licenses"."is_active" IS '라이선스 사용 가능 여부.';
COMMENT ON COLUMN "licenses"."created_at" IS '라이선스 생성 시각.';
COMMENT ON COLUMN "licenses"."updated_at" IS '라이선스 수정 시각.';
COMMENT ON TABLE "user_licenses" IS '사용자별 라이선스 부여 이력. 현재 유효 라이선스와 기간을 관리한다.';
COMMENT ON COLUMN "user_licenses"."id" IS '사용자 라이선스 UUID.';
COMMENT ON COLUMN "user_licenses"."user_id" IS '라이선스를 부여받은 사용자 UUID.';
COMMENT ON COLUMN "user_licenses"."license_id" IS '부여된 라이선스 UUID.';
COMMENT ON COLUMN "user_licenses"."starts_at" IS '라이선스 시작 시각.';
COMMENT ON COLUMN "user_licenses"."expires_at" IS '라이선스 만료 시각. NULL이면 무기한.';
COMMENT ON COLUMN "user_licenses"."assigned_by" IS '라이선스를 부여한 관리자 UUID.';
COMMENT ON COLUMN "user_licenses"."created_at" IS '라이선스 부여 이력 생성 시각.';