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
+1835 -60

No files matched your search

+3 -1
View File
@@ -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 })
}
}
+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
+22 -15
View File
@@ -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))
-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'
+11 -6
View File
@@ -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
+19 -15
View File
@@ -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
+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,
password: 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
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()
})
})