const express = require('express'); const _ = require('lodash'); const { query, body } = require('express-validator'); const { onSuccess, fill, dateFormat, onError } = require('../../../utils'); const { limit, COURSE_STATUS, COURSE_TYPE } = require('../../config'); const check = require('../../../middleware/check'); const Course = require('../../../db/models/course'); const Teacher = require('../../../db/models/teacher'); const Chapter = require('../../../db/models/chapter'); const router = express.Router(); const _COURSE_STATUS = _.invert(COURSE_STATUS); const _COURSE_TYPE = _.invert(COURSE_TYPE); async function fillSingle(data) { const { teacherId, recordId } = data; const recorder = await Teacher.findOne({ where: { id: recordId } }); data.teachers = await Promise.all( teacherId.map(item => { return Teacher.findOne({ where: { id: item } }); }) ); recorder && (data.recordName = recorder.name); data.publishAt && (data.publishAt = dateFormat(data.publishAt)); data.statusStr = _COURSE_STATUS[data.status]; data.typeStr = _COURSE_TYPE[data.type]; return data; } /** * showdoc * @catalog v1/课程 * @title 课程列表 * @description 课程列表接口 * @method GET * @url /master/course/ * @param page 0 Int 页码: 不传默认取第1页数据,每页20条数据 * @return {"code":0, "count":1, "data": []} * @return_param id integer id * @return_param title string 标题 * @return_param desc string 描述 * @return_param detailimg string 详情大图 * @return_param listimg string 描述 * @return_param teacherId integer 讲师 * @return_param recordId integer 录播讲师 * @return_param oprice decimal 原价 * @return_param price decimal 现价 * @return_param discountmsg string 优惠信息 * @return_param type tinyint 1碳资产开发2碳核算 * @return_param status tinyint 0草稿1已发布2下线 * @return_param weight integer 权重 * @return_param richText text 富文本 * @return_param createdAt date - * @return_param updatedAt date - * @remark * @number */ router.get('/', async (req, res) => { const { page = 0 } = req.query; const where = _.omit(req.query, ['page']); const info = onSuccess(); info.data = await Course.findAll({ where, limit, offset: page * limit }); info.data = await fill(info.data, fillSingle); if (!page) { info.count = await Course.count({ where }); } res.send(info); }); /** * showdoc * @catalog v1/课程 * @title 课程详情 * @description * @method GET * @url /master/course/:id * @param :id 1 STRING 详情ID * @return {"code":0, "data": {}} * @return_param id integer id * @return_param title string 标题 * @return_param desc string 描述 * @return_param detailimg string 详情大图 * @return_param listimg string 描述 * @return_param teacherId integer 讲师 * @return_param recordId integer 录播讲师 * @return_param oprice decimal 原价 * @return_param price decimal 现价 * @return_param discountmsg string 优惠信息 * @return_param type tinyint 1碳资产开发2碳核算 * @return_param status tinyint 0草稿1已发布2下线 * @return_param weight integer 权重 * @return_param richText text 富文本 * @return_param createdAt date - * @return_param updatedAt date - * @remark * @number */ router.get('/:id', async (req, res) => { let data = await Course.findOne({ where: req.params }); data = await fill(data, fillSingle); res.send(onSuccess(data)); }); /** * showdoc * @catalog v1/课程 * @title 课程添加 * @description * @method POST * @url /master/course/ * @param title string 标题 * @param desc string 描述 * @param detailimg string 详情大图 * @param listimg string 描述 * @param teacherId integer 讲师 * @param recordId integer 录播讲师 * @param oprice decimal 原价 * @param price decimal 现价 * @param discountmsg string 优惠信息 * @param type tinyint 1碳资产开发2碳核算 * @param status tinyint 0草稿1已发布2下线 * @param weight integer 权重 * @param richText text 富文本 * @return {"code":0, "data": {}} * @remark * @number */ router.post('/', check([body([]).notEmpty()]), async (req, res) => { const data = await Course.create(req.body); res.send(onSuccess(data)); }); /** * showdoc * @catalog v1/课程 * @title 课程上线下线 * @description * @method PUT * @url /master/course/status/:id * @param status 1 number 1上线2下线 * @return {"code":0, "msg": "修改成功"} * @remark * @number */ router.put('/status/:id', async (req, res) => { const { status } = req.body; const { id } = req.params; // eslint-disable-next-line eqeqeq if (status == 1) { req.body.publishAt = new Date(); const vcount = await Chapter.count({ where: { cid: id } }); if (!vcount) { return onError('请上传视频后再发布'); } } const data = await Course.update(req.body, { where: { id }, limit: 1 }); res.send(onSuccess(null, '修改成功')); }); /** * showdoc * @catalog v1/课程 * @title 课程修改 * @description * @method PUT * @url /master/course/:id * @param :id 1 STRING 详情ID * @param title string 标题 * @param desc string 描述 * @param detailimg string 详情大图 * @param listimg string 描述 * @param teacherId integer 讲师 * @param recordId integer 录播讲师 * @param oprice decimal 原价 * @param price decimal 现价 * @param discountmsg string 优惠信息 * @param type tinyint 1碳资产开发2碳核算 * @param status tinyint 0草稿1已发布2下线 * @param weight integer 权重 * @param richText text 富文本 * @return {"code":0, "msg": "修改成功"} * @remark * @number */ router.put('/:id', async (req, res) => { const data = await Course.update(req.body, { where: req.params, limit: 1 }); res.send(onSuccess(null, '修改成功')); }); /** * showdoc * @catalog v1/课程 * @title 课程删除 * @description * @method DELETE * @url /master/course/:id * @param :id 1 STRING 详情ID * @return {"status":0, "msg": "删除成功"} * @remark * @number */ router.delete('/:id', async (req, res) => { const data = await Course.destroy({ where: req.params, limit: 1 }); res.send(onSuccess(null, '删除成功')); }); module.exports = router;