Define routes, controllers of sessions

Work in progress, debugging
This commit is contained in:
wancat committed 2023-07-19 16:42:09 +08:00
1 parent 50443b96e0
commit 04edfdd0dc
13 files changed
+1804 -29

No files matched your search

+1
View File
@@ -2,6 +2,7 @@ module.exports = {
root: true, root: true,
env: { env: {
node: true, node: true,
jest: true,
}, },
extends: [ extends: [
'plugin:vue/vue3-essential', 'plugin:vue/vue3-essential',
+3 -1
View File
@@ -6,7 +6,8 @@
"scripts": { "scripts": {
"start": "node src/index.js", "start": "node src/index.js",
"dev": "nodemon 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": { "dependencies": {
"dockerode": "^3.3.5", "dockerode": "^3.3.5",
@@ -18,6 +19,7 @@
"yaml": "^2.3.1" "yaml": "^2.3.1"
}, },
"devDependencies": { "devDependencies": {
"jest": "^29.6.1",
"nodemon": "^3.0.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 })
}
}
+12
View File
@@ -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
+11
View File
@@ -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
+10 -3
View File
@@ -1,4 +1,4 @@
import fs from 'fs' import fs from 'fs/promises'
import express from 'express' import express from 'express'
import http from 'http' import http from 'http'
import YAML from 'yaml' import YAML from 'yaml'
@@ -6,14 +6,16 @@ import swaggerUI from 'swagger-ui-express'
import socketServer from './api/socket.js' import socketServer from './api/socket.js'
import connectDB from './db.js' import connectDB from './db.js'
import apiRouter from './api/routes/index.js'
async function main() {
const port = 3000 const port = 3000
const app = express() const app = express()
const server = http.createServer(app) const server = http.createServer(app)
socketServer(server) socketServer(server)
connectDB() await connectDB()
const file = fs.readFileSync('./swagger.yaml', 'utf8') const file = await fs.readFile('./swagger.yaml', 'utf8')
const swaggerDocument = YAML.parse(file) const swaggerDocument = YAML.parse(file)
app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerDocument)) app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerDocument))
@@ -21,6 +23,11 @@ app.get('/', (req, res) => {
res.send('Hello World!') res.send('Hello World!')
}) })
app.use('/api/v1', apiRouter)
server.listen(port, () => { server.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`) console.log(`Server listening at http://localhost:${port}`)
}) })
}
main().catch((err) => console.log(err))
-3
View File
@@ -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'
+6 -1
View File
@@ -1,10 +1,15 @@
import { model } from 'mongoose' import { model } from 'mongoose'
import { Schema } from 'yaml'
export default model( const Quest = model(
'Quest', 'Quest',
new Schema(
{ {
name: String, name: String,
description: String, description: String,
}, },
{ timestamp: true } { timestamp: true }
) )
)
export default Quest
+5 -1
View File
@@ -1,7 +1,8 @@
import { model, Schema } from 'mongoose' import { model, Schema } from 'mongoose'
export default model( const Session = model(
'Session', 'Session',
new Schema(
{ {
name: String, name: String,
containerId: String, containerId: String,
@@ -18,3 +19,6 @@ export default model(
}, },
{ timestamps: true } { timestamps: true }
) )
)
export default Session
+4 -2
View File
@@ -1,7 +1,9 @@
import mongoose from 'mongoose' import { model } from 'mongoose'
export default mongoose.model('User', { const User = model('User', {
username: String, username: String,
password: String, password: String,
email: String, email: String,
}) })
export default User
+1 -1
View File
@@ -10,7 +10,7 @@ info:
url: http://www.apache.org/licenses/LICENSE-2.0.html url: http://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.0 version: 1.0.0
servers: servers:
- url: / - url: /api/v1
tags: tags:
- name: admins - name: admins
description: Secured Admin-only calls 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()
})
})
+1635 -17
View File
File diff suppressed because it is too large. Load diff