|
@@ -1,5 +1,6 @@
|
|
|
const { serializePageSecurely } = require('../models/serializers/page-serializer');
|
|
const { serializePageSecurely } = require('../models/serializers/page-serializer');
|
|
|
const { serializeRevisionSecurely } = require('../models/serializers/revision-serializer');
|
|
const { serializeRevisionSecurely } = require('../models/serializers/revision-serializer');
|
|
|
|
|
+const { serializeUserSecurely } = require('../models/serializers/user-serializer');
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -134,18 +135,17 @@ module.exports = function(crowi, app) {
|
|
|
|
|
|
|
|
const Page = crowi.model('Page');
|
|
const Page = crowi.model('Page');
|
|
|
const User = crowi.model('User');
|
|
const User = crowi.model('User');
|
|
|
- const Bookmark = crowi.model('Bookmark');
|
|
|
|
|
const PageTagRelation = crowi.model('PageTagRelation');
|
|
const PageTagRelation = crowi.model('PageTagRelation');
|
|
|
- const UpdatePost = crowi.model('UpdatePost');
|
|
|
|
|
const GlobalNotificationSetting = crowi.model('GlobalNotificationSetting');
|
|
const GlobalNotificationSetting = crowi.model('GlobalNotificationSetting');
|
|
|
const ShareLink = crowi.model('ShareLink');
|
|
const ShareLink = crowi.model('ShareLink');
|
|
|
|
|
|
|
|
const ApiResponse = require('../util/apiResponse');
|
|
const ApiResponse = require('../util/apiResponse');
|
|
|
const getToday = require('../util/getToday');
|
|
const getToday = require('../util/getToday');
|
|
|
|
|
|
|
|
- const { slackNotificationService, configManager, xssService } = crowi;
|
|
|
|
|
|
|
+ const { configManager, xssService } = crowi;
|
|
|
const interceptorManager = crowi.getInterceptorManager();
|
|
const interceptorManager = crowi.getInterceptorManager();
|
|
|
const globalNotificationService = crowi.getGlobalNotificationService();
|
|
const globalNotificationService = crowi.getGlobalNotificationService();
|
|
|
|
|
+ const userNotificationService = crowi.getUserNotificationService();
|
|
|
|
|
|
|
|
const XssOption = require('../../lib/service/xss/xssOption');
|
|
const XssOption = require('../../lib/service/xss/xssOption');
|
|
|
const Xss = require('../../lib/service/xss/index');
|
|
const Xss = require('../../lib/service/xss/index');
|
|
@@ -194,37 +194,6 @@ module.exports = function(crowi, app) {
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // user notification
|
|
|
|
|
- // TODO create '/service/user-notification' module
|
|
|
|
|
- /**
|
|
|
|
|
- *
|
|
|
|
|
- * @param {Page} page
|
|
|
|
|
- * @param {User} user
|
|
|
|
|
- * @param {string} slackChannelsStr comma separated string. e.g. 'general,channel1,channel2'
|
|
|
|
|
- * @param {boolean} updateOrCreate
|
|
|
|
|
- * @param {string} previousRevision
|
|
|
|
|
- */
|
|
|
|
|
- async function notifyToSlackByUser(page, user, slackChannelsStr, updateOrCreate, previousRevision) {
|
|
|
|
|
- await page.updateSlackChannel(slackChannelsStr)
|
|
|
|
|
- .catch((err) => {
|
|
|
|
|
- logger.error('Error occured in updating slack channels: ', err);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- if (slackNotificationService.hasSlackConfig()) {
|
|
|
|
|
- const slackChannels = slackChannelsStr != null ? slackChannelsStr.split(',') : [null];
|
|
|
|
|
-
|
|
|
|
|
- const promises = slackChannels.map((chan) => {
|
|
|
|
|
- return crowi.slack.postPage(page, user, chan, updateOrCreate, previousRevision);
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- Promise.all(promises)
|
|
|
|
|
- .catch((err) => {
|
|
|
|
|
- logger.error('Error occured in sending slack notification: ', err);
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
function addRenderVarsForPage(renderVars, page) {
|
|
function addRenderVarsForPage(renderVars, page) {
|
|
|
renderVars.page = page;
|
|
renderVars.page = page;
|
|
|
renderVars.revision = page.revision;
|
|
renderVars.revision = page.revision;
|
|
@@ -253,12 +222,11 @@ module.exports = function(crowi, app) {
|
|
|
renderVars.revision = page.revision;
|
|
renderVars.revision = page.revision;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- async function addRenderVarsForUserPage(renderVars, page, requestUser) {
|
|
|
|
|
|
|
+ async function addRenderVarsForUserPage(renderVars, page) {
|
|
|
const userData = await User.findUserByUsername(User.getUsernameByPath(page.path));
|
|
const userData = await User.findUserByUsername(User.getUsernameByPath(page.path));
|
|
|
|
|
|
|
|
if (userData != null) {
|
|
if (userData != null) {
|
|
|
- renderVars.pageUser = userData.toObject();
|
|
|
|
|
- renderVars.bookmarkList = await Bookmark.findByUser(userData, { limit: 10, populatePage: true, requestUser });
|
|
|
|
|
|
|
+ renderVars.pageUser = serializeUserSecurely(userData);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -268,10 +236,6 @@ module.exports = function(crowi, app) {
|
|
|
renderVars.grantedGroupName = page.grantedGroup ? page.grantedGroup.name : null;
|
|
renderVars.grantedGroupName = page.grantedGroup ? page.grantedGroup.name : null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- async function addRenderVarsForSlack(renderVars, page) {
|
|
|
|
|
- renderVars.slack = await getSlackChannels(page);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
async function addRenderVarsForDescendants(renderVars, path, requestUser, offset, limit, isRegExpEscapedFromPath) {
|
|
async function addRenderVarsForDescendants(renderVars, path, requestUser, offset, limit, isRegExpEscapedFromPath) {
|
|
|
const SEENER_THRESHOLD = 10;
|
|
const SEENER_THRESHOLD = 10;
|
|
|
|
|
|
|
@@ -349,7 +313,6 @@ module.exports = function(crowi, app) {
|
|
|
portalPage = await portalPage.populateDataToShowRevision();
|
|
portalPage = await portalPage.populateDataToShowRevision();
|
|
|
|
|
|
|
|
addRenderVarsForPage(renderVars, portalPage);
|
|
addRenderVarsForPage(renderVars, portalPage);
|
|
|
- await addRenderVarsForSlack(renderVars, portalPage);
|
|
|
|
|
|
|
|
|
|
const sharelinksNumber = await ShareLink.countDocuments({ relatedPage: portalPage._id });
|
|
const sharelinksNumber = await ShareLink.countDocuments({ relatedPage: portalPage._id });
|
|
|
renderVars.sharelinksNumber = sharelinksNumber;
|
|
renderVars.sharelinksNumber = sharelinksNumber;
|
|
@@ -399,7 +362,6 @@ module.exports = function(crowi, app) {
|
|
|
addRenderVarsForPage(renderVars, page);
|
|
addRenderVarsForPage(renderVars, page);
|
|
|
addRenderVarsForScope(renderVars, page);
|
|
addRenderVarsForScope(renderVars, page);
|
|
|
|
|
|
|
|
- await addRenderVarsForSlack(renderVars, page);
|
|
|
|
|
await addRenderVarsForDescendants(renderVars, path, req.user, offset, limit, true);
|
|
await addRenderVarsForDescendants(renderVars, path, req.user, offset, limit, true);
|
|
|
|
|
|
|
|
const sharelinksNumber = await ShareLink.countDocuments({ relatedPage: page._id });
|
|
const sharelinksNumber = await ShareLink.countDocuments({ relatedPage: page._id });
|
|
@@ -408,23 +370,13 @@ module.exports = function(crowi, app) {
|
|
|
if (isUserPage(page.path)) {
|
|
if (isUserPage(page.path)) {
|
|
|
// change template
|
|
// change template
|
|
|
view = 'layout-growi/user_page';
|
|
view = 'layout-growi/user_page';
|
|
|
- await addRenderVarsForUserPage(renderVars, page, req.user);
|
|
|
|
|
|
|
+ await addRenderVarsForUserPage(renderVars, page);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
await interceptorManager.process('beforeRenderPage', req, res, renderVars);
|
|
await interceptorManager.process('beforeRenderPage', req, res, renderVars);
|
|
|
return res.render(view, renderVars);
|
|
return res.render(view, renderVars);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const getSlackChannels = async(page) => {
|
|
|
|
|
- if (page.extended.slack) {
|
|
|
|
|
- return page.extended.slack;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- const data = await UpdatePost.findSettingsByPath(page.path);
|
|
|
|
|
- const channels = data.map((e) => { return e.channel }).join(', ');
|
|
|
|
|
- return channels;
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
actions.showTopPage = function(req, res) {
|
|
actions.showTopPage = function(req, res) {
|
|
|
return showTopPage(req, res);
|
|
return showTopPage(req, res);
|
|
|
};
|
|
};
|
|
@@ -701,6 +653,12 @@ module.exports = function(crowi, app) {
|
|
|
result.pages.pop();
|
|
result.pages.pop();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ result.pages.forEach((page) => {
|
|
|
|
|
+ if (page.lastUpdateUser != null && page.lastUpdateUser instanceof User) {
|
|
|
|
|
+ page.lastUpdateUser = serializeUserSecurely(page.lastUpdateUser);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
return res.json(ApiResponse.success(result));
|
|
return res.json(ApiResponse.success(result));
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
@@ -769,7 +727,17 @@ module.exports = function(crowi, app) {
|
|
|
|
|
|
|
|
// user notification
|
|
// user notification
|
|
|
if (isSlackEnabled) {
|
|
if (isSlackEnabled) {
|
|
|
- await notifyToSlackByUser(createdPage, req.user, slackChannels, 'create', false);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ const results = await userNotificationService.fire(createdPage, req.user, slackChannels, 'create');
|
|
|
|
|
+ results.forEach((result) => {
|
|
|
|
|
+ if (result.status === 'rejected') {
|
|
|
|
|
+ logger.error('Create user notification failed', result.reason);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('Create user notification failed', err);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -904,7 +872,17 @@ module.exports = function(crowi, app) {
|
|
|
|
|
|
|
|
// user notification
|
|
// user notification
|
|
|
if (isSlackEnabled) {
|
|
if (isSlackEnabled) {
|
|
|
- await notifyToSlackByUser(page, req.user, slackChannels, 'update', previousRevision);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ const results = await userNotificationService.fire(page, req.user, slackChannels, 'update', { previousRevision });
|
|
|
|
|
+ results.forEach((result) => {
|
|
|
|
|
+ if (result.status === 'rejected') {
|
|
|
|
|
+ logger.error('Create user notification failed', result.reason);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('Create user notification failed', err);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|