From 20a206c3d12ad285c31411cd506cede791958322 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 11 Jun 2021 14:26:37 +0200 Subject: [PATCH] Refactor include checks --- server/controllers/activitypub/client.ts | 1 - server/lib/model-loaders/video.ts | 3 +- .../middlewares/validators/shared/videos.ts | 3 +- .../sql/video-model-get-query-builder.ts | 102 +++++++++--------- server/typings/express/index.d.ts | 4 +- 5 files changed, 52 insertions(+), 61 deletions(-) diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts index 444a8abaa..f592af644 100644 --- a/server/controllers/activitypub/client.ts +++ b/server/controllers/activitypub/client.ts @@ -31,7 +31,6 @@ import { videoPlaylistElementAPGetValidator, videoPlaylistsGetValidator } from ' import { AccountModel } from '../../models/account/account' import { AccountVideoRateModel } from '../../models/account/account-video-rate' import { ActorFollowModel } from '../../models/actor/actor-follow' -import { VideoModel } from '../../models/video/video' import { VideoCaptionModel } from '../../models/video/video-caption' import { VideoCommentModel } from '../../models/video/video-comment' import { VideoPlaylistModel } from '../../models/video/video-playlist' diff --git a/server/lib/model-loaders/video.ts b/server/lib/model-loaders/video.ts index e2bf96f62..0a3c15ad8 100644 --- a/server/lib/model-loaders/video.ts +++ b/server/lib/model-loaders/video.ts @@ -5,8 +5,7 @@ import { MVideoFullLight, MVideoId, MVideoImmutable, - MVideoThumbnail, - MVideoWithRights + MVideoThumbnail } from '@server/types/models' import { Hooks } from '../plugins/hooks' diff --git a/server/middlewares/validators/shared/videos.ts b/server/middlewares/validators/shared/videos.ts index 6131379ce..2c66c1a3a 100644 --- a/server/middlewares/validators/shared/videos.ts +++ b/server/middlewares/validators/shared/videos.ts @@ -10,8 +10,7 @@ import { MVideoFullLight, MVideoId, MVideoImmutable, - MVideoThumbnail, - MVideoWithRights + MVideoThumbnail } from '@server/types/models' import { HttpStatusCode } from '@shared/core-utils' import { UserRight } from '@shared/models' diff --git a/server/models/video/sql/video-model-get-query-builder.ts b/server/models/video/sql/video-model-get-query-builder.ts index f56fdd474..2545f887e 100644 --- a/server/models/video/sql/video-model-get-query-builder.ts +++ b/server/models/video/sql/video-model-get-query-builder.ts @@ -10,11 +10,21 @@ import { VideoTables } from './shared/video-tables' * */ +export type GetType = + 'api' | + 'full-light' | + 'account-blacklist-files' | + 'all-files' | + 'thumbnails' | + 'thumbnails-blacklist' | + 'id' | + 'blacklist-rights' + export type BuildVideoGetQueryOptions = { id?: number | string url?: string - type: 'api' | 'full-light' | 'account-blacklist-files' | 'all-files' | 'thumbnails' | 'thumbnails-blacklist' | 'id' | 'blacklist-rights' + type: GetType userId?: number transaction?: Transaction @@ -29,6 +39,8 @@ export class VideosModelGetQueryBuilder { private readonly videoModelBuilder: VideoModelBuilder + private static readonly videoFilesInclude = new Set([ 'api', 'full-light', 'account-blacklist-files', 'all-files' ]) + constructor (protected readonly sequelize: Sequelize) { this.videoQueryBuilder = new VideosModelGetQuerySubBuilder(sequelize) this.webtorrentFilesQueryBuilder = new VideoFileQueryBuilder(sequelize) @@ -41,11 +53,11 @@ export class VideosModelGetQueryBuilder { const [ videoRows, webtorrentFilesRows, streamingPlaylistFilesRows ] = await Promise.all([ this.videoQueryBuilder.queryVideos(options), - this.shouldQueryVideoFiles(options) + VideosModelGetQueryBuilder.videoFilesInclude.has(options.type) ? this.webtorrentFilesQueryBuilder.queryWebTorrentVideos(options) : Promise.resolve(undefined), - this.shouldQueryVideoFiles(options) + VideosModelGetQueryBuilder.videoFilesInclude.has(options.type) ? this.streamingPlaylistFilesQueryBuilder.queryStreamingPlaylistVideos(options) : Promise.resolve(undefined) ]) @@ -59,10 +71,6 @@ export class VideosModelGetQueryBuilder { if (videos.length === 0) return null return videos[0] } - - private shouldQueryVideoFiles (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light', 'account-blacklist-files', 'all-files' ].includes(options.type) - } } export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuilder { @@ -71,6 +79,30 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuild protected webtorrentFilesQuery: string protected streamingPlaylistFilesQuery: string + private static readonly trackersInclude = new Set([ 'api' ]) + private static readonly liveInclude = new Set([ 'api', 'full-light' ]) + private static readonly scheduleUpdateInclude = new Set([ 'api', 'full-light' ]) + private static readonly tagsInclude = new Set([ 'api', 'full-light' ]) + private static readonly userHistoryInclude = new Set([ 'api', 'full-light' ]) + private static readonly accountInclude = new Set([ 'api', 'full-light', 'account-blacklist-files' ]) + private static readonly ownerUserInclude = new Set([ 'blacklist-rights' ]) + + private static readonly blacklistedInclude = new Set([ + 'api', + 'full-light', + 'account-blacklist-files', + 'thumbnails-blacklist', + 'blacklist-rights' + ]) + + private static readonly thumbnailsInclude = new Set([ + 'api', + 'full-light', + 'account-blacklist-files', + 'thumbnails', + 'thumbnails-blacklist' + ]) + constructor (protected readonly sequelize: Sequelize) { super('get') } @@ -86,40 +118,40 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuild '"video".*': '' } - if (this.shouldIncludeThumbnails(options)) { + if (VideosModelGetQuerySubBuilder.thumbnailsInclude.has(options.type)) { this.includeThumbnails() } - if (this.shouldIncludeBlacklisted(options)) { + if (VideosModelGetQuerySubBuilder.blacklistedInclude.has(options.type)) { this.includeBlacklisted() } - if (this.shouldIncludeAccount(options)) { + if (VideosModelGetQuerySubBuilder.accountInclude.has(options.type)) { this.includeChannels() this.includeAccounts() } - if (this.shouldIncludeTags(options)) { + if (VideosModelGetQuerySubBuilder.tagsInclude.has(options.type)) { this.includeTags() } - if (this.shouldIncludeScheduleUpdate(options)) { + if (VideosModelGetQuerySubBuilder.scheduleUpdateInclude.has(options.type)) { this.includeScheduleUpdate() } - if (this.shouldIncludeLive(options)) { + if (VideosModelGetQuerySubBuilder.liveInclude.has(options.type)) { this.includeLive() } - if (options.userId && this.shouldIncludeUserHistory(options)) { + if (options.userId && VideosModelGetQuerySubBuilder.userHistoryInclude.has(options.type)) { this.includeUserHistory(options.userId) } - if (this.shouldIncludeOwnerUser(options)) { + if (VideosModelGetQuerySubBuilder.ownerUserInclude.has(options.type)) { this.includeOwnerUser() } - if (this.shouldIncludeTrackers(options)) { + if (VideosModelGetQuerySubBuilder.trackersInclude.has(options.type)) { this.includeTrackers() } @@ -129,7 +161,7 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuild } private buildQuery (options: BuildVideoGetQueryOptions) { - const order = this.shouldIncludeTags(options) + const order = VideosModelGetQuerySubBuilder.tagsInclude.has(options.type) ? 'ORDER BY "Tags"."name" ASC' : '' @@ -137,40 +169,4 @@ export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuild return `${this.buildSelect()} FROM (${from}) AS "video" ${this.joins} ${order}` } - - private shouldIncludeTrackers (options: BuildVideoGetQueryOptions) { - return options.type === 'api' - } - - private shouldIncludeLive (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light' ].includes(options.type) - } - - private shouldIncludeScheduleUpdate (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light' ].includes(options.type) - } - - private shouldIncludeTags (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light' ].includes(options.type) - } - - private shouldIncludeUserHistory (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light' ].includes(options.type) - } - - private shouldIncludeAccount (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light', 'account-blacklist-files' ].includes(options.type) - } - - private shouldIncludeBlacklisted (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light', 'account-blacklist-files', 'thumbnails-blacklist', 'blacklist-rights' ].includes(options.type) - } - - private shouldIncludeOwnerUser (options: BuildVideoGetQueryOptions) { - return options.type === 'blacklist-rights' - } - - private shouldIncludeThumbnails (options: BuildVideoGetQueryOptions) { - return [ 'api', 'full-light', 'account-blacklist-files', 'thumbnails', 'thumbnails-blacklist' ].includes(options.type) - } } diff --git a/server/typings/express/index.d.ts b/server/typings/express/index.d.ts index de673f4fc..1a8dc3430 100644 --- a/server/typings/express/index.d.ts +++ b/server/typings/express/index.d.ts @@ -37,11 +37,9 @@ import { MVideoBlacklist, MVideoCaptionVideo, MVideoFullLight, - MVideoIdThumbnail, MVideoRedundancyVideo, MVideoShareActor, - MVideoThumbnail, - MVideoWithRights + MVideoThumbnail } from '../../types/models' declare module 'express' { -- 2.41.0