From a7422853fac4bf51af0232e3d5e19ad1dffbee28 Mon Sep 17 00:00:00 2001 From: wancat Date: Sat, 11 Nov 2023 16:33:05 +0800 Subject: [PATCH] feat: add /users/me endpoint --- server/src/api/controllers/userController.js | 25 ++++++ .../src/api/routes/{auth.js => authRouter.js} | 0 .../routes/{commands.js => commandRouter.js} | 0 server/src/api/routes/index.js | 10 ++- .../api/routes/{quests.js => questRouter.js} | 0 .../routes/{sessions.js => sessionRouter.js} | 0 server/src/api/routes/userRouter.js | 9 ++ server/swagger.yaml | 87 +++++++++++++++---- 8 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 server/src/api/controllers/userController.js rename server/src/api/routes/{auth.js => authRouter.js} (100%) rename server/src/api/routes/{commands.js => commandRouter.js} (100%) rename server/src/api/routes/{quests.js => questRouter.js} (100%) rename server/src/api/routes/{sessions.js => sessionRouter.js} (100%) create mode 100644 server/src/api/routes/userRouter.js diff --git a/server/src/api/controllers/userController.js b/server/src/api/controllers/userController.js new file mode 100644 index 0000000..e6a3160 --- /dev/null +++ b/server/src/api/controllers/userController.js @@ -0,0 +1,25 @@ +import { UserProfile } from '@linux-odyssey/models' + +export async function me(req, res) { + const userProfile = await UserProfile.findOne({ + user: req.user._id, + }).populate('user') + console.log(userProfile) + if (!userProfile) { + res.status(404).json({ message: 'User not found' }) + return + } + const { + user: { username, email }, + progress, + } = userProfile + res.json({ + username, + email, + progress, + }) +} + +export default { + me, +} diff --git a/server/src/api/routes/auth.js b/server/src/api/routes/authRouter.js similarity index 100% rename from server/src/api/routes/auth.js rename to server/src/api/routes/authRouter.js diff --git a/server/src/api/routes/commands.js b/server/src/api/routes/commandRouter.js similarity index 100% rename from server/src/api/routes/commands.js rename to server/src/api/routes/commandRouter.js diff --git a/server/src/api/routes/index.js b/server/src/api/routes/index.js index aea4d31..427cf91 100644 --- a/server/src/api/routes/index.js +++ b/server/src/api/routes/index.js @@ -1,10 +1,11 @@ import { Router } from 'express' import passport from 'passport' -import sessions from './sessions.js' -import quests from './quests.js' -import commands from './commands.js' -import authRouter from './auth.js' +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' +import userRouter from './userRouter.js' import config from '../../config.js' const router = Router() @@ -21,6 +22,7 @@ if (!config.isProduction) { router.use('/auth', authRouter) router.use('/quests', quests) +router.use('/users', userRouter) router.use('/sessions', authRequired, sessions) router.use( diff --git a/server/src/api/routes/quests.js b/server/src/api/routes/questRouter.js similarity index 100% rename from server/src/api/routes/quests.js rename to server/src/api/routes/questRouter.js diff --git a/server/src/api/routes/sessions.js b/server/src/api/routes/sessionRouter.js similarity index 100% rename from server/src/api/routes/sessions.js rename to server/src/api/routes/sessionRouter.js diff --git a/server/src/api/routes/userRouter.js b/server/src/api/routes/userRouter.js new file mode 100644 index 0000000..2bd7fe8 --- /dev/null +++ b/server/src/api/routes/userRouter.js @@ -0,0 +1,9 @@ +import express from 'express' +import userController from '../controllers/userController.js' +import authRequired from '../../middleware/authRequired.js' + +const router = express.Router() + +router.get('/me', authRequired, userController.me) + +export default router diff --git a/server/swagger.yaml b/server/swagger.yaml index b5cc28a..fab89f7 100644 --- a/server/swagger.yaml +++ b/server/swagger.yaml @@ -27,7 +27,7 @@ paths: - cookieAuth: [] parameters: - in: query - name: quest_id + name: questId description: find sessions by quest id schema: type: string @@ -60,7 +60,7 @@ paths: schema: type: object properties: - quest_id: + questId: type: string example: helloworld responses: @@ -93,9 +93,9 @@ paths: schema: type: 'object' required: - - quest_id + - questId properties: - quest_id: + questId: type: 'string' description: 'The ID of the quest.' example: 'helloworld' @@ -111,7 +111,7 @@ paths: 500: description: 'Internal Server Error.' - /sessions/{session_id}: + /sessions/{sessionId}: get: tags: - signed-in @@ -120,7 +120,7 @@ paths: - cookieAuth: [] parameters: - in: path - name: session_id + name: sessionId description: ID of the session to retrieve required: true schema: @@ -151,7 +151,7 @@ paths: - cookieAuth: [] parameters: - in: path - name: session_id + name: sessionId required: true schema: type: string @@ -468,12 +468,12 @@ paths: items: $ref: '#/components/schemas/QuestSummary' - /quests/{quest_id}: + /quests/{questId}: get: summary: get a quest's detail by name parameters: - in: path - name: quest_id + name: questId description: name of the quest to retrieve required: true schema: @@ -534,6 +534,23 @@ paths: type: string example: '127.0.0.1' + /users/me: + get: + summary: Get current user's profile + tags: + - signed-in + security: + - cookieAuth: [] + responses: + '200': + description: User profile + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '401': + description: Unauthorized + components: schemas: User: @@ -549,6 +566,46 @@ components: email: type: string format: email + + UserProfile: + type: object + properties: + username: + type: string + example: 'alex' + email: + type: string + format: email + example: alex@example.com + progress: + type: object + additionalProperties: + $ref: '#/components/schemas/Progress' + + Progress: + type: object + properties: + questId: + type: string + example: helloworld + sessions: + type: array + items: + type: string + format: objectId + example: 64b7a3a3c182b4826dd1aaa1 + completed: + type: boolean + example: true + startedAt: + type: string + format: date-time + example: 2020-01-01T00:00:00.000Z + finishedAt: + type: string + format: date-time + example: 2020-01-01T00:00:00.000Z + Quest: type: object properties: @@ -587,13 +644,13 @@ components: $ref: '#/components/schemas/User' quest: $ref: '#/components/schemas/Quest' - created_at: + createdAt: type: string format: date-time - updated_at: + updatedAt: type: string format: date-time - finished_at: + finishedAt: type: string format: date-time hints: @@ -621,13 +678,13 @@ components: example: 64b7a3a3c182b4826dd1aaa1 quest: $ref: '#/components/schemas/Quest' - created_at: + createdAt: type: string format: date-time - updated_at: + updatedAt: type: string format: date-time - finished_at: + finishedAt: type: string format: date-time