Rhys Sullivanclean upa9ff2ff8 months agoHistory
89 lines · 2.6 KB · TypeScript
RawDownload
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 }),          ),        ),      ),);