Skip to content

hir-94: vercel.json cron config + GET-driven cron handlers#20

Open
jaredzwick wants to merge 1 commit intopypesdev:mainfrom
jaredzwick:hir-94/cron-config
Open

hir-94: vercel.json cron config + GET-driven cron handlers#20
jaredzwick wants to merge 1 commit intopypesdev:mainfrom
jaredzwick:hir-94/cron-config

Conversation

@jaredzwick
Copy link
Copy Markdown
Collaborator

The /api/cron/* routes only had POST handlers, so nothing actually
fired them on a schedule. Queued emails just sat in the database;
expiring OAuth tokens silently rotted; silent-reply follow-ups never
flushed. The recommended-frequency comments in each handler were
aspirational — there was no scheduler.

  • vercel.json: cron config invoking /api/cron/process-queue and
    /api/cron/process-followups every 5 minutes, /refresh-tokens every
    30 minutes (matches the per-route docstrings).
  • All three cron routes now expose a single shared handle for both
    GET and POST. Vercel Cron only sends GET, so GET previously did
    nothing useful (returned a health-check JSON). POST callers
    (manual triggers, external runners) keep working with no behavior
    change.
  • Auth lifted into src/lib/cronAuth.ts — pure verifyCronAuth() that
    returns ok / 500 misconfig / 401. 10 vitest specs cover scheme
    case-sensitivity, prefix-attack rejection, missing/empty header,
    empty/missing secret, and the happy path.

No schema, no migrations. tsc clean. test:int 105 passed (only the
pre-existing PAYLOAD_SECRET api.int.spec.ts failure remains, same
as main).

Co-Authored-By: Paperclip noreply@paperclip.ing

🤖 Generated with Claude Code

The /api/cron/* routes only had POST handlers, so nothing actually
fired them on a schedule. Queued emails just sat in the database;
expiring OAuth tokens silently rotted; silent-reply follow-ups never
flushed. The recommended-frequency comments in each handler were
aspirational — there was no scheduler.

- vercel.json: cron config invoking /api/cron/process-queue and
  /api/cron/process-followups every 5 minutes, /refresh-tokens every
  30 minutes (matches the per-route docstrings).
- All three cron routes now expose a single shared `handle` for both
  GET and POST. Vercel Cron only sends GET, so GET previously did
  nothing useful (returned a health-check JSON). POST callers
  (manual triggers, external runners) keep working with no behavior
  change.
- Auth lifted into src/lib/cronAuth.ts — pure verifyCronAuth() that
  returns ok / 500 misconfig / 401. 10 vitest specs cover scheme
  case-sensitivity, prefix-attack rejection, missing/empty header,
  empty/missing secret, and the happy path.

No schema, no migrations. tsc clean. test:int 105 passed (only the
pre-existing PAYLOAD_SECRET api.int.spec.ts failure remains, same
as main).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant