1import { Inject, Body, Controller, Delete, Get, Param, Patch, Post, Query, Req } from "@nestjs/common"; 2import type { Request } from "express"; 3import { z } from "zod"; 4import { ApiKeysService } from "./api-keys.service.js"; 5import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js"; 6import { requireUser } from "../../common/types.js"; 7import { API_KEY_SCOPES } from "../../constants.js"; 8 9const CreateKeyDto = z.object({ 10 name: z.string().min(1).max(100), 11 scopes: z.array(z.enum(API_KEY_SCOPES)).min(1).max(3), 12 rateLimit: z.number().int().min(1).max(100_000).optional(), 13 expiresAt: z.string().datetime({ offset: true }).optional() 14}); 15type CreateKeyInput = z.infer<typeof CreateKeyDto>; 16 17const UpdateKeyDto = z.object({ 18 name: z.string().min(1).max(100).optional(), 19 scopes: z.array(z.enum(API_KEY_SCOPES)).min(1).max(3).optional(), 20 active: z.boolean().optional(), 21 rateLimit: z.number().int().min(1).max(100_000).nullable().optional(), 22 expiresAt: z.string().datetime({ offset: true }).nullable().optional() 23}); 24type UpdateKeyInput = z.infer<typeof UpdateKeyDto>; 25 26@Controller("workspaces/:workspaceId/api-keys") 27export class ApiKeysController { 28 constructor(@Inject(ApiKeysService) private readonly keys: ApiKeysService) {} 29 30 @Post() 31 create( 32 @Param("workspaceId") workspaceId: string, 33 @Body(ZodValidate(CreateKeyDto)) body: CreateKeyInput, 34 @Req() req: Request 35 ) { 36 return this.keys.create(workspaceId, requireUser(req), body, req); 37 } 38 39 @Get() 40 list(@Param("workspaceId") workspaceId: string, @Req() req: Request) { 41 return this.keys.list(workspaceId, requireUser(req)); 42 } 43 44 @Patch(":id") 45 update( 46 @Param("workspaceId") workspaceId: string, 47 @Param("id") id: string, 48 @Body(ZodValidate(UpdateKeyDto)) body: UpdateKeyInput, 49 @Req() req: Request 50 ) { 51 return this.keys.update(workspaceId, id, requireUser(req), body, req); 52 } 53 54 @Delete(":id") 55 revoke( 56 @Param("workspaceId") workspaceId: string, 57 @Param("id") id: string, 58 @Req() req: Request 59 ) { 60 return this.keys.revoke(workspaceId, id, requireUser(req), req); 61 } 62} 63