101 lines
2.6 KiB
TypeScript
101 lines
2.6 KiB
TypeScript
|
|
import BaseController from '../../common/base.controller'
|
|
import { permission, router } from '../../decorators/router'
|
|
import { ZError } from '../../common/ZError'
|
|
import { Puzzle } from '../../models/content/Puzzle'
|
|
import { PuzzleCategory } from '../../models/content/PuzzleCategory'
|
|
|
|
class PuzzleController extends BaseController{
|
|
@permission('puzzle:read')
|
|
@router('post /puzzles')
|
|
async list(req, res) {
|
|
let { start, limit, page } = req.params
|
|
limit = +limit || 10
|
|
start = +start || (+page - 1) * limit|| 0
|
|
let { opt, sort } = Puzzle.parseQueryParam(req.params)
|
|
let articles = await Puzzle.find(opt)
|
|
.sort(sort)
|
|
.skip(start)
|
|
.limit(limit)
|
|
let count = await Puzzle.count(opt)
|
|
let records = []
|
|
let cateMap = await PuzzleCategory.allCateMap()
|
|
for (let record of articles) {
|
|
let data = record.toJson()
|
|
let category = ''
|
|
if (record.tag && cateMap.has(record.tag)) {
|
|
category += cateMap.get(record.tag)
|
|
}
|
|
if (record.sub_tag && cateMap.has(record.sub_tag)) {
|
|
category += ' - '
|
|
category += cateMap.get(record.sub_tag)
|
|
}
|
|
data.category = category
|
|
records.push(data)
|
|
}
|
|
return {
|
|
total: count,
|
|
start,
|
|
limit,
|
|
records
|
|
}
|
|
}
|
|
|
|
@permission('puzzle:read')
|
|
@router('get /puzzle/:id')
|
|
async detail(req, res) {
|
|
let { id } = req.params
|
|
const record = await Puzzle.findById(id)
|
|
if (!record) {
|
|
throw new ZError(11, 'record not found')
|
|
}
|
|
return record.toJson()
|
|
}
|
|
|
|
@permission('puzzle:read')
|
|
@router('post /puzzle/save')
|
|
async save(req: any) {
|
|
let { _id, withNext } = req.params
|
|
let user = req.user
|
|
let record
|
|
if (!_id) {
|
|
record = new Puzzle(req.params)
|
|
record.createdBy = user.id
|
|
} else {
|
|
record = await Puzzle.findById(_id)
|
|
record.updateFromReq(req.params)
|
|
}
|
|
await record.save()
|
|
if (withNext) {
|
|
let nextRecord = await Puzzle.nextQuestion(record.id)
|
|
return nextRecord.toJson()
|
|
}
|
|
return record.toJson()
|
|
}
|
|
@permission('puzzle:read')
|
|
@router('post /puzzle/:id/delete')
|
|
async delete(req: any) {
|
|
let { id } = req.params
|
|
if (!id) {
|
|
throw new ZError(11, 'params mismatch')
|
|
}
|
|
await Puzzle.findByIdAndUpdate(id, {
|
|
$set: {
|
|
deleted: 1,
|
|
deleteTime: new Date()
|
|
}
|
|
})
|
|
return {}
|
|
}
|
|
@permission('puzzle:read')
|
|
@router('post /nextpuzzle')
|
|
async next(req: any) {
|
|
let { id } = req.params
|
|
if (!id) {
|
|
throw new ZError(11, 'params mismatch')
|
|
}
|
|
let nextRecord = await Puzzle.nextQuestion(id)
|
|
return nextRecord.toJson()
|
|
}
|
|
}
|