From 822c7e610d19e3320519a6ae5c90c01db971f03f Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 27 Dec 2019 09:04:04 +0100 Subject: [PATCH] Fix playlist search --- server/models/video/video-playlist.ts | 21 ++++++-------------- server/tests/api/videos/video-playlists.ts | 19 ++++++++++++++++++ shared/extra-utils/videos/video-playlists.ts | 5 +++-- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/server/models/video/video-playlist.ts b/server/models/video/video-playlist.ts index ef87a7ee9..71a580249 100644 --- a/server/models/video/video-playlist.ts +++ b/server/models/video/video-playlist.ts @@ -13,11 +13,10 @@ import { Model, Scopes, Table, - UpdatedAt, - Sequelize + UpdatedAt } from 'sequelize-typescript' import { VideoPlaylistPrivacy } from '../../../shared/models/videos/playlist/video-playlist-privacy.model' -import { buildServerIdsFollowedBy, buildWhereIdOrUUID, getSort, isOutdated, throwIfNotValid, createSimilarityAttribute } from '../utils' +import { buildServerIdsFollowedBy, buildWhereIdOrUUID, getSort, isOutdated, throwIfNotValid } from '../utils' import { isVideoPlaylistDescriptionValid, isVideoPlaylistNameValid, @@ -46,7 +45,8 @@ import { ActivityIconObject } from '../../../shared/models/activitypub/objects' import { FindOptions, literal, Op, ScopeOptions, Transaction, WhereOptions } from 'sequelize' import * as Bluebird from 'bluebird' import { - MVideoPlaylistAccountThumbnail, MVideoPlaylistAP, + MVideoPlaylistAccountThumbnail, + MVideoPlaylistAP, MVideoPlaylistFormattable, MVideoPlaylistFull, MVideoPlaylistFullSummary, @@ -166,18 +166,9 @@ type AvailableForListOptions = { } if (options.search) { - const escapedSearch = VideoPlaylistModel.sequelize.escape(options.search) - const escapedLikeSearch = VideoPlaylistModel.sequelize.escape('%' + options.search + '%') whereAnd.push({ - id: { - [ Op.in ]: Sequelize.literal( - '(' + - 'SELECT "videoPlaylist"."id" FROM "videoPlaylist" ' + - 'WHERE ' + - 'lower(immutable_unaccent("videoPlaylist"."name")) % lower(immutable_unaccent(' + escapedSearch + ')) OR ' + - 'lower(immutable_unaccent("videoPlaylist"."name")) LIKE lower(immutable_unaccent(' + escapedLikeSearch + '))' + - ')' - ) + name: { + [ Op.iLike ]: '%' + options.search + '%' } }) } diff --git a/server/tests/api/videos/video-playlists.ts b/server/tests/api/videos/video-playlists.ts index 424b217fb..9fd48ac7c 100644 --- a/server/tests/api/videos/video-playlists.ts +++ b/server/tests/api/videos/video-playlists.ts @@ -407,6 +407,25 @@ describe('Test video playlists', function () { expect(data).to.have.lengthOf(1) expect(data[ 0 ].displayName).to.equal('playlist 3') } + + { + const res = await getAccountPlaylistsList(servers[ 1 ].url, 'root', 0, 10, 'createdAt', '3') + + expect(res.body.total).to.equal(1) + + const data: VideoPlaylist[] = res.body.data + expect(data).to.have.lengthOf(1) + expect(data[ 0 ].displayName).to.equal('playlist 3') + } + + { + const res = await getAccountPlaylistsList(servers[ 1 ].url, 'root', 0, 10, 'createdAt', '4') + + expect(res.body.total).to.equal(0) + + const data: VideoPlaylist[] = res.body.data + expect(data).to.have.lengthOf(0) + } }) it('Should not list unlisted or private playlists', async function () { diff --git a/shared/extra-utils/videos/video-playlists.ts b/shared/extra-utils/videos/video-playlists.ts index cbb073fbc..6762c5973 100644 --- a/shared/extra-utils/videos/video-playlists.ts +++ b/shared/extra-utils/videos/video-playlists.ts @@ -45,13 +45,14 @@ function getVideoChannelPlaylistsList (url: string, videoChannelName: string, st }) } -function getAccountPlaylistsList (url: string, accountName: string, start: number, count: number, sort?: string) { +function getAccountPlaylistsList (url: string, accountName: string, start: number, count: number, sort?: string, search?: string) { const path = '/api/v1/accounts/' + accountName + '/video-playlists' const query = { start, count, - sort + sort, + search } return makeGetRequest({ -- 2.41.0