diff --git a/server/src/api/controllers/sessionController.js b/server/src/api/controllers/sessionController.js index 79b0940..6272215 100644 --- a/server/src/api/controllers/sessionController.js +++ b/server/src/api/controllers/sessionController.js @@ -1,5 +1,6 @@ import Session from '../../models/session.js' import Quest from '../../models/quest.js' +import { createContainer } from '../../containers/docker.js' export async function getSessionList(req, res) { try { @@ -7,8 +8,31 @@ export async function getSessionList(req, res) { if (req.query.quest_id) { query.quest = req.query.quest_id } + if (req.query.status) { + query.status = req.query.status + } const sessions = await Session.find(query) - res.json(sessions) + res.json( + sessions.map( + ({ + _id, + user, + quest, + status, + progress, + createdAt, + lastActivityAt, + }) => ({ + _id, + user, + quest, + status, + progress, + createdAt, + lastActivityAt, + }) + ) + ) } catch (err) { console.error(err) res.status(500).json({ message: err.message }) @@ -24,11 +48,14 @@ export async function createSession(req, res) { try { const progress = quest.stages[0].id + const container = await createContainer( + `quest-${quest.id}-${req.user.username}-${Date.now()}` + ) const newSession = new Session({ user: req.user, quest, progress, - containerId: `quest-${quest.id}-${req.user.username}-${Date.now()}`, + containerId: container.id, }) const session = await newSession.save() diff --git a/server/src/api/socket.js b/server/src/api/socket.js index a56fcb8..25d26d6 100644 --- a/server/src/api/socket.js +++ b/server/src/api/socket.js @@ -1,5 +1,5 @@ import { Server } from 'socket.io' -import { getOrCreateContainer, attachContainer } from '../containers/docker.js' +import { getAndStartContainer, attachContainer } from '../containers/docker.js' import Session from '../models/session.js' import { defaultUser, genSessionJWT } from '../utils/auth.js' @@ -47,6 +47,7 @@ export default (server) => { session = await Session.findOne({ _id: sessionId, user: socket.user, + status: 'active', }) if (!session) { socket.send('Session not found.') @@ -61,7 +62,7 @@ export default (server) => { const token = await genSessionJWT(session) - const container = await getOrCreateContainer(session.containerId) + const container = await getAndStartContainer(session.containerId) const stream = await attachContainer(container, { token }) stream.on('data', (chunk) => { diff --git a/server/src/containers/docker.js b/server/src/containers/docker.js index f4a2493..8dc0fbb 100644 --- a/server/src/containers/docker.js +++ b/server/src/containers/docker.js @@ -24,7 +24,16 @@ const containerOptions = { const network = engine.getNetwork(config.dockerNetwork) -export async function getOrCreateContainer(id) { +export async function createContainer(name) { + const container = await engine.createContainer({ + ...containerOptions, + name, + }) + await network.connect({ Container: container.id }) + return container +} + +export async function getAndStartContainer(id) { console.log(`Getting container: ${id}`) let container try { @@ -34,20 +43,7 @@ export async function getOrCreateContainer(id) { } return container } catch (error) { - try { - container = await engine.createContainer({ - ...containerOptions, - name: id, - }) - } catch (err) { - console.log(err) - throw err - } - await network.connect({ Container: container.id }) - - await container.start() - console.log(container.id) - return container + throw new Error(`Container not found: ${id}`) } }