feat: add organization policy center

This commit is contained in:
xz
2026-09-01 13:22:04 +08:00
parent a9c8eea271
commit 1d4154dd20
12 changed files with 1565 additions and 12 deletions
+25
View File
@@ -159,6 +159,7 @@ import { reclaimStorage, requireStorageQuota, storageCleanupPreview, storageSumm
import { backupSummary, createDatabaseBackup } from "./backup.mjs";
import { systemReadiness } from "./readiness.mjs";
import { bindProjectStyleKit, createStyleKit, getProjectStyleKit, getStyleKit, listStyleKits, updateStyleKit } from "./style-kits.mjs";
import { evaluateAndRecordOrganizationPolicies, listOrganizationPolicies, updateOrganizationPolicy } from "./organization-policies.mjs";
import { dispatchNotificationEvent, listUserNotificationPreferences, listUserNotifications, markAllUserNotificationsRead, markUserNotificationRead, notificationDeliveries, updateUserNotificationPreference } from "./notifications.mjs";
import { composeProject, listCompositions } from "./composition.mjs";
import { listProjectArtifacts, readArtifactContent } from "./media-artifacts.mjs";
@@ -1852,6 +1853,30 @@ createServer(async (req, res) => {
return send(res, 200, updateCostCenter(context, organizationId, decodeURIComponent(organizationCostCenterMatch[2]), await readBody(req)));
}
const organizationPoliciesEvaluateMatch = pathname.match(/^\/api\/organizations\/([^/]+)\/policies\/evaluate$/);
if (req.method === "POST" && organizationPoliciesEvaluateMatch) {
const organizationId = decodeURIComponent(organizationPoliciesEvaluateMatch[1]);
const context = contextWith({
organizationId,
workspaceId: req.headers["x-workspace-id"] || url.searchParams.get("workspaceId") || "",
projectId: req.headers["x-project-id"] || url.searchParams.get("projectId") || ""
}, req);
return send(res, 200, evaluateAndRecordOrganizationPolicies(context, organizationId, await readBody(req)));
}
const organizationPoliciesMatch = pathname.match(/^\/api\/organizations\/([^/]+)\/policies(?:\/([^/]+))?$/);
if (req.method === "GET" && organizationPoliciesMatch && !organizationPoliciesMatch[2]) {
const organizationId = decodeURIComponent(organizationPoliciesMatch[1]);
const context = contextWith({ organizationId, workspaceId: "", projectId: "" }, req);
return send(res, 200, listOrganizationPolicies(context, organizationId, { limit: url.searchParams.get("limit") || 40 }));
}
if (req.method === "PATCH" && organizationPoliciesMatch?.[2]) {
const organizationId = decodeURIComponent(organizationPoliciesMatch[1]);
const policyKey = decodeURIComponent(organizationPoliciesMatch[2]);
const context = contextWith({ organizationId, workspaceId: "", projectId: "" }, req);
return send(res, 200, updateOrganizationPolicy(context, organizationId, policyKey, await readBody(req)));
}
const organizationRolePolicyMatch = pathname.match(/^\/api\/organizations\/([^/]+)\/role-policies(?:\/([^/]+))?$/);
if (req.method === "GET" && organizationRolePolicyMatch) {
const organizationId = decodeURIComponent(organizationRolePolicyMatch[1]);