dates
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user