CREATE TABLE "course_week_modules" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "week_id" UUID NOT NULL, "sort_order" INTEGER NOT NULL, "category" TEXT NOT NULL, "name" TEXT NOT NULL, "folder_name" TEXT NOT NULL, "template_repository_url" TEXT, "docker_image" TEXT, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "course_week_modules_pkey" PRIMARY KEY ("id") ); CREATE UNIQUE INDEX "course_week_modules_week_id_folder_name_key" ON "course_week_modules"("week_id", "folder_name"); CREATE UNIQUE INDEX "course_week_modules_week_id_sort_order_key" ON "course_week_modules"("week_id", "sort_order"); CREATE INDEX "course_week_modules_week_id_idx" ON "course_week_modules"("week_id"); ALTER TABLE "course_week_modules" ADD CONSTRAINT "course_week_modules_week_id_fkey" FOREIGN KEY ("week_id") REFERENCES "course_weeks"("id") ON DELETE CASCADE ON UPDATE CASCADE; COMMENT ON TABLE "course_week_modules" IS '주차별 개발 스튜디오 모듈 목록.'; COMMENT ON COLUMN "course_week_modules"."folder_name" IS '관리자 템플릿 또는 로컬 캐시의 원본 모듈 폴더명.'; COMMENT ON COLUMN "course_week_modules"."template_repository_url" IS '추후 Gitea 템플릿 저장소 연동 시 사용할 원본 repo URL.'; COMMENT ON COLUMN "course_week_modules"."docker_image" IS '모듈 실행에 사용할 Docker 이미지.'; WITH target_week AS ( SELECT w."id" AS week_id FROM "course_weeks" w JOIN "courses" c ON c."id" = w."course_id" WHERE c."slug" = 'futuredrive-autonomy-basic' AND w."week" = 3 ), seed(sort_order, category, name, folder_name) AS ( VALUES (1, 'Gui', 'AW-Rviz', '[furive-gui]AW-Rviz_v1.0.0_ws'), (2, 'Map', 'AW-SampleMap', '[furive-map]AW-SampleMap_v1.0.0_ws'), (3, 'Simulator', 'AW-PlanningSim', '[furive-simulator]AW-PlanningSim_v1.0.0_ws'), (4, 'Map', 'DGIST-Campus', '[furive-map]DGIST-Campus_v1.0.0_ws'), (5, 'Planning', 'AW-Planning', '[furive-planning]AW-Planning_v1.0.0_ws'), (6, 'Bag', 'AW-SampleBag', '[furive-bag]AW-SampleBag_v1.0.0_ws'), (7, 'Perception', 'AW-Perception', '[furive-perception]AW-Perception_v1.0.0_ws'), (8, 'Sensing', 'test2', '[furive-sensing]test2_v1.0.0_ws'), (9, 'Localization', 'AW-Localization', '[furive-localization]AW-Localization_v1.0.0_ws'), (10, 'System', 'AW-System', '[furive-system]AW-System_v1.0.0_ws'), (11, 'Vehicle', 'AW-TestSampleVehicle', '[furive-vehicle]AW-TestSampleVehicle_v1.0.0_ws'), (12, 'Module', 'vehicle-f1', 'vehicle-f1_v1.0.0_ws'), (13, 'Vehicle', 'AW-SampleVehicle', '[furive-vehicle]AW-SampleVehicle_v1.0.0_ws'), (14, 'Control', 'AW-Control', '[furive-control]AW-Control_v1.0.0_ws'), (15, 'Map', 'AW-SampleMapRosBag', '[furive-map]AW-SampleMapRosBag_v1.0.0_ws'), (16, 'Sensing', 'AW-SampleSensor', '[furive-sensing]AW-SampleSensor_v1.0.0_ws') ) INSERT INTO "course_week_modules" ("week_id", "sort_order", "category", "name", "folder_name") SELECT target_week.week_id, seed.sort_order, seed.category, seed.name, seed.folder_name FROM target_week CROSS JOIN seed ON CONFLICT ("week_id", "folder_name") DO UPDATE SET "sort_order" = EXCLUDED."sort_order", "category" = EXCLUDED."category", "name" = EXCLUDED."name", "updated_at" = CURRENT_TIMESTAMP;