完整性更新
现在已经实现了大部分基础功能
This commit is contained in:
103
src/modules/dashboard/data-access.ts
Normal file
103
src/modules/dashboard/data-access.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import "server-only"
|
||||
|
||||
import { cache } from "react"
|
||||
import { count, desc, eq, gt } from "drizzle-orm"
|
||||
|
||||
import { db } from "@/shared/db"
|
||||
import {
|
||||
chapters,
|
||||
classes,
|
||||
exams,
|
||||
homeworkAssignments,
|
||||
homeworkSubmissions,
|
||||
questions,
|
||||
sessions,
|
||||
textbooks,
|
||||
users,
|
||||
} from "@/shared/db/schema"
|
||||
import type { AdminDashboardData } from "./types"
|
||||
|
||||
export const getAdminDashboardData = cache(async (): Promise<AdminDashboardData> => {
|
||||
const now = new Date()
|
||||
|
||||
const [
|
||||
activeSessionsRow,
|
||||
userCountRow,
|
||||
userRoleRows,
|
||||
classCountRow,
|
||||
textbookCountRow,
|
||||
chapterCountRow,
|
||||
questionCountRow,
|
||||
examCountRow,
|
||||
homeworkAssignmentCountRow,
|
||||
homeworkAssignmentPublishedCountRow,
|
||||
homeworkSubmissionCountRow,
|
||||
homeworkSubmissionToGradeCountRow,
|
||||
recentUserRows,
|
||||
] = await Promise.all([
|
||||
db.select({ value: count() }).from(sessions).where(gt(sessions.expires, now)),
|
||||
db.select({ value: count() }).from(users),
|
||||
db.select({ role: users.role, value: count() }).from(users).groupBy(users.role),
|
||||
db.select({ value: count() }).from(classes),
|
||||
db.select({ value: count() }).from(textbooks),
|
||||
db.select({ value: count() }).from(chapters),
|
||||
db.select({ value: count() }).from(questions),
|
||||
db.select({ value: count() }).from(exams),
|
||||
db.select({ value: count() }).from(homeworkAssignments),
|
||||
db.select({ value: count() }).from(homeworkAssignments).where(eq(homeworkAssignments.status, "published")),
|
||||
db.select({ value: count() }).from(homeworkSubmissions),
|
||||
db.select({ value: count() }).from(homeworkSubmissions).where(eq(homeworkSubmissions.status, "submitted")),
|
||||
db
|
||||
.select({
|
||||
id: users.id,
|
||||
name: users.name,
|
||||
email: users.email,
|
||||
role: users.role,
|
||||
createdAt: users.createdAt,
|
||||
})
|
||||
.from(users)
|
||||
.orderBy(desc(users.createdAt))
|
||||
.limit(8),
|
||||
])
|
||||
|
||||
const activeSessionsCount = Number(activeSessionsRow[0]?.value ?? 0)
|
||||
const userCount = Number(userCountRow[0]?.value ?? 0)
|
||||
const classCount = Number(classCountRow[0]?.value ?? 0)
|
||||
const textbookCount = Number(textbookCountRow[0]?.value ?? 0)
|
||||
const chapterCount = Number(chapterCountRow[0]?.value ?? 0)
|
||||
const questionCount = Number(questionCountRow[0]?.value ?? 0)
|
||||
const examCount = Number(examCountRow[0]?.value ?? 0)
|
||||
const homeworkAssignmentCount = Number(homeworkAssignmentCountRow[0]?.value ?? 0)
|
||||
const homeworkAssignmentPublishedCount = Number(homeworkAssignmentPublishedCountRow[0]?.value ?? 0)
|
||||
const homeworkSubmissionCount = Number(homeworkSubmissionCountRow[0]?.value ?? 0)
|
||||
const homeworkSubmissionToGradeCount = Number(homeworkSubmissionToGradeCountRow[0]?.value ?? 0)
|
||||
|
||||
const userRoleCounts = userRoleRows
|
||||
.map((r) => ({ role: r.role ?? "unknown", count: Number(r.value ?? 0) }))
|
||||
.sort((a, b) => b.count - a.count)
|
||||
|
||||
const recentUsers = recentUserRows.map((u) => ({
|
||||
id: u.id,
|
||||
name: u.name,
|
||||
email: u.email,
|
||||
role: u.role,
|
||||
createdAt: u.createdAt.toISOString(),
|
||||
}))
|
||||
|
||||
return {
|
||||
activeSessionsCount,
|
||||
userCount,
|
||||
userRoleCounts,
|
||||
classCount,
|
||||
textbookCount,
|
||||
chapterCount,
|
||||
questionCount,
|
||||
examCount,
|
||||
homeworkAssignmentCount,
|
||||
homeworkAssignmentPublishedCount,
|
||||
homeworkSubmissionCount,
|
||||
homeworkSubmissionToGradeCount,
|
||||
recentUsers,
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user