Init commit
This commit is contained in:
91
server/core/models/shared/query.ts
Normal file
91
server/core/models/shared/query.ts
Normal file
@@ -0,0 +1,91 @@
|
||||
import { forceNumber } from '@peertube/peertube-core-utils'
|
||||
import { BindOrReplacements, Op, QueryOptionsWithType, QueryTypes, Sequelize, Transaction } from 'sequelize'
|
||||
import { Fn } from 'sequelize/types/utils'
|
||||
import validator from 'validator'
|
||||
|
||||
async function doesExist (options: {
|
||||
sequelize: Sequelize
|
||||
query: string
|
||||
bind?: BindOrReplacements
|
||||
transaction?: Transaction
|
||||
}) {
|
||||
const { sequelize, query, bind, transaction } = options
|
||||
|
||||
const queryOptions: QueryOptionsWithType<QueryTypes.SELECT> = {
|
||||
type: QueryTypes.SELECT,
|
||||
bind,
|
||||
raw: true,
|
||||
transaction
|
||||
}
|
||||
|
||||
const results = await sequelize.query(query, queryOptions)
|
||||
|
||||
return results.length === 1
|
||||
}
|
||||
|
||||
// FIXME: have to specify the result type to not break peertube typings generation
|
||||
function createSimilarityAttribute (col: string, value: string): Fn {
|
||||
return Sequelize.fn(
|
||||
'similarity',
|
||||
searchTrigramNormalizeCol(col),
|
||||
searchTrigramNormalizeValue(value)
|
||||
)
|
||||
}
|
||||
|
||||
function buildWhereIdOrUUID (id: number | string) {
|
||||
return validator.default.isInt('' + id) ? { id } : { uuid: id }
|
||||
}
|
||||
|
||||
function parseAggregateResult (result: any) {
|
||||
if (!result) return 0
|
||||
|
||||
const total = forceNumber(result)
|
||||
if (isNaN(total)) return 0
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
function parseRowCountResult (result: any): number {
|
||||
if (result.length !== 0) return result[0].total
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function createSafeIn (sequelize: Sequelize, toEscape: (string | number)[], additionalUnescaped: string[] = []) {
|
||||
return toEscape.map(t => {
|
||||
return t === null
|
||||
? null
|
||||
: sequelize.escape('' + t)
|
||||
}).concat(additionalUnescaped).join(', ')
|
||||
}
|
||||
|
||||
function searchAttribute (sourceField?: string, targetField?: string) {
|
||||
if (!sourceField) return {}
|
||||
|
||||
return {
|
||||
[targetField]: {
|
||||
// FIXME: ts error
|
||||
[Op.iLike as any]: `%${sourceField}%`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
buildWhereIdOrUUID,
|
||||
createSafeIn,
|
||||
createSimilarityAttribute,
|
||||
doesExist,
|
||||
parseAggregateResult,
|
||||
parseRowCountResult,
|
||||
searchAttribute
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
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)))
|
||||
}
|
||||
Reference in New Issue
Block a user