Skip to content

Commit 9c39ec4

Browse files
authored
feat(contests): prime entry-count cache from /events/entity (#14455)
1 parent 5d9d4e4 commit 9c39ec4

2 files changed

Lines changed: 41 additions & 7 deletions

File tree

packages/common/src/api/tan-query/batchers/getEventsByEntityIdBatcher.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,44 @@
1-
import { Id, OptionalId } from '@audius/sdk'
1+
import { Id, OptionalHashId, OptionalId } from '@audius/sdk'
22
import { create, windowScheduler } from '@yornaath/batshit'
33
import { memoize } from 'lodash'
44

55
import { eventMetadataListFromSDK } from '~/adapters/event'
66
import { ID, Event } from '~/models'
77

8+
import { getRemixesCountQueryKey } from '../remixes/useRemixes'
9+
810
import { contextCacheResolver } from './contextCacheResolver'
911
import { BatchContext } from './types'
1012

1113
export const getEventsByEntityIdBatcher = memoize(
1214
(context: BatchContext) =>
1315
create({
1416
fetcher: async (entityIds: ID[]): Promise<Event[]> => {
15-
const { sdk, currentUserId } = context
17+
const { sdk, currentUserId, queryClient } = context
1618
if (!entityIds.length) return []
17-
const { data } = await sdk.events.getEntityEvents({
19+
const { data, related } = await sdk.events.getEntityEvents({
1820
entityId: entityIds.map((entityId) => Id.parse(entityId)),
1921
userId: OptionalId.parse(currentUserId)
2022
})
2123

24+
// Prime the dedicated `useRemixesCount` cache from the entry counts
25+
// delivered alongside the event list (keyed by the contest's parent
26+
// track hashid). This turns ContestCard's entry-count badge into a
27+
// cache hit so surfaces that resolve contests via this endpoint (the
28+
// track-page contest section, cold contest pages, web Explore's
29+
// featured contests) don't fire a count-only
30+
// `/tracks/{id}/remixes?limit=0` per card. Same pattern as
31+
// useAllRemixContests / useUserRemixContests.
32+
const entryCounts = related?.entryCounts ?? {}
33+
for (const [hashedTrackId, count] of Object.entries(entryCounts)) {
34+
const trackId = OptionalHashId.parse(hashedTrackId)
35+
if (!trackId) continue
36+
queryClient.setQueryData(
37+
getRemixesCountQueryKey({ trackId, isContestEntry: true }),
38+
count
39+
)
40+
}
41+
2242
return eventMetadataListFromSDK(data)
2343
},
2444
resolver: (events: Event[], entityId: ID) =>

packages/sdk/src/sdk/api/generated/default/models/EventsResponse.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,31 @@ import {
1919
EventFromJSONTyped,
2020
EventToJSON,
2121
} from './Event';
22+
import type { RemixContestsRelated } from './RemixContestsRelated';
23+
import {
24+
RemixContestsRelatedFromJSON,
25+
RemixContestsRelatedFromJSONTyped,
26+
RemixContestsRelatedToJSON,
27+
} from './RemixContestsRelated';
2228

2329
/**
24-
*
30+
*
2531
* @export
2632
* @interface EventsResponse
2733
*/
2834
export interface EventsResponse {
2935
/**
30-
*
36+
*
3137
* @type {Array<Event>}
3238
* @memberof EventsResponse
3339
*/
3440
data?: Array<Event>;
41+
/**
42+
*
43+
* @type {RemixContestsRelated}
44+
* @memberof EventsResponse
45+
*/
46+
related?: RemixContestsRelated;
3547
}
3648

3749
/**
@@ -52,8 +64,9 @@ export function EventsResponseFromJSONTyped(json: any, ignoreDiscriminator: bool
5264
return json;
5365
}
5466
return {
55-
67+
5668
'data': !exists(json, 'data') ? undefined : ((json['data'] as Array<any>).map(EventFromJSON)),
69+
'related': !exists(json, 'related') ? undefined : RemixContestsRelatedFromJSON(json['related']),
5770
};
5871
}
5972

@@ -65,8 +78,9 @@ export function EventsResponseToJSON(value?: EventsResponse | null): any {
6578
return null;
6679
}
6780
return {
68-
81+
6982
'data': value.data === undefined ? undefined : ((value.data as Array<any>).map(EventToJSON)),
83+
'related': RemixContestsRelatedToJSON(value.related),
7084
};
7185
}
7286

0 commit comments

Comments
 (0)