const groupModel = require('../models/group.js');
const yapi = require('../yapi.js');
const baseController = require('./base.js');
const projectModel = require('../models/project.js');
const userModel = require('../models/user.js');
const interfaceModel = require('../models/interface.js');
const interfaceColModel = require('../models/interfaceCol.js');
const interfaceCaseModel = require('../models/interfaceCase.js');
const _ = require('underscore')
const rolename = {
owner: '组长',
dev: '开发者',
guest: '访客'
};
class groupController extends baseController {
constructor(ctx) {
super(ctx);
const id = 'number';
const group_name = {
type: 'string',
minLength: 1
};
const group_desc = 'string';
const role = {
type: 'string',
enum: ['owner', 'dev', 'guest']
};
const member_uids = {
type: 'array',
items: 'number',
minItems: 1
};
this.schemaMap = {
get: {
'*id': id
},
add: {
'*group_name': group_name,
group_desc: group_desc,
owner_uids: ['number']
},
addMember: {
'*id': id,
role: role,
'*member_uids': member_uids
},
changeMemberRole: {
'*member_uid': 'number',
'*id': id,
role: role
},
getMemberList: {
'*id': id
},
delMember: {
'*id': id,
'*member_uid': 'number'
},
del: {
'*id': id
},
up: {
'*id': id,
'*group_name': group_name,
group_desc: group_desc,
custom_field1: {
name: 'string',
enable: 'boolen'
},
custom_field2: {
name: 'string',
enable: 'boolen'
},
custom_field3: {
name: 'string',
enable: 'boolen'
}
}
};
}
/**
* 查询项目分组
* @interface /group/get
* @method GET
* @category group
* @foldnumber 10
* @param {String} id 项目分组ID
* @returns {Object}
* @example
*/
async get(ctx) {
let params = ctx.params;
let groupInst = yapi.getInst(groupModel);
let result = await groupInst.getGroupById(params.id);
if (result) {
result = result.toObject();
let role = await this.getProjectRole(params.id, 'group');
result.role = role;
if (result.type === 'private') {
result.group_name = '个人空间';
}
ctx.body = yapi.commons.resReturn(result);
}
}
/**
* 添加项目分组
* @interface /group/add
* @method POST
* @category group
* @foldnumber 10
* @param {String} group_name 项目分组名称,不能为空
* @param {String} [group_desc] 项目分组描述
* @param {String} [owner_uids] 组长[uid]
* @returns {Object}
* @example ./api/group/add.json
*/
async add(ctx) {
let params = ctx.params;
// 新版每个人都有权限添加分组
// if (this.getRole() !== 'admin') {
// return (ctx.body = yapi.commons.resReturn(null, 401, '没有权限'));
// }
let owners = [];
if(params.owner_uids.length === 0){
params.owner_uids.push(
this.getUid()
)
}
if (params.owner_uids) {
for (let i = 0, len = params.owner_uids.length; i < len; i++) {
let id = params.owner_uids[i];
let groupUserdata = await this.getUserdata(id, 'owner');
if (groupUserdata) {
owners.push(groupUserdata);
}
}
}
let groupInst = yapi.getInst(groupModel);
let checkRepeat = await groupInst.checkRepeat(params.group_name);
if (checkRepeat > 0) {
return (ctx.body = yapi.commons.resReturn(null, 401, '项目分组名已存在'));
}
let data = {
group_name: params.group_name,
group_desc: params.group_desc,
uid: this.getUid(),
add_time: yapi.commons.time(),
up_time: yapi.commons.time(),
members: owners
};
let result = await groupInst.save(data);
result = yapi.commons.fieldSelect(result, [
'_id',
'group_name',
'group_desc',
'uid',
'members',
'type'
]);
let username = this.getUsername();
yapi.commons.saveLog({
content: `${username} 新增了分组 ${params.group_name}`,
type: 'group',
uid: this.getUid(),
username: username,
typeid: result._id
});
ctx.body = yapi.commons.resReturn(result);
}
/**
* 获取用户数据
* @param uid
* @param role
* @returns {Promise.<*>}
*/
async getUserdata(uid, role) {
role = role || 'dev';
let userInst = yapi.getInst(userModel);
let userData = await userInst.findById(uid);
if (!userData) {
return null;
}
return {
_role: userData.role,
role: role,
uid: userData._id,
username: userData.username,
email: userData.email
};
}
async getMyGroup(ctx){
var groupInst = yapi.getInst(groupModel);
let privateGroup = await groupInst.getByPrivateUid(this.getUid());
if (!privateGroup) {
privateGroup = await groupInst.save({
uid: this.getUid(),
group_name: 'User-' + this.getUid(),
add_time: yapi.commons.time(),
up_time: yapi.commons.time(),
type: 'private'
});
}
if(privateGroup){
ctx.body = yapi.commons.resReturn(privateGroup)
}else{
ctx.body = yapi.commons.resReturn(null)
}
}
/**
* 添加项目分组成员
* @interface /group/add_member
* @method POST
* @category group
* @foldnumber 10
* @param {String} id 项目分组id
* @param {String} member_uids 项目分组成员[uid]
* @param {String} role 成员角色,owner or dev or guest
* @returns {Object}
* @example
*/
async addMember(ctx) {
let params = ctx.params;
let groupInst = yapi.getInst(groupModel);
params.role = ['owner', 'dev', 'guest'].find(v => v === params.role) || 'dev';
let add_members = [];
let exist_members = [];
let no_members = [];
for (let i = 0, len = params.member_uids.length; i < len; i++) {
let id = params.member_uids[i];
let check = await groupInst.checkMemberRepeat(params.id, id);
let userdata = await this.getUserdata(id, params.role);
if (check > 0) {
exist_members.push(userdata);
} else if (!userdata) {
no_members.push(id);
} else {
userdata.role !== 'admin' && add_members.push(userdata);
delete userdata._role;
}
}
let result = await groupInst.addMember(params.id, add_members);
let username = this.getUsername();
if (add_members.length) {
let members = add_members.map(item => {
return `${item.username}`;
});
members = members.join('、');
yapi.commons.saveLog({
content: `${username} 新增了分组成员 ${members} 为 ${
rolename[params.role]
}`,
type: 'group',
uid: this.getUid(),
username: username,
typeid: params.id
});
}
ctx.body = yapi.commons.resReturn({
result,
add_members,
exist_members,
no_members
});
}
/**
* 修改项目分组成员角色
* @interface /group/change_member_role
* @method POST
* @category group
* @foldnumber 10
* @param {String} id 项目分组id
* @param {String} member_uid 项目分组成员uid
* @param {String} role 权限 ['owner'|'dev']
* @returns {Object}
* @example
*/
async changeMemberRole(ctx) {
let params = ctx.request.body;
let groupInst = yapi.getInst(groupModel);
var check = await groupInst.checkMemberRepeat(params.id, params.member_uid);
if (check === 0) {
return (ctx.body = yapi.commons.resReturn(null, 400, '分组成员不存在'));
}
if ((await this.checkAuth(params.id, 'group', 'danger')) !== true) {
return (ctx.body = yapi.commons.resReturn(null, 405, '没有权限'));
}
params.role = ['owner', 'dev', 'guest'].find(v => v === params.role) || 'dev';
let result = await groupInst.changeMemberRole(params.id, params.member_uid, params.role);
let username = this.getUsername();
let groupUserdata = await this.getUserdata(params.member_uid, params.role);
yapi.commons.saveLog({
content: `${username} 更改了分组成员 ${groupUserdata ? groupUserdata.username : ''} 的权限为 "${rolename[params.role]}"`,
type: 'group',
uid: this.getUid(),
username: username,
typeid: params.id
});
ctx.body = yapi.commons.resReturn(result);
}
/**
* 获取所有项目成员
* @interface /group/get_member_list
* @method GET
* @category group
* @foldnumber 10
* @param {String} id 项目分组id
* @returns {Object}
* @example
*/
async getMemberList(ctx) {
let params = ctx.params;
let groupInst = yapi.getInst(groupModel);
let group = await groupInst.get(params.id);
ctx.body = yapi.commons.resReturn(group.members);
}
/**
* 删除项目成员
* @interface /group/del_member
* @method POST
* @category group
* @foldnumber 10
* @param {String} id 项目分组id
* @param {String} member_uid 项目分组成员uid
* @returns {Object}
* @example
*/
async delMember(ctx) {
let params = ctx.params;
let groupInst = yapi.getInst(groupModel);
var check = await groupInst.checkMemberRepeat(params.id, params.member_uid);
if (check === 0) {
return (ctx.body = yapi.commons.resReturn(null, 400, '分组成员不存在'));
}
if ((await this.checkAuth(params.id, 'group', 'danger')) !== true) {
return (ctx.body = yapi.commons.resReturn(null, 405, '没有权限'));
}
let result = await groupInst.delMember(params.id, params.member_uid);
let username = this.getUsername();
let groupUserdata = await this.getUserdata(params.member_uid, params.role);
yapi.commons.saveLog({
content: `${username} 删除了分组成员 ${groupUserdata ? groupUserdata.username : ''}`,
type: 'group',
uid: this.getUid(),
username: username,
typeid: params.id
});
ctx.body = yapi.commons.resReturn(result);
}
/**
* 获取项目分组列表
* @interface /group/list
* @method get
* @category group
* @foldnumber 10
* @returns {Object}
* @example ./api/group/list.json
*/
async list(ctx) {
var groupInst = yapi.getInst(groupModel);
let projectInst = yapi.getInst(projectModel);
let privateGroup = await groupInst.getByPrivateUid(this.getUid());
let newResult = [];
if (!privateGroup) {
privateGroup = await groupInst.save({
uid: this.getUid(),
group_name: 'User-' + this.getUid(),
add_time: yapi.commons.time(),
up_time: yapi.commons.time(),
type: 'private'
});
}
if(this.getRole() === 'admin'){
let result = await groupInst.list();
if(result && result.length > 0 ){
for (let i = 0; i < result.length; i++){
result[i] = result[i].toObject();
newResult.unshift(result[i])
}
}
}else{
let result = await groupInst.getAuthList(this.getUid());
if(result && result.length > 0 ){
for (let i = 0; i < result.length; i++){
result[i] = result[i].toObject();
newResult.unshift(result[i])
}
}
const groupIds = newResult.map(item=> item._id);
const newGroupIds = [];
let groupByProject = await projectInst.getAuthList(this.getUid());
if(groupByProject && groupByProject.length > 0){
groupByProject.forEach( _data=>{
const _temp = [...groupIds, ...newGroupIds];
if(!_.find(_temp, id=> id === _data.group_id)){
newGroupIds.push(_data.group_id)
}
})
}
let newData = await groupInst.findByGroups(newGroupIds)
newData.forEach(_data=>{
_data = _data.toObject();
newResult.push(_data);
})
}
if (privateGroup) {
privateGroup = privateGroup.toObject();
privateGroup.group_name = '个人空间';
privateGroup.role = 'owner';
newResult.unshift(privateGroup);
}
ctx.body = yapi.commons.resReturn(newResult);
}
/**
* 删除项目分组
* @interface /group/del
* @method post
* @param {String} id 项目分组id
* @category group
* @foldnumber 10
* @returns {Object}
* @example ./api/group/del.json
*/
async del(ctx) {
if (this.getRole() !== 'admin') {
return (ctx.body = yapi.commons.resReturn(null, 401, '没有权限'));
}
let groupInst = yapi.getInst(groupModel);
let projectInst = yapi.getInst(projectModel);
let interfaceInst = yapi.getInst(interfaceModel);
let interfaceColInst = yapi.getInst(interfaceColModel);
let interfaceCaseInst = yapi.getInst(interfaceCaseModel);
let id = ctx.params.id;
let projectList = await projectInst.list(id, true);
projectList.forEach(async p => {
await interfaceInst.delByProjectId(p._id);
await interfaceCaseInst.delByProjectId(p._id);
await interfaceColInst.delByProjectId(p._id);
});
if (projectList.length > 0) {
await projectInst.delByGroupid(id);
}
let result = await groupInst.del(id);
ctx.body = yapi.commons.resReturn(result);
}
/**
* 更新项目分组
* @interface /group/up
* @method post
* @param {String} id 项目分组id
* @param {String} group_name 项目分组名称
* @param {String} group_desc 项目分组描述
* @category group
* @foldnumber 10
* @returns {Object}
* @example ./api/group/up.json
*/
async up(ctx) {
let groupInst = yapi.getInst(groupModel);
let params = ctx.params;
if ((await this.checkAuth(params.id, 'group', 'danger')) !== true) {
return (ctx.body = yapi.commons.resReturn(null, 405, '没有权限'));
}
let result = await groupInst.up(params.id, params);
let username = this.getUsername();
yapi.commons.saveLog({
content: `${username} 更新了 ${params.group_name} 分组`,
type: 'group',
uid: this.getUid(),
username: username,
typeid: params.id
});
ctx.body = yapi.commons.resReturn(result);
}
}
module.exports = groupController;