From 70b109e78b0595348e8d4058f9453a2cae5e65bb Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 28 Oct 2023 18:14:58 +0200 Subject: [PATCH] Allow songs to be searched and filtered by genres --- back/src/search/search.controller.ts | 12 +++++++----- back/src/search/search.service.ts | 7 ++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/back/src/search/search.controller.ts b/back/src/search/search.controller.ts index 884aac4..563ec9e 100644 --- a/back/src/search/search.controller.ts +++ b/back/src/search/search.controller.ts @@ -39,15 +39,17 @@ export class SearchController { @ApiUnauthorizedResponse({ description: "Invalid token" }) async searchSong( @Request() req: any, - @Param("query") query: string, - @Param("artistId") artistId: number, - @Query("include") include: string, - @Query("skip", new DefaultValuePipe(0), ParseIntPipe) skip: number, - @Query("take", new DefaultValuePipe(20), ParseIntPipe) take: number, + @Param('query') query: string, + @Query('artistId') artistId: number, + @Query('genreId') genreId: number, + @Query('include') include: string, + @Query('skip', new DefaultValuePipe(0), ParseIntPipe) skip: number, + @Query('take', new DefaultValuePipe(20), ParseIntPipe) take: number, ): Promise { return await this.searchService.searchSong( query, artistId, + genreId, mapInclude(include, req, SongController.includableFields), skip, take, diff --git a/back/src/search/search.service.ts b/back/src/search/search.service.ts index 5899966..57fcabd 100644 --- a/back/src/search/search.service.ts +++ b/back/src/search/search.service.ts @@ -15,6 +15,7 @@ export class SearchService { async searchSong( query: string, artistId?: number, + genreId?: number, include?: Prisma.SongInclude, skip?: number, take?: number, @@ -23,6 +24,7 @@ export class SearchService { return await this.prisma.song.findMany({ where: { artistId, + genreId, }, take, skip, @@ -33,7 +35,10 @@ export class SearchService { await this.search.index("songs").search(query, { limit: take, offset: skip, - ...(artistId ? { filter: `artistId = ${artistId}` } : {}), + filter: [ + ...(artistId ? [`artistId = ${artistId}`] : []), + ...(genreId ? [`genreId = ${genreId}`] : []), + ].join(' AND '), }) ).hits.map((x) => x.id);