完整性更新
现在已经实现了大部分基础功能
This commit is contained in:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user