147 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { GitlabProjectModel } from "../../db/gitlabProject/index."
import { Context } from "../../types"
/**
* 刷新项目的Gitlab Event
* @param param0
* @param project
* @returns
*/
const refreshProjectHooks = async (
{ gitlabService }: Context,
project: GitlabProjectModel
) => {
gitlabService.setProjectId(project.projectId)
const eventList = await gitlabService.hook.getList()
const HOOK_URL =
Bun.env.NODE_ENV === "production"
? "https://lark-egg.ai.xiaomi.com/gitlab"
: "https://lark-egg-preview.ai.xiaomi.com/gitlab"
// 找到目标Event
const targetEvent = eventList.find((event) => event.url === HOOK_URL)
// 清除Event
if (!project.openCICDNotify && !project.openMRSummary) {
if (!targetEvent) return
await gitlabService.hook.delete(targetEvent.id)
return
}
// 添加Event
if (targetEvent) return
await gitlabService.hook.add({
url: HOOK_URL,
push_events: false,
job_events: true,
merge_requests_events: true,
})
}
const openFunc = async (
ctx: Context,
projectId: number,
func: "openCICDNotify" | "openMRSummary"
) => {
const { logger, larkBody, larkService, larkCard, db } = ctx
const cardGender = larkCard.child("gitlabAgent")
if (!projectId) {
logger.error(`项目ID格式错误项目ID${projectId}`)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genErrorCard("项目ID格式错误请检查项目ID是否正确")
)
return
}
const project = await db.gitlabProject.getAndCreate(
projectId,
ctx.gitlabService
)
if (!project) {
logger.error(`项目不存在项目ID${projectId}`)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genErrorCard(
"该项目不存在请检查项目ID是否正确或确认 @itp-cr-agent 是否具有对项目的Maintainer权限"
)
)
return
}
const newProj = await db.gitlabProject.update(project.id, {
[func]: true,
})
if (!newProj) {
logger.error(`更新项目失败项目ID${projectId}`)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genErrorCard("操作失败,请稍后再试")
)
return
}
await refreshProjectHooks(ctx, newProj)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genSuccessCard(
`已开启${func === "openCICDNotify" ? "CI/CD成功提醒" : "MR自动总结"}`
)
)
}
const closeFunc = async (
ctx: Context,
projectId: number,
func: "openCICDNotify" | "openMRSummary"
) => {
const { logger, larkBody, larkService, larkCard, db } = ctx
const cardGender = larkCard.child("gitlabAgent")
if (!projectId) {
logger.error(`项目ID格式错误项目ID${projectId}`)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genErrorCard("项目ID格式错误请检查项目ID是否正确")
)
return
}
const project = await db.gitlabProject.getByProjectId(projectId)
if (!project) {
logger.error(`项目不存在项目ID${projectId}`)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genSuccessCard(
`已关闭${func === "openCICDNotify" ? "CI/CD成功提醒" : "MR自动总结"}`
)
)
return
}
const newProj = await db.gitlabProject.update(project.id, {
[func]: false,
})
if (!newProj) {
logger.error(`更新项目失败项目ID${projectId}`)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genErrorCard("操作失败,请稍后再试")
)
return
}
await refreshProjectHooks(ctx, newProj)
await larkService.message.replyCard(
larkBody.messageId,
cardGender.genSuccessCard(
`已关闭${func === "openCICDNotify" ? "CI/CD成功提醒" : "MR自动总结"}`
)
)
}
const register = {
openCICDNotify: async (ctx: Context, projectId: number) =>
openFunc(ctx, projectId, "openCICDNotify"),
closeCICDNotify: async (ctx: Context, projectId: number) =>
closeFunc(ctx, projectId, "openCICDNotify"),
openMRSummary: async (ctx: Context, projectId: number) =>
openFunc(ctx, projectId, "openMRSummary"),
closeMRSummary: async (ctx: Context, projectId: number) =>
closeFunc(ctx, projectId, "openMRSummary"),
}
export default register