Skip to content

Commit d436c81

Browse files
committed
feat: enhance song retrieval by adding category filtering for recent songs
- Updated SongController to support fetching recent songs by category. - Modified RecentSongsProvider to handle new response structure with PageDto. - Adjusted endpoint and data handling to accommodate category-based song retrieval.
1 parent 713b113 commit d436c81

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

apps/backend/src/song/song.controller.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,21 @@ export class SongController {
148148

149149
// Handle recent sort
150150
if (query.sort === SongSortType.RECENT) {
151+
// If category is provided, use getSongsByCategory (which also sorts by recent)
152+
if (query.category) {
153+
const data = await this.songService.getSongsByCategory(
154+
query.category,
155+
query.page,
156+
query.limit,
157+
);
158+
return new PageDto<SongPreviewDto>({
159+
content: data,
160+
page: query.page,
161+
limit: query.limit,
162+
total: data.length,
163+
});
164+
}
165+
151166
const data = await this.songService.getRecentSongs(
152167
query.page,
153168
query.limit,

apps/frontend/src/modules/browse/components/client/context/RecentSongs.context.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
useState,
99
} from 'react';
1010

11-
import { SongPreviewDtoType } from '@nbw/database';
11+
import { PageDto, SongPreviewDtoType } from '@nbw/database';
1212
import axiosInstance from '@web/lib/axios';
1313

1414
type RecentSongsContextType = {
@@ -43,7 +43,7 @@ export function RecentSongsProvider({
4343
const [hasMore, setHasMore] = useState(true);
4444
const [categories, setCategories] = useState<Record<string, number>>({});
4545
const [selectedCategory, setSelectedCategory] = useState<string>('');
46-
const [endpoint, setEndpoint] = useState<string>('/song-browser/recent');
46+
const [endpoint, setEndpoint] = useState<string>('/song');
4747

4848
const adCount = 1;
4949
const pageSize = 12;
@@ -66,12 +66,13 @@ export function RecentSongsProvider({
6666
params.category = selectedCategory;
6767
}
6868

69-
const response = await axiosInstance.get<SongPreviewDtoType[]>(
69+
const response = await axiosInstance.get<PageDto<SongPreviewDtoType>>(
7070
endpoint,
7171
{ params },
7272
);
7373

74-
const newSongs: Array<SongPreviewDtoType | undefined> = response.data;
74+
const newSongs: Array<SongPreviewDtoType | undefined> =
75+
response.data.content;
7576

7677
for (let i = 0; i < adCount; i++) {
7778
const adPosition = Math.floor(Math.random() * newSongs.length) + 1;
@@ -80,10 +81,10 @@ export function RecentSongsProvider({
8081

8182
setRecentSongs((prevSongs) => [
8283
...prevSongs.filter((song) => song !== null),
83-
...response.data,
84+
...response.data.content,
8485
]);
8586

86-
if (response.data.length < fetchCount) {
87+
if (response.data.content.length < fetchCount) {
8788
setHasMore(false);
8889
}
8990
} catch (error) {

0 commit comments

Comments
 (0)