diff --git a/shop/app/api/cron/sync-companies/route.ts b/shop/app/api/cron/sync-companies/route.ts new file mode 100644 index 0000000..c5685db --- /dev/null +++ b/shop/app/api/cron/sync-companies/route.ts @@ -0,0 +1,25 @@ +import { NextRequest, NextResponse } from 'next/server' +import { syncCompaniesFromLicServer } from '@/lib/actions/companies' + +export const dynamic = 'force-dynamic' + +export async function GET(req: NextRequest) { + // Check authorization header + const authHeader = req.headers.get('authorization') + const cronSecret = process.env.CRON_SECRET + + // Secure the cron endpoint in production + if (process.env.NODE_ENV === 'production' && cronSecret) { + if (authHeader !== `Bearer ${cronSecret}`) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) + } + } + + try { + const res = await syncCompaniesFromLicServer() + return NextResponse.json({ success: true, count: res.count }) + } catch (err: any) { + console.error('[cron] Sync failed:', err) + return NextResponse.json({ error: err.message || 'Sync failed' }, { status: 500 }) + } +} diff --git a/shop/lib/actions/companies.ts b/shop/lib/actions/companies.ts index c495518..959183f 100644 --- a/shop/lib/actions/companies.ts +++ b/shop/lib/actions/companies.ts @@ -1,7 +1,7 @@ 'use server' import { createAdminClient } from '@/lib/supabase/admin' import { revalidatePath, unstable_noStore as noStore } from 'next/cache' -import { getLicServerConfig } from './licserver-config' +import { getLicServerConfig, getLicServerConfigSystem } from './licserver-config' export async function getCompanies() { noStore() @@ -222,7 +222,7 @@ export async function adminDeleteEndCustomer(id: string) { export async function syncCompaniesFromLicServer() { const admin = createAdminClient() - const cfg = await getLicServerConfig() + const cfg = await getLicServerConfigSystem() if (!cfg.base_url || !cfg.api_key) { throw new Error('LicServer ist nicht konfiguriert.') diff --git a/shop/lib/actions/licserver-config.ts b/shop/lib/actions/licserver-config.ts index a5a09db..c5928f8 100644 --- a/shop/lib/actions/licserver-config.ts +++ b/shop/lib/actions/licserver-config.ts @@ -1,6 +1,7 @@ 'use server' import { createClient } from '@/lib/supabase/server' +import { createAdminClient } from '@/lib/supabase/admin' export interface LicServerConfig { base_url: string | null @@ -90,3 +91,22 @@ export async function testLicServerConnection(): Promise<{ ok: boolean; message: return { ok: false, message: `Nicht erreichbar: ${err.message}` } } } + +/** + * System version of getLicServerConfig that bypasses client auth check. + * Used internally by automated background jobs / cron routes. + */ +export async function getLicServerConfigSystem(): Promise { + const admin = createAdminClient() + + const { data } = await admin + .from('settings') + .select('licserver_base_url, licserver_api_key') + .eq('id', 'licserver') + .single() + + return { + base_url: data?.licserver_base_url || process.env.LICSERVER_BASE_URL || null, + api_key: data?.licserver_api_key || process.env.LICSERVER_API_KEY || null, + } +} diff --git a/shop/vercel.json b/shop/vercel.json new file mode 100644 index 0000000..d958c11 --- /dev/null +++ b/shop/vercel.json @@ -0,0 +1,8 @@ +{ + "crons": [ + { + "path": "/api/cron/sync-companies", + "schedule": "0 */6 * * *" + } + ] +}