From 16f313a40f68fab59e09040af75537112730e578 Mon Sep 17 00:00:00 2001 From: Max Wofford Date: Wed, 22 Jan 2025 12:48:31 -0500 Subject: [PATCH] Add daily shirt generation job trigger --- src/app/api/cron/create-background-job.ts | 12 ------- src/app/api/cron/every-day/route.ts | 40 ++++++++++++++++++++++- 2 files changed, 39 insertions(+), 13 deletions(-) delete mode 100644 src/app/api/cron/create-background-job.ts diff --git a/src/app/api/cron/create-background-job.ts b/src/app/api/cron/create-background-job.ts deleted file mode 100644 index 5c890174..00000000 --- a/src/app/api/cron/create-background-job.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { sql } from '@vercel/postgres' - -export default async function createBackgroundJob( - type: 'run_lottery' | 'create_person' | 'invite', - args: {}, - status: 'pending' | 'completed' | 'failed' = 'pending', -) { - console.log(JSON.stringify(args)) - return await sql`INSERT INTO background_job (type, args, status) VALUES (${type}, ${JSON.stringify(args)}, ${status})` -} - -export const fetchCache = 'force-no-store' diff --git a/src/app/api/cron/every-day/route.ts b/src/app/api/cron/every-day/route.ts index 40c4bec6..6845cf75 100644 --- a/src/app/api/cron/every-day/route.ts +++ b/src/app/api/cron/every-day/route.ts @@ -1,10 +1,48 @@ export const dynamic = 'force-dynamic' export const fetchCache = 'force-no-store' -import createBackgroundJob from '../create-background-job' +import 'server-only' +import Airtable from 'airtable' + +async function triggerShirtJob() { + Airtable.configure({ + apiKey: process.env.AIRTABLE_API_KEY, + endpointUrl: process.env.AIRTABLE_ENDPOINT_URL, + }) + + const base = Airtable.base(process.env.BASE_ID) + console.log('Getting people to regenerate') + const peopleToRegenerate = await base('people') + .select({ + filterByFormula: ` + AND( + NOT({action_generate_shirt_design} = TRUE()), + NOT({ysws_submission} = BLANK()) + )`, + fields: [], + }) + .all() + + const peopleIds = peopleToRegenerate.map((person) => person.id) + console.log('People to regenerate:', peopleIds.length) + const chunkSize = 10 + for (let i = 0; i < peopleIds.length; i += chunkSize) { + console.log(`Processing chunk ${i} to ${i + chunkSize}`) + const chunk = peopleIds.slice(i, i + chunkSize) + await base('people').update( + chunk.map((id) => ({ + id, + fields: { + action_generate_shirt_design: true, + }, + })), + ) + } +} async function processDailyJobs() { console.log('Processing daily jobs') + await triggerShirtJob() } export async function GET() {