]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/models/shared/query.ts
Bumped to version v5.2.1
[github/Chocobozzz/PeerTube.git] / server / models / shared / query.ts
1 import { BindOrReplacements, Op, QueryTypes, Sequelize } from 'sequelize'
2 import validator from 'validator'
3 import { forceNumber } from '@shared/core-utils'
4
5 function doesExist (sequelize: Sequelize, query: string, bind?: BindOrReplacements) {
6 const options = {
7 type: QueryTypes.SELECT as QueryTypes.SELECT,
8 bind,
9 raw: true
10 }
11
12 return sequelize.query(query, options)
13 .then(results => results.length === 1)
14 }
15
16 function createSimilarityAttribute (col: string, value: string) {
17 return Sequelize.fn(
18 'similarity',
19
20 searchTrigramNormalizeCol(col),
21
22 searchTrigramNormalizeValue(value)
23 )
24 }
25
26 function buildWhereIdOrUUID (id: number | string) {
27 return validator.isInt('' + id) ? { id } : { uuid: id }
28 }
29
30 function parseAggregateResult (result: any) {
31 if (!result) return 0
32
33 const total = forceNumber(result)
34 if (isNaN(total)) return 0
35
36 return total
37 }
38
39 function parseRowCountResult (result: any) {
40 if (result.length !== 0) return result[0].total
41
42 return 0
43 }
44
45 function createSafeIn (sequelize: Sequelize, toEscape: (string | number)[], additionalUnescaped: string[] = []) {
46 return toEscape.map(t => {
47 return t === null
48 ? null
49 : sequelize.escape('' + t)
50 }).concat(additionalUnescaped).join(', ')
51 }
52
53 function searchAttribute (sourceField?: string, targetField?: string) {
54 if (!sourceField) return {}
55
56 return {
57 [targetField]: {
58 // FIXME: ts error
59 [Op.iLike as any]: `%${sourceField}%`
60 }
61 }
62 }
63
64 export {
65 doesExist,
66 createSimilarityAttribute,
67 buildWhereIdOrUUID,
68 parseAggregateResult,
69 parseRowCountResult,
70 createSafeIn,
71 searchAttribute
72 }
73
74 // ---------------------------------------------------------------------------
75
76 function searchTrigramNormalizeValue (value: string) {
77 return Sequelize.fn('lower', Sequelize.fn('immutable_unaccent', value))
78 }
79
80 function searchTrigramNormalizeCol (col: string) {
81 return Sequelize.fn('lower', Sequelize.fn('immutable_unaccent', Sequelize.col(col)))
82 }