|
1 | | -import { Router, IRequest } from 'itty-router'; |
| 1 | +import { Router, IRequest } from "itty-router"; |
2 | 2 |
|
3 | 3 | // Constants |
4 | | -const API_ENDPOINT = 'https://api.mailchannels.net/tx/v1/send'; |
5 | | -const CONTENT_TYPE_JSON = 'application/json'; |
| 4 | +const API_ENDPOINT = "https://api.mailchannels.net/tx/v1/send"; |
| 5 | +const CONTENT_TYPE_JSON = "application/json"; |
6 | 6 |
|
7 | 7 | // Helper function to create a response |
8 | 8 | const createResponse = (body: any, status: number) => |
9 | | -new Response(JSON.stringify(body), { |
10 | | -headers: { 'content-type': CONTENT_TYPE_JSON }, |
11 | | -status, |
12 | | -}); |
| 9 | + new Response(JSON.stringify(body), { |
| 10 | + headers: { "content-type": CONTENT_TYPE_JSON }, |
| 11 | + status, |
| 12 | + }); |
13 | 13 |
|
14 | 14 | // Curry function for handling errors |
15 | 15 | const handleError = (status: number) => (message: string, request: IRequest) => |
16 | | -createResponse({ error: message }, status); |
| 16 | + createResponse({ error: message }, status); |
17 | 17 |
|
18 | 18 | // Middleware for authentication |
19 | 19 | const authMiddleware = (token: string | null) => (request: IRequest) => { |
20 | | -const requestToken = request.headers.get('Authorization'); |
| 20 | + const requestToken = request.headers.get("Authorization"); |
21 | 21 |
|
22 | | -const unauthorizedError = handleError(401)('Unauthorized', request); |
23 | | -const missingTokenError = handleError(401)('You must set the TOKEN environment variable.', request); |
| 22 | + const unauthorizedError = handleError(401)("Unauthorized", request); |
| 23 | + const missingTokenError = handleError(401)( |
| 24 | + "You must set the TOKEN environment variable.", |
| 25 | + request |
| 26 | + ); |
24 | 27 |
|
25 | | -return token |
26 | | -? requestToken === token |
27 | | -? null |
28 | | -: unauthorizedError |
29 | | -: missingTokenError; |
| 28 | + return token |
| 29 | + ? requestToken === token |
| 30 | + ? null |
| 31 | + : unauthorizedError |
| 32 | + : missingTokenError; |
30 | 33 | }; |
31 | 34 |
|
32 | 35 | // Service function to send email |
33 | 36 | const sendEmail = async (email: any) => { |
34 | | -const resp = await fetch(API_ENDPOINT, { |
35 | | -method: 'POST', |
36 | | -headers: { |
37 | | -'content-type': CONTENT_TYPE_JSON, |
38 | | -}, |
39 | | -body: JSON.stringify(email), |
40 | | -}); |
41 | | - |
42 | | -if (!resp.ok) { |
43 | | -const errorMessage = `Error sending email: ${resp.status} ${resp.statusText}`; |
44 | | -throw new Error(`${errorMessage}\n${await resp.text()}`); |
45 | | -} |
| 37 | + const resp = await fetch(API_ENDPOINT, { |
| 38 | + method: "POST", |
| 39 | + headers: { |
| 40 | + "content-type": CONTENT_TYPE_JSON, |
| 41 | + }, |
| 42 | + body: JSON.stringify(email), |
| 43 | + }); |
| 44 | + |
| 45 | + if (!resp.ok) { |
| 46 | + const errorMessage = `Error sending email: ${resp.status} ${resp.statusText}`; |
| 47 | + throw new Error(`${errorMessage}\n${await resp.text()}`); |
| 48 | + } |
| 49 | +}; |
| 50 | + |
| 51 | +// Log batch of emails |
| 52 | +const logBatch = async (emails: any[], env: Env) => { |
| 53 | + if (emails.length > 0) { |
| 54 | + await Promise.all( |
| 55 | + emails.map((email) => env.log.put(`${Date.now()}`, JSON.stringify(email))) |
| 56 | + ); |
| 57 | + } |
46 | 58 | }; |
47 | 59 |
|
48 | 60 | // Route handler for sending email |
49 | 61 | const sendEmailHandler = async (request: IRequest, env: Env) => { |
50 | | -try { |
51 | | -const authError = authMiddleware(env.TOKEN)(request); |
52 | | -if (authError) return authError; |
53 | | - |
54 | | -const email = await request.json(); |
55 | | -await sendEmail(email); |
56 | | - |
57 | | -return createResponse({ |
58 | | -status: 'SUCCESS', |
59 | | -statusCode: 1000, |
60 | | -message: 'NA', |
61 | | -}, 200); |
62 | | -} catch (error) { |
63 | | -console.error(`Error processing request: ${error}`); |
64 | | -return handleError(500)('Internal Server Error', request); |
65 | | -} |
| 62 | + try { |
| 63 | + const authError = authMiddleware(env.TOKEN)(request); |
| 64 | + if (authError) return authError; |
| 65 | + |
| 66 | + const email = await request.json(); |
| 67 | + await sendEmail(email); |
| 68 | + |
| 69 | + logBatch([email], env); |
| 70 | + |
| 71 | + return createResponse( |
| 72 | + { |
| 73 | + status: "SUCCESS", |
| 74 | + statusCode: 1000, |
| 75 | + message: "NA", |
| 76 | + }, |
| 77 | + 200 |
| 78 | + ); |
| 79 | + } catch (error) { |
| 80 | + console.error(`Error processing request: ${error}`); |
| 81 | + return handleError(500)("Internal Server Error", request); |
| 82 | + } |
66 | 83 | }; |
67 | 84 |
|
68 | 85 | // Create router |
69 | 86 | const router = Router(); |
70 | 87 |
|
71 | 88 | // Define routes |
72 | | -router.post('/api/email', sendEmailHandler); |
73 | | -router.all('*', (request: IRequest) => handleError(404)('Not Found', request)); |
| 89 | +router.post("/api/email", sendEmailHandler); |
| 90 | +router.all("*", (request: IRequest) => handleError(404)("Not Found", request)); |
74 | 91 |
|
75 | 92 | // Export the router handler |
76 | 93 | export default { |
77 | | -fetch: router.handle, |
| 94 | + fetch: router.handle, |
78 | 95 | }; |
0 commit comments