Skip to content

Commit 57bf817

Browse files
authored
feat(for-you): switch useForYouFeed to dedicated /users/{id}/feed/for-you endpoint (#14388)
1 parent 5612392 commit 57bf817

2 files changed

Lines changed: 70 additions & 9 deletions

File tree

packages/common/src/api/tan-query/lineups/useForYouFeed.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Id, GetUserRecommendedTracksTimeRangeEnum } from '@audius/sdk'
1+
import { Id } from '@audius/sdk'
22
import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'
33

44
import { userTrackMetadataFromSDK } from '~/adapters/track'
@@ -24,11 +24,9 @@ export const getForYouFeedQueryKey = (userId: ID | null | undefined) => {
2424
}
2525

2626
/**
27-
* "For You" feed for the Feed page. Backed by the same recommended-tracks
28-
* endpoint that powers the Explore page's For You section
29-
* (`GET /v1/users/{id}/recommended-tracks`). The dedicated
30-
* `/feed/for-you` endpoint has been retired in favor of consolidating on
31-
* the recommended-tracks source — see the API repo for the deletion.
27+
* "For You" feed for the Feed page. Backed by the dedicated
28+
* `GET /v1/users/{id}/feed/for-you` endpoint — a lean 3-source pipeline
29+
* (in-network, trending, underground) with linear ranking and diversity pass.
3230
*/
3331
export const useForYouFeed = (
3432
{
@@ -57,12 +55,11 @@ export const useForYouFeed = (
5755
const isFirstPage = pageParam === 0
5856
const currentPageSize = isFirstPage ? initialPageSize : loadMorePageSize
5957
const sdk = await audiusSdk()
60-
const { data = [] } = await sdk.users.getUserRecommendedTracks({
58+
const { data = [] } = await sdk.users.getUserForYouFeed({
6159
id: Id.parse(currentUserId),
6260
userId: Id.parse(currentUserId),
6361
limit: currentPageSize,
64-
offset: pageParam,
65-
timeRange: GetUserRecommendedTracksTimeRangeEnum.Week
62+
offset: pageParam
6663
})
6764

6865
const tracks = primeTrackData({

packages/sdk/src/sdk/api/generated/default/apis/UsersApi.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,14 @@ export interface GetUserFeedRequest {
687687
encodedDataSignature?: string;
688688
}
689689

690+
export interface GetUserForYouFeedRequest {
691+
id: string;
692+
limit?: number;
693+
offset?: number;
694+
maxPerArtist?: number;
695+
userId?: string;
696+
}
697+
690698
export interface GetUserIDsByAddressesRequest {
691699
address: Array<string>;
692700
}
@@ -4172,6 +4180,62 @@ export class UsersApi extends runtime.BaseAPI {
41724180
return await response.value();
41734181
}
41744182

4183+
/**
4184+
* @hidden
4185+
* Returns a personalized For You feed for the user identified in the path. Twitter-style multi-source pipeline — candidate retrieval (in-network, trending, underground) → linear ranking (recency decay × engagement × social affinity, weighted by source) → diversity (per-artist cap + consecutive-same-artist lookahead).
4186+
* Get For You feed for user
4187+
*/
4188+
async getUserForYouFeedRaw(params: GetUserForYouFeedRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Tracks>> {
4189+
if (params.id === null || params.id === undefined) {
4190+
throw new runtime.RequiredError('id','Required parameter params.id was null or undefined when calling getUserForYouFeed.');
4191+
}
4192+
4193+
const queryParameters: any = {};
4194+
4195+
if (params.limit !== undefined) {
4196+
queryParameters['limit'] = params.limit;
4197+
}
4198+
4199+
if (params.offset !== undefined) {
4200+
queryParameters['offset'] = params.offset;
4201+
}
4202+
4203+
if (params.maxPerArtist !== undefined) {
4204+
queryParameters['max_per_artist'] = params.maxPerArtist;
4205+
}
4206+
4207+
if (params.userId !== undefined) {
4208+
queryParameters['user_id'] = params.userId;
4209+
}
4210+
4211+
const headerParameters: runtime.HTTPHeaders = {};
4212+
4213+
if (!headerParameters["Authorization"] && this.configuration && this.configuration.accessToken) {
4214+
const token = await this.configuration.accessToken("OAuth2", ["read"]);
4215+
if (token) {
4216+
headerParameters["Authorization"] = token;
4217+
}
4218+
}
4219+
4220+
const response = await this.request({
4221+
path: `/users/{id}/feed/for-you`.replace(`{${"id"}}`, encodeURIComponent(String(params.id))),
4222+
method: 'GET',
4223+
headers: headerParameters,
4224+
query: queryParameters,
4225+
}, initOverrides);
4226+
4227+
return new runtime.JSONApiResponse(response, (jsonValue) => TracksFromJSON(jsonValue));
4228+
}
4229+
4230+
/**
4231+
* Returns a personalized For You feed for the user identified in the path. Twitter-style multi-source pipeline — candidate retrieval (in-network, trending, underground) → linear ranking (recency decay × engagement × social affinity, weighted by source) → diversity (per-artist cap + consecutive-same-artist lookahead).
4232+
* Get For You feed for user
4233+
*/
4234+
async getUserForYouFeed(params: GetUserForYouFeedRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Tracks> {
4235+
const response = await this.getUserForYouFeedRaw(params, initOverrides);
4236+
return await response.value();
4237+
}
4238+
41754239
/**
41764240
* @hidden
41774241
* Gets User IDs from any Ethereum wallet address or Solana account address associated with their Audius account.

0 commit comments

Comments
 (0)