import { Inject, Body, Controller, Delete, Get, Param, Patch, Post, Req } from "@nestjs/common"; import type { Request } from "express"; import { z } from "zod"; import { IntegrationsService } from "./integrations.service.js"; import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js"; import { requireActor } from "../../common/types.js"; const CreateIntegrationDto = z.object({ name: z.string().min(1).max(100), kind: z.enum(["sso", "scim", "custom"]), config: z.record(z.unknown()).default({}) }); type CreateIntegrationInput = z.infer; const UpdateIntegrationDto = z.object({ name: z.string().min(1).max(100).optional(), status: z.enum(["active", "inactive", "revoked"]).optional(), config: z.record(z.unknown()).optional() }); type UpdateIntegrationInput = z.infer; @Controller("workspaces/:workspaceId/integrations") export class IntegrationsController { constructor(@Inject(IntegrationsService) private readonly integrations: IntegrationsService) {} @Get() list(@Param("workspaceId") workspaceId: string, @Req() req: Request) { return this.integrations.list(workspaceId, requireActor(req)); } @Post() create( @Param("workspaceId") workspaceId: string, @Body(ZodValidate(CreateIntegrationDto)) body: CreateIntegrationInput, @Req() req: Request ) { return this.integrations.create(workspaceId, requireActor(req), body, req); } @Patch(":id") update( @Param("workspaceId") workspaceId: string, @Param("id") id: string, @Body(ZodValidate(UpdateIntegrationDto)) body: UpdateIntegrationInput, @Req() req: Request ) { return this.integrations.update(workspaceId, id, requireActor(req), body, req); } @Delete(":id") remove( @Param("workspaceId") workspaceId: string, @Param("id") id: string, @Req() req: Request ) { return this.integrations.remove(workspaceId, id, requireActor(req), req); } }