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