X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Futils.ts;h=69ad123ac9eb87aea08fc36caa71f1081d08f874;hb=eb66ee88351a93eb68c366cfbe30d35ed7c57b03;hp=0b6ac8340be0ee099bdd127c0964306faa830f14;hpb=0a8a79552cf59c800011c9f63eaa8658230acddc;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/utils.ts b/server/models/utils.ts index 0b6ac8340..69ad123ac 100644 --- a/server/models/utils.ts +++ b/server/models/utils.ts @@ -1,6 +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 } @@ -178,30 +179,6 @@ 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 = forceNumber(actorId) @@ -277,11 +254,34 @@ function searchAttribute (sourceField?: string, targetField?: string) { } } +function buildSQLAttributes (options: { + model: ModelStatic + tableName: string + + excludeAttributes?: (keyof AttributesOnly)[] + aliasPrefix?: string +}) { + const { model, tableName, aliasPrefix, excludeAttributes } = options + + const attributes = Object.keys(model.getAttributes()) + + 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,