From 2ecefbfd64fc47b8540d94f94e3ad3370c5f7b47 Mon Sep 17 00:00:00 2001 From: Francis Turmel Date: Thu, 12 Nov 2026 23:10:10 -0500 Subject: [PATCH] update Netlify functions to ESM and their "modern" API --- ...ackground.js => submission-background.mjs} | 21 +++++---- ...submission-sync.js => submission-sync.mjs} | 43 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) rename netlify/functions/{submission-background.js => submission-background.mjs} (91%) rename netlify/functions/{submission-sync.js => submission-sync.mjs} (76%) diff --git a/netlify/functions/submission-background.js b/netlify/functions/submission-background.mjs similarity index 91% rename from netlify/functions/submission-background.js rename to netlify/functions/submission-background.mjs index 642cb3c56..52b9d72d5 100644 --- a/netlify/functions/submission-background.js +++ b/netlify/functions/submission-background.mjs @@ -1,9 +1,8 @@ -const { Octokit } = require('@octokit/core'); -const slugify = require('slugify'); -const sharp = require('sharp'); -const crypto = require('crypto'); +import { Octokit } from '@octokit/core'; +import crypto from 'node:crypto'; +import slugify from 'slugify'; -// event.body expected to be: +// Request JSON body expected to be: // { // title: "Something", // imageBlobSha: "sha", @@ -19,8 +18,8 @@ const crypto = require('crypto'); // } // X-Signature: sha256=... -exports.handler = async function (event) { - console.log('Background handler called with: ', event.body); +export default async (request) => { + console.log('Background handler called'); if (!process.env.GITHUB_TOKEN) { console.error('GitHub Token not loaded'); @@ -28,10 +27,10 @@ exports.handler = async function (event) { } // parse payload and validate signature - const postInfo = JSON.parse(event.body); + const postInfo = await request.json(); const hmac = crypto.createHmac('sha256', process.env.GITHUB_TOKEN); const signature = hmac.update(JSON.stringify(postInfo)).digest('hex'); - if (signature !== event.headers['x-signature']) { + if (signature !== request.headers.get('x-signature')) { console.error('Invalid signature'); return; } @@ -182,3 +181,7 @@ exports.handler = async function (event) { console.log('Done!'); }; + +export const config = { + background: true +}; diff --git a/netlify/functions/submission-sync.js b/netlify/functions/submission-sync.mjs similarity index 76% rename from netlify/functions/submission-sync.js rename to netlify/functions/submission-sync.mjs index 382f5f4e0..fc5860eab 100644 --- a/netlify/functions/submission-sync.js +++ b/netlify/functions/submission-sync.mjs @@ -1,8 +1,8 @@ -const { Octokit } = require('@octokit/core'); -const sharp = require('sharp'); -const crypto = require('crypto'); +import { Octokit } from '@octokit/core'; +import sharp from 'sharp'; +import crypto from 'node:crypto'; -// event.body expected to be: +// Request JSON body expected to be: // { // title: "Something", // image: "base64string=", @@ -38,28 +38,22 @@ async function validateImage(imageBase64) { } } -exports.handler = async function (event, context) { - console.log('Sync handler called with', event.body); +export default async (request) => { + console.log('Sync handler called'); if (!process.env.GITHUB_TOKEN) { console.error('GitHub Token not loaded'); - return { - statusCode: 500, - body: JSON.stringify({}) - }; + return Response.json({}, { status: 500 }); } // parse payload - const postInfo = JSON.parse(event.body); + const postInfo = await request.json(); // validate image and extract its extension const { error, imageExtension } = await validateImage(postInfo.image); if (error) { console.error(error); - return { - statusCode: 400, - body: JSON.stringify({ error }) - }; + return Response.json({ error }, { status: 400 }); } // Shared properties @@ -99,8 +93,8 @@ exports.handler = async function (event, context) { imageExtension }; const signature = hmac.update(JSON.stringify(payload)).digest('hex'); - await fetch( - event.rawUrl.replace('submission-sync', 'submission-background'), + const backgroundResponse = await fetch( + new URL('/.netlify/functions/submission-background', request.url), { method: 'POST', body: JSON.stringify(payload), @@ -111,10 +105,13 @@ exports.handler = async function (event, context) { } ); - return { - statusCode: 200, - body: JSON.stringify({ - status: 'success' - }) - }; + if (!backgroundResponse.ok) { + console.error('Background invocation failed:', backgroundResponse.status); + return Response.json( + { error: 'Could not start submission processing' }, + { status: 502 } + ); + } + + return Response.json({ status: 'success' }); };