Skip to content

Commit 3cef382

Browse files
authored
Feat/explore v2 (#185)
* feat(explore): check for tweets already in redis * fix(explore): fill if user has no cats
1 parent b0711d7 commit 3cef382

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

src/explore/explore.service.spec.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ describe('ExploreService', () => {
3030
find: jest.fn(),
3131
};
3232

33+
const mock_category_query_builder = {
34+
where: jest.fn().mockReturnThis(),
35+
andWhere: jest.fn().mockReturnThis(),
36+
orderBy: jest.fn().mockReturnThis(),
37+
limit: jest.fn().mockReturnThis(),
38+
getMany: jest.fn().mockResolvedValue([]),
39+
};
40+
41+
// Ensure category repository supports createQueryBuilder in tests
42+
mock_category_repository['createQueryBuilder'] = jest.fn(() => mock_category_query_builder);
43+
3344
const mock_user_interests_repository = {
3445
createQueryBuilder: jest.fn(),
3546
};
@@ -414,12 +425,17 @@ describe('ExploreService', () => {
414425

415426
mock_user_interests_repository.createQueryBuilder.mockReturnValue(mock_query_builder);
416427
mock_category_repository.find.mockResolvedValue(mock_default_cats);
428+
// ensure createQueryBuilder fallback returns same defaults in case service uses it
429+
mock_category_query_builder.getMany.mockResolvedValue(mock_default_cats);
417430
mock_redis_service.zrevrangeMultiple.mockResolvedValue(mock_tweet_ids);
418431
mock_tweets_service.getTweetsByIds.mockResolvedValue(mock_tweets);
419432

420433
const result = await service.getForYouPosts('user-456');
421434

422-
expect(mock_category_repository.find).toHaveBeenCalled();
435+
expect(
436+
mock_category_repository.find.mock.calls.length > 0 ||
437+
mock_category_query_builder.getMany.mock.calls.length > 0
438+
).toBeTruthy();
423439
expect(result).toHaveLength(2);
424440
});
425441

@@ -428,12 +444,17 @@ describe('ExploreService', () => {
428444
const mock_tweet_ids = [['tweet-1']];
429445

430446
mock_category_repository.find.mockResolvedValue(mock_default_cats);
447+
// ensure query builder fallback also returns defaults
448+
mock_category_query_builder.getMany.mockResolvedValue(mock_default_cats);
431449
mock_redis_service.zrevrangeMultiple.mockResolvedValue(mock_tweet_ids);
432450
mock_tweets_service.getTweetsByIds.mockResolvedValue([{ tweet_id: 'tweet-1' }]);
433451

434452
const result = await service.getForYouPosts();
435453

436-
expect(mock_category_repository.find).toHaveBeenCalled();
454+
expect(
455+
mock_category_repository.find.mock.calls.length > 0 ||
456+
mock_category_query_builder.getMany.mock.calls.length > 0
457+
).toBeTruthy();
437458
});
438459

439460
it('should return empty array when no tweets found', async () => {

src/explore/explore.service.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class ExploreService {
2121
private readonly who_to_follow_service: WhoToFollowService
2222
) {}
2323

24-
private readonly DEFAULT_CATEGORIES = [21, 20, 3, 4, 5];
24+
private readonly DEFAULT_CATEGORIES = [2, 3, 5, 4, 15];
2525

2626
async getExploreData(current_user_id?: string) {
2727
// This method would fetch all explore data in one go
@@ -119,12 +119,23 @@ export class ExploreService {
119119
console.log('Time taken to fetch user interests:', time_after - time_before, 'ms');
120120

121121
const categories = user_interests.map((interest) => interest.category);
122-
if (categories.length === 0) {
123-
// If no user interests, use default categories
124-
const default_cats = await this.category_repository.find({
125-
where: { id: In(this.DEFAULT_CATEGORIES) },
126-
});
127-
categories.push(...default_cats);
122+
123+
if (categories.length < 5) {
124+
// Fill remaining slots with default categories
125+
const existing_ids = categories.map((cat) => cat.id);
126+
const needed = 5 - categories.length;
127+
const qb = this.category_repository
128+
.createQueryBuilder('c')
129+
.where('c.id IN (:...ids)', { ids: this.DEFAULT_CATEGORIES })
130+
.orderBy('c.id', 'ASC')
131+
.limit(needed);
132+
133+
if (existing_ids.length > 0) {
134+
qb.andWhere('c.id NOT IN (:...existing_ids)', { existing_ids });
135+
}
136+
137+
const filler_cats = await qb.getMany();
138+
categories.push(...filler_cats);
128139
}
129140
const keys = categories.map((cat) => `explore:category:${cat.id}`);
130141
const results = await this.redis_service.zrevrangeMultiple(keys, 0, 4);

src/tweets/tweets.repository.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ export class TweetsRepository extends Repository<Tweet> {
5656

5757
const tweets = await query.getMany();
5858

59-
console.log(tweets);
60-
6159
return plainToInstance(TweetResponseDTO, tweets, {
6260
excludeExtraneousValues: true,
6361
});

0 commit comments

Comments
 (0)