X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Futils.ts;h=0b6ac8340be0ee099bdd127c0964306faa830f14;hb=0a8a79552cf59c800011c9f63eaa8658230acddc;hp=b57290afff918aa54ed31ecfa4291d21eb3778a5;hpb=bae616273d455d225d131eb17c56db6c20a0b6b3;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/utils.ts b/server/models/utils.ts index b57290aff..0b6ac8340 100644 --- a/server/models/utils.ts +++ b/server/models/utils.ts @@ -1,5 +1,6 @@ import { literal, Op, OrderItem, Sequelize } from 'sequelize' import validator from 'validator' +import { forceNumber } from '@shared/core-utils' type SortType = { sortModel: string, sortValue: string } @@ -11,8 +12,6 @@ function getSort (value: string, lastSort: OrderItem = [ 'id', 'ASC' ]): OrderIt if (field.toLowerCase() === 'match') { // Search finalField = Sequelize.col('similarity') - } else if (field === 'videoQuotaUsed') { // Users list - finalField = Sequelize.col('videoQuotaUsed') } else { finalField = field } @@ -20,6 +19,25 @@ function getSort (value: string, lastSort: OrderItem = [ 'id', 'ASC' ]): OrderIt return [ [ finalField, direction ], lastSort ] } +function getAdminUsersSort (value: string): OrderItem[] { + const { direction, field } = buildDirectionAndField(value) + + let finalField: string | ReturnType + + if (field === 'videoQuotaUsed') { // Users list + finalField = Sequelize.col('videoQuotaUsed') + } else { + finalField = field + } + + const nullPolicy = direction === 'ASC' + ? 'NULLS FIRST' + : 'NULLS LAST' + + // FIXME: typings + return [ [ finalField as any, direction, nullPolicy ], [ 'id', 'ASC' ] ] +} + function getPlaylistSort (value: string, lastSort: OrderItem = [ 'id', 'ASC' ]): OrderItem[] { const { direction, field } = buildDirectionAndField(value) @@ -100,9 +118,19 @@ function getInstanceFollowsSort (value: string, lastSort: OrderItem = [ 'id', 'A return getSort(value, lastSort) } +function getChannelSyncSort (value: string): OrderItem[] { + const { direction, field } = buildDirectionAndField(value) + if (field.toLowerCase() === 'videochannel') { + return [ + [ literal('"VideoChannel.name"'), direction ] + ] + } + return [ [ field, direction ] ] +} + function isOutdated (model: { createdAt: Date, updatedAt: Date }, refreshInterval: number) { if (!model.createdAt || !model.updatedAt) { - throw new Error('Miss createdAt & updatedAt attribuets to model') + throw new Error('Miss createdAt & updatedAt attributes to model') } const now = Date.now() @@ -175,7 +203,7 @@ function buildBlockedAccountSQLOptimized (columnNameJoin: string, blockerIds: nu } function buildServerIdsFollowedBy (actorId: any) { - const actorIdNumber = parseInt(actorId + '', 10) + const actorIdNumber = forceNumber(actorId) return '(' + 'SELECT "actor"."serverId" FROM "actorFollow" ' + @@ -191,7 +219,7 @@ function buildWhereIdOrUUID (id: number | string) { function parseAggregateResult (result: any) { if (!result) return 0 - const total = parseInt(result + '', 10) + const total = forceNumber(result) if (isNaN(total)) return 0 return total @@ -203,12 +231,12 @@ function parseRowCountResult (result: any) { return 0 } -function createSafeIn (sequelize: Sequelize, stringArr: (string | number)[]) { - return stringArr.map(t => { +function createSafeIn (sequelize: Sequelize, toEscape: (string | number)[], additionalUnescaped: string[] = []) { + return toEscape.map(t => { return t === null ? null : sequelize.escape('' + t) - }).join(', ') + }).concat(additionalUnescaped).join(', ') } function buildLocalAccountIdsIn () { @@ -260,8 +288,10 @@ export { buildLocalAccountIdsIn, getSort, getCommentSort, + getAdminUsersSort, getVideoSort, getBlacklistSort, + getChannelSyncSort, createSimilarityAttribute, throwIfNotValid, buildServerIdsFollowedBy,