| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- var express = require('express');
- var createError = require('http-errors')
- var router = express.Router();
- const models = require('../../../models');
- const utils = require('../../../libs/utils');
- const auth = require('../../../libs/auth');
- let artUserPopulates = Object.keys(models.Art.schema.paths)
- .filter(path => 'User' == models.Art.schema.path(path).options.ref)
- .map(path => ({ path, select: 'username name' }));
- console.log('artUserPopulates:', artUserPopulates);
- /**表头 */
- router.get('/pager/headers', auth.need('read:own', 'art'), utils.pager.getHeadersBuilder(models.Art));
- /**所有作品列表 */
- router.get('/pager/all', auth.need('read:any', 'art'), (req, res, next) => {
- (async () => {
- req.query.base = { drop: false };
- next();
- })().catch(next)
- }, utils.pager.getListBuilder(models.Art, artUserPopulates));
- /**回收站列表 */
- router.get('/pager/removed', auth.need('read:own', 'art'),
- (req, res, next) => {
- (async () => {
- req.query.base = { drop: true }
- let ac = await auth.getAc(req);
- if (!ac.can('user').readAny('art').granted) {
- req.query.base.user = req.session.user._id;
- }
- next();
- })().catch(next)
- }, utils.pager.getListBuilder(models.Art, artUserPopulates));
- /**我的作品列表 */
- router.get('/pager/my', auth.need('read:own', 'art'), (req, res, next) => {
- (async () => {
- req.query.base = {
- user: req.session.user._id,
- drop: false,
- }
- next();
- })().catch(next)
- }, utils.pager.getListBuilder(models.Art, artUserPopulates));
- /**获取某个用户的作品列表 */
- router.get('/pager/user/:username', auth.need('read:any', 'art'), (req, res, next) => {
- (async () => {
- let { username } = req.params;
- let user = await models.User.findOne({ username });
- if (!user) throw createError(404, '用户不存在');
- req.query.base = {
- user: user._id,
- drop: false,
- }
- next();
- })().catch(next)
- }, utils.pager.getListBuilder(models.Art, artUserPopulates));
- /**待发布列表*/
- router.get('/pager/pending', auth.need('read:any', 'art-publish'), (req, res, next) => {
- (async () => {
- req.query.base = {
- drop: false,
- status: 7000,
- $or: [{ publishSchedule: { $exists: false } }, { publishSchedule: null }]
- }
- next();
- })().catch(next)
- }, utils.pager.getListBuilder(models.Art, artUserPopulates));
- /**
- *
- * 获取作品基础信息, 排除任何二进制数据
- *
- */
- router.get('/:id', auth.need('read:own', 'art'), function (req, res, next) {
- (async function () {
- let user = req.session.user._id;
- let id = req.params.id;
- utils.validators.validateId(id);
- /**@type {Query} */
- let query = models.Art.findOne({ $or: [{ _id: id }, { pageId: id }] });
- // query.populate({ path: 'bins', select: '-data' });
- artUserPopulates.forEach(p => {
- query.populate(p);
- })
- query.populate({ path: 'publishSchedule', select: 'done' });
- let doc = await query.exec();
- if (!doc) throw createError(404, '作品不存在!')
- let ac = await auth.getAc(req);
- if (!ac.can('user').readAny('art').granted && doc.user._id != req.session.user._id) {
- throw createError(403, '权限不足');
- }
- let out = doc.toObject();
- if (doc.work) { out.zip = utils.thumb.zipPath(doc._id); }
- if (out.upstream) {
- let { upstreamBase } = req.app.get('app-config');
- out.upstreamUrl = `${upstreamBase}/app/pages/detail/${doc._id}`;
- }
- res.json(out);
- })().catch(next)
- });
- /**
- * 更新作品tags,name
- * patch-meta
- */
- router.patch('/meta', auth.need('update:own', 'art'), (req, res, next) => {
- (async function () {
- let user = req.session.user._id;
- let { tags, name, desc, epgs, pageId, } = req.body;
- if (!tags || !name || !epgs || !Array.isArray(tags)) {
- throw createError(400, '参数错误');
- }
- tags = tags.map(t => t.trim()).filter(t => t);
- utils.validators.validateId(pageId, 'ID错误');
- let doc = await models.Art.findById(pageId);
- if (!doc) throw createError(404, '作品不存在!');
- let ac = await auth.getAc(req);
- let isOwner = doc.user == user;
- if (!ac.can('user').updateAny('art').granted && !isOwner) {
- throw createError(403, '权限不足');
- }
- doc.tags = tags;
- doc.epgs = epgs;
- doc.name = name;
- doc.desc = desc;
- await doc.save();
- res.json({
- msg: 'ok'
- })
- })().catch(next)
- });
- ////////other-apis//////
- router.get('/agg/tags', function (req, res, next) {
- (async function () {
- let tags = await models.Art.aggregate([
- { $project: { tags: 1 } },
- { $unwind: '$tags' },
- {
- $group: {
- _id: '$tags',
- count: { $sum: 1 }
- }
- },
- { $sort: { count: -1 } },
- ]);
- tags = tags.map(t => ({ value: t._id, label: t._id }));
- res.json(tags);
- })().catch(next)
- });
- module.exports = router;
|