← back to Norma
app/api/settings/pulse-config/route.ts
69 lines
import { NextRequest, NextResponse } from 'next/server';
import { query } from '@/lib/db';
import { requireRole } from '@/lib/require-role';
const KEY_PREFIX = 'pulse_config.';
/**
* GET /api/settings/pulse-config
* Return all pulse_config.* keys from app_settings.
*/
export async function GET(request: NextRequest) {
const result = requireRole(request, 'admin');
if (result instanceof NextResponse) return result;
try {
const { rows } = await query(
`SELECT key, value FROM app_settings WHERE key LIKE $1`,
[`${KEY_PREFIX}%`]
);
// Build a flat config object: { "petitions": true, "featured_count": 5, ... }
const config: Record<string, unknown> = {};
for (const row of rows) {
const shortKey = row.key.replace(KEY_PREFIX, '');
config[shortKey] = row.value;
}
return NextResponse.json({ config });
} catch (err) {
console.error('[pulse-config] GET error:', (err as Error).message);
return NextResponse.json({ error: 'Failed to fetch pulse config' }, { status: 500 });
}
}
/**
* PUT /api/settings/pulse-config
* Upsert multiple pulse_config.* keys.
* Body: { config: { petitions: true, featured_count: 5, ... } }
*/
export async function PUT(request: NextRequest) {
const result = requireRole(request, 'admin');
if (result instanceof NextResponse) return result;
try {
const body = await request.json();
const { config } = body;
if (!config || typeof config !== 'object') {
return NextResponse.json({ error: 'config object is required' }, { status: 400 });
}
// Upsert each key
for (const [shortKey, value] of Object.entries(config)) {
const fullKey = `${KEY_PREFIX}${shortKey}`;
await query(
`INSERT INTO app_settings (key, value, updated_at)
VALUES ($1, $2, now())
ON CONFLICT (key) DO UPDATE SET value = $2, updated_at = now()`,
[fullKey, JSON.stringify(value)]
);
}
return NextResponse.json({ success: true });
} catch (err) {
console.error('[pulse-config] PUT error:', (err as Error).message);
return NextResponse.json({ error: 'Failed to save pulse config' }, { status: 500 });
}
}