wulf-pulse/app/api/data/contacts/route.ts

108 lines
2.9 KiB
TypeScript
Raw Normal View History

/**
* Contacts Data API Endpoint
* GET /api/data/contacts - Query contacts from PostgreSQL
*/
import { NextRequest, NextResponse } from 'next/server';
import postgresClient from '@/lib/services/postgres-client';
export async function GET(request: NextRequest) {
try {
const searchParams = request.nextUrl.searchParams;
const limit = parseInt(searchParams.get('limit') || '100');
const offset = parseInt(searchParams.get('offset') || '0');
const companyId = searchParams.get('companyId');
const isActive = searchParams.get('isActive');
const sortBy = searchParams.get('sort');
const sortOrder = searchParams.get('order') || 'asc';
// Build conditions and parameters
const conditions: string[] = [];
const params: any[] = [];
if (companyId) {
conditions.push('company_id = $' + (params.length + 1));
params.push(parseInt(companyId));
}
if (isActive !== null) {
conditions.push('is_active = $' + (params.length + 1));
params.push(isActive === 'true');
}
const whereClause = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
// Build dynamic ORDER BY clause
let orderByClause = 'ORDER BY last_name ASC, first_name ASC';
if (sortBy) {
const validColumns = ['id', 'first_name', 'last_name', 'email_address', 'title', 'is_active', 'company_id'];
if (validColumns.includes(sortBy)) {
const direction = sortOrder.toLowerCase() === 'desc' ? 'DESC' : 'ASC';
orderByClause = `ORDER BY ${sortBy} ${direction}, last_name ASC, first_name ASC`;
}
}
// Query contacts
const query = `
SELECT
id,
first_name,
last_name,
email_address,
title,
phone,
extension,
alternate_phone,
mobile_phone,
fax,
address_line,
address_line1,
city,
state,
zip_code,
country,
is_active,
company_id,
created_at,
updated_at,
synced_at,
is_deleted,
deleted_at
FROM contacts
${whereClause}
${orderByClause}
LIMIT $${params.length + 1} OFFSET $${params.length + 2}
`;
params.push(limit, offset);
const result = await postgresClient.query(query, params);
const contacts = result.rows;
// Get total count
const countQuery = `
SELECT COUNT(*) as total
FROM contacts
${whereClause}
`;
const countResult = await postgresClient.query(countQuery, params.slice(0, -2));
const totalCount = parseInt(countResult.rows[0].total);
return NextResponse.json({
contacts,
pagination: {
limit,
offset,
total: totalCount,
hasMore: offset + contacts.length < totalCount,
},
});
} catch (error) {
console.error('Failed to fetch contacts:', error);
return NextResponse.json(
{ error: 'Failed to fetch contacts' },
{ status: 500 }
);
}
}