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 '라이선스 부여 이력 생성 시각.';