From 4b1f1b810a50829be8d8998cdd4d296143e34f2e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 29 Aug 2019 16:47:32 +0200 Subject: [PATCH] Lowercase video tags search --- server/models/video/tag.ts | 6 +++++- server/models/video/video.ts | 10 +++++++--- server/tests/api/search/search-videos.ts | 8 ++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/server/models/video/tag.ts b/server/models/video/tag.ts index b110f2a43..ed8df8b48 100644 --- a/server/models/video/tag.ts +++ b/server/models/video/tag.ts @@ -1,5 +1,5 @@ import * as Bluebird from 'bluebird' -import { QueryTypes, Transaction } from 'sequelize' +import { fn, QueryTypes, Transaction, col } from 'sequelize' import { AllowNull, BelongsToMany, Column, CreatedAt, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' import { isVideoTagValid } from '../../helpers/custom-validators/videos' import { throwIfNotValid } from '../utils' @@ -15,6 +15,10 @@ import { MTag } from '@server/typings/models' { fields: [ 'name' ], unique: true + }, + { + name: 'tag_lower_name', + fields: [ fn('lower', col('name')) ] as any // FIXME: typings } ] }) diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 6a95f6ef7..6856dcd9f 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -468,13 +468,15 @@ export type AvailableForListIDsOptions = { // FIXME: issues with sequelize count when making a join on n:m relation, so we just make a IN() if (options.tagsAllOf || options.tagsOneOf) { if (options.tagsOneOf) { + const tagsOneOfLower = options.tagsOneOf.map(t => t.toLowerCase()) + whereAnd.push({ id: { [ Op.in ]: Sequelize.literal( '(' + 'SELECT "videoId" FROM "videoTag" ' + 'INNER JOIN "tag" ON "tag"."id" = "videoTag"."tagId" ' + - 'WHERE "tag"."name" IN (' + createSafeIn(VideoModel, options.tagsOneOf) + ')' + + 'WHERE lower("tag"."name") IN (' + createSafeIn(VideoModel, tagsOneOfLower) + ')' + ')' ) } @@ -482,14 +484,16 @@ export type AvailableForListIDsOptions = { } if (options.tagsAllOf) { + const tagsAllOfLower = options.tagsAllOf.map(t => t.toLowerCase()) + whereAnd.push({ id: { [ Op.in ]: Sequelize.literal( '(' + 'SELECT "videoId" FROM "videoTag" ' + 'INNER JOIN "tag" ON "tag"."id" = "videoTag"."tagId" ' + - 'WHERE "tag"."name" IN (' + createSafeIn(VideoModel, options.tagsAllOf) + ')' + - 'GROUP BY "videoTag"."videoId" HAVING COUNT(*) = ' + options.tagsAllOf.length + + 'WHERE lower("tag"."name") IN (' + createSafeIn(VideoModel, tagsAllOfLower) + ')' + + 'GROUP BY "videoTag"."videoId" HAVING COUNT(*) = ' + tagsAllOfLower.length + ')' ) } diff --git a/server/tests/api/search/search-videos.ts b/server/tests/api/search/search-videos.ts index c06200ffe..a3e05156b 100644 --- a/server/tests/api/search/search-videos.ts +++ b/server/tests/api/search/search-videos.ts @@ -206,7 +206,7 @@ describe('Test videos search', function () { const query = { search: '9999', categoryOneOf: [ 1 ], - tagsOneOf: [ 'aaaa', 'ffff' ] + tagsOneOf: [ 'aAaa', 'ffff' ] } const res1 = await advancedVideosSearch(server.url, query) expect(res1.body.total).to.equal(2) @@ -219,15 +219,15 @@ describe('Test videos search', function () { const query = { search: '9999', categoryOneOf: [ 1 ], - tagsAllOf: [ 'cccc' ] + tagsAllOf: [ 'CCcc' ] } const res1 = await advancedVideosSearch(server.url, query) expect(res1.body.total).to.equal(2) - const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'blabla' ] })) + const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'blAbla' ] })) expect(res2.body.total).to.equal(0) - const res3 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'bbbb', 'cccc' ] })) + const res3 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'bbbb', 'CCCC' ] })) expect(res3.body.total).to.equal(1) })