import { Inject, Body, Controller, Delete, Get, Param, Patch, Post, Query, Req } from "@nestjs/common"; import type { Request } from "express"; import { z } from "zod"; import { ApiKeysService } from "./api-keys.service.js"; import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js"; import { requireUser } from "../../common/types.js"; import { API_KEY_SCOPES } from "../../constants.js"; const CreateKeyDto = z.object({ name: z.string().min(1).max(100), scopes: z.array(z.enum(API_KEY_SCOPES)).min(1).max(3), rateLimit: z.number().int().min(1).max(100_000).optional(), expiresAt: z.string().datetime({ offset: true }).optional() }); type CreateKeyInput = z.infer; const UpdateKeyDto = z.object({ name: z.string().min(1).max(100).optional(), scopes: z.array(z.enum(API_KEY_SCOPES)).min(1).max(3).optional(), active: z.boolean().optional(), rateLimit: z.number().int().min(1).max(100_000).nullable().optional(), expiresAt: z.string().datetime({ offset: true }).nullable().optional() }); type UpdateKeyInput = z.infer; @Controller("workspaces/:workspaceId/api-keys") export class ApiKeysController { constructor(@Inject(ApiKeysService) private readonly keys: ApiKeysService) {} @Post() create( @Param("workspaceId") workspaceId: string, @Body(ZodValidate(CreateKeyDto)) body: CreateKeyInput, @Req() req: Request ) { return this.keys.create(workspaceId, requireUser(req), body, req); } @Get() list(@Param("workspaceId") workspaceId: string, @Req() req: Request) { return this.keys.list(workspaceId, requireUser(req)); } @Patch(":id") update( @Param("workspaceId") workspaceId: string, @Param("id") id: string, @Body(ZodValidate(UpdateKeyDto)) body: UpdateKeyInput, @Req() req: Request ) { return this.keys.update(workspaceId, id, requireUser(req), body, req); } @Delete(":id") revoke( @Param("workspaceId") workspaceId: string, @Param("id") id: string, @Req() req: Request ) { return this.keys.revoke(workspaceId, id, requireUser(req), req); } }