From 7e7d8e485356402e7652c61c9f004e850b0a1607 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 2 Nov 2021 11:00:40 +0100 Subject: [PATCH] Some fixes for admin videos list --- .../overview/videos/video-list.component.html | 5 +-- .../overview/videos/video-list.component.ts | 4 +-- .../shared/shared-main/video/video.service.ts | 16 +++++----- ...query-builder.ts => abstract-run-query.ts} | 2 +- ...der.ts => abstract-video-query-builder.ts} | 10 +++--- .../sql/shared/video-file-query-builder.ts | 4 +-- .../video/sql/shared/video-model-builder.ts | 4 +-- ...eo-tables.ts => video-table-attributes.ts} | 32 +++++++++---------- .../sql/video-model-get-query-builder.ts | 11 ++++--- .../video/sql/videos-id-list-query-builder.ts | 6 ++-- .../sql/videos-model-list-query-builder.ts | 10 +++--- support/doc/api/openapi.yaml | 4 +-- 12 files changed, 54 insertions(+), 54 deletions(-) rename server/models/video/sql/shared/{abstract-videos-query-builder.ts => abstract-run-query.ts} (93%) rename server/models/video/sql/shared/{abstract-videos-model-query-builder.ts => abstract-video-query-builder.ts} (97%) rename server/models/video/sql/shared/{video-tables.ts => video-table-attributes.ts} (90%) diff --git a/client/src/app/+admin/overview/videos/video-list.component.html b/client/src/app/+admin/overview/videos/video-list.component.html index eedf6f3dc..dd4ab178e 100644 --- a/client/src/app/+admin/overview/videos/video-list.component.html +++ b/client/src/app/+admin/overview/videos/video-list.component.html @@ -69,7 +69,7 @@ NSFW - Not published yet + {{ video.state.label }} Account muted Server muted @@ -80,8 +80,9 @@ HLS WebTorrent + Live - {{ getFilesSize(video) | bytes: 1 }} + {{ getFilesSize(video) | bytes: 1 }} diff --git a/client/src/app/+admin/overview/videos/video-list.component.ts b/client/src/app/+admin/overview/videos/video-list.component.ts index 6885abfc7..8bd171c53 100644 --- a/client/src/app/+admin/overview/videos/video-list.component.ts +++ b/client/src/app/+admin/overview/videos/video-list.component.ts @@ -16,7 +16,7 @@ export class VideoListComponent extends RestTable implements OnInit { videos: Video[] = [] totalRecords = 0 - sort: SortMeta = { field: 'publishedAt', order: 1 } + sort: SortMeta = { field: 'publishedAt', order: -1 } pagination: RestPagination = { count: this.rowsPerPage, start: 0 } bulkVideoActions: DropdownAction[][] = [] @@ -99,7 +99,7 @@ export class VideoListComponent extends RestTable implements OnInit { } isUnpublished (state: VideoState) { - return state !== VideoState.PUBLISHED + return state !== VideoState.LIVE_ENDED && state !== VideoState.PUBLISHED } isAccountBlocked (video: Video) { diff --git a/client/src/app/shared/shared-main/video/video.service.ts b/client/src/app/shared/shared-main/video/video.service.ts index 5db9a8704..819847ac6 100644 --- a/client/src/app/shared/shared-main/video/video.service.ts +++ b/client/src/app/shared/shared-main/video/video.service.ts @@ -48,7 +48,7 @@ export type CommonVideoParams = { @Injectable() export class VideoService { - static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos/' + static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos' static BASE_FEEDS_URL = environment.apiUrl + '/feeds/videos.' static BASE_SUBSCRIPTION_FEEDS_URL = environment.apiUrl + '/feeds/subscriptions.' @@ -60,18 +60,18 @@ export class VideoService { ) {} getVideoViewUrl (uuid: string) { - return VideoService.BASE_VIDEO_URL + uuid + '/views' + return VideoService.BASE_VIDEO_URL + '/' + uuid + '/views' } getUserWatchingVideoUrl (uuid: string) { - return VideoService.BASE_VIDEO_URL + uuid + '/watching' + return VideoService.BASE_VIDEO_URL + '/' + uuid + '/watching' } getVideo (options: { videoId: string }): Observable { return this.serverService.getServerLocale() .pipe( switchMap(translations => { - return this.authHttp.get(VideoService.BASE_VIDEO_URL + options.videoId) + return this.authHttp.get(VideoService.BASE_VIDEO_URL + '/' + options.videoId) .pipe(map(videoHash => ({ videoHash, translations }))) }), map(({ videoHash, translations }) => new VideoDetails(videoHash, translations)), @@ -111,7 +111,7 @@ export class VideoService { const data = objectToFormData(body) - return this.authHttp.put(VideoService.BASE_VIDEO_URL + video.id, data) + return this.authHttp.put(VideoService.BASE_VIDEO_URL + '/' + video.id, data) .pipe( map(this.restExtractor.extractDataBool), catchError(err => this.restExtractor.handleError(err)) @@ -119,7 +119,7 @@ export class VideoService { } uploadVideo (video: FormData) { - const req = new HttpRequest('POST', VideoService.BASE_VIDEO_URL + 'upload', video, { reportProgress: true }) + const req = new HttpRequest('POST', VideoService.BASE_VIDEO_URL + '/' + 'upload', video, { reportProgress: true }) return this.authHttp .request<{ video: { id: number, uuid: string } }>(req) @@ -321,7 +321,7 @@ export class VideoService { return from(ids) .pipe( - concatMap(id => this.authHttp.delete(VideoService.BASE_VIDEO_URL + id)), + concatMap(id => this.authHttp.delete(VideoService.BASE_VIDEO_URL + '/' + id)), toArray(), catchError(err => this.restExtractor.handleError(err)) ) @@ -413,7 +413,7 @@ export class VideoService { } private setVideoRate (id: number, rateType: UserVideoRateType) { - const url = VideoService.BASE_VIDEO_URL + id + '/rate' + const url = VideoService.BASE_VIDEO_URL + '/' + id + '/rate' const body: UserVideoRateUpdate = { rating: rateType } diff --git a/server/models/video/sql/shared/abstract-videos-query-builder.ts b/server/models/video/sql/shared/abstract-run-query.ts similarity index 93% rename from server/models/video/sql/shared/abstract-videos-query-builder.ts rename to server/models/video/sql/shared/abstract-run-query.ts index 09776bcb0..8e7a7642d 100644 --- a/server/models/video/sql/shared/abstract-videos-query-builder.ts +++ b/server/models/video/sql/shared/abstract-run-query.ts @@ -6,7 +6,7 @@ import { QueryTypes, Sequelize, Transaction } from 'sequelize' * */ -export class AbstractVideosQueryBuilder { +export class AbstractRunQuery { protected sequelize: Sequelize protected query: string diff --git a/server/models/video/sql/shared/abstract-videos-model-query-builder.ts b/server/models/video/sql/shared/abstract-video-query-builder.ts similarity index 97% rename from server/models/video/sql/shared/abstract-videos-model-query-builder.ts rename to server/models/video/sql/shared/abstract-video-query-builder.ts index 29827db2a..a6afb04e4 100644 --- a/server/models/video/sql/shared/abstract-videos-model-query-builder.ts +++ b/server/models/video/sql/shared/abstract-video-query-builder.ts @@ -1,8 +1,8 @@ import { createSafeIn } from '@server/models/utils' import { MUserAccountId } from '@server/types/models' import validator from 'validator' -import { AbstractVideosQueryBuilder } from './abstract-videos-query-builder' -import { VideoTables } from './video-tables' +import { AbstractRunQuery } from './abstract-run-query' +import { VideoTableAttributes } from './video-table-attributes' /** * @@ -10,18 +10,18 @@ import { VideoTables } from './video-tables' * */ -export class AbstractVideosModelQueryBuilder extends AbstractVideosQueryBuilder { +export class AbstractVideoQueryBuilder extends AbstractRunQuery { protected attributes: { [key: string]: string } = {} protected joins = '' protected where: string - protected tables: VideoTables + protected tables: VideoTableAttributes constructor (protected readonly mode: 'list' | 'get') { super() - this.tables = new VideoTables(this.mode) + this.tables = new VideoTableAttributes(this.mode) } protected buildSelect () { diff --git a/server/models/video/sql/shared/video-file-query-builder.ts b/server/models/video/sql/shared/video-file-query-builder.ts index 6b15c3b69..3eb3dc07d 100644 --- a/server/models/video/sql/shared/video-file-query-builder.ts +++ b/server/models/video/sql/shared/video-file-query-builder.ts @@ -1,6 +1,6 @@ import { Sequelize } from 'sequelize' import { BuildVideoGetQueryOptions } from '../video-model-get-query-builder' -import { AbstractVideosModelQueryBuilder } from './abstract-videos-model-query-builder' +import { AbstractVideoQueryBuilder } from './abstract-video-query-builder' /** * @@ -8,7 +8,7 @@ import { AbstractVideosModelQueryBuilder } from './abstract-videos-model-query-b * */ -export class VideoFileQueryBuilder extends AbstractVideosModelQueryBuilder { +export class VideoFileQueryBuilder extends AbstractVideoQueryBuilder { protected attributes: { [key: string]: string } constructor (protected readonly sequelize: Sequelize) { diff --git a/server/models/video/sql/shared/video-model-builder.ts b/server/models/video/sql/shared/video-model-builder.ts index 0eac95661..7751d8e68 100644 --- a/server/models/video/sql/shared/video-model-builder.ts +++ b/server/models/video/sql/shared/video-model-builder.ts @@ -18,7 +18,7 @@ import { VideoChannelModel } from '../../video-channel' import { VideoFileModel } from '../../video-file' import { VideoLiveModel } from '../../video-live' import { VideoStreamingPlaylistModel } from '../../video-streaming-playlist' -import { VideoTables } from './video-tables' +import { VideoTableAttributes } from './video-table-attributes' type SQLRow = { [id: string]: string | number } @@ -51,7 +51,7 @@ export class VideoModelBuilder { constructor ( readonly mode: 'get' | 'list', - readonly tables: VideoTables + readonly tables: VideoTableAttributes ) { } diff --git a/server/models/video/sql/shared/video-tables.ts b/server/models/video/sql/shared/video-table-attributes.ts similarity index 90% rename from server/models/video/sql/shared/video-tables.ts rename to server/models/video/sql/shared/video-table-attributes.ts index 042b9d5da..8a8d2073a 100644 --- a/server/models/video/sql/shared/video-tables.ts +++ b/server/models/video/sql/shared/video-table-attributes.ts @@ -4,7 +4,7 @@ * Class to build video attributes/join names we want to fetch from the database * */ -export class VideoTables { +export class VideoTableAttributes { constructor (readonly mode: 'get' | 'list') { @@ -93,22 +93,20 @@ export class VideoTables { } getStreamingPlaylistAttributes () { - let playlistKeys = [ 'id', 'playlistUrl', 'playlistFilename', 'type' ] - - if (this.mode === 'get') { - playlistKeys = playlistKeys.concat([ - 'p2pMediaLoaderInfohashes', - 'p2pMediaLoaderPeerVersion', - 'segmentsSha256Filename', - 'segmentsSha256Url', - 'videoId', - 'createdAt', - 'updatedAt', - 'storage' - ]) - } - - return playlistKeys + return [ + 'id', + 'playlistUrl', + 'playlistFilename', + 'type', + 'p2pMediaLoaderInfohashes', + 'p2pMediaLoaderPeerVersion', + 'segmentsSha256Filename', + 'segmentsSha256Url', + 'videoId', + 'createdAt', + 'updatedAt', + 'storage' + ] } getUserHistoryAttributes () { 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 2f34d5602..a65c96097 100644 --- a/server/models/video/sql/video-model-get-query-builder.ts +++ b/server/models/video/sql/video-model-get-query-builder.ts @@ -1,8 +1,8 @@ import { Sequelize, Transaction } from 'sequelize' -import { AbstractVideosModelQueryBuilder } from './shared/abstract-videos-model-query-builder' +import { AbstractVideoQueryBuilder } from './shared/abstract-video-query-builder' import { VideoFileQueryBuilder } from './shared/video-file-query-builder' import { VideoModelBuilder } from './shared/video-model-builder' -import { VideoTables } from './shared/video-tables' +import { VideoTableAttributes } from './shared/video-table-attributes' /** * @@ -46,7 +46,7 @@ export class VideoModelGetQueryBuilder { this.webtorrentFilesQueryBuilder = new VideoFileQueryBuilder(sequelize) this.streamingPlaylistFilesQueryBuilder = new VideoFileQueryBuilder(sequelize) - this.videoModelBuilder = new VideoModelBuilder('get', new VideoTables('get')) + this.videoModelBuilder = new VideoModelBuilder('get', new VideoTableAttributes('get')) } async queryVideo (options: BuildVideoGetQueryOptions) { @@ -69,15 +69,16 @@ export class VideoModelGetQueryBuilder { }) if (videos.length > 1) { - throw new Error('Video results is more than ') + throw new Error('Video results is more than 1') } if (videos.length === 0) return null + return videos[0] } } -export class VideosModelGetQuerySubBuilder extends AbstractVideosModelQueryBuilder { +export class VideosModelGetQuerySubBuilder extends AbstractVideoQueryBuilder { protected attributes: { [key: string]: string } protected webtorrentFilesQuery: string diff --git a/server/models/video/sql/videos-id-list-query-builder.ts b/server/models/video/sql/videos-id-list-query-builder.ts index 4d6e0ea4b..5064afafe 100644 --- a/server/models/video/sql/videos-id-list-query-builder.ts +++ b/server/models/video/sql/videos-id-list-query-builder.ts @@ -5,7 +5,7 @@ import { WEBSERVER } from '@server/initializers/constants' import { buildDirectionAndField, createSafeIn } from '@server/models/utils' import { MUserAccountId, MUserId } from '@server/types/models' import { VideoInclude, VideoPrivacy, VideoState } from '@shared/models' -import { AbstractVideosQueryBuilder } from './shared/abstract-videos-query-builder' +import { AbstractRunQuery } from './shared/abstract-run-query' /** * @@ -72,7 +72,7 @@ export type BuildVideosListQueryOptions = { having?: string } -export class VideosIdListQueryBuilder extends AbstractVideosQueryBuilder { +export class VideosIdListQueryBuilder extends AbstractRunQuery { protected replacements: any = {} private attributes: string[] @@ -105,7 +105,7 @@ export class VideosIdListQueryBuilder extends AbstractVideosQueryBuilder { return this.runQuery().then(rows => rows.length !== 0 ? rows[0].total : 0) } - getIdsListQueryAndSort (options: BuildVideosListQueryOptions) { + getQuery (options: BuildVideosListQueryOptions) { this.buildIdsListQuery(options) return { query: this.query, sort: this.sort, replacements: this.replacements } diff --git a/server/models/video/sql/videos-model-list-query-builder.ts b/server/models/video/sql/videos-model-list-query-builder.ts index cd721f055..b15b29ec3 100644 --- a/server/models/video/sql/videos-model-list-query-builder.ts +++ b/server/models/video/sql/videos-model-list-query-builder.ts @@ -1,6 +1,6 @@ import { VideoInclude } from '@shared/models' import { Sequelize } from 'sequelize' -import { AbstractVideosModelQueryBuilder } from './shared/abstract-videos-model-query-builder' +import { AbstractVideoQueryBuilder } from './shared/abstract-video-query-builder' import { VideoModelBuilder } from './shared/video-model-builder' import { BuildVideosListQueryOptions, VideosIdListQueryBuilder } from './videos-id-list-query-builder' @@ -10,7 +10,7 @@ import { BuildVideosListQueryOptions, VideosIdListQueryBuilder } from './videos- * */ -export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder { +export class VideosModelListQueryBuilder extends AbstractVideoQueryBuilder { protected attributes: { [key: string]: string } private innerQuery: string @@ -26,7 +26,7 @@ export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder queryVideos (options: BuildVideosListQueryOptions) { this.buildInnerQuery(options) - this.buildListQueryFromIdsQuery(options) + this.buildMainQuery(options) return this.runQuery() .then(rows => this.videoModelBuilder.buildVideosFromRows({ rows, include: options.include })) @@ -34,14 +34,14 @@ export class VideosModelListQueryBuilder extends AbstractVideosModelQueryBuilder private buildInnerQuery (options: BuildVideosListQueryOptions) { const idsQueryBuilder = new VideosIdListQueryBuilder(this.sequelize) - const { query, sort, replacements } = idsQueryBuilder.getIdsListQueryAndSort(options) + const { query, sort, replacements } = idsQueryBuilder.getQuery(options) this.replacements = replacements this.innerQuery = query this.innerSort = sort } - private buildListQueryFromIdsQuery (options: BuildVideosListQueryOptions) { + private buildMainQuery (options: BuildVideosListQueryOptions) { this.attributes = { '"video".*': '' } diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index cdb4dd343..e9e7e1757 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -4805,7 +4805,7 @@ components: required: false schema: type: boolean - description: 'Display only local or remote videos' + description: '**PeerTube >= 4.0** Display only local or remote videos' include: name: include in: query @@ -4819,7 +4819,7 @@ components: - 4 - 8 description: > - Include additional videos in results (can be combined using bitwise or operator) + **PeerTube >= 4.0** Include additional videos in results (can be combined using bitwise or operator) - `0` NONE -- 2.41.0