1
- import { sendFormViaEmail } from "./comms/email.js"
2
- import { ulidFactory } from "./ulid.ts"
1
+ import { sendFormViaEmail } from "./comms/email.js" ;
2
+ import { sendFormViaPush } from "./comms/push.js" ;
3
+ import { verifySecureToken } from "./secure-token.js" ;
4
+ import { ulidFactory } from "./ulid.ts" ;
3
5
4
6
const ulid = ulidFactory ( { monotonic : true } ) ;
5
7
@@ -8,13 +10,25 @@ async function handleForm({
8
10
formId,
9
11
honeypotField,
10
12
} ) {
13
+ const headers = Object . fromEntries ( context . request . headers . entries ( ) ) ;
14
+ const usingJson = ( headers [ "content-type" ] === "application/json" ) ;
11
15
const submissionId = ulid ( ) ;
12
16
const submittedTs = new Date ( ) . toISOString ( ) ;
13
- const fields = Object . fromEntries ( ( await context . request . formData ( ) ) . entries ( ) ) ;
17
+ const fields = usingJson ?
18
+ await context . request . json ( ) :
19
+ Object . fromEntries ( ( await context . request . formData ( ) ) . entries ( ) ) ;
14
20
const replyEmail = fields . email ;
15
21
const spamReasons = [ ] ;
16
22
const cf = context . request . cf ;
17
- const headers = Object . fromEntries ( context . request . headers . entries ( ) ) ;
23
+
24
+ if ( URGENT_TOKEN_FIELD_NAME in fields ) {
25
+ if ( await verifySecureToken ( {
26
+ token : fields [ URGENT_TOKEN_FIELD_NAME ] ,
27
+ secret : context . env . TOKEN_GENERATOR_SECRET ,
28
+ } ) === false ) {
29
+ spamReasons . push ( "BAD_TOKEN" ) ;
30
+ }
31
+ }
18
32
19
33
if ( typeof honeypotField === "string" ) {
20
34
if ( fields [ honeypotField ] !== "" ) {
@@ -37,15 +51,24 @@ async function handleForm({
37
51
. run ( ) ;
38
52
39
53
if ( spamReasons . length === 0 ) {
40
- return await sendFormViaEmail ( {
54
+ const emailResult = await sendFormViaEmail ( {
41
55
env : context . env ,
42
56
subject : `New ${ formId } form submission from beh.uk` ,
43
57
form : fields ,
44
- } )
58
+ } ) ;
59
+ if ( URGENT_TOKEN_FIELD_NAME in fields ) {
60
+ return await sendFormViaPush ( {
61
+ env : context . env ,
62
+ form : fields ,
63
+ } ) ;
64
+ }
65
+ return emailResult ;
45
66
} else {
46
67
// submission is belived to be spam, return OK and don't do anything else
47
68
return true ;
48
69
}
49
70
}
50
71
72
+ const URGENT_TOKEN_FIELD_NAME = "token" ;
73
+
51
74
export { handleForm }
0 commit comments