import { HttpApiBuilder } from "@effect/platform";import type { OrganizationId, WorkspaceId } from "#schema"; import { requirePermission, withPolicy } from "#domain";import { createWorkspace, getWorkspace, listWorkspaces, removeWorkspace, updateWorkspace,} from "../../runtime/organizations-operations"; import { ControlPlaneApi } from "../api";import { withRequestActor, withWorkspaceRequestActor,} from "../http-auth"; const requireReadWorkspace = (workspaceId: WorkspaceId) => requirePermission({ permission: "workspace:read", workspaceId, }); const requireManageWorkspace = (workspaceId: WorkspaceId) => requirePermission({ permission: "workspace:manage", workspaceId, }); const requireOrganizationWorkspaceRead = (organizationId: OrganizationId) => requirePermission({ permission: "workspace:read", organizationId, }); const requireOrganizationWorkspaceManage = (organizationId: OrganizationId) => requirePermission({ permission: "workspace:manage", organizationId, }); export const ControlPlaneWorkspacesLive = HttpApiBuilder.group( ControlPlaneApi, "workspaces", (handlers) => handlers .handle("list", ({ path }) => withRequestActor("workspaces.list", () => withPolicy( requireOrganizationWorkspaceRead(path.organizationId), )(listWorkspaces(path.organizationId)) ), ) .handle("create", ({ path, payload }) => withRequestActor("workspaces.create", (actor) => withPolicy( requireOrganizationWorkspaceManage(path.organizationId), )( createWorkspace({ organizationId: path.organizationId, payload, createdByAccountId: actor.principal.accountId, }), ), ), ) .handle("get", ({ path }) => withWorkspaceRequestActor("workspaces.get", path.workspaceId, () => withPolicy(requireReadWorkspace(path.workspaceId))( getWorkspace(path.workspaceId), ), ), ) .handle("update", ({ path, payload }) => withWorkspaceRequestActor("workspaces.update", path.workspaceId, () => withPolicy(requireManageWorkspace(path.workspaceId))( updateWorkspace({ workspaceId: path.workspaceId, payload }), ), ), ) .handle("remove", ({ path }) => withWorkspaceRequestActor("workspaces.remove", path.workspaceId, () => withPolicy(requireManageWorkspace(path.workspaceId))( removeWorkspace({ workspaceId: path.workspaceId }), ), ), ),);
import { HttpApiBuilder } from "@effect/platform";
import type { OrganizationId, WorkspaceId } from "#schema";
import { requirePermission, withPolicy } from "#domain";
import {
createWorkspace,
getWorkspace,
listWorkspaces,
removeWorkspace,
updateWorkspace,
} from "../../runtime/organizations-operations";
import { ControlPlaneApi } from "../api";
import {
withRequestActor,
withWorkspaceRequestActor,
} from "../http-auth";
const requireReadWorkspace = (workspaceId: WorkspaceId) =>
requirePermission({
permission: "workspace:read",
workspaceId,
});
const requireManageWorkspace = (workspaceId: WorkspaceId) =>
requirePermission({
permission: "workspace:manage",
workspaceId,
});
const requireOrganizationWorkspaceRead = (organizationId: OrganizationId) =>
requirePermission({
permission: "workspace:read",
organizationId,
});
const requireOrganizationWorkspaceManage = (organizationId: OrganizationId) =>
requirePermission({
permission: "workspace:manage",
organizationId,
});
export const ControlPlaneWorkspacesLive = HttpApiBuilder.group(
ControlPlaneApi,
"workspaces",
(handlers) =>
handlers
.handle("list", ({ path }) =>
withRequestActor("workspaces.list", () =>
withPolicy(
requireOrganizationWorkspaceRead(path.organizationId),
)(listWorkspaces(path.organizationId))
),
)
.handle("create", ({ path, payload }) =>
withRequestActor("workspaces.create", (actor) =>
withPolicy(
requireOrganizationWorkspaceManage(path.organizationId),
)(
createWorkspace({
organizationId: path.organizationId,
payload,
createdByAccountId: actor.principal.accountId,
}),
),
),
)
.handle("get", ({ path }) =>
withWorkspaceRequestActor("workspaces.get", path.workspaceId, () =>
withPolicy(requireReadWorkspace(path.workspaceId))(
getWorkspace(path.workspaceId),
),
),
)
.handle("update", ({ path, payload }) =>
withWorkspaceRequestActor("workspaces.update", path.workspaceId, () =>
withPolicy(requireManageWorkspace(path.workspaceId))(
updateWorkspace({ workspaceId: path.workspaceId, payload }),
),
),
)
.handle("remove", ({ path }) =>
withWorkspaceRequestActor("workspaces.remove", path.workspaceId, () =>
withPolicy(requireManageWorkspace(path.workspaceId))(
removeWorkspace({ workspaceId: path.workspaceId }),
),
),
),
);