118 lines
3.0 KiB
TypeScript
118 lines
3.0 KiB
TypeScript
/**
|
|
* @swagger
|
|
* tags:
|
|
* name: Exercises
|
|
* description: API to manage the exercise progress
|
|
*/
|
|
import { Op } from "sequelize";
|
|
import { Exercise } from "../models/exercises/exercise.model";
|
|
import { ExerciseGroup } from "../models/exercises/exerciseGroup.model";
|
|
import { Request, Response, Router } from "express";
|
|
|
|
export const exercises = Router()
|
|
|
|
/**
|
|
* @swagger
|
|
* /exercises:
|
|
* get:
|
|
* summary: Download all exercises
|
|
* tags: [Exercises]
|
|
* responses:
|
|
* 200:
|
|
* description: Array of all exercises
|
|
* type: array
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/exercise'
|
|
* 500:
|
|
* description: Internal server error
|
|
*/
|
|
exercises.get("/", (req: Request, res: Response) => {
|
|
Exercise.findAll({
|
|
include: [ ExerciseGroup ],
|
|
attributes: {
|
|
exclude: [ "exerciseGroupId" ]
|
|
}
|
|
})
|
|
.then(result => {
|
|
result.sort((a, b) => {
|
|
return (a.dataValues.exerciseGroup.dataValues.groupNr * 10 + a.dataValues.exerciseNr) > (b.dataValues.exerciseGroup.dataValues.groupNr * 10 + b.dataValues.exerciseNr) ? 1 : -1
|
|
})
|
|
|
|
res.status(200).json(result)
|
|
})
|
|
.catch(error => {
|
|
res.status(500).send()
|
|
})
|
|
})
|
|
|
|
/**
|
|
* @swagger
|
|
* /exercises/{groupNr}/{exerciseNr}/{state}:
|
|
* post:
|
|
* summary: Update an exercise solved state
|
|
* tags: [Exercises]
|
|
* parameters:
|
|
* - in: path
|
|
* name: groupNr
|
|
* schema:
|
|
* type: number
|
|
* required: true
|
|
* description: Number of exercise group (not ID)
|
|
* - in: path
|
|
* name: exerciseNr
|
|
* schema:
|
|
* type: number
|
|
* required: true
|
|
* description: Number of exercise (not ID)
|
|
* - in: path
|
|
* name: state
|
|
* schema:
|
|
* type: number
|
|
* required: true
|
|
* description: 1 = Solved, 0 = Unsolved
|
|
* responses:
|
|
* 200:
|
|
* description: Edited exercise
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/exercise'
|
|
* 500:
|
|
* description: Internal server error
|
|
*/
|
|
exercises.post("/:groupNr/:exerciseNr/:state", (req: Request, res: Response) => {
|
|
Exercise.findOne({
|
|
where: {
|
|
[Op.and] : [
|
|
{
|
|
exerciseNr: req.params.exerciseNr
|
|
},
|
|
{
|
|
"$exerciseGroup.groupNr$": req.params.groupNr
|
|
}
|
|
]
|
|
},
|
|
include: [ ExerciseGroup ],
|
|
attributes: {
|
|
exclude: [ "exerciseGroupId" ]
|
|
}
|
|
})
|
|
.then(async exercise => {
|
|
let changed = false
|
|
|
|
if (exercise.dataValues.solved != (req.params.state == "1")) {
|
|
await exercise.update({ solved: req.params.state == "1" })
|
|
changed = true
|
|
}
|
|
|
|
res.status(200).json({
|
|
exercise: exercise,
|
|
changed: changed
|
|
})
|
|
})
|
|
.catch(error => {
|
|
res.status(500).send()
|
|
})
|
|
}) |