fix(lms): support direct R2 map uploads and preserve empty course groups

This commit is contained in:
2026-09-09 13:57:28 +09:00
parent 121bf41266
commit d70f99e9c9
12 changed files with 348 additions and 57 deletions
@@ -0,0 +1,19 @@
ALTER TABLE "student_groups" ADD COLUMN "course_id" UUID;
CREATE INDEX "student_groups_course_id_idx" ON "student_groups"("course_id");
ALTER TABLE "student_groups" ADD CONSTRAINT "student_groups_course_id_fkey"
FOREIGN KEY ("course_id") REFERENCES "courses"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- Preserve only unambiguous historical course associations. Empty groups without
-- curriculum history cannot be attributed to an instructor safely.
WITH candidates AS (
SELECT "group_id", "course_id" FROM "instructor_curriculum_settings" WHERE "group_id" IS NOT NULL
UNION
SELECT m."group_id", e."course_id"
FROM "student_group_members" m
JOIN "student_enrollments" e ON e."user_id" = m."user_id" AND e."status" = 'ACTIVE'
), unique_courses AS (
SELECT "group_id", MIN("course_id"::text)::uuid AS "course_id"
FROM candidates GROUP BY "group_id" HAVING COUNT(DISTINCT "course_id") = 1
)
UPDATE "student_groups" g SET "course_id" = c."course_id"
FROM unique_courses c WHERE g."id" = c."group_id";
+4
View File
@@ -65,6 +65,8 @@ model StudentEnrollment {
model StudentGroup {
id String @id @default(uuid()) @db.Uuid
courseId String? @map("course_id") @db.Uuid
course Course? @relation(fields: [courseId], references: [id], onDelete: Restrict)
organizationId String? @map("organization_id") @db.Uuid
organizationName String @map("organization_name")
name String
@@ -84,6 +86,7 @@ model StudentGroup {
teamCustomModules TeamCustomModule[]
@@unique([organizationName, name])
@@index([courseId])
@@index([organizationId])
@@index([organizationName])
@@index([instructorPlatformId])
@@ -168,6 +171,7 @@ model Course {
customModules StudentCustomModule[]
teamCustomModules TeamCustomModule[]
submissionScores SubmissionScore[]
studentGroups StudentGroup[]
submissionTotalScores SubmissionTotalScore[]
@@index([isActive])