X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Futils.ts;h=93723816f29bc499a49349c7ec9a13beadc1bd27;hb=a8749f7c3b137f433e6944bb99fd721a6f0cfc1e;hp=c468f748d50c7c984ec61d2f1bfcc9dfb5ce623c;hpb=6c1da7937cedbc1d4013cff0686d785247229c52;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/utils.ts b/server/models/utils.ts index c468f748d..93723816f 100644 --- a/server/models/utils.ts +++ b/server/models/utils.ts @@ -1,5 +1,7 @@ -import { literal, Op, OrderItem, Sequelize } from 'sequelize' +import { literal, Model, ModelStatic, Op, OrderItem, Sequelize } from 'sequelize' import validator from 'validator' +import { forceNumber } from '@shared/core-utils' +import { AttributesOnly } from '@shared/typescript-utils' type SortType = { sortModel: string, sortValue: string } @@ -117,6 +119,16 @@ 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 attributes to model') @@ -167,32 +179,8 @@ function buildBlockedAccountSQL (blockerIds: number[]) { 'WHERE "serverBlocklist"."accountId" IN (' + blockerIdsString + ')' } -function buildBlockedAccountSQLOptimized (columnNameJoin: string, blockerIds: number[]) { - const blockerIdsString = blockerIds.join(', ') - - return [ - literal( - `NOT EXISTS (` + - ` SELECT 1 FROM "accountBlocklist" ` + - ` WHERE "targetAccountId" = ${columnNameJoin} ` + - ` AND "accountId" IN (${blockerIdsString})` + - `)` - ), - - literal( - `NOT EXISTS (` + - ` SELECT 1 FROM "account" ` + - ` INNER JOIN "actor" ON account."actorId" = actor.id ` + - ` INNER JOIN "serverBlocklist" ON "actor"."serverId" = "serverBlocklist"."targetServerId" ` + - ` WHERE "account"."id" = ${columnNameJoin} ` + - ` AND "serverBlocklist"."accountId" IN (${blockerIdsString})` + - `)` - ) - ] -} - function buildServerIdsFollowedBy (actorId: any) { - const actorIdNumber = parseInt(actorId + '', 10) + const actorIdNumber = forceNumber(actorId) return '(' + 'SELECT "actor"."serverId" FROM "actorFollow" ' + @@ -208,7 +196,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 @@ -220,12 +208,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 () { @@ -266,11 +254,34 @@ function searchAttribute (sourceField?: string, targetField?: string) { } } +function buildSQLAttributes (options: { + model: ModelStatic + tableName: string + + excludeAttributes?: Exclude, symbol>[] + aliasPrefix?: string +}) { + const { model, tableName, aliasPrefix, excludeAttributes } = options + + const attributes = Object.keys(model.getAttributes()) as Exclude, symbol>[] + + return attributes + .filter(a => { + if (!excludeAttributes) return true + if (excludeAttributes.includes(a)) return false + + return true + }) + .map(a => { + return `"${tableName}"."${a}" AS "${aliasPrefix || ''}${a}"` + }) +} + // --------------------------------------------------------------------------- export { + buildSQLAttributes, buildBlockedAccountSQL, - buildBlockedAccountSQLOptimized, buildLocalActorIdsIn, getPlaylistSort, SortType, @@ -280,6 +291,7 @@ export { getAdminUsersSort, getVideoSort, getBlacklistSort, + getChannelSyncSort, createSimilarityAttribute, throwIfNotValid, buildServerIdsFollowedBy,