diff --git a/src/app/(campaign)/campanha/(app)/home-search/route.ts b/src/app/(campaign)/campanha/(app)/home-search/route.ts index 64dd5ee8..77977a3b 100644 --- a/src/app/(campaign)/campanha/(app)/home-search/route.ts +++ b/src/app/(campaign)/campanha/(app)/home-search/route.ts @@ -23,28 +23,32 @@ import { searchStaffMunicipalityHits } from '@/utilities/homeSearch/searchStaffM export const dynamic = 'force-dynamic' +type HomeSearchRouteSuccessBody = + | HomeSearchSuccessResponse + | WizardMunicipalitySearchSuccessResponse + export const POST = campaignJsonMutationRoute( { bodySchema: homeSearchBodySchema, safeMessages: [HOME_SEARCH_STAFF_ONLY_MESSAGE], genericMessage: HOME_SEARCH_GENERIC_ERROR_MESSAGE, }, - async (body) => { + async (body): Promise> => { const { payload, actor } = await getCampaignActionContext() if (body.mode === 'suggest') { const result = await loadHomeSearchSuggestions(payload, actor) - return NextResponse.json(result) + return NextResponse.json(result) } if (body.mode === 'wizard-municipality-suggest') { const result = await loadWizardMunicipalitySuggestions(payload, actor) - return NextResponse.json(result) + return NextResponse.json(result) } if (body.mode === 'wizard-municipality') { const municipalities = await searchStaffMunicipalityHits(payload, actor, body.query) - return NextResponse.json({ + return NextResponse.json({ status: 'success', municipalities, }) @@ -59,7 +63,7 @@ export const POST = campaignJsonMutationRoute( searchHomeStateDeputies(payload, actor, body.query), searchHomeDemands(payload, actor, body.query), ]) - return NextResponse.json({ + return NextResponse.json({ ...municipalityResult, advisors, leaderships, diff --git a/src/lib/wizardMunicipalitySuggest.ts b/src/lib/wizardMunicipalitySuggest.ts index 87a2354f..7027314e 100644 --- a/src/lib/wizardMunicipalitySuggest.ts +++ b/src/lib/wizardMunicipalitySuggest.ts @@ -76,19 +76,17 @@ const compareVotes2022 = ( return 0 } -/** Older signal first; null = coldest. */ +/** Older signal first; null = coldest; equal timestamps defer to later tie-breakers. */ const compareSignalOldestFirst = ( left: WizardMunicipalitySuggestInput, right: WizardMunicipalitySuggestInput, ): number => { - if (left.lastSignalAt === null && right.lastSignalAt === null) { - return municipalityNameCompare(left, right) - } + if (left.lastSignalAt === null && right.lastSignalAt === null) return 0 if (left.lastSignalAt === null) return -1 if (right.lastSignalAt === null) return 1 const byTime = left.lastSignalAt.localeCompare(right.lastSignalAt) if (byTime !== 0) return byTime - return municipalityNameCompare(left, right) + return 0 } const compareWizardMunicipalitySuggest = ( diff --git a/src/utilities/homeSearch/loadWizardMunicipalitySuggestions.ts b/src/utilities/homeSearch/loadWizardMunicipalitySuggestions.ts index 026e8323..14397d17 100644 --- a/src/utilities/homeSearch/loadWizardMunicipalitySuggestions.ts +++ b/src/utilities/homeSearch/loadWizardMunicipalitySuggestions.ts @@ -59,10 +59,13 @@ export const loadWizardMunicipalitySuggestions = async ( }) const ranked = rankWizardMunicipalitySuggestions(inputs) + const docBySlug = new Map(municipalities.map((doc) => [doc.slug, doc])) return { status: 'success', resultKind: 'wizard-suggest', - municipalities: ranked.map(toHomeSearchMunicipalityHit), + municipalities: ranked.map((input) => + toHomeSearchMunicipalityHit(docBySlug.get(input.slug)!), + ), } }