feat: migrate quest api to trpc

This commit is contained in:
Justin Lin committed 2025-04-16 16:24:29 +08:00
1 parent 55a41dd3b5
commit ac92950177
14 files changed
+55 -71

No files matched your search

@@ -1,28 +0,0 @@
import { Quest } from '@linux-odyssey/models'
import { matchedData } from 'express-validator'
import type { Request, Response } from 'express'
import { asyncHandler } from '../../middleware/error.js'
export const getQuests = asyncHandler(async (req: Request, res: Response) => {
const quests = await Quest.find({})
res.json(
quests.map(({ title, _id, requirements }) => ({
_id,
title,
requirements,
}))
)
})
export const getQuestDetail = asyncHandler(
async (req: Request, res: Response) => {
const { questId } = matchedData(req)
const quest = await Quest.findById(questId)
if (!quest) {
res.status(404).json({ message: 'Quest not found.' })
return
}
const { _id, title, instruction, requirements } = quest
res.json({ _id, title, instruction, requirements })
}
)
-2
View File
@@ -1,7 +1,6 @@
import { Router } from 'express'
import passport from 'passport'
import sessions from './sessionRouter.js'
import quests from './questRouter.js'
import commands from './commandRouter.js'
import authRouter from './authRouter.js'
import authRequired from '../../middleware/authRequired.js'
@@ -29,7 +28,6 @@ router.use(
router.use('/auth', authRouter)
router.use('/sessions', authRequired, sessions)
router.use('/quests', quests)
router.use('/users', userRouter)
router.get('/survey', (req, res) => {
-10
View File
@@ -1,10 +0,0 @@
import { Router } from 'express'
import * as questController from '../controllers/questController.js'
import { questIdValidator } from '../validators/questValidator.js'
const router = Router()
router.get('/', questController.getQuests)
router.get('/:questId', questIdValidator, questController.getQuestDetail)
export default router
@@ -1,7 +0,0 @@
import { check } from 'express-validator'
import { noError } from '../../middleware/validator.js'
export const checkQuestId = () =>
check('questId').notEmpty().isString().isLowercase().isLength({ max: 64 })
export const questIdValidator = [checkQuestId(), noError]
@@ -1,5 +1,4 @@
import { check } from 'express-validator'
import { checkQuestId } from './questValidator.js'
import { noError } from '../../middleware/validator.js'
const checkSessionStatus = () =>
@@ -8,7 +7,7 @@ const checkSessionStatus = () =>
export const checkSessionId = () =>
check('sessionId').notEmpty().isString().isMongoId()
export const sessionListValidator = [checkQuestId(), checkSessionStatus()]
export const sessionListValidator = [checkSessionStatus()]
export const sessionDetailValidator = [checkSessionId()]
export const createSessionValidator = [checkQuestId(), noError]
export const activeSessionValidator = [checkQuestId(), noError]
export const createSessionValidator = [noError]
export const activeSessionValidator = [noError]
+2
View File
@@ -1,5 +1,6 @@
import { router, publicProcedure } from '../trpc.js'
import { linkRouter } from './linkRouter.js'
import { questRouter } from './questRouter.js'
export const appRouter = router({
userList: publicProcedure.query(async (opts) => {
@@ -7,6 +8,7 @@ export const appRouter = router({
return opts.ctx
}),
links: linkRouter,
quests: questRouter,
})
export type AppRouter = typeof appRouter
+30
View File
@@ -0,0 +1,30 @@
import { TRPCError } from '@trpc/server'
import { Quest } from '@linux-odyssey/models'
import { QuestDetailResponse } from '@linux-odyssey/constants'
import { z } from 'zod'
import { router, publicProcedure } from '../trpc.js'
export const questRouter = router({
getQuests: publicProcedure.query(async () => {
const quests = await Quest.find({})
return quests.map(({ title, _id, requirements }) => ({
_id,
title,
requirements,
}))
}),
getQuestDetail: publicProcedure
.input(z.string())
.query(async (opts): Promise<QuestDetailResponse> => {
const id = opts.input
const quest = await Quest.findById(id)
if (!quest) {
throw new TRPCError({
code: 'NOT_FOUND',
message: 'Quest not found.',
})
}
const { _id, title, instruction, requirements } = quest
return { _id, title, instruction, requirements }
}),
})