/home/techb158/balavpn.abdallabala.com/src/app/api/workspaces/[workspaceId]/integrations
Edit: /home/techb158/balavpn.abdallabala.com/src/app/api/workspaces/[workspaceId]/integrations/route.js (2472B)
const { prisma } = require("../../../../../lib/prisma");
const { getActorFromRequest } = require("../../../../../lib/request-context");
const { hasPermission } = require("../../../../../domain/permissions");
const { jsonResponse, errorResponse, parseJson } = require("../../../../../lib/http");
const { saveIntegrationCredentials } = require("../../../../../services/integration-service");
async function requireWorkspace(request, workspaceId, permission) {
const actor = await getActorFromRequest(request);
const workspace = await prisma.workspace.findUniqueOrThrow({ where: { id: workspaceId } });
const membership = actor.memberships.find(item => item.organizationId === workspace.organizationId && item.status === "ACTIVE");
if (!membership || !hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return { actor, workspace };
}
export async function GET(request, { params }) {
try {
const { workspaceId } = await params;
await requireWorkspace(request, workspaceId, "integration:read");
const integrations = await prisma.integration.findMany({ where: { workspaceId }, orderBy: { provider: "asc" } });
return jsonResponse({ integrations });
} catch (error) {
return errorResponse(error);
}
}
export async function POST(request, { params }) {
try {
const { workspaceId } = await params;
const { actor, workspace } = await requireWorkspace(request, workspaceId, "integration:manage");
const body = await parseJson(request);
const integration = await prisma.integration.create({
data: {
workspaceId: workspace.id,
provider: body.provider,
workspaceName: body.workspaceName || `${body.provider} workspace`,
externalProjectKey: body.externalProjectKey || "",
baseUrl: body.baseUrl || "",
authMode: body.authMode || "OAuth or API token",
connectionStatus: "NEEDS_CONFIGURATION",
syncDirection: body.syncDirection || "COSMIC to PM",
liveEnabled: body.liveEnabled === true,
liveConfig: body.liveConfig || {}
}
});
const credentialStore = body.credentials ? await saveIntegrationCredentials({ integrationId: integration.id, credentials: body.credentials, actor, request }) : null;
return jsonResponse({ integration, credentialStore }, 201);
} catch (error) {
return errorResponse(error);
}
}