operations/projex/project.ts (161 lines of code) (raw):
/**
* 项目(Project)相关操作
*
* 概念说明:
* - 项目(Project)是云效平台中的项目管理单元,包含工作项、迭代等管理概念
* - 项目与代码库(Repository)是不同的概念,代码库属于CodeUp产品,用于代码管理
* - 一个项目可以关联多个代码库,但两者是不同的资源类型
*/
import { z } from "zod";
import { yunxiaoRequest } from "../../common/utils.js";
import {
ProjectInfoSchema,
FilterConditionSchema,
ConditionsSchema
} from "../../common/types.js";
// Function implementations
export async function getProjectFunc(
organizationId: string,
id: string
): Promise<z.infer<typeof ProjectInfoSchema>> {
const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${id}`;
const response = await yunxiaoRequest(url, {
method: "GET",
});
return ProjectInfoSchema.parse(response);
}
export async function searchProjectsFunc(
organizationId: string,
name?: string,
status?: string,
createdAfter?: string,
createdBefore?: string,
creator?: string,
admin?: string,
logicalStatus?: string,
advancedConditions?: string,
extraConditions?: string,
orderBy?: string, // Possible values: "gmtCreate", "name"
page?: number,
perPage?: number,
sort?: string // Possible values: "desc", "asc"
): Promise<z.infer<typeof ProjectInfoSchema>[]> {
const url = `/oapi/v1/projex/organizations/${organizationId}/projects:search`;
// Prepare payload
const payload: Record<string, any> = {};
// Process condition parameters
const conditions = buildProjectConditions({
name,
status,
createdAfter,
createdBefore,
creator,
admin,
logicalStatus,
advancedConditions
});
if (conditions) {
payload.conditions = conditions;
}
// Add other optional parameters
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,
});
// Ensure response is an array
if (!Array.isArray(response)) {
return [];
}
// Parse each project object
return response.map(project => ProjectInfoSchema.parse(project));
}
// Build project search conditions
function buildProjectConditions(args: {
name?: string;
status?: string;
createdAfter?: string;
createdBefore?: string;
creator?: string;
admin?: string;
logicalStatus?: string;
advancedConditions?: string;
}): string | undefined {
// If advanced conditions are provided directly, use them preferentially
if (args.advancedConditions) {
return args.advancedConditions;
}
// Build condition group
const filterConditions: z.infer<typeof FilterConditionSchema>[] = [];
// Process name
if (args.name) {
filterConditions.push({
className: "string",
fieldIdentifier: "name",
format: "input",
operator: "CONTAINS",
toValue: null,
value: [args.name],
});
}
// Process status
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,
});
}
// Process creation time range
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`],
});
}
// Process creator
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,
});
}
// Process administrator
if (args.admin) {
const adminValues = args.admin.split(",");
const values = adminValues.map(v => v.trim());
filterConditions.push({
className: "user",
fieldIdentifier: "project.admin",
format: "multiList",
operator: "CONTAINS",
toValue: null,
value: values,
});
}
// Process logical status
if (args.logicalStatus) {
filterConditions.push({
className: "string",
fieldIdentifier: "logicalStatus",
format: "list",
operator: "CONTAINS",
toValue: null,
value: [args.logicalStatus],
});
}
// If there are no conditions, return undefined
if (filterConditions.length === 0) {
return undefined;
}
// Build complete condition object
const conditions: z.infer<typeof ConditionsSchema> = {
conditionGroups: [filterConditions],
};
// Serialize to JSON
return JSON.stringify(conditions);
}