From fd543ed594cc65fd80f093a2304e636f104692c0 Mon Sep 17 00:00:00 2001 From: wancat Date: Thu, 22 Feb 2024 20:10:03 +0800 Subject: [PATCH] finish session controller --- .../src/api/controllers/sessionController.js | 75 ---------------- .../src/api/controllers/sessionController.ts | 86 +++++++++++++++++++ server/src/models/sessionManager.ts | 4 +- 3 files changed, 88 insertions(+), 77 deletions(-) delete mode 100644 server/src/api/controllers/sessionController.js create mode 100644 server/src/api/controllers/sessionController.ts diff --git a/server/src/api/controllers/sessionController.js b/server/src/api/controllers/sessionController.js deleted file mode 100644 index a5c03db..0000000 --- a/server/src/api/controllers/sessionController.js +++ /dev/null @@ -1,75 +0,0 @@ -import { matchedData } from 'express-validator' -import { Session } from '@linux-odyssey/models' -import { - createNewSession, - getOrCreateActiveSession, - isQuestUnlocked, -} from '../../models/sessionManager.js' -import { asyncHandler } from '../../middleware/error.js' -import config from '../../config.js' - -function sessionSummary(session) { - return { - _id: session._id, - user: session.user._id || session.user, - quest: session.quest._id || session.quest, - status: session.status, - createdAt: session.createdAt, - lastActivityAt: session.lastActivityAt, - } -} - -function sessionDetail(session) { - return { - ...sessionSummary(session), - hints: session.hints, - tasks: session.tasks, - graph: session.graph, - } -} - -export const getSessionList = asyncHandler(async (req, res) => { - const query = { user: req.user._id } - const { questId, status } = matchedData(req) - if (questId) { - query.quest = questId - } - query.status = status || 'active' - const sessions = await Session.find(query) - res.json(sessions.map(sessionSummary)) -}) - -export const createSession = asyncHandler(async (req, res) => { - const { questId } = matchedData(req) - if (await isQuestUnlocked(req.user, questId)) { - const session = await createNewSession(req.user, questId) - res.status(201).json(sessionDetail(session)) - } else { - res.status(403).json({ message: 'Quest is locked.' }) - } -}) - -export const getSessionById = asyncHandler(async (req, res) => { - const { sessionId } = matchedData(req) - const session = await Session.findOne({ - _id: sessionId, - user: req.user._id, - }) - - if (!session) { - res.status(404).json({ message: 'Session not found.' }) - return - } - - res.json(sessionDetail(session)) -}) - -export const getOrCreateSession = asyncHandler(async (req, res) => { - const { questId } = matchedData(req) - if ((await isQuestUnlocked(req.user, questId)) || config.testing.enabled) { - const session = await getOrCreateActiveSession(req.user, questId) - res.json(sessionDetail(session)) - } else { - res.status(403).json({ message: 'Quest is locked.' }) - } -}) diff --git a/server/src/api/controllers/sessionController.ts b/server/src/api/controllers/sessionController.ts new file mode 100644 index 0000000..2fb6f00 --- /dev/null +++ b/server/src/api/controllers/sessionController.ts @@ -0,0 +1,86 @@ +import { matchedData } from 'express-validator' +import type { Express, Request, Response } from 'express' +import { User, Session, ISession } from '@linux-odyssey/models' +import { + createNewSession, + getOrCreateActiveSession, + isQuestUnlocked, +} from '../../models/sessionManager.js' +import { asyncHandler } from '../../middleware/error.js' +import config from '../../config.js' + +function sessionSummary(session: ISession) { + return { + _id: session._id, + user: session.user, + quest: session.quest, + status: session.status, + createdAt: session.createdAt, + lastActivityAt: session.lastActivityAt, + } +} + +function sessionDetail(session: ISession) { + return { + ...sessionSummary(session), + hints: session.hints, + tasks: session.tasks, + graph: session.graph, + } +} + +export const getSessionList = asyncHandler( + async (req: Request, res: Response) => { + const user = req.user as Express.ExistingUser + const { questId, status } = matchedData(req) + const query = { user: user.id, quest: questId, status } + const sessions = await Session.find(query) + res.json(sessions.map(sessionSummary)) + } +) + +export const createSession = asyncHandler( + async (req: Request, res: Response) => { + const { questId } = matchedData(req) + const user = await User.findById((req.user as Express.ExistingUser).id) + if (user && (await isQuestUnlocked(user, questId))) { + const session = await createNewSession(user, questId) + res.status(201).json(sessionDetail(session)) + } else { + res.status(403).json({ message: 'Quest is locked.' }) + } + } +) + +export const getSessionById = asyncHandler( + async (req: Request, res: Response) => { + const { sessionId } = matchedData(req) + const session = await Session.findOne({ + _id: sessionId, + user: (req.user as Express.ExistingUser).id, + }) + + if (!session) { + res.status(404).json({ message: 'Session not found.' }) + return + } + + res.json(sessionDetail(session)) + } +) + +export const getOrCreateSession = asyncHandler( + async (req: Request, res: Response) => { + const { questId } = matchedData(req) + const user = await User.findById((req.user as Express.ExistingUser).id) + if ( + user && + ((await isQuestUnlocked(user, questId)) || config.testing.enabled) + ) { + const session = await getOrCreateActiveSession(user, questId) + res.json(sessionDetail(session)) + } else { + res.status(403).json({ message: 'Quest is locked.' }) + } + } +) diff --git a/server/src/models/sessionManager.ts b/server/src/models/sessionManager.ts index 76370e5..d6bfa2f 100644 --- a/server/src/models/sessionManager.ts +++ b/server/src/models/sessionManager.ts @@ -120,9 +120,9 @@ export async function isQuestUnlocked( user: HydratedDocument, questId: string ): Promise { - const userProfile = await UserProfile.findOne({ user: user._id }) + const userProfile = await UserProfile.findOne({ user: user.id }) if (!userProfile) { - throw new Error(`UserProfile ${user._id} not found`) + throw new Error(`UserProfile ${user.id} not found`) } const quest = await Quest.findById(questId) if (!quest) {