From 11bc793b125965babba8b4340f071360b9e83f12 Mon Sep 17 00:00:00 2001 From: wancat Date: Mon, 30 Oct 2023 22:10:25 +0800 Subject: [PATCH] refactor: separate createSession to sessionManager --- .eslintrc.js | 1 + docker-compose.prod.yml | 1 + docker-compose.testing.yml | 1 + .../src/api/controllers/sessionController.js | 52 +++---------------- server/src/containers/docker.js | 8 +-- server/src/game/sessionHandler.js | 4 ++ server/src/game/sessionManager.js | 50 ++++++++++++++++++ 7 files changed, 68 insertions(+), 49 deletions(-) create mode 100644 server/src/game/sessionManager.js diff --git a/.eslintrc.js b/.eslintrc.js index b9b5429..1d3cb3d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,5 +27,6 @@ module.exports = { 'no-var': 'error', 'no-plusplus': 'off', 'prettier/prettier': ['error', { endOfLine: 'auto', semi: false }], + 'import/prefer-default-export': 'off', }, } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index aeeeec4..44bb466 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -81,6 +81,7 @@ networks: internal: players: name: linux-odyssey-players + internal: true volumes: mongo: diff --git a/docker-compose.testing.yml b/docker-compose.testing.yml index cace521..100c9e1 100644 --- a/docker-compose.testing.yml +++ b/docker-compose.testing.yml @@ -76,3 +76,4 @@ networks: internal: players: name: linux-odyssey-players + internal: true diff --git a/server/src/api/controllers/sessionController.js b/server/src/api/controllers/sessionController.js index fd8564f..601a69c 100644 --- a/server/src/api/controllers/sessionController.js +++ b/server/src/api/controllers/sessionController.js @@ -1,6 +1,5 @@ -import { Session, Quest } from '@linux-odyssey/models' -import { createContainer, deleteContainer } from '../../containers/docker.js' -import SessionHandler from '../../game/sessionHandler.js' +import { Session } from '@linux-odyssey/models' +import { createNewSession } from '../../game/sessionManager.js' function sessionSummary(session) { return { @@ -37,53 +36,14 @@ export async function getSessionList(req, res) { } } -async function deactivateSessions(user, quest) { - const sessions = await Session.find({ - user, - quest, - status: 'active', - }) - return Promise.all( - sessions.map((session) => { - return deleteContainer(session.containerId).then(() => { - session.status = 'inactive' - session.containerId = null - return session.save() - }) - }) - ) -} - export async function createSession(req, res) { - const quest = await Quest.findById(req.body.quest_id) - if (!quest) { - res.status(400).json({ message: 'Quest not found.' }) - return - } - - // deactivate all active sessions - deactivateSessions(req.user._id, quest._id).catch((err) => { - console.error(err) - }) - + const { quest_id } = req.body try { - const container = await createContainer( - `quest-${quest.id}-${req.user.username}-${Date.now()}` - ) - const newSession = new Session({ - user: req.user, - quest, - containerId: container.id, - }) - - const session = new SessionHandler(newSession) - session.addNewTasks() - - await newSession.save() - res.status(201).json(sessionDetail(newSession)) + const session = await createNewSession(req.user, quest_id) + res.status(201).json(sessionDetail(session)) } catch (err) { console.error(err) - res.status(400).json({ message: err.message }) + res.status(500).json({ message: err.message }) } } diff --git a/server/src/containers/docker.js b/server/src/containers/docker.js index 551b1fc..5f21147 100644 --- a/server/src/containers/docker.js +++ b/server/src/containers/docker.js @@ -25,17 +25,19 @@ const containerOptions = { // const network = engine.getNetwork(config.dockerNetwork) -export async function createContainer(name) { - const container = await engine.createContainer({ +export function createContainer(name) { + return engine.createContainer({ ...containerOptions, name, }) - return container } export async function getAndStartContainer(id) { console.log(`Getting container: ${id}`) const container = engine.getContainer(id) + if (!container) { + throw new Error(`Container ${id} not found`) + } if (!(await container.inspect()).State.Running) { await container.start() } diff --git a/server/src/game/sessionHandler.js b/server/src/game/sessionHandler.js index 6107305..7b11e1e 100644 --- a/server/src/game/sessionHandler.js +++ b/server/src/game/sessionHandler.js @@ -6,6 +6,10 @@ export default class SessionHandler { this.quest = session.quest } + getSession() { + return this.session + } + getTask(stage) { return this.session.tasks.find((t) => t.id === stage.id) } diff --git a/server/src/game/sessionManager.js b/server/src/game/sessionManager.js new file mode 100644 index 0000000..211f11d --- /dev/null +++ b/server/src/game/sessionManager.js @@ -0,0 +1,50 @@ +import { Session, Quest } from '@linux-odyssey/models' +import { createContainer, deleteContainer } from '../containers/docker.js' +import SessionHandler from './sessionHandler.js' + +async function deactivateSessions(user, quest) { + const sessions = await Session.find({ + user, + quest, + status: 'active', + }) + return Promise.all( + sessions.map((session) => { + return deleteContainer(session.containerId).then(() => { + session.status = 'inactive' + session.containerId = null + return session.save() + }) + }) + ) +} + +export async function createNewSession(user, questId) { + const quest = await Quest.findById(questId) + if (!quest) { + throw new Error(`Quest ${questId} not found`) + } + + // deactivate all active sessions + deactivateSessions(user._id, quest._id).catch((err) => { + console.error(err) + }) + + const container = await createContainer( + `quest-${quest.id}-${user.username}-${Date.now()}` + ) + + const sessionHandler = new SessionHandler( + new Session({ + user, + quest, + containerId: container.id, + }) + ) + + sessionHandler.addNewTasks() + + const session = sessionHandler.getSession() + await session.save() + return session +}