|
|
@@ -2,16 +2,20 @@ module.exports = function(crowi, app) {
|
|
|
'use strict';
|
|
|
|
|
|
var debug = require('debug')('crowi:routes:admin')
|
|
|
+ , fs = require('fs')
|
|
|
, models = crowi.models
|
|
|
, Page = models.Page
|
|
|
+ , PageGroupRelation = models.PageGroupRelation
|
|
|
, User = models.User
|
|
|
, ExternalAccount = models.ExternalAccount
|
|
|
+ , UserGroup = models.UserGroup
|
|
|
+ , UserGroupRelation = models.UserGroupRelation
|
|
|
, Config = models.Config
|
|
|
, PluginUtils = require('../plugins/plugin-utils')
|
|
|
, pluginUtils = new PluginUtils()
|
|
|
, ApiResponse = require('../util/apiResponse')
|
|
|
|
|
|
- , MAX_PAGE_LIST = 5
|
|
|
+ , MAX_PAGE_LIST = 50
|
|
|
, actions = {};
|
|
|
|
|
|
function createPager(total, limit, page, pagesCount, maxPageList) {
|
|
|
@@ -527,6 +531,314 @@ module.exports = function(crowi, app) {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ actions.userGroup = {};
|
|
|
+ actions.userGroup.index = function (req, res) {
|
|
|
+ var page = parseInt(req.query.page) || 1;
|
|
|
+ var renderVar = {
|
|
|
+ userGroups : [],
|
|
|
+ userGroupRelations : new Map(),
|
|
|
+ pager : null,
|
|
|
+ }
|
|
|
+
|
|
|
+ UserGroup.findUserGroupsWithPagination({ page: page })
|
|
|
+ .then((result) => {
|
|
|
+ const pager = createPager(result.total, result.limit, result.page, result.pages, MAX_PAGE_LIST);
|
|
|
+ var userGroups = result.docs;
|
|
|
+ renderVar.userGroups = userGroups;
|
|
|
+ renderVar.pager = pager;
|
|
|
+ return userGroups.map((userGroup) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ UserGroupRelation.findAllRelationForUserGroup(userGroup)
|
|
|
+ .then((relations) => {
|
|
|
+ return resolve([userGroup, relations]);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .then((allRelationsPromise) => {
|
|
|
+ return Promise.all(allRelationsPromise)
|
|
|
+ })
|
|
|
+ .then((relations) => {
|
|
|
+ renderVar.userGroupRelations = new Map(relations);
|
|
|
+ debug("in findUserGroupsWithPagination findAllRelationForUserGroupResult", renderVar.userGroupRelations);
|
|
|
+ return res.render('admin/user-groups', renderVar);
|
|
|
+ })
|
|
|
+ .catch( function(err) {
|
|
|
+ debug('Error on find all relations', err);
|
|
|
+ return res.json(ApiResponse.error('Error'));
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // グループ詳細
|
|
|
+ actions.userGroup.detail = function (req, res) {
|
|
|
+ var name = req.params.name;
|
|
|
+ var renderVar = {
|
|
|
+ userGroup: null,
|
|
|
+ userGroupRelations: [],
|
|
|
+ pageGroupRelations: [],
|
|
|
+ notRelatedusers: []
|
|
|
+ }
|
|
|
+ var targetUserGroup = null;
|
|
|
+ UserGroup.findUserGroupByName(name)
|
|
|
+ .then(function (userGroup) {
|
|
|
+ targetUserGroup = userGroup;
|
|
|
+ if (targetUserGroup == null) {
|
|
|
+ req.flash('errorMessage', 'グループがありません');
|
|
|
+ throw new Error('no userGroup is exists. ', name);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ renderVar.userGroup = targetUserGroup;
|
|
|
+
|
|
|
+ return Promise.all([
|
|
|
+ // get all user and group relations
|
|
|
+ UserGroupRelation.findAllRelationForUserGroup(targetUserGroup),
|
|
|
+ // get all page and group relations
|
|
|
+ PageGroupRelation.findAllRelationForUserGroup(targetUserGroup),
|
|
|
+ // get all not related users for group
|
|
|
+ UserGroupRelation.findUserByNotRelatedGroup(targetUserGroup),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .then((resolves) => {
|
|
|
+ renderVar.userGroupRelations = resolves[0];
|
|
|
+ renderVar.pageGroupRelations = resolves[1];
|
|
|
+ renderVar.notRelatedusers = resolves[2];
|
|
|
+ debug('notRelatedusers', renderVar.notRelatedusers);
|
|
|
+
|
|
|
+ return res.render('admin/user-group-detail', renderVar);
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ req.flash('errorMessage', 'ユーザグループの検索に失敗しました');
|
|
|
+ debug('Error on get userGroupDetail', err);
|
|
|
+ return res.redirect('/admin/user-groups');
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ //グループの生成
|
|
|
+ actions.userGroup.create = function (req, res) {
|
|
|
+ var form = req.form.createGroupForm;
|
|
|
+ if (req.form.isValid) {
|
|
|
+ UserGroup.createGroupByName(form.userGroupName)
|
|
|
+ .then((newUserGroup) => {
|
|
|
+ req.flash('successMessage', newUserGroup.name)
|
|
|
+ req.flash('createdUserGroup', newUserGroup);
|
|
|
+ return res.redirect('/admin/user-groups');
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ debug('create userGroup error:', err);
|
|
|
+ req.flash('errorMessage', '同じグループ名が既に存在します。');
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ req.flash('errorMessage', req.form.errors.join('\n'));
|
|
|
+ return res.redirect('/admin/user-groups');
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //
|
|
|
+ actions.userGroup.update = function (req, res) {
|
|
|
+
|
|
|
+ var userGroupId = req.params.userGroupId;
|
|
|
+ var name = req.body.name;
|
|
|
+
|
|
|
+ UserGroup.findById(userGroupId)
|
|
|
+ .then((userGroupData) => {
|
|
|
+ if (userGroupData == null) {
|
|
|
+ req.flash('errorMessage', 'グループの検索に失敗しました。');
|
|
|
+ return new Promise();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 名前存在チェック
|
|
|
+ return UserGroup.isRegisterableName(name)
|
|
|
+ .then((isRegisterableName) => {
|
|
|
+ // 既に存在するグループ名に更新しようとした場合はエラー
|
|
|
+ if (!isRegisterableName) {
|
|
|
+ req.flash('errorMessage', 'グループ名が既に存在します。');
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return userGroupData.updateName(name)
|
|
|
+ .then(() => {
|
|
|
+ req.flash('successMessage', 'グループ名を更新しました。');
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ req.flash('errorMessage', 'グループ名の更新に失敗しました。');
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ return res.redirect('/admin/user-group-detail/' + name);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ actions.userGroup.uploadGroupPicture = function (req, res) {
|
|
|
+ var fileUploader = require('../util/fileUploader')(crowi, app);
|
|
|
+ //var storagePlugin = new pluginService('storage');
|
|
|
+ //var storage = require('../service/storage').StorageService(config);
|
|
|
+
|
|
|
+ var userGroupId = req.params.userGroupId;
|
|
|
+
|
|
|
+ var tmpFile = req.file || null;
|
|
|
+ if (!tmpFile) {
|
|
|
+ return res.json({
|
|
|
+ 'status': false,
|
|
|
+ 'message': 'File type error.'
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ UserGroup.findById(userGroupId, function (err, userGroupData) {
|
|
|
+ if (!userGroupData) {
|
|
|
+ return res.json({
|
|
|
+ 'status': false,
|
|
|
+ 'message': 'UserGroup error.'
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ var tmpPath = tmpFile.path;
|
|
|
+ var filePath = UserGroup.createUserGroupPictureFilePath(userGroupData, tmpFile.filename + tmpFile.originalname);
|
|
|
+ var acceptableFileType = /image\/.+/;
|
|
|
+
|
|
|
+ if (!tmpFile.mimetype.match(acceptableFileType)) {
|
|
|
+ return res.json({
|
|
|
+ 'status': false,
|
|
|
+ 'message': 'File type error. Only image files is allowed to set as user picture.',
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ var tmpFileStream = fs.createReadStream(tmpPath, { flags: 'r', encoding: null, fd: null, mode: '0666', autoClose: true });
|
|
|
+
|
|
|
+ fileUploader.uploadFile(filePath, tmpFile.mimetype, tmpFileStream, {})
|
|
|
+ .then(function (data) {
|
|
|
+ var imageUrl = fileUploader.generateUrl(filePath);
|
|
|
+ userGroupData.updateImage(imageUrl)
|
|
|
+ .then(() => {
|
|
|
+ fs.unlink(tmpPath, function (err) {
|
|
|
+ if (err) {
|
|
|
+ debug('Error while deleting tmp file.', err);
|
|
|
+ }
|
|
|
+
|
|
|
+ return res.json({
|
|
|
+ 'status': true,
|
|
|
+ 'url': imageUrl,
|
|
|
+ 'message': '',
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }).catch(function (err) {
|
|
|
+ debug('Uploading error', err);
|
|
|
+
|
|
|
+ return res.json({
|
|
|
+ 'status': false,
|
|
|
+ 'message': 'Error while uploading to ',
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ actions.userGroup.deletePicture = function (req, res) {
|
|
|
+
|
|
|
+ var userGroupId = req.params.userGroupId;
|
|
|
+ let userGroupName = null;
|
|
|
+
|
|
|
+ UserGroup.findById(userGroupId)
|
|
|
+ .then((userGroupData) => {
|
|
|
+ if (userGroupData == null) {
|
|
|
+ return Promise.reject();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ userGroupName = userGroupData.name;
|
|
|
+ return userGroupData.deleteImage();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .then((updated) => {
|
|
|
+ req.flash('successMessage', 'Deleted group picture');
|
|
|
+
|
|
|
+ return res.redirect('/admin/user-group-detail/' + userGroupName);
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ debug('An error occured.', err);
|
|
|
+
|
|
|
+ req.flash('errorMessage', 'Error while deleting group picture');
|
|
|
+ if (userGroupName == null) {
|
|
|
+ return res.redirect('/admin/user-groups/');
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return res.redirect('/admin/user-group-detail/' + userGroupName);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // app.post('/_api/admin/user-group/delete' , admin.userGroup.removeCompletely);
|
|
|
+ actions.userGroup.removeCompletely = function (req, res) {
|
|
|
+ const id = req.body.user_group_id;
|
|
|
+
|
|
|
+ UserGroup.removeCompletelyById(id, function (err, removed) {
|
|
|
+ if (err) {
|
|
|
+ debug('Error while removing userGroup.', err, id);
|
|
|
+ req.flash('errorMessage', '完全な削除に失敗しました。');
|
|
|
+ } else {
|
|
|
+ req.flash('successMessage', '削除しました');
|
|
|
+ }
|
|
|
+ return res.redirect('/admin/user-groups');
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ actions.userGroupRelation = {};
|
|
|
+ actions.userGroupRelation.index = function(req, res) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ actions.userGroupRelation.create = function(req, res) {
|
|
|
+ const User = crowi.model('User');
|
|
|
+ const UserGroup = crowi.model('UserGroup');
|
|
|
+ const UserGroupRelation = crowi.model('UserGroupRelation');
|
|
|
+
|
|
|
+ // req params
|
|
|
+ const userName = req.body.user_name;
|
|
|
+ const userGroupId = req.body.user_group_id;
|
|
|
+
|
|
|
+ let user = null;
|
|
|
+ let userGroup = null;
|
|
|
+
|
|
|
+ Promise.all([
|
|
|
+ // ユーザグループをIDで検索
|
|
|
+ UserGroup.findById(userGroupId),
|
|
|
+ // ユーザを名前で検索
|
|
|
+ User.findUserByUsername(userName),
|
|
|
+ ])
|
|
|
+ .then((resolves) => {
|
|
|
+ userGroup = resolves[0];
|
|
|
+ user = resolves[1];
|
|
|
+ // Relation を作成
|
|
|
+ UserGroupRelation.createRelation(userGroup, user)
|
|
|
+ })
|
|
|
+ .then((result) => {
|
|
|
+ return res.redirect('/admin/user-group-detail/' + userGroup.name);
|
|
|
+ }).catch((err) => {
|
|
|
+ debug('Error on create user-group relation', err);
|
|
|
+ req.flash('errorMessage', 'Error on create user-group relation');
|
|
|
+ return res.redirect('/admin/user-group-detail/' + userGroup.name);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ actions.userGroupRelation.remove = function (req, res) {
|
|
|
+ const UserGroupRelation = crowi.model('UserGroupRelation');
|
|
|
+ var name = req.params.name;
|
|
|
+ var relationId = req.params.relationId;
|
|
|
+
|
|
|
+ debug(name, relationId);
|
|
|
+ UserGroupRelation.removeById(relationId)
|
|
|
+ .then(() =>{
|
|
|
+ return res.redirect('/admin/user-group-detail/' + name);
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ debug('Error on remove user-group-relation', err);
|
|
|
+ req.flash('errorMessage', 'グループのユーザ削除に失敗しました。');
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
actions.api = {};
|
|
|
actions.api.appSetting = function(req, res) {
|
|
|
var form = req.form.settingForm;
|