← back to Norma

app/api/pulse/fetch/route.ts

38 lines

/**
 * POST /api/pulse/fetch
 * Server-side proxy to the Pulse agent feed refresh endpoint.
 * Keeps credentials out of client-side code.
 */

import { NextRequest, NextResponse } from 'next/server';
import { requireRole } from '@/lib/require-role';

const PULSE_INTERNAL = process.env.PULSE_API_URL || 'http://127.0.0.1:9845';
const PULSE_USER = process.env.PULSE_API_USER || 'admin';
const PULSE_PASS = process.env.PULSE_API_PASS || process.env.AUTH_PASSWORD || '';

export async function POST(request: NextRequest) {
  const auth = requireRole(request, 'admin', 'staff', 'pulse');
  if (auth instanceof NextResponse) return auth;

  try {
    const res = await fetch(`${PULSE_INTERNAL}/api/pulse/fetch`, {
      method: 'POST',
      headers: {
        Authorization: 'Basic ' + Buffer.from(`${PULSE_USER}:${PULSE_PASS}`).toString('base64'),
      },
    });
    if (!res.ok) {
      return NextResponse.json(
        { error: `Pulse agent returned ${res.status}` },
        { status: res.status },
      );
    }
    const data = await res.json();
    return NextResponse.json(data);
  } catch (err) {
    console.error('[api/pulse/fetch] proxy error:', (err as Error).message);
    return NextResponse.json({ error: 'Pulse agent unavailable' }, { status: 502 });
  }
}