fix: add pagination cursor and totalCount to cyber threats response#237
fix: add pagination cursor and totalCount to cyber threats response#237haosenwang1018 wants to merge 3 commits intokoala73:mainfrom
Conversation
The previous 0.5° rounding (~50km radius) merged distinct events in dense urban areas (e.g. Manhattan vs Brooklyn protests on the same day). Reducing to 0.1° (~10km) preserves neighborhood-level granularity while still deduplicating true duplicates. Fixes koala73#204 Signed-off-by: haosenwang1018 <haosenwang1018@users.noreply.github.com>
Replace Math.random() with a djb2 hash seeded by the threat ID, so the same threat always appears at the same coordinates. This prevents 'jumping' markers on the map when the same data is re-fetched. Fixes koala73#203 Signed-off-by: haosenwang1018 <haosenwang1018@users.noreply.github.com>
The handler previously returned pagination: undefined, making it impossible for clients to paginate. Now parses cursor as an offset, returns totalCount of filtered results, and nextCursor for the next page (empty string when no more results). Fixes koala73#202 Signed-off-by: haosenwang1018 <haosenwang1018@users.noreply.github.com>
|
@haosenwang1018 is attempting to deploy a commit to the Elie Team on Vercel. A member of the Team first needs to authorize it. |
|
Thanks again @haosenwang1018 much appreciated! Pls see below, the core pagination is on point - but it introduces a few other issues that you should handle PR Review: fix: add pagination cursor and totalCount to cyber threats responsePR #237 by haosenwang1018 | 3 commits | +30/-11 across 3 files SummaryThe PR addresses the
Issues Found1. Removing Redis caching is a significant performance regression (High)The PR removes the entire Redis caching layer ( The caching was likely removed because the old cache key didn't account for pagination offsets. The correct fix is to cache the full sorted/filtered result set (keyed by filters only, pre-pagination) and apply const cacheKey = `${REDIS_CACHE_KEY}:${req.timeRange?.start || 0}:${req.type || ''}:...`;
const cached = await getCachedJson(cacheKey) as CyberThreat[] | null;
if (cached?.length) {
const paged = cached.slice(offset, offset + pageSize);
return { threats: paged, pagination: { totalCount: cached.length, nextCursor: ... } };
}
// ... fetch, process, cache full result set, then paginate ...2. Negative cursor offset not guarded (Medium) —
|
Problem
listCyberThreatsreturnspagination: undefined. Clients cannot implement 'next page' semantics — there's no cursor or total count to know if more results exist.Fix
req.pagination.cursoras an offset into the sorted/filtered resultstotalCount(total filtered results before paging)nextCursor(offset for next page, empty string when exhausted)slice(0, pageSize)before filtering — now applied after all filtersRef: PR #106 re-review (NEW-7)
Fixes #202