增加tag和题目的类型相关接口

This commit is contained in:
zhl 2021-04-23 13:56:17 +08:00
parent 4f17e9c6ec
commit 0634527146
5 changed files with 103 additions and 4 deletions

View File

@ -43,7 +43,7 @@ class PuzzleController extends BaseController{
@permission('puzzle:read')
@router('post /puzzle/save')
async save(req: any) {
let { _id } = req.params
let { _id, withNext } = req.params
let user = req.user
let record
if (!_id) {
@ -54,6 +54,10 @@ class PuzzleController extends BaseController{
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')
@ -71,4 +75,14 @@ class PuzzleController extends BaseController{
})
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()
}
}

View File

@ -0,0 +1,25 @@
import BaseController from '../../common/base.controller'
import { router } from '../../decorators/router'
import { Tag } from '../../models/Tag'
import { PuzzleCategory } from '../../models/content/PuzzleCategory'
class TagController extends BaseController{
@router('get /tags')
async list(req, res) {
let records = await Tag.find({})
return records.map(o=>o.name)
}
@router('post /tag/save')
async save(req) {
const { name } = req.params
let record = (await Tag.findOrCreate({name})).doc
await record.save()
return {}
}
@router('get /question/categorys')
async categoryList(req, res) {
let records = await PuzzleCategory.find({})
return records
}
}

18
src/models/Tag.ts Normal file
View File

@ -0,0 +1,18 @@
import { dbconn } from '../decorators/dbconn'
import {
getModelForClass,
index,
modelOptions,
prop
} from '@typegoose/typegoose'
import { BaseModule } from './Base'
@dbconn()
@index({'name': 1}, {unique: false})
@modelOptions({ schemaOptions: { collection: 'tags'}})
class TagClass extends BaseModule {
@prop({ required: true })
public name!: string
}
export const Tag = getModelForClass(TagClass, { existingConnection: TagClass.db })

View File

@ -1,5 +1,10 @@
import { dbconn } from '../../decorators/dbconn'
import { getModelForClass, modelOptions, prop } from '@typegoose/typegoose'
import {
getModelForClass,
modelOptions,
prop,
ReturnModelType
} from '@typegoose/typegoose'
import { BaseModule } from '../Base'
import { noJson } from '../../decorators/nojson'
@ -32,13 +37,20 @@ class PuzzleClass extends BaseModule {
@noJson()
@prop()
public is_hide: number
/**
* tag
* @type {string}
*/
@prop()
public group: string
@prop({ type: () => [String] })
public groups: string[]
@prop()
public tag: string
@prop()
public subtag: string
public static parseQueryParam(params) {
let {key, timeBegin, timeEnd } = params
let opt: any = {deleted: 0, is_hide: 0}
@ -56,6 +68,10 @@ class PuzzleClass extends BaseModule {
let sort = {_id: 1}
return { opt, sort }
}
public static async nextQuestion(this: ReturnModelType<typeof PuzzleClass>, id: string) {
return this.findOne({deleted: 0, is_hide: 0, _id: {$gt: id }}).exec()
}
}
export const Puzzle = getModelForClass(PuzzleClass, { existingConnection: PuzzleClass.db })

View File

@ -0,0 +1,26 @@
import { dbconn } from '../../decorators/dbconn'
import { getModelForClass, modelOptions, prop } from '@typegoose/typegoose'
import { BaseModule } from '../Base'
class SubType {
@prop()
public _id: string
@prop()
public name: string
}
@dbconn('second')
@modelOptions({ schemaOptions: { collection: 'question_category' } })
class PuzzleCategoryClass extends BaseModule {
@prop()
public _id: string
@prop()
public name: string
@prop({type: () => [SubType]})
public children: SubType[]
}
export const PuzzleCategory = getModelForClass(PuzzleCategoryClass, { existingConnection: PuzzleCategoryClass.db })