@@ -41,12 +41,14 @@ cd surveys-backend
41
41
npm install
42
42
```
43
43
44
+ You can now delete all files in the services/ folder, we'll create new services in this guide.
45
+
44
46
## Add Runtime Type Safety
45
47
46
48
This project uses:
47
49
48
50
- [ Zod] ( https://zod.dev/ ) to define and validate the structure of form submissions.
49
- - [ pdfkit] ( https://pdfkit.org/ ) to generate pdfs from html templates.
51
+ - [ pdfkit] ( https://pdfkit.org/ ) to generate PDFs from html templates.
50
52
51
53
### Install Zod
52
54
@@ -56,7 +58,7 @@ npm install zod pdfkit
56
58
57
59
### Define a schema for form submissions
58
60
59
- Create a file at ` src/forms/ form/schema.ts` :
61
+ Create a file at ` form/schema.ts ` :
60
62
61
63
``` ts title:src/forms/form/schema.ts
62
64
import { z } from ' zod'
@@ -76,7 +78,7 @@ This schema ensures that any incoming submission contains a valid name, a 1–5
76
78
77
79
Create and configure the cloud resources your backend will use, such as storage buckets, queues, and key-value stores.
78
80
79
- ` ` ` ts title : src / resources /resources .ts
81
+ ` ` ` ts title : resources /resources .ts
80
82
import { bucket , kv , topic } from ' @nitric/sdk'
81
83
82
84
export const output = bucket (' receipts' ).allow (' read' , ' write' )
@@ -89,10 +91,10 @@ export const receipts = topic('form-submitted')
89
91
90
92
Create an API route that validates and stores form submissions, then triggers further processing.
91
93
92
- ``` ts title:src/ services/forms.ts
94
+ ``` ts title:services/forms.ts
93
95
import { api } from ' @nitric/sdk'
94
96
import { submissions , submitted } from ' ../resources/resources'
95
- import { SubmissionSchema } from ' .../forms /form/schema'
97
+ import { SubmissionSchema } from ' ../form/schema'
96
98
97
99
const formApi = api (' forms' )
98
100
@@ -118,9 +120,9 @@ formApi.post('/forms/:formId', async (ctx) => {
118
120
119
121
Listen for submitted events and generate a formatted PDF receipt from the stored data.
120
122
121
- ``` ts title:src/ services/pdfs.ts
123
+ ``` ts title:services/pdfs.ts
122
124
import { receipts , submissions , output } from ' ../resources/resources'
123
- import { buildReceipt } from ' ../forms/ form/receipt'
125
+ import { buildReceipt } from ' ../form/receipt'
124
126
125
127
receipts .subscribe (async (ctx ) => {
126
128
const { id } = ctx .req .json ()
@@ -144,7 +146,7 @@ receipts.subscribe(async (ctx) => {
144
146
145
147
### Build the PDF Receipt
146
148
147
- ``` ts title:src/forms/ form/receipt.ts
149
+ ``` ts title:form/receipt.ts
148
150
import PDFDocument from ' pdfkit'
149
151
import { Submission } from ' ./schema'
150
152
@@ -198,7 +200,7 @@ This PDF output is fairly plain, you can enhance it further using layout templat
198
200
199
201
Simulate or perform delivery of the receipt (e.g. via email or other downstream systems).
200
202
201
- ``` ts title:src/ services/deliver.ts
203
+ ``` ts title:services/deliver.ts
202
204
import { receipts } from ' ../resources/resources'
203
205
204
206
receipts .subscribe (async (ctx ) => {
@@ -213,7 +215,7 @@ receipts.subscribe(async (ctx) => {
213
215
214
216
Create an endpoint that returns a download URL for the generated receipt file.
215
217
216
- ``` ts title:src/apis /receipts.ts
218
+ ``` ts title:services /receipts.ts
217
219
import { api } from ' @nitric/sdk'
218
220
import { output } from ' ../resources/resources'
219
221
0 commit comments