corgi/src/admin/controllers/puzzle.controller.ts
2021-04-23 18:46:47 +08:00

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()
}
}