mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-06 03:20:13 +08:00
Define routes, controllers of sessions
Work in progress, debugging
This commit is contained in:
1 parent
50443b96e0
commit
04edfdd0dc
13 files changed
+1835
-60
No files matched your search
+3
-1
@@ -6,7 +6,8 @@
|
||||
"scripts": {
|
||||
"start": "node src/index.js",
|
||||
"dev": "nodemon src/index.js",
|
||||
"cli": "node src/client.js"
|
||||
"cli": "node src/client.js",
|
||||
"test": "yarn node --experimental-vm-modules $(yarn bin jest)"
|
||||
},
|
||||
"dependencies": {
|
||||
"dockerode": "^3.3.5",
|
||||
@@ -18,6 +19,7 @@
|
||||
"yaml": "^2.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jest": "^29.6.1",
|
||||
"nodemon": "^3.0.1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import Session from '../../models/session.js'
|
||||
|
||||
export async function getSessionList(req, res) {
|
||||
try {
|
||||
const sessions = await Session.find({ user: req.user.id })
|
||||
res.json(sessions)
|
||||
} catch (err) {
|
||||
res.status(500).json({ message: err.message })
|
||||
}
|
||||
}
|
||||
|
||||
export async function createSession(req, res) {
|
||||
const newSession = new Session({
|
||||
user: req.user.id,
|
||||
exercise: req.body.exercise_id,
|
||||
})
|
||||
|
||||
try {
|
||||
const session = await newSession.save()
|
||||
res.status(201).json(session)
|
||||
} catch (err) {
|
||||
res.status(400).json({ message: err.message })
|
||||
}
|
||||
}
|
||||
|
||||
export async function getSessionById(req, res) {
|
||||
try {
|
||||
const session = await Session.findOne({
|
||||
_id: req.params.session_id,
|
||||
user: req.user.id,
|
||||
})
|
||||
|
||||
if (!session) {
|
||||
res.status(404).json({ message: 'Session not found.' })
|
||||
return
|
||||
}
|
||||
|
||||
res.json(session)
|
||||
} catch (err) {
|
||||
res.status(500).json({ message: err.message })
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteSessionById(req, res) {
|
||||
try {
|
||||
const session = await Session.findOneAndDelete({
|
||||
_id: req.params.session_id,
|
||||
user: req.user.id,
|
||||
})
|
||||
|
||||
if (!session) {
|
||||
res.status(404).json({ message: 'Session not found.' })
|
||||
return
|
||||
}
|
||||
|
||||
res.status(204).end()
|
||||
} catch (err) {
|
||||
res.status(500).json({ message: err.message })
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import { Router } from 'express'
|
||||
import sessions from './sessions.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.send('Hello API!')
|
||||
})
|
||||
|
||||
router.use('/sessions', sessions)
|
||||
|
||||
export default router
|
||||
@@ -0,0 +1,11 @@
|
||||
import { Router } from 'express'
|
||||
import * as sessionController from '../controllers/sessionController.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.get('/', sessionController.getSessionList)
|
||||
router.post('/', sessionController.createSession)
|
||||
router.get('/:id', sessionController.getSessionById)
|
||||
router.delete('/:id', sessionController.deleteSessionById)
|
||||
|
||||
export default router
|
||||
+22
-15
@@ -1,4 +1,4 @@
|
||||
import fs from 'fs'
|
||||
import fs from 'fs/promises'
|
||||
import express from 'express'
|
||||
import http from 'http'
|
||||
import YAML from 'yaml'
|
||||
@@ -6,21 +6,28 @@ import swaggerUI from 'swagger-ui-express'
|
||||
|
||||
import socketServer from './api/socket.js'
|
||||
import connectDB from './db.js'
|
||||
import apiRouter from './api/routes/index.js'
|
||||
|
||||
const port = 3000
|
||||
const app = express()
|
||||
const server = http.createServer(app)
|
||||
socketServer(server)
|
||||
connectDB()
|
||||
async function main() {
|
||||
const port = 3000
|
||||
const app = express()
|
||||
const server = http.createServer(app)
|
||||
socketServer(server)
|
||||
await connectDB()
|
||||
|
||||
const file = fs.readFileSync('./swagger.yaml', 'utf8')
|
||||
const swaggerDocument = YAML.parse(file)
|
||||
app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerDocument))
|
||||
const file = await fs.readFile('./swagger.yaml', 'utf8')
|
||||
const swaggerDocument = YAML.parse(file)
|
||||
app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerDocument))
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Hello World!')
|
||||
})
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Hello World!')
|
||||
})
|
||||
|
||||
server.listen(port, () => {
|
||||
console.log(`Server listening at http://localhost:${port}`)
|
||||
})
|
||||
app.use('/api/v1', apiRouter)
|
||||
|
||||
server.listen(port, () => {
|
||||
console.log(`Server listening at http://localhost:${port}`)
|
||||
})
|
||||
}
|
||||
|
||||
main().catch((err) => console.log(err))
|
||||
@@ -1,3 +0,0 @@
|
||||
export { default as User } from './user.js'
|
||||
export { default as Session } from './session.js'
|
||||
export { default as Quest } from './quest.js'
|
||||
@@ -1,10 +1,15 @@
|
||||
import { model } from 'mongoose'
|
||||
import { Schema } from 'yaml'
|
||||
|
||||
export default model(
|
||||
const Quest = model(
|
||||
'Quest',
|
||||
{
|
||||
name: String,
|
||||
description: String,
|
||||
},
|
||||
{ timestamp: true }
|
||||
new Schema(
|
||||
{
|
||||
name: String,
|
||||
description: String,
|
||||
},
|
||||
{ timestamp: true }
|
||||
)
|
||||
)
|
||||
|
||||
export default Quest
|
||||
@@ -1,20 +1,24 @@
|
||||
import { model, Schema } from 'mongoose'
|
||||
|
||||
export default model(
|
||||
const Session = model(
|
||||
'Session',
|
||||
{
|
||||
name: String,
|
||||
containerId: String,
|
||||
user: {
|
||||
type: Schema.ObjectId,
|
||||
ref: 'User',
|
||||
new Schema(
|
||||
{
|
||||
name: String,
|
||||
containerId: String,
|
||||
user: {
|
||||
type: Schema.ObjectId,
|
||||
ref: 'User',
|
||||
},
|
||||
quest: {
|
||||
type: Schema.ObjectId,
|
||||
ref: 'Quest',
|
||||
},
|
||||
finishedAt: Date,
|
||||
terminals: [String],
|
||||
},
|
||||
quest: {
|
||||
type: Schema.ObjectId,
|
||||
ref: 'Quest',
|
||||
},
|
||||
finishedAt: Date,
|
||||
terminals: [String],
|
||||
},
|
||||
{ timestamps: true }
|
||||
{ timestamps: true }
|
||||
)
|
||||
)
|
||||
|
||||
export default Session
|
||||
@@ -1,7 +1,9 @@
|
||||
import mongoose from 'mongoose'
|
||||
import { model } from 'mongoose'
|
||||
|
||||
export default mongoose.model('User', {
|
||||
const User = model('User', {
|
||||
username: String,
|
||||
password: String,
|
||||
email: String,
|
||||
})
|
||||
|
||||
export default User
|
||||
+1
-1
@@ -10,7 +10,7 @@ info:
|
||||
url: http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: /
|
||||
- url: /api/v1
|
||||
tags:
|
||||
- name: admins
|
||||
description: Secured Admin-only calls
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
import jest from 'jest'
|
||||
import * as sessionController from '../../src/api/controllers/sessionController'
|
||||
import Session from '../../src/models/session'
|
||||
|
||||
jest.mock('../../src/models/session')
|
||||
|
||||
describe('Session Controller', () => {
|
||||
let mockReq
|
||||
let mockRes
|
||||
|
||||
beforeEach(() => {
|
||||
mockReq = {
|
||||
user: { id: 'userid' },
|
||||
body: {},
|
||||
params: {},
|
||||
}
|
||||
mockRes = {
|
||||
status: jest.fn().mockReturnThis(),
|
||||
json: jest.fn().mockReturnThis(),
|
||||
end: jest.fn().mockReturnThis(),
|
||||
}
|
||||
})
|
||||
|
||||
test('getSessionList returns a list of sessions', async () => {
|
||||
Session.find.mockResolvedValue(['session1', 'session2'])
|
||||
await sessionController.getSessionList(mockReq, mockRes)
|
||||
expect(mockRes.json).toHaveBeenCalledWith(['session1', 'session2'])
|
||||
})
|
||||
|
||||
test('createSession creates a new session', async () => {
|
||||
mockReq.body.exercise_id = 'exerciseid'
|
||||
const mockSession = { user: 'userid', exercise: 'exerciseid' }
|
||||
Session.mockReturnValue(mockSession)
|
||||
mockSession.save = jest.fn().mockResolvedValue('newsess')
|
||||
await sessionController.createSession(mockReq, mockRes)
|
||||
expect(mockRes.status).toHaveBeenCalledWith(201)
|
||||
expect(mockRes.json).toHaveBeenCalledWith('newsess')
|
||||
})
|
||||
|
||||
test('getSessionById returns the correct session', async () => {
|
||||
mockReq.params.session_id = 'sessionid'
|
||||
const mockSession = { user: 'userid', _id: 'sessionid' }
|
||||
Session.findOne.mockResolvedValue(mockSession)
|
||||
await sessionController.getSessionById(mockReq, mockRes)
|
||||
expect(mockRes.json).toHaveBeenCalledWith(mockSession)
|
||||
})
|
||||
|
||||
test('deleteSessionById deletes a session', async () => {
|
||||
mockReq.params.session_id = 'sessionid'
|
||||
const mockSession = { user: 'userid', _id: 'sessionid' }
|
||||
Session.findOneAndDelete.mockResolvedValue(mockSession)
|
||||
await sessionController.deleteSessionById(mockReq, mockRes)
|
||||
expect(mockRes.status).toHaveBeenCalledWith(204)
|
||||
expect(mockRes.end).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user