1import { Inject, Body, Controller, Delete, Get, Param, Patch, Post, Req } from "@nestjs/common"; 2import type { Request } from "express"; 3import { z } from "zod"; 4import { IntegrationsService } from "./integrations.service.js"; 5import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js"; 6import { requireActor } from "../../common/types.js"; 7 8const CreateIntegrationDto = z.object({ 9 name: z.string().min(1).max(100), 10 kind: z.enum(["sso", "scim", "custom"]), 11 config: z.record(z.unknown()).default({}) 12}); 13type CreateIntegrationInput = z.infer<typeof CreateIntegrationDto>; 14 15const UpdateIntegrationDto = z.object({ 16 name: z.string().min(1).max(100).optional(), 17 status: z.enum(["active", "inactive", "revoked"]).optional(), 18 config: z.record(z.unknown()).optional() 19}); 20type UpdateIntegrationInput = z.infer<typeof UpdateIntegrationDto>; 21 22@Controller("workspaces/:workspaceId/integrations") 23export class IntegrationsController { 24 constructor(@Inject(IntegrationsService) private readonly integrations: IntegrationsService) {} 25 26 @Get() 27 list(@Param("workspaceId") workspaceId: string, @Req() req: Request) { 28 return this.integrations.list(workspaceId, requireActor(req)); 29 } 30 31 @Post() 32 create( 33 @Param("workspaceId") workspaceId: string, 34 @Body(ZodValidate(CreateIntegrationDto)) body: CreateIntegrationInput, 35 @Req() req: Request 36 ) { 37 return this.integrations.create(workspaceId, requireActor(req), body, req); 38 } 39 40 @Patch(":id") 41 update( 42 @Param("workspaceId") workspaceId: string, 43 @Param("id") id: string, 44 @Body(ZodValidate(UpdateIntegrationDto)) body: UpdateIntegrationInput, 45 @Req() req: Request 46 ) { 47 return this.integrations.update(workspaceId, id, requireActor(req), body, req); 48 } 49 50 @Delete(":id") 51 remove( 52 @Param("workspaceId") workspaceId: string, 53 @Param("id") id: string, 54 @Req() req: Request 55 ) { 56 return this.integrations.remove(workspaceId, id, requireActor(req), req); 57 } 58} 59