| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- const baseController = require('controllers/base.js');
- const wikiModel = require('./wikiModel.js');
- const projectModel = require('models/project.js');
- const userModel = require('models/user.js');
- const jsondiffpatch = require('jsondiffpatch');
- const formattersHtml = jsondiffpatch.formatters.html;
- const yapi = require('yapi.js');
- // const util = require('./util.js');
- const fs = require('fs-extra');
- const path = require('path');
- const showDiffMsg = require('../../common/diff-view.js');
- class wikiController extends baseController {
- constructor(ctx) {
- super(ctx);
- this.Model = yapi.getInst(wikiModel);
- this.projectModel = yapi.getInst(projectModel);
- }
- /**
- * 获取wiki信息
- * @interface wiki_desc/get
- * @method get
- * @category statistics
- * @foldnumber 10
- * @returns {Object}
- */
- async getWikiDesc(ctx) {
- try {
- let project_id = ctx.request.query.project_id;
- if (!project_id) {
- return (ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空'));
- }
- let result = await this.Model.get(project_id);
- return (ctx.body = yapi.commons.resReturn(result));
- } catch (err) {
- ctx.body = yapi.commons.resReturn(null, 400, err.message);
- }
- }
- /**
- * 保存wiki信息
- * @interface wiki_desc/get
- * @method get
- * @category statistics
- * @foldnumber 10
- * @returns {Object}
- */
- async uplodaWikiDesc(ctx) {
- try {
- let params = ctx.request.body;
- params = yapi.commons.handleParams(params, {
- project_id: 'number',
- desc: 'string',
- markdown: 'string'
- });
- if (!params.project_id) {
- return (ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空'));
- }
- if (!this.$tokenAuth) {
- let auth = await this.checkAuth(params.project_id, 'project', 'edit');
- if (!auth) {
- return (ctx.body = yapi.commons.resReturn(null, 400, '没有权限'));
- }
- }
- let notice = params.email_notice;
- delete params.email_notice;
- const username = this.getUsername();
- const uid = this.getUid();
- // 如果当前数据库里面没有数据
- let result = await this.Model.get(params.project_id);
- if (!result) {
- let data = Object.assign(params, {
- username,
- uid,
- add_time: yapi.commons.time(),
- up_time: yapi.commons.time()
- });
- let res = await this.Model.save(data);
- ctx.body = yapi.commons.resReturn(res);
- } else {
- let data = Object.assign(params, {
- username,
- uid,
- up_time: yapi.commons.time()
- });
- let upRes = await this.Model.up(result._id, data);
- ctx.body = yapi.commons.resReturn(upRes);
- }
- let logData = {
- type: 'wiki',
- project_id: params.project_id,
- current: params.desc,
- old: result ? result.toObject().desc : ''
- };
- let wikiUrl = `${ctx.request.origin}/project/${params.project_id}/wiki`;
- if (notice) {
- let diffView = showDiffMsg(jsondiffpatch, formattersHtml, logData);
- let annotatedCss = fs.readFileSync(
- path.resolve(
- yapi.WEBROOT,
- 'node_modules/jsondiffpatch/dist/formatters-styles/annotated.css'
- ),
- 'utf8'
- );
- let htmlCss = fs.readFileSync(
- path.resolve(yapi.WEBROOT, 'node_modules/jsondiffpatch/dist/formatters-styles/html.css'),
- 'utf8'
- );
- let project = await this.projectModel.getBaseInfo(params.project_id);
- yapi.commons.sendNotice(params.project_id, {
- title: `${username} 更新了wiki说明`,
- content: `<html>
- <head>
- <meta charset="utf-8" />
- <style>
- ${annotatedCss}
- ${htmlCss}
- </style>
- </head>
- <body>
- <div><h3>${username}更新了wiki说明</h3>
- <p>修改用户: ${username}</p>
- <p>修改项目: <a href="${wikiUrl}">${project.name}</a></p>
- <p>详细改动日志: ${this.diffHTML(diffView)}</p></div>
- </body>
- </html>`
- });
- }
- // 保存修改日志信息
- yapi.commons.saveLog({
- content: `<a href="/user/profile/${uid}">${username}</a> 更新了 <a href="${wikiUrl}">wiki</a> 的信息`,
- type: 'project',
- uid,
- username: username,
- typeid: params.project_id,
- data: logData
- });
- return 1;
- } catch (err) {
- ctx.body = yapi.commons.resReturn(null, 400, err.message);
- }
- }
- diffHTML(html) {
- if (html.length === 0) {
- return `<span style="color: #555">没有改动,该操作未改动wiki数据</span>`;
- }
- return html.map(item => {
- return `<div>
- <h4 class="title">${item.title}</h4>
- <div>${item.content}</div>
- </div>`;
- });
- }
- // 处理编辑冲突
- async wikiConflict(ctx) {
- try {
- let result;
- ctx.websocket.on('message', async message => {
- let id = parseInt(ctx.query.id, 10);
- if (!id) {
- return ctx.websocket.send('id 参数有误');
- }
- result = await this.Model.get(id);
- let data = await this.websocketMsgMap(message, result);
- if (data) {
- ctx.websocket.send(JSON.stringify(data));
- }
- });
- ctx.websocket.on('close', async () => {});
- } catch (err) {
- yapi.commons.log(err, 'error');
- }
- }
- websocketMsgMap(msg, result) {
- const map = {
- start: this.startFunc.bind(this),
- end: this.endFunc.bind(this),
- editor: this.editorFunc.bind(this)
- };
- return map[msg](result);
- }
- // socket 开始链接
- async startFunc(result) {
- if (result && result.edit_uid === this.getUid()) {
- await this.Model.upEditUid(result._id, 0);
- }
- }
- // socket 结束链接
- async endFunc(result) {
- if (result) {
- await this.Model.upEditUid(result._id, 0);
- }
- }
- // 正在编辑
- async editorFunc(result) {
- let userInst, userinfo, data;
- if (result && result.edit_uid !== 0 && result.edit_uid !== this.getUid()) {
- userInst = yapi.getInst(userModel);
- userinfo = await userInst.findById(result.edit_uid);
- data = {
- errno: result.edit_uid,
- data: { uid: result.edit_uid, username: userinfo.username }
- };
- } else {
- if (result) {
- await this.Model.upEditUid(result._id, this.getUid());
- }
- data = {
- errno: 0,
- data: result
- };
- }
- return data;
- }
- }
- module.exports = wikiController;
|