← 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 });
  }
}