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