X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Futils.ts;h=58a18c97a9788a2aab814f19925f7acbf8b9d820;hb=a84b8fa5cf6e4cafb841af3db9bdfcc9531c09a4;hp=7ba96815e282a512db020243c68816ea6899ca8a;hpb=69818c9394366b954b6ba3bd697bd9d2b09f2a16;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/utils.ts b/server/models/utils.ts index 7ba96815e..58a18c97a 100644 --- a/server/models/utils.ts +++ b/server/models/utils.ts @@ -1,6 +1,8 @@ -// Translate for example "-name" to [ 'name', 'DESC' ] -function getSort (value: string) { - let field: string +// Translate for example "-name" to [ [ 'name', 'DESC' ], [ 'id', 'ASC' ] ] +import { Sequelize } from 'sequelize-typescript' + +function getSort (value: string, lastSort: string[] = [ 'id', 'ASC' ]) { + let field: any let direction: 'ASC' | 'DESC' if (value.substring(0, 1) === '-') { @@ -11,17 +13,60 @@ function getSort (value: string) { field = value } - return [ field, direction ] + // Alias + if (field.toLowerCase() === 'match') field = Sequelize.col('similarity') + + return [ [ field, direction ], lastSort ] +} + +function getSortOnModel (model: any, value: string, lastSort: string[] = [ 'id', 'ASC' ]) { + let [ firstSort ] = getSort(value) + + if (model) return [ [ model, firstSort[0], firstSort[1] ], lastSort ] + return [ firstSort, lastSort ] } -function addMethodsToModel (model: any, classMethods: Function[], instanceMethods: Function[] = []) { - classMethods.forEach(m => model[m.name] = m) - instanceMethods.forEach(m => model.prototype[m.name] = m) +function throwIfNotValid (value: any, validator: (value: any) => boolean, fieldName = 'value') { + if (validator(value) === false) { + throw new Error(`"${value}" is not a valid ${fieldName}.`) + } +} + +function buildTrigramSearchIndex (indexName: string, attribute: string) { + return { + name: indexName, + fields: [ Sequelize.literal('lower(immutable_unaccent(' + attribute + '))') as any ], + using: 'gin', + operator: 'gin_trgm_ops' + } +} + +function createSimilarityAttribute (col: string, value: string) { + return Sequelize.fn( + 'similarity', + + searchTrigramNormalizeCol(col), + + searchTrigramNormalizeValue(value) + ) } // --------------------------------------------------------------------------- export { - addMethodsToModel, - getSort + getSort, + getSortOnModel, + createSimilarityAttribute, + throwIfNotValid, + buildTrigramSearchIndex +} + +// --------------------------------------------------------------------------- + +function searchTrigramNormalizeValue (value: string) { + return Sequelize.fn('lower', Sequelize.fn('immutable_unaccent', value)) +} + +function searchTrigramNormalizeCol (col: string) { + return Sequelize.fn('lower', Sequelize.fn('immutable_unaccent', Sequelize.col(col))) }