Files
lms-be/prisma/migrations/20260610114000_add_visualization_platforms/migration.sql
T
2026-07-07 16:09:12 +09:00

136 lines
4.8 KiB
SQL

CREATE TABLE "visualization_platforms" (
"platform_key" TEXT NOT NULL,
"type" TEXT NOT NULL,
"display_name" TEXT NOT NULL,
"description" TEXT,
"default_config" JSONB NOT NULL,
"sort_order" INTEGER NOT NULL DEFAULT 0,
"enabled" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMPTZ(3) NOT NULL,
CONSTRAINT "visualization_platforms_pkey" PRIMARY KEY ("platform_key")
);
CREATE UNIQUE INDEX "visualization_platforms_type_key" ON "visualization_platforms"("type");
CREATE INDEX "visualization_platforms_enabled_sort_order_idx" ON "visualization_platforms"("enabled", "sort_order");
CREATE TABLE "course_week_visualization_platforms" (
"id" UUID NOT NULL DEFAULT gen_random_uuid(),
"course_id" UUID NOT NULL,
"week" INTEGER NOT NULL,
"platform_key" TEXT NOT NULL,
"enabled" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMPTZ(3) NOT NULL,
CONSTRAINT "course_week_visualization_platforms_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "course_week_visualization_platforms_course_id_week_platform_key_key"
ON "course_week_visualization_platforms"("course_id", "week", "platform_key");
CREATE INDEX "course_week_visualization_platforms_course_id_week_idx"
ON "course_week_visualization_platforms"("course_id", "week");
CREATE INDEX "course_week_visualization_platforms_platform_key_idx"
ON "course_week_visualization_platforms"("platform_key");
ALTER TABLE "course_week_visualization_platforms"
ADD CONSTRAINT "course_week_visualization_platforms_course_id_fkey"
FOREIGN KEY ("course_id") REFERENCES "courses"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "course_week_visualization_platforms"
ADD CONSTRAINT "course_week_visualization_platforms_platform_key_fkey"
FOREIGN KEY ("platform_key") REFERENCES "visualization_platforms"("platform_key") ON DELETE CASCADE ON UPDATE CASCADE;
INSERT INTO "visualization_platforms" ("platform_key", "type", "display_name", "description", "default_config", "sort_order", "updated_at")
VALUES
(
'AUTOWARE',
'AUTOWARE',
'Autoware',
'Autoware 기반 자율주행 시각화와 제어 실습 환경',
'{
"type": "AUTOWARE",
"runtime": { "containers": [], "steps": [] },
"bridge": {
"name": "autoware-ros-bridge",
"image": "autoware-ros-bridge",
"port": 8765,
"env": {
"ROBOT_STACK": "autoware",
"MAP_POINT_STRIDE": "8",
"MAP_POINT_LIMIT": "80000",
"AUTOWARE_ROUTE_INPUT": "rviz_topic",
"INITIAL_POSE_TOPIC": "/initialpose",
"GOAL_POSE_TOPIC": "/planning/mission_planning/goal",
"VEHICLE_POSE_TOPIC": "/localization/kinematic_state",
"TRAJECTORY_TOPIC": "/planning/scenario_planning/trajectory",
"ROUTE_TOPIC": "/planning/mission_planning/route"
}
},
"viewer": { "stack": "autoware" }
}'::jsonb,
1,
CURRENT_TIMESTAMP
),
(
'NAV2',
'NAV2',
'Nav2',
'Nav2 기반 주행 알고리즘 시각화 실습 환경',
'{
"type": "NAV2",
"runtime": { "containers": [], "steps": [] },
"bridge": {
"name": "nav2-ros-bridge",
"image": "nav2-ros-bridge",
"port": 8765,
"env": {
"ROBOT_STACK": "nav2"
}
},
"viewer": { "stack": "nav2" }
}'::jsonb,
2,
CURRENT_TIMESTAMP
),
(
'SLAM',
'SLAM',
'SLAM',
'TurtleBot3 SLAM 지도 생성 시각화 실습 환경',
'{
"type": "SLAM",
"runtime": {
"containers": [
{ "name": "nav2-slam", "image": "nav2-slam:humble", "network": "host" },
{ "name": "slam-ros-bridge", "image": "slam-ros-bridge", "network": "host" }
]
},
"bridge": { "url": "http://localhost:8765" },
"viewer": { "stack": "slam" },
"ros": {
"turtlebotModel": "burger"
}
}'::jsonb,
3,
CURRENT_TIMESTAMP
)
ON CONFLICT ("platform_key") DO UPDATE
SET "type" = EXCLUDED."type",
"display_name" = EXCLUDED."display_name",
"description" = EXCLUDED."description",
"default_config" = EXCLUDED."default_config",
"sort_order" = EXCLUDED."sort_order",
"enabled" = true,
"updated_at" = CURRENT_TIMESTAMP;
INSERT INTO "course_week_visualization_platforms" ("course_id", "week", "platform_key", "enabled", "updated_at")
SELECT DISTINCT profile."course_id", profile."week", upper(profile."profile_type"), true, CURRENT_TIMESTAMP
FROM "course_environment_profiles" profile
JOIN "visualization_platforms" platform ON platform."platform_key" = upper(profile."profile_type")
WHERE profile."enabled" = true
ON CONFLICT ("course_id", "week", "platform_key") DO UPDATE
SET "enabled" = true,
"updated_at" = CURRENT_TIMESTAMP;