1
12import {
13 Body,
14 Controller,
15 Get,
16 HttpCode,
17 HttpStatus,
18 Inject,
19 Param,
20 Post,
21 Req,
22 UseGuards
23} from "@nestjs/common";
24import type { Request } from "express";
25import { z } from "zod";
26import { PublicFormsService } from "./public-forms.service.js";
27import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js";
28import { loadEnv } from "../../config/env.js";
29import { verifyToken, TokenError } from "../../lib/jwt.js";
30import type { AuthContext } from "../../common/types.js";
31import { OptionalAuthGuard } from "./optional-auth.guard.js";
32
33
34const SubmitBody = z
35 .object({
36 answers: z.record(z.unknown()).default({}),
37 recaptchaToken: z.string().max(4_096).optional(),
38 website: z.string().max(500).optional(),
39 hp: z.string().max(500).optional()
40 })
41 .strict();
42type SubmitInput = z.infer<typeof SubmitBody>;
43
44@Controller()
45export class PublicFormsController {
46 constructor(@Inject(PublicFormsService) private readonly publicForms: PublicFormsService) {}
47
48 @Get("public/forms/:slug")
49 get(@Param("slug") slug: string) {
50 return this.publicForms.getPublic(slug);
51 }
52
53
54
55 @UseGuards(OptionalAuthGuard)
56 @HttpCode(HttpStatus.CREATED)
57 @Post("public/forms/:slug/submit")
58 submit(
59 @Param("slug") slug: string,
60 @Body(ZodValidate(SubmitBody)) body: SubmitInput,
61 @Req() req: Request
62 ) {
63 return this.publicForms.submitPublic(slug, body, req);
64 }
65}
66
67
68