You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.3 KiB
TypeScript
89 lines
2.3 KiB
TypeScript
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) {
|
|||
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)))
|
|||
}
|