@iflow-mcp/alibabacloud-devops-mcp-server
Version:
MCP Server for using the alibabacloud-devops API: allows AI assistants to directly participate in development collaboration, helping teams optimize development processes and improve efficiency.
207 lines (206 loc) • 6.33 kB
JavaScript
/**
* 项目(Project)相关操作
*
* 概念说明:
* - 项目(Project)是云效平台中的项目管理单元,包含工作项、迭代等管理概念
* - 项目与代码库(Repository)是不同的概念,代码库属于CodeUp产品,用于代码管理
* - 一个项目可以关联多个代码库,但两者是不同的资源类型
*/
import { yunxiaoRequest } from "../../common/utils.js";
import { ProjectInfoSchema } from "../../common/types.js";
/**
* 获取项目详情
* @param organizationId
* @param id
*/
export async function getProjectFunc(organizationId, id) {
const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${id}`;
const response = await yunxiaoRequest(url, {
method: "GET",
});
return ProjectInfoSchema.parse(response);
}
/**
* 搜索项目
* @param organizationId
* @param name
* @param status
* @param createdAfter
* @param createdBefore
* @param creator
* @param adminUserId
* @param logicalStatus
* @param advancedConditions
* @param extraConditions
* @param orderBy
* @param page
* @param perPage
* @param sort
* @param scenarioFilter
* @param userId
*/
export async function searchProjectsFunc(organizationId, name, status, createdAfter, createdBefore, creator, adminUserId, // Project administrator user ID
logicalStatus, advancedConditions, extraConditions, // Should be constructed using buildExtraConditions for common filters
orderBy, // Possible values: "gmtCreate", "name"
page, perPage, sort, // Possible values: "desc", "asc"
scenarioFilter, // Common project filter scenarios
userId // User ID to use with scenarioFilter
) {
const url = `/oapi/v1/projex/organizations/${organizationId}/projects:search`;
const payload = {};
if (scenarioFilter && userId) {
extraConditions = buildExtraConditions(scenarioFilter, userId);
}
const conditions = buildProjectConditions({
name,
status,
createdAfter,
createdBefore,
creator,
adminUserId,
logicalStatus,
advancedConditions
});
if (conditions) {
payload.conditions = conditions;
}
if (extraConditions) {
payload.extraConditions = extraConditions;
}
if (orderBy) {
payload.orderBy = orderBy;
}
if (page !== undefined) {
payload.page = page;
}
if (perPage !== undefined) {
payload.perPage = perPage;
}
if (sort) {
payload.sort = sort;
}
const response = await yunxiaoRequest(url, {
method: "POST",
body: payload,
});
if (!Array.isArray(response)) {
return [];
}
return response.map(project => ProjectInfoSchema.parse(project));
}
/**
* 构建项目过滤条件(源API所需参数conditions是一个固定的JSON结构)
* @param args
*/
function buildProjectConditions(args) {
if (args.advancedConditions) {
return args.advancedConditions;
}
const filterConditions = [];
if (args.name) {
filterConditions.push({
className: "string",
fieldIdentifier: "name",
format: "input",
operator: "CONTAINS",
toValue: null,
value: [args.name],
});
}
if (args.status) {
const statusValues = args.status.split(",");
const values = statusValues.map(v => v.trim());
filterConditions.push({
className: "status",
fieldIdentifier: "status",
format: "list",
operator: "CONTAINS",
toValue: null,
value: values,
});
}
if (args.createdAfter) {
const createdBefore = args.createdBefore ? `${args.createdBefore} 23:59:59` : null;
filterConditions.push({
className: "date",
fieldIdentifier: "gmtCreate",
format: "input",
operator: "BETWEEN",
toValue: createdBefore,
value: [`${args.createdAfter} 00:00:00`],
});
}
if (args.creator) {
const creatorValues = args.creator.split(",");
const values = creatorValues.map(v => v.trim());
filterConditions.push({
className: "user",
fieldIdentifier: "creator",
format: "list",
operator: "CONTAINS",
toValue: null,
value: values,
});
}
if (args.adminUserId) {
const adminValues = args.adminUserId.split(",");
const values = adminValues.map(v => v.trim());
filterConditions.push({
className: "user",
fieldIdentifier: "project.admin",
format: "multiList",
operator: "CONTAINS",
toValue: null,
value: values,
});
}
if (args.logicalStatus) {
filterConditions.push({
className: "string",
fieldIdentifier: "logicalStatus",
format: "list",
operator: "CONTAINS",
toValue: null,
value: [args.logicalStatus],
});
}
if (filterConditions.length === 0) {
return undefined;
}
const conditions = {
conditionGroups: [filterConditions],
};
return JSON.stringify(conditions);
}
/**
* 项目额外过滤条件
* @param scenario The filter scenario: "manage" (projects I manage), "participate" (projects I participate in), "favorite" (projects I favorited)
* @param userId The user ID to filter by
* @returns JSON string for extraConditions parameter
*/
export function buildExtraConditions(scenario, userId) {
let fieldIdentifier;
switch (scenario) {
case "manage":
fieldIdentifier = "project.admin";
break;
case "participate":
fieldIdentifier = "users";
break;
case "favorite":
fieldIdentifier = "collectMembers";
break;
default:
throw new Error(`Unknown scenario: ${scenario}`);
}
const conditions = {
conditionGroups: [[{
className: "user",
fieldIdentifier: fieldIdentifier,
format: "multiList",
operator: "CONTAINS",
value: [userId]
}]]
};
return JSON.stringify(conditions);
}