完整性更新
Some checks failed
CI / build-and-test (push) Failing after 3m50s
CI / deploy (push) Has been skipped

现在已经实现了大部分基础功能
This commit is contained in:
SpecialX
2026-01-08 11:14:03 +08:00
parent 0da2eac0b4
commit 57807def37
155 changed files with 26421 additions and 1036 deletions

View File

@@ -7,6 +7,8 @@ import { and, count, eq } from "drizzle-orm"
import { db } from "@/shared/db"
import {
classes,
classEnrollments,
exams,
homeworkAnswers,
homeworkAssignmentQuestions,
@@ -78,6 +80,7 @@ export async function createHomeworkAssignmentAction(
const parsed = CreateHomeworkAssignmentSchema.safeParse({
sourceExamId: formData.get("sourceExamId"),
classId: formData.get("classId"),
title: formData.get("title") || undefined,
description: formData.get("description") || undefined,
availableAt: formData.get("availableAt") || undefined,
@@ -105,6 +108,13 @@ export async function createHomeworkAssignmentAction(
const input = parsed.data
const publish = input.publish ?? true
const [ownedClass] = await db
.select({ id: classes.id })
.from(classes)
.where(user.role === "admin" ? eq(classes.id, input.classId) : and(eq(classes.id, input.classId), eq(classes.teacherId, user.id)))
.limit(1)
if (!ownedClass) return { success: false, message: "Class not found" }
const exam = await db.query.exams.findFirst({
where: eq(exams.id, input.sourceExamId),
with: {
@@ -122,15 +132,30 @@ export async function createHomeworkAssignmentAction(
const dueAt = input.dueAt ? new Date(input.dueAt) : null
const lateDueAt = input.lateDueAt ? new Date(input.lateDueAt) : null
const classStudentIds = (
await db
.select({ studentId: classEnrollments.studentId })
.from(classEnrollments)
.innerJoin(classes, eq(classes.id, classEnrollments.classId))
.where(
and(
eq(classEnrollments.classId, input.classId),
eq(classEnrollments.status, "active"),
user.role === "admin" ? eq(classes.id, input.classId) : eq(classes.teacherId, user.id)
)
)
).map((r) => r.studentId)
const classStudentIdSet = new Set(classStudentIds)
const targetStudentIds =
input.targetStudentIds && input.targetStudentIds.length > 0
? input.targetStudentIds
: (
await db
.select({ id: users.id })
.from(users)
.where(eq(users.role, "student"))
).map((r) => r.id)
? input.targetStudentIds.filter((id) => classStudentIdSet.has(id))
: classStudentIds
if (publish && targetStudentIds.length === 0) {
return { success: false, message: "No active students in this class" }
}
await db.transaction(async (tx) => {
await tx.insert(homeworkAssignments).values({