Fix scheduled sync: add cron endpoint, systemd timer, bypass auth middleware
- Add /api/cron/sync route secured by x-cron-secret header - Bypass NextAuth middleware for /api/cron/* routes - Add CRON_SECRET to .env - Fix FK violation: pass undefined instead of 'system' for triggered_by - Systemd timer (ondeck-sync.timer) runs daily at 2 AM via curl
This commit is contained in:
parent
0abcadaa71
commit
35748219ab
2 changed files with 23 additions and 0 deletions
18
ondeck/src/app/api/cron/sync/route.ts
Normal file
18
ondeck/src/app/api/cron/sync/route.ts
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { NextRequest, NextResponse } from 'next/server'
|
||||||
|
import { runSync } from '@/lib/sync/sync-engine'
|
||||||
|
|
||||||
|
export async function POST(request: NextRequest) {
|
||||||
|
const secret = request.headers.get('x-cron-secret')
|
||||||
|
if (!secret || secret !== process.env.CRON_SECRET) {
|
||||||
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await runSync(undefined, true)
|
||||||
|
return NextResponse.json({ success: result.success, stats: result.stats, error: result.error })
|
||||||
|
} catch (error) {
|
||||||
|
const message = error instanceof Error ? error.message : String(error)
|
||||||
|
console.error('Cron sync error:', error)
|
||||||
|
return NextResponse.json({ error: message }, { status: 500 })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -42,6 +42,11 @@ export default withAuth(
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Allow cron endpoints (secured by x-cron-secret header instead)
|
||||||
|
if (path.startsWith('/api/cron/')) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// Require authentication for all other paths
|
// Require authentication for all other paths
|
||||||
return !!token
|
return !!token
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue