From 5a7c4da628ac32510b3e08b5153acef091d88fc5 Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 30 Oct 2023 22:43:27 +0800 Subject: [PATCH] refactor: add getOrCreateSession to simplify process --- app/src/utils/session.js | 30 +++--------------- app/src/views/GamePage.vue | 2 +- .../src/api/controllers/sessionController.js | 16 +++++++++- server/src/api/routes/sessions.js | 1 + server/src/game/sessionManager.js | 24 +++++++++++--- server/swagger.yaml | 31 +++++++++++++++++++ 6 files changed, 72 insertions(+), 32 deletions(-) diff --git a/app/src/utils/session.js b/app/src/utils/session.js index e659bff..a1317ee 100644 --- a/app/src/utils/session.js +++ b/app/src/utils/session.js @@ -58,34 +58,14 @@ class SessionManager { this.setSession(data) } - async getSessionList() { - const res = await api.get('/sessions', { - params: { quest_id: this.questId }, + async getActiveSession() { + const res = await api.post('/sessions/active', { + quest_id: this.questId, }) - const { data } = res - return data - } - - async lastSession() { - const sessions = await this.getSessionList() - if (sessions.length === 0) { - return - } - const { _id: sessionId } = sessions[sessions.length - 1] - const { data: session } = await api.get(`/sessions/${sessionId}`) - console.log( - `Last Session ID: ${session._id}, Quest: ${session.quest}, Created At: ${session.createdAt}` - ) + const session = res.data + console.log(session) this.setSession(session) } - - async lastOrCreate() { - await this.lastSession() - if (!this.session.value) { - await this.createSession() - } - console.log(this.session.value) - } } const sessionManager = new SessionManager('helloworld') diff --git a/app/src/views/GamePage.vue b/app/src/views/GamePage.vue index 6312731..e5550bc 100644 --- a/app/src/views/GamePage.vue +++ b/app/src/views/GamePage.vue @@ -16,7 +16,7 @@ const completed = computed(() => { }) onMounted(async () => { - await sessionManager.lastOrCreate() + await sessionManager.getActiveSession() socket.connect(sessionManager.getSession()) socket.on('connect', function open() { console.log('Connected to the server.') diff --git a/server/src/api/controllers/sessionController.js b/server/src/api/controllers/sessionController.js index 601a69c..43ea7ca 100644 --- a/server/src/api/controllers/sessionController.js +++ b/server/src/api/controllers/sessionController.js @@ -1,5 +1,8 @@ import { Session } from '@linux-odyssey/models' -import { createNewSession } from '../../game/sessionManager.js' +import { + createNewSession, + getOrCreateActiveSession, +} from '../../game/sessionManager.js' function sessionSummary(session) { return { @@ -82,3 +85,14 @@ export async function deleteSessionById(req, res) { res.status(500).json({ message: err.message }) } } + +export async function getActiveSession(req, res) { + const { quest_id } = req.body + try { + const session = await getOrCreateActiveSession(req.user, quest_id) + res.json(sessionDetail(session)) + } catch (err) { + console.error(err) + res.status(500).json({ message: err.message }) + } +} diff --git a/server/src/api/routes/sessions.js b/server/src/api/routes/sessions.js index a4d15eb..d8f0b5d 100644 --- a/server/src/api/routes/sessions.js +++ b/server/src/api/routes/sessions.js @@ -5,6 +5,7 @@ const router = Router() router.get('/', sessionController.getSessionList) router.post('/', sessionController.createSession) +router.post('/active', sessionController.getActiveSession) router.get('/:id', sessionController.getSessionById) router.delete('/:id', sessionController.deleteSessionById) diff --git a/server/src/game/sessionManager.js b/server/src/game/sessionManager.js index 211f11d..409f58e 100644 --- a/server/src/game/sessionManager.js +++ b/server/src/game/sessionManager.js @@ -10,11 +10,13 @@ async function deactivateSessions(user, quest) { }) return Promise.all( sessions.map((session) => { - return deleteContainer(session.containerId).then(() => { - session.status = 'inactive' - session.containerId = null - return session.save() - }) + return deleteContainer(session.containerId) + .catch(console.error) + .finally(() => { + session.status = 'inactive' + session.containerId = null + return session.save() + }) }) ) } @@ -48,3 +50,15 @@ export async function createNewSession(user, questId) { await session.save() return session } + +export async function getOrCreateActiveSession(user, questId) { + const session = await Session.findOne({ + user, + quest: questId, + status: 'active', + }) + if (session) { + return session + } + return createNewSession(user, questId) +} diff --git a/server/swagger.yaml b/server/swagger.yaml index d52d7bc..a90f34d 100644 --- a/server/swagger.yaml +++ b/server/swagger.yaml @@ -80,6 +80,37 @@ paths: message: type: string + /sessions/active: + post: + summary: 'Get or create an active session.' + tags: + - signed-in + description: 'This endpoint returns the latest active session for the user, or creates a new one if no active session exists.' + requestBody: + required: true + content: + application/json: + schema: + type: 'object' + required: + - quest_id + properties: + quest_id: + type: 'string' + description: 'The ID of the quest.' + example: 'helloworld' + responses: + 200: + description: 'Return a active session.' + content: + application/json: + schema: + $ref: '#/components/schemas/Session' + 400: + description: 'Bad Request. The request is invalid or malformed.' + 500: + description: 'Internal Server Error.' + /sessions/{session_id}: get: tags: