This commit is contained in:
2026-02-04 12:51:41 +00:00
parent 4fdbfb0fb3
commit f1e13f87f6
19 changed files with 722 additions and 67 deletions

View File

@@ -1,4 +1,6 @@
import type { GeneratedQuery, Opportunity, EnhancedProductAnalysis } from './types'
import { logServer } from "@/lib/server-logger";
import { appendSerperAgeModifiers, SerperAgeFilter } from "@/lib/serper-date-filters";
interface SearchResult {
title: string
@@ -10,6 +12,7 @@ interface SearchResult {
export async function executeSearches(
queries: GeneratedQuery[],
filters?: SerperAgeFilter,
onProgress?: (progress: { current: number; total: number; platform: string }) => void
): Promise<SearchResult[]> {
const results: SearchResult[] = []
@@ -24,11 +27,17 @@ export async function executeSearches(
let completed = 0
for (const [platform, platformQueries] of byPlatform) {
console.log(`Searching ${platform}: ${platformQueries.length} queries`)
await logServer({
level: "info",
message: "Searching platform",
labels: ["search-executor", "platform", "start"],
payload: { platform, queries: platformQueries.length },
source: "lib/search-executor",
});
for (const query of platformQueries) {
try {
const searchResults = await executeSingleSearch(query)
const searchResults = await executeSingleSearch(query, filters)
results.push(...searchResults)
completed++
@@ -37,7 +46,13 @@ export async function executeSearches(
// Rate limiting - 1 second between requests
await delay(1000)
} catch (err) {
console.error(`Search failed for ${platform}:`, err)
await logServer({
level: "error",
message: "Search failed for platform",
labels: ["search-executor", "platform", "error"],
payload: { platform, error: String(err) },
source: "lib/search-executor",
});
}
}
}
@@ -45,15 +60,15 @@ export async function executeSearches(
return results
}
async function executeSingleSearch(query: GeneratedQuery): Promise<SearchResult[]> {
async function executeSingleSearch(query: GeneratedQuery, filters?: SerperAgeFilter): Promise<SearchResult[]> {
if (!process.env.SERPER_API_KEY) {
throw new Error('SERPER_API_KEY is not configured.')
}
return searchWithSerper(query)
return searchWithSerper(query, filters)
}
async function searchWithSerper(query: GeneratedQuery): Promise<SearchResult[]> {
async function searchWithSerper(query: GeneratedQuery, filters?: SerperAgeFilter): Promise<SearchResult[]> {
const response = await fetch('https://google.serper.dev/search', {
method: 'POST',
headers: {
@@ -61,7 +76,7 @@ async function searchWithSerper(query: GeneratedQuery): Promise<SearchResult[]>
'Content-Type': 'application/json'
},
body: JSON.stringify({
q: query.query,
q: appendSerperAgeModifiers(query.query, filters),
num: 5,
gl: 'us',
hl: 'en'
@@ -73,6 +88,13 @@ async function searchWithSerper(query: GeneratedQuery): Promise<SearchResult[]>
}
const data = await response.json()
await logServer({
level: "info",
message: "Serper response received",
labels: ["search-executor", "serper", "response"],
payload: { query: query.query, platform: query.platform, data },
source: "lib/search-executor",
});
return (data.organic || []).map((r: any) => ({
title: r.title,