← back to Trademarks Copyright
src/app/api/brands/route.ts
58 lines
import { NextRequest, NextResponse } from "next/server";
import { query } from "@/lib/db";
export async function GET(req: NextRequest) {
const sp = req.nextUrl.searchParams;
const status = sp.get("status") || "";
const category = sp.get("category") || "";
const minYears = Number(sp.get("minYears") ?? 0);
const maxYearsRaw = sp.get("maxYears");
const maxYears = maxYearsRaw !== null && maxYearsRaw !== "" ? Number(maxYearsRaw) : null;
const q = sp.get("q")?.trim() || "";
const opportunity = sp.get("opportunity") || "";
const where: string[] = [];
const params: unknown[] = [];
if (status) { params.push(status); where.push(`status = $${params.length}`); }
if (category) { params.push(category); where.push(`category = $${params.length}`); }
if (opportunity) { params.push(opportunity); where.push(`opportunity_label = $${params.length}`); }
if (Number.isFinite(minYears) && minYears > 0) {
params.push(minYears);
where.push(`(years_in_business IS NULL OR years_in_business >= $${params.length})`);
}
if (maxYears !== null && Number.isFinite(maxYears)) {
params.push(maxYears);
where.push(`(years_in_business IS NULL OR years_in_business <= $${params.length})`);
}
if (q) {
params.push(`%${q}%`);
where.push(`(brand_name ILIKE $${params.length} OR domain ILIKE $${params.length} OR meta_description ILIKE $${params.length})`);
}
const { rows } = await query(
`SELECT id, domain, brand_name, category, established_year, years_in_business,
whois_created_date, meta_description,
uspto_checked_at, uspto_live_marks, has_federal_registration, uspto_search_url,
suggested_by, status, error_message, notes, last_checked_at, created_at,
http_status, domain_expires_on, domain_lifecycle,
last_activity_year, last_activity_signal, years_since_activity,
abandonment_status, opportunity_label,
CASE WHEN domain_expires_on IS NOT NULL
THEN (domain_expires_on - CURRENT_DATE) ELSE NULL END AS days_to_expiry
FROM brand_candidates
${where.length ? `WHERE ${where.join(" AND ")}` : ""}
ORDER BY
CASE status
WHEN 'verified_unregistered' THEN 0
WHEN 'registered' THEN 1
WHEN 'pending' THEN 2
WHEN 'parked' THEN 3
ELSE 4
END,
years_in_business DESC NULLS LAST,
brand_name ASC`,
params
);
return NextResponse.json({ items: rows });
}