feat: enable hybrid local and remote module execution

This commit is contained in:
2026-08-06 16:17:41 +09:00
parent e06b853bcb
commit f8ccd8b0a3
18 changed files with 1312 additions and 123 deletions
+96 -1
View File
@@ -31,8 +31,10 @@ model User {
platformControlSessions PlatformControlSession[]
platformControlQueueEntries PlatformControlQueueEntry[]
studioRepositories StudioRepository[]
customModuleRepositories StudentCustomModuleRepository[]
savedMaps StudentSavedMap[]
customModules StudentCustomModule[]
teamCustomModules TeamCustomModule[] @relation("TeamCustomModuleCreator")
submissionScores SubmissionScore[]
submissionTotalScores SubmissionTotalScore[]
@@ -77,6 +79,9 @@ model StudentGroup {
platformControlSessions PlatformControlSession[]
platformControlQueueEntries PlatformControlQueueEntry[]
curriculumSettings InstructorCurriculumSetting[]
teamStudioRepositories TeamStudioRepository[]
teamCustomModuleRepositories TeamCustomModuleRepository[]
teamCustomModules TeamCustomModule[]
@@unique([organizationName, name])
@@index([organizationId])
@@ -162,6 +167,7 @@ model Course {
weekMaps CourseWeekMap[]
savedMaps StudentSavedMap[]
customModules StudentCustomModule[]
teamCustomModules TeamCustomModule[]
submissionScores SubmissionScore[]
submissionTotalScores SubmissionTotalScore[]
@@ -267,8 +273,12 @@ model StudentSavedMap {
viewerModel String @map("viewer_model")
yamlPath String @map("yaml_path")
pgmPath String @map("pgm_path")
yamlUrl String? @map("yaml_url")
pgmUrl String? @map("pgm_url")
previewPgm String? @map("preview_pgm")
databasePath String? @map("database_path")
databaseUrl String? @map("database_url")
runtimeKind String @default("SIMULATION") @map("runtime_kind")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@ -276,6 +286,7 @@ model StudentSavedMap {
@@unique([userId, courseId, week, yamlPath])
@@index([userId, courseId, week, createdAt])
@@index([userId, courseId, week, runtimeKind])
@@map("student_saved_maps")
}
@@ -291,16 +302,78 @@ model StudentCustomModule {
dockerImage String? @map("docker_image")
packageName String @map("package_name")
launchFile String @map("launch_file")
runtimeTarget String @default("LOCAL") @map("runtime_target")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
repository StudentCustomModuleRepository?
@@unique([userId, courseId, week, folderName])
@@unique([userId, courseId, week, folderName, runtimeTarget])
@@index([userId, courseId, week, sortOrder])
@@index([userId, courseId, week, runtimeTarget, sortOrder])
@@map("student_custom_modules")
}
model TeamCustomModule {
id String @id @default(uuid()) @db.Uuid
groupId String @map("group_id") @db.Uuid
creatorId String @map("creator_id") @db.Uuid
courseId String @map("course_id") @db.Uuid
week Int
sortOrder Int @map("sort_order")
category String
name String
folderName String @map("folder_name")
dockerImage String? @map("docker_image")
packageName String @map("package_name")
launchFile String @map("launch_file")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
group StudentGroup @relation(fields: [groupId], references: [id], onDelete: Cascade)
creator User @relation("TeamCustomModuleCreator", fields: [creatorId], references: [id], onDelete: Cascade)
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
repository TeamCustomModuleRepository?
@@unique([groupId, courseId, week, folderName])
@@index([groupId, courseId, week, sortOrder])
@@map("team_custom_modules")
}
model StudentCustomModuleRepository {
id String @id @default(uuid()) @db.Uuid
userId String @map("user_id") @db.Uuid
customModuleId String @unique @map("custom_module_id") @db.Uuid
repoOwner String @map("repo_owner")
repoName String @map("repo_name")
repositoryUrl String @map("repository_url")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
customModule StudentCustomModule @relation(fields: [customModuleId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([repoOwner, repoName])
@@map("student_custom_module_repositories")
}
model TeamCustomModuleRepository {
id String @id @default(uuid()) @db.Uuid
groupId String @map("group_id") @db.Uuid
customModuleId String @unique @map("custom_module_id") @db.Uuid
repoOwner String @map("repo_owner")
repoName String @map("repo_name")
repositoryUrl String @map("repository_url")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
group StudentGroup @relation(fields: [groupId], references: [id], onDelete: Cascade)
customModule TeamCustomModule @relation(fields: [customModuleId], references: [id], onDelete: Cascade)
@@index([groupId])
@@index([repoOwner, repoName])
@@map("team_custom_module_repositories")
}
model InstructorCurriculumSetting {
id String @id @default(uuid()) @db.Uuid
organizationId String? @map("organization_id") @db.Uuid
@@ -333,6 +406,7 @@ model InstructorCurriculumWeekOverride {
overview String?
deliverable String?
requiresSourceSubmission Boolean? @default(true) @map("requires_source_submission")
isTeamProject Boolean? @default(false) @map("is_team_project")
learningSteps Json? @map("learning_steps")
topics Json?
topicDetails Json? @map("topic_details")
@@ -540,6 +614,7 @@ model CourseWeekModule {
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
week CourseWeek @relation(fields: [weekId], references: [id], onDelete: Cascade)
studioRepositories StudioRepository[]
teamStudioRepositories TeamStudioRepository[]
submissionScores SubmissionScore[]
@@unique([weekId, folderName])
@@ -568,6 +643,26 @@ model StudioRepository {
@@map("studio_repositories")
}
model TeamStudioRepository {
id String @id @default(uuid()) @db.Uuid
groupId String @map("group_id") @db.Uuid
weekId String @map("week_id") @db.Uuid
moduleId String @map("module_id") @db.Uuid
repoOwner String @map("repo_owner")
repoName String @map("repo_name")
repositoryUrl String @map("repository_url")
templateRepositoryUrl String @map("template_repository_url")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
group StudentGroup @relation(fields: [groupId], references: [id], onDelete: Cascade)
module CourseWeekModule @relation(fields: [moduleId], references: [id], onDelete: Cascade)
@@unique([groupId, moduleId])
@@index([weekId])
@@index([repoOwner, repoName])
@@map("team_studio_repositories")
}
model SubmissionScore {
id String @id @default(uuid()) @db.Uuid
courseId String @map("course_id") @db.Uuid