运维服务中台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

185 lines
4.9 KiB

'use strict';
const moment = require('moment')
async function bindAnxin2pep (ctx) {
const transaction = await ctx.fs.dc.orm.transaction();
try {
const models = ctx.fs.dc.models;
const { clickHouse } = ctx.app.fs
const { userId, pepUserId } = ctx.fs.api
const { bindId, name, pepProjectId, anxinProjectId = [], appId = [] } = ctx.request.body
if (name && pepProjectId) {
throw '项企项目与自定义项目名称仅可选择一项'
}
let bindId_ = bindId
const now = moment()
let storageData = {
name, pepProjectId, anxinProjectId,
updateTime: now,
del: false,
}
// 仅限已有 pepProjectId 的项目
const existRes = pepProjectId ? await models.ProjectCorrelation.findOne({
where: Object.assign(
{},
pepProjectId ? {
pepProjectId: pepProjectId
} : {
name,
}
),
}) : null
if (name) {
const pepRepeatNameCount = await clickHouse.projectManage.query(`SELECT COUNT(*) AS count FROM t_pim_project WHERE project_name='${name}'`).toPromise()
if (pepRepeatNameCount[0].count) {
throw `已有相同名称【${name}】的项企项目`
}
const pomsRepeatNameRes = await models.ProjectCorrelation.findAll({
where: {
name
}
})
if (pomsRepeatNameRes.some((pr) => {
return (
(
// 有修改id但是不等于当前修改id的
bindId && pr.id != bindId && !pr.del
) || (
!bindId && (
(
existRes && pr.id != existRes.id && !pr.del
) || (
!existRes && !pr.del
)
)
)
)
})) {
throw `已有相同名称【${name}】的自定义项目`
}
} else {
const pomsRepeatProjectIdRes = await models.ProjectCorrelation.findAll({
where: {
pepProjectId: pepProjectId
}
})
if (pomsRepeatProjectIdRes.some((pr) => {
return (
(
// 有修改id但是不等于当前修改id的
bindId && pr.id != bindId && !pr.del
) || (
!bindId && (
(
existRes && pr.id != existRes.id && !pr.del
) || (
!existRes && !pr.del
)
)
)
)
})) {
throw `当前项企项目已绑定`
}
storageData.name = null
}
if (bindId) {
// 修改
await models.ProjectCorrelation.update(storageData, {
where: {
id: bindId
},
transaction
})
} else {
// 新增
if (existRes) {
// 但是有之前的数据
if (existRes.del) {
// 不过之前的删除了
await models.ProjectCorrelation.update(storageData, {
where: {
pepProjectId: pepProjectId
},
transaction
})
} else {
// 没有删除 重复添加
throw '当前项企项目已绑定'
}
} else {
storageData.createUser = userId;
storageData.createTime = now.format()
const createRes = await models.ProjectCorrelation.create(storageData, {
transaction
})
bindId_ = createRes.id
}
}
if (bindId) {
await models.ProjectApp.destroy({
where: {
projectId: bindId
},
transaction
})
}
await models.ProjectApp.bulkCreate(appId.map(aid => {
return {
projectId: bindId_,
appId: aid
}
}), {
transaction
})
await transaction.commit();
ctx.status = 204;
} catch (error) {
await transaction.rollback();
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function del (ctx) {
try {
const models = ctx.fs.dc.models;
const { bindId } = ctx.params
await models.ProjectCorrelation.update({
del: true
}, {
where: {
id: { $in: bindId.split(',') }
}
})
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
module.exports = {
bindAnxin2pep,
del
};