From a8a63227781c6815532cb7a68699b08fdb0368be Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Nov 2018 11:24:31 +0100 Subject: [PATCH 1/6] Optimize image resizing --- .../verify-account-email.component.ts | 1 - server/helpers/image-utils.ts | 19 +++++++++++++++++-- server/lib/activitypub/videos.ts | 10 ++++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts b/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts index 26b3bf4b1..e4a5522c8 100644 --- a/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts +++ b/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts @@ -25,7 +25,6 @@ export class VerifyAccountEmailComponent implements OnInit { } ngOnInit () { - this.userId = this.route.snapshot.queryParams['userId'] this.verificationString = this.route.snapshot.queryParams['verificationString'] diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts index 3eaa674ed..da3285b13 100644 --- a/server/helpers/image-utils.ts +++ b/server/helpers/image-utils.ts @@ -1,13 +1,28 @@ import 'multer' import * as sharp from 'sharp' -import { remove } from 'fs-extra' +import { move, remove } from 'fs-extra' async function processImage ( physicalFile: { path: string }, destination: string, newSize: { width: number, height: number } ) { - await sharp(physicalFile.path) + if (physicalFile.path === destination) { + throw new Error('Sharp needs an input path different that the output path.') + } + + const sharpInstance = sharp(physicalFile.path) + const metadata = await sharpInstance.metadata() + + // No need to resize + if (metadata.width === newSize.width && metadata.height === newSize.height) { + await move(physicalFile.path, destination, { overwrite: true }) + return + } + + await remove(destination) + + await sharpInstance .resize(newSize.width, newSize.height) .toFile(destination) diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index 80de92f24..6ff9baefe 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -242,10 +242,6 @@ async function updateVideoFromAP (options: { if (options.updateViews === true) options.video.set('views', videoData.views) await options.video.save(sequelizeOptions) - // Don't block on request - generateThumbnailFromUrl(options.video, options.videoObject.icon) - .catch(err => logger.warn('Cannot generate thumbnail of %s.', options.videoObject.id, { err })) - { const videoFileAttributes = videoFileActivityUrlToDBAttributes(options.video, options.videoObject) const newVideoFiles = videoFileAttributes.map(a => new VideoFileModel(a)) @@ -293,6 +289,12 @@ async function updateVideoFromAP (options: { logger.debug('Cannot update the remote video.', { err }) throw err } + + try { + await generateThumbnailFromUrl(options.video, options.videoObject.icon) + } catch (err) { + logger.warn('Cannot generate thumbnail of %s.', options.videoObject.id, { err }) + } } export { From 361805c48b14c5402c9984485c67c45a1a3113cc Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Nov 2018 14:34:01 +0100 Subject: [PATCH 2/6] Fix checkbox margins --- .../edit-custom-config.component.html | 69 +++++++++++-------- .../my-account-video-settings.component.html | 20 +++--- server/helpers/activitypub.ts | 10 +-- server/lib/activitypub/actor.ts | 8 +-- server/lib/activitypub/process/process.ts | 4 +- server/lib/activitypub/share.ts | 4 +- server/lib/activitypub/video-rates.ts | 4 +- server/lib/activitypub/videos.ts | 4 +- 8 files changed, 69 insertions(+), 54 deletions(-) diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html index dfbbfbb29..fd4d3d9c9 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html @@ -87,15 +87,19 @@
Signup
- +
+ +
- +
+ +
@@ -110,15 +114,19 @@
Import
- +
+ +
- +
+ +
Administrator
@@ -184,13 +192,15 @@
- +
+ +
@@ -199,11 +209,13 @@
Transcoding
- +
+ +
@@ -226,7 +238,6 @@ [inputName]="getResolutionKey(resolution)" [formControlName]="getResolutionKey(resolution)" i18n-labelText labelText="Resolution {{resolution}} enabled" > - diff --git a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html index 8be8a66cc..049119fa8 100644 --- a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html +++ b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html @@ -15,15 +15,19 @@ - +
+ +
- +
+ +
diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts index bcbd9be59..79b76fa0b 100644 --- a/server/helpers/activitypub.ts +++ b/server/helpers/activitypub.ts @@ -1,7 +1,7 @@ import * as Bluebird from 'bluebird' import * as validator from 'validator' import { ResultList } from '../../shared/models' -import { Activity, ActivityPubActor } from '../../shared/models/activitypub' +import { Activity } from '../../shared/models/activitypub' import { ACTIVITY_PUB } from '../initializers' import { ActorModel } from '../models/activitypub/actor' import { signJsonLDObject } from './peertube-crypto' @@ -106,10 +106,10 @@ function buildSignedActivity (byActor: ActorModel, data: Object) { return signJsonLDObject(byActor, activity) as Promise } -function getActorUrl (activityActor: string | ActivityPubActor) { - if (typeof activityActor === 'string') return activityActor +function getAPUrl (activity: string | { id: string }) { + if (typeof activity === 'string') return activity - return activityActor.id + return activity.id } function checkUrlsSameHost (url1: string, url2: string) { @@ -123,7 +123,7 @@ function checkUrlsSameHost (url1: string, url2: string) { export { checkUrlsSameHost, - getActorUrl, + getAPUrl, activityPubContextify, activityPubCollectionPagination, buildSignedActivity diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index 218dbc6a7..504263c99 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts @@ -5,15 +5,15 @@ import * as url from 'url' import * as uuidv4 from 'uuid/v4' import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub' import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects' -import { checkUrlsSameHost, getActorUrl } from '../../helpers/activitypub' +import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor' import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils' import { logger } from '../../helpers/logger' import { createPrivateAndPublicKeys } from '../../helpers/peertube-crypto' -import { doRequest, doRequestAndSaveToFile, downloadImage } from '../../helpers/requests' +import { doRequest, downloadImage } from '../../helpers/requests' import { getUrlFromWebfinger } from '../../helpers/webfinger' -import { AVATARS_SIZE, CONFIG, IMAGE_MIMETYPE_EXT, PREVIEWS_SIZE, sequelizeTypescript } from '../../initializers' +import { AVATARS_SIZE, CONFIG, IMAGE_MIMETYPE_EXT, sequelizeTypescript } from '../../initializers' import { AccountModel } from '../../models/account/account' import { ActorModel } from '../../models/activitypub/actor' import { AvatarModel } from '../../models/avatar/avatar' @@ -43,7 +43,7 @@ async function getOrCreateActorAndServerAndModel ( recurseIfNeeded = true, updateCollections = false ) { - const actorUrl = getActorUrl(activityActor) + const actorUrl = getAPUrl(activityActor) let created = false let actor = await fetchActorByUrl(actorUrl, fetchType) diff --git a/server/lib/activitypub/process/process.ts b/server/lib/activitypub/process/process.ts index b9b255ddf..bcc5cac7a 100644 --- a/server/lib/activitypub/process/process.ts +++ b/server/lib/activitypub/process/process.ts @@ -1,5 +1,5 @@ import { Activity, ActivityType } from '../../../../shared/models/activitypub' -import { checkUrlsSameHost, getActorUrl } from '../../../helpers/activitypub' +import { checkUrlsSameHost, getAPUrl } from '../../../helpers/activitypub' import { logger } from '../../../helpers/logger' import { ActorModel } from '../../../models/activitypub/actor' import { processAcceptActivity } from './process-accept' @@ -40,7 +40,7 @@ async function processActivities ( continue } - const actorUrl = getActorUrl(activity.actor) + const actorUrl = getAPUrl(activity.actor) // When we fetch remote data, we don't have signature if (options.signatureActor && actorUrl !== options.signatureActor.url) { diff --git a/server/lib/activitypub/share.ts b/server/lib/activitypub/share.ts index d2649e2d5..5dcba778c 100644 --- a/server/lib/activitypub/share.ts +++ b/server/lib/activitypub/share.ts @@ -11,7 +11,7 @@ import { doRequest } from '../../helpers/requests' import { getOrCreateActorAndServerAndModel } from './actor' import { logger } from '../../helpers/logger' import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' -import { checkUrlsSameHost, getActorUrl } from '../../helpers/activitypub' +import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) { if (video.privacy === VideoPrivacy.PRIVATE) return undefined @@ -41,7 +41,7 @@ async function addVideoShares (shareUrls: string[], instance: VideoModel) { }) if (!body || !body.actor) throw new Error('Body or body actor is invalid') - const actorUrl = getActorUrl(body.actor) + const actorUrl = getAPUrl(body.actor) if (checkUrlsSameHost(shareUrl, actorUrl) !== true) { throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`) } diff --git a/server/lib/activitypub/video-rates.ts b/server/lib/activitypub/video-rates.ts index 1854b44c4..2cce67f0c 100644 --- a/server/lib/activitypub/video-rates.ts +++ b/server/lib/activitypub/video-rates.ts @@ -9,7 +9,7 @@ import { AccountVideoRateModel } from '../../models/account/account-video-rate' import { logger } from '../../helpers/logger' import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' import { doRequest } from '../../helpers/requests' -import { checkUrlsSameHost, getActorUrl } from '../../helpers/activitypub' +import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' import { ActorModel } from '../../models/activitypub/actor' import { getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from './url' @@ -26,7 +26,7 @@ async function createRates (ratesUrl: string[], video: VideoModel, rate: VideoRa }) if (!body || !body.actor) throw new Error('Body or body actor is invalid') - const actorUrl = getActorUrl(body.actor) + const actorUrl = getAPUrl(body.actor) if (checkUrlsSameHost(actorUrl, rateUrl) !== true) { throw new Error(`Rate url ${rateUrl} has not the same host than actor url ${actorUrl}`) } diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index 6ff9baefe..4cecf9345 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -29,7 +29,7 @@ import { createRates } from './video-rates' import { addVideoShares, shareVideoByServerAndChannel } from './share' import { AccountModel } from '../../models/account/account' import { fetchVideoByUrl, VideoFetchByUrlType } from '../../helpers/video' -import { checkUrlsSameHost } from '../../helpers/activitypub' +import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' async function federateVideoIfNeeded (video: VideoModel, isNewVideo: boolean, transaction?: sequelize.Transaction) { // If the video is not private and published, we federate it @@ -167,7 +167,7 @@ async function getOrCreateVideoAndAccountAndChannel (options: { const refreshViews = options.refreshViews || false // Get video url - const videoUrl = typeof options.videoObject === 'string' ? options.videoObject : options.videoObject.id + const videoUrl = getAPUrl(options.videoObject) let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType) if (videoFromDatabase) { From 0b2f03d3712f438f67eccf86b67acd047284f9b4 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Nov 2018 15:21:09 +0100 Subject: [PATCH 3/6] Speedup peertube startup --- server.ts | 6 ++++-- server/initializers/database.ts | 32 +++++++++++++++++--------------- server/initializers/installer.ts | 21 +++++++++++++++------ server/lib/user.ts | 15 +++++++++++---- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/server.ts b/server.ts index f3514cf9c..3025a6fd7 100644 --- a/server.ts +++ b/server.ts @@ -204,9 +204,11 @@ async function startApplication () { // Email initialization Emailer.Instance.init() - await Emailer.Instance.checkConnectionOrDie() - await JobQueue.Instance.init() + await Promise.all([ + Emailer.Instance.checkConnectionOrDie(), + JobQueue.Instance.init() + ]) // Caches initializations VideosPreviewCache.Instance.init(CONFIG.CACHE.PREVIEWS.SIZE, CACHE.PREVIEWS.MAX_AGE) diff --git a/server/initializers/database.ts b/server/initializers/database.ts index dd5b9bf67..40cd659ab 100644 --- a/server/initializers/database.ts +++ b/server/initializers/database.ts @@ -119,25 +119,27 @@ export { // --------------------------------------------------------------------------- async function checkPostgresExtensions () { - const extensions = [ - 'pg_trgm', - 'unaccent' + const promises = [ + checkPostgresExtension('pg_trgm'), + checkPostgresExtension('unaccent') ] - for (const extension of extensions) { - const query = `SELECT true AS enabled FROM pg_available_extensions WHERE name = '${extension}' AND installed_version IS NOT NULL;` - const [ res ] = await sequelizeTypescript.query(query, { raw: true }) + return Promise.all(promises) +} - if (!res || res.length === 0 || res[ 0 ][ 'enabled' ] !== true) { - // Try to create the extension ourself - try { - await sequelizeTypescript.query(`CREATE EXTENSION ${extension};`, { raw: true }) +async function checkPostgresExtension (extension: string) { + const query = `SELECT true AS enabled FROM pg_available_extensions WHERE name = '${extension}' AND installed_version IS NOT NULL;` + const [ res ] = await sequelizeTypescript.query(query, { raw: true }) - } catch { - const errorMessage = `You need to enable ${extension} extension in PostgreSQL. ` + - `You can do so by running 'CREATE EXTENSION ${extension};' as a PostgreSQL super user in ${CONFIG.DATABASE.DBNAME} database.` - throw new Error(errorMessage) - } + if (!res || res.length === 0 || res[ 0 ][ 'enabled' ] !== true) { + // Try to create the extension ourself + try { + await sequelizeTypescript.query(`CREATE EXTENSION ${extension};`, { raw: true }) + + } catch { + const errorMessage = `You need to enable ${extension} extension in PostgreSQL. ` + + `You can do so by running 'CREATE EXTENSION ${extension};' as a PostgreSQL super user in ${CONFIG.DATABASE.DBNAME} database.` + throw new Error(errorMessage) } } } diff --git a/server/initializers/installer.ts b/server/initializers/installer.ts index c952ad46c..b9a9da183 100644 --- a/server/initializers/installer.ts +++ b/server/initializers/installer.ts @@ -12,12 +12,21 @@ import { remove, ensureDir } from 'fs-extra' async function installApplication () { try { - await sequelizeTypescript.sync() - await removeCacheDirectories() - await createDirectoriesIfNotExist() - await createApplicationIfNotExist() - await createOAuthClientIfNotExist() - await createOAuthAdminIfNotExist() + await Promise.all([ + // Database related + sequelizeTypescript.sync() + .then(() => { + return Promise.all([ + createApplicationIfNotExist(), + createOAuthClientIfNotExist(), + createOAuthAdminIfNotExist() + ]) + }), + + // Directories + removeCacheDirectories() + .then(() => createDirectoriesIfNotExist()) + ]) } catch (err) { logger.error('Cannot install application.', { err }) process.exit(-1) diff --git a/server/lib/user.ts b/server/lib/user.ts index db29469eb..acb883e23 100644 --- a/server/lib/user.ts +++ b/server/lib/user.ts @@ -17,8 +17,10 @@ async function createUserAccountAndChannel (userToCreate: UserModel, validateUse validate: validateUser } - const userCreated = await userToCreate.save(userOptions) - const accountCreated = await createLocalAccountWithoutKeys(userToCreate.username, userToCreate.id, null, t) + const [ userCreated, accountCreated ] = await Promise.all([ + userToCreate.save(userOptions), + createLocalAccountWithoutKeys(userToCreate.username, userToCreate.id, null, t) + ]) userCreated.Account = accountCreated let channelName = userCreated.username + '_channel' @@ -37,8 +39,13 @@ async function createUserAccountAndChannel (userToCreate: UserModel, validateUse return { user: userCreated, account: accountCreated, videoChannel } }) - account.Actor = await setAsyncActorKeys(account.Actor) - videoChannel.Actor = await setAsyncActorKeys(videoChannel.Actor) + const [ accountKeys, channelKeys ] = await Promise.all([ + setAsyncActorKeys(account.Actor), + setAsyncActorKeys(videoChannel.Actor) + ]) + + account.Actor = accountKeys + videoChannel.Actor = channelKeys return { user, account, videoChannel } as { user: UserModel, account: AccountModel, videoChannel: VideoChannelModel } } From d175a6f7ab9dd53e36f9f52769ac02dbfdc57e3e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Nov 2018 17:08:18 +0100 Subject: [PATCH 4/6] Cleanup tests imports --- scripts/travis.sh | 15 ++++++--------- server/helpers/ffmpeg-utils.ts | 2 +- server/lib/user.ts | 6 ++---- server/models/account/user.ts | 4 ++-- server/models/oauth/oauth-token.ts | 4 ++-- server/tests/api/activitypub/security.ts | 3 ++- server/tests/api/users/index.ts | 2 +- .../api/videos/video-blacklist-management.ts | 3 +-- server/tests/api/videos/video-channels.ts | 6 ++++-- server/tests/api/videos/video-schedule-update.ts | 1 - server/tests/api/videos/video-transcoder.ts | 6 ++---- server/tests/utils/index.ts | 1 - server/tests/utils/requests/check-api-params.ts | 2 +- server/tests/utils/search/videos.ts | 2 +- server/tests/utils/server/config.ts | 2 +- server/tests/utils/server/jobs.ts | 3 ++- server/tests/utils/server/stats.ts | 2 +- server/tests/utils/users/accounts.ts | 2 +- server/tests/utils/users/blocklist.ts | 2 +- server/tests/utils/users/user-subscriptions.ts | 2 +- server/tests/utils/users/users.ts | 2 +- server/tests/utils/videos/video-abuses.ts | 2 +- server/tests/utils/videos/video-captions.ts | 4 ++-- server/tests/utils/videos/video-channels.ts | 2 +- server/tests/utils/videos/video-comments.ts | 2 +- server/tests/utils/videos/video-imports.ts | 2 +- server/tests/utils/videos/videos.ts | 4 ++-- 27 files changed, 41 insertions(+), 47 deletions(-) diff --git a/scripts/travis.sh b/scripts/travis.sh index 49b7233e1..509b40d87 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -11,28 +11,25 @@ killall -q peertube || true if [ "$1" = "misc" ]; then npm run build -- --light-fr - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/client.ts \ + mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/client.ts \ server/tests/feeds/index.ts \ server/tests/misc-endpoints.ts \ server/tests/helpers/index.ts -elif [ "$1" = "api" ]; then - npm run build:server - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index.ts elif [ "$1" = "cli" ]; then npm run build:server - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/cli/index.ts + mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/cli/index.ts elif [ "$1" = "api-1" ]; then npm run build:server - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-1.ts + mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-1.ts elif [ "$1" = "api-2" ]; then npm run build:server - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-2.ts + mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-2.ts elif [ "$1" = "api-3" ]; then npm run build:server - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-3.ts + mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-3.ts elif [ "$1" = "api-4" ]; then npm run build:server - mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-4.ts + mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-4.ts elif [ "$1" = "lint" ]; then npm run tslint -- --project ./tsconfig.json -c ./tslint.json server.ts "server/**/*.ts" "shared/**/*.ts" diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 8b9045038..b59e7e40e 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts @@ -1,7 +1,7 @@ import * as ffmpeg from 'fluent-ffmpeg' import { join } from 'path' import { getTargetBitrate, VideoResolution } from '../../shared/models/videos' -import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers' +import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers/constants' import { processImage } from './image-utils' import { logger } from './logger' import { checkFFmpegEncoders } from '../initializers/checker-before-init' diff --git a/server/lib/user.ts b/server/lib/user.ts index acb883e23..29d6d087d 100644 --- a/server/lib/user.ts +++ b/server/lib/user.ts @@ -17,10 +17,8 @@ async function createUserAccountAndChannel (userToCreate: UserModel, validateUse validate: validateUser } - const [ userCreated, accountCreated ] = await Promise.all([ - userToCreate.save(userOptions), - createLocalAccountWithoutKeys(userToCreate.username, userToCreate.id, null, t) - ]) + const userCreated = await userToCreate.save(userOptions) + const accountCreated = await createLocalAccountWithoutKeys(userCreated.username, userCreated.id, null, t) userCreated.Account = accountCreated let channelName = userCreated.username + '_channel' diff --git a/server/models/account/user.ts b/server/models/account/user.ts index 34aafa1a7..1843603f1 100644 --- a/server/models/account/user.ts +++ b/server/models/account/user.ts @@ -1,6 +1,6 @@ import * as Sequelize from 'sequelize' import { - AfterDelete, + AfterDestroy, AfterUpdate, AllowNull, BeforeCreate, @@ -179,7 +179,7 @@ export class UserModel extends Model { } @AfterUpdate - @AfterDelete + @AfterDestroy static removeTokenCache (instance: UserModel) { return clearCacheByUserId(instance.id) } diff --git a/server/models/oauth/oauth-token.ts b/server/models/oauth/oauth-token.ts index ecf846821..08d892da4 100644 --- a/server/models/oauth/oauth-token.ts +++ b/server/models/oauth/oauth-token.ts @@ -1,5 +1,5 @@ import { - AfterDelete, + AfterDestroy, AfterUpdate, AllowNull, BelongsTo, @@ -126,7 +126,7 @@ export class OAuthTokenModel extends Model { OAuthClients: OAuthClientModel[] @AfterUpdate - @AfterDelete + @AfterDestroy static removeTokenCache (token: OAuthTokenModel) { return clearCacheByToken(token.accessToken) } diff --git a/server/tests/api/activitypub/security.ts b/server/tests/api/activitypub/security.ts index e7899bb14..7349749f1 100644 --- a/server/tests/api/activitypub/security.ts +++ b/server/tests/api/activitypub/security.ts @@ -2,12 +2,13 @@ import 'mocha' -import { flushAndRunMultipleServers, flushTests, killallServers, makePOSTAPRequest, makeFollowRequest, ServerInfo } from '../../utils' +import { flushAndRunMultipleServers, flushTests, killallServers, ServerInfo } from '../../utils' import { HTTP_SIGNATURE } from '../../../initializers' import { buildDigest, buildGlobalHeaders } from '../../../lib/job-queue/handlers/utils/activitypub-http-utils' import * as chai from 'chai' import { setActorField } from '../../utils/miscs/sql' import { activityPubContextify, buildSignedActivity } from '../../../helpers/activitypub' +import { makeFollowRequest, makePOSTAPRequest } from '../../utils/requests/activitypub' const expect = chai.expect diff --git a/server/tests/api/users/index.ts b/server/tests/api/users/index.ts index 0a1b8b0b2..ff433315d 100644 --- a/server/tests/api/users/index.ts +++ b/server/tests/api/users/index.ts @@ -1,5 +1,5 @@ import './blocklist' import './user-subscriptions' import './users' -import './users-verification' import './users-multiple-servers' +import './users-verification' diff --git a/server/tests/api/videos/video-blacklist-management.ts b/server/tests/api/videos/video-blacklist-management.ts index 7bf39dc99..fab577b30 100644 --- a/server/tests/api/videos/video-blacklist-management.ts +++ b/server/tests/api/videos/video-blacklist-management.ts @@ -1,7 +1,7 @@ /* tslint:disable:no-unused-expression */ import * as chai from 'chai' -import * as lodash from 'lodash' +import { orderBy } from 'lodash' import 'mocha' import { addVideoToBlacklist, @@ -22,7 +22,6 @@ import { waitJobs } from '../../utils/server/jobs' import { VideoAbuse } from '../../../../shared/models/videos' const expect = chai.expect -const orderBy = lodash.orderBy describe('Test video blacklist management', function () { let servers: ServerInfo[] = [] diff --git a/server/tests/api/videos/video-channels.ts b/server/tests/api/videos/video-channels.ts index 8138c65d6..41429a3d8 100644 --- a/server/tests/api/videos/video-channels.ts +++ b/server/tests/api/videos/video-channels.ts @@ -7,10 +7,12 @@ import { createUser, doubleFollow, flushAndRunMultipleServers, - getVideoChannelVideos, serverLogin, testImage, + getVideoChannelVideos, + testImage, updateVideo, updateVideoChannelAvatar, - uploadVideo, wait, userLogin + uploadVideo, + userLogin } from '../../utils' import { addVideoChannel, diff --git a/server/tests/api/videos/video-schedule-update.ts b/server/tests/api/videos/video-schedule-update.ts index a260fa4da..b226a9d50 100644 --- a/server/tests/api/videos/video-schedule-update.ts +++ b/server/tests/api/videos/video-schedule-update.ts @@ -16,7 +16,6 @@ import { uploadVideo, wait } from '../../utils' -import { join } from 'path' import { waitJobs } from '../../utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index 85795d2ed..23920d452 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -3,13 +3,13 @@ import * as chai from 'chai' import 'mocha' import { omit } from 'lodash' -import * as ffmpeg from 'fluent-ffmpeg' import { getMaxBitrate, VideoDetails, VideoResolution, VideoState } from '../../../../shared/models/videos' import { audio, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' import { buildAbsoluteFixturePath, doubleFollow, flushAndRunMultipleServers, + generateHighBitrateVideo, getMyVideos, getVideo, getVideosList, @@ -18,12 +18,10 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo, - webtorrentAdd, - generateHighBitrateVideo + webtorrentAdd } from '../../utils' import { join } from 'path' import { waitJobs } from '../../utils/server/jobs' -import { pathExists } from 'fs-extra' import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' const expect = chai.expect diff --git a/server/tests/utils/index.ts b/server/tests/utils/index.ts index 905d93823..8349631c9 100644 --- a/server/tests/utils/index.ts +++ b/server/tests/utils/index.ts @@ -7,7 +7,6 @@ export * from './miscs/miscs' export * from './miscs/stubs' export * from './server/follows' export * from './requests/requests' -export * from './requests/activitypub' export * from './server/servers' export * from './videos/services' export * from './users/users' diff --git a/server/tests/utils/requests/check-api-params.ts b/server/tests/utils/requests/check-api-params.ts index edb47e0e9..a2a549682 100644 --- a/server/tests/utils/requests/check-api-params.ts +++ b/server/tests/utils/requests/check-api-params.ts @@ -1,5 +1,5 @@ import { makeGetRequest } from './requests' -import { immutableAssign } from '..' +import { immutableAssign } from '../miscs/miscs' function checkBadStartPagination (url: string, path: string, token?: string, query = {}) { return makeGetRequest({ diff --git a/server/tests/utils/search/videos.ts b/server/tests/utils/search/videos.ts index 3a0c10e42..8c0037ccc 100644 --- a/server/tests/utils/search/videos.ts +++ b/server/tests/utils/search/videos.ts @@ -2,7 +2,7 @@ import * as request from 'supertest' import { VideosSearchQuery } from '../../../../shared/models/search' -import { immutableAssign } from '..' +import { immutableAssign } from '../miscs/miscs' function searchVideo (url: string, search: string) { const path = '/api/v1/search/videos' diff --git a/server/tests/utils/server/config.ts b/server/tests/utils/server/config.ts index b85e02ab7..aa3100d34 100644 --- a/server/tests/utils/server/config.ts +++ b/server/tests/utils/server/config.ts @@ -1,4 +1,4 @@ -import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../' +import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../requests/requests' import { CustomConfig } from '../../../../shared/models/server/custom-config.model' function getConfig (url: string) { diff --git a/server/tests/utils/server/jobs.ts b/server/tests/utils/server/jobs.ts index 4c02cace5..26180ec72 100644 --- a/server/tests/utils/server/jobs.ts +++ b/server/tests/utils/server/jobs.ts @@ -1,6 +1,7 @@ import * as request from 'supertest' import { Job, JobState } from '../../../../shared/models' -import { ServerInfo, wait } from '../index' +import { ServerInfo } from './servers' +import { wait } from '../miscs/miscs' function getJobsList (url: string, accessToken: string, state: JobState) { const path = '/api/v1/jobs/' + state diff --git a/server/tests/utils/server/stats.ts b/server/tests/utils/server/stats.ts index 01989d952..6f079ad18 100644 --- a/server/tests/utils/server/stats.ts +++ b/server/tests/utils/server/stats.ts @@ -1,4 +1,4 @@ -import { makeGetRequest } from '../' +import { makeGetRequest } from '../requests/requests' function getStats (url: string, useCache = false) { const path = '/api/v1/server/stats' diff --git a/server/tests/utils/users/accounts.ts b/server/tests/utils/users/accounts.ts index f82b8d906..257fa5b27 100644 --- a/server/tests/utils/users/accounts.ts +++ b/server/tests/utils/users/accounts.ts @@ -4,7 +4,7 @@ import { expect } from 'chai' import { existsSync, readdir } from 'fs-extra' import { join } from 'path' import { Account } from '../../../../shared/models/actors' -import { root } from '../index' +import { root } from '../miscs/miscs' import { makeGetRequest } from '../requests/requests' function getAccountsList (url: string, sort = '-createdAt', statusCodeExpected = 200) { diff --git a/server/tests/utils/users/blocklist.ts b/server/tests/utils/users/blocklist.ts index 35b537571..0ead5e5f6 100644 --- a/server/tests/utils/users/blocklist.ts +++ b/server/tests/utils/users/blocklist.ts @@ -1,6 +1,6 @@ /* tslint:disable:no-unused-expression */ -import { makeDeleteRequest, makePostBodyRequest } from '../index' +import { makeDeleteRequest, makePostBodyRequest } from '../requests/requests' import { makeGetRequest } from '../requests/requests' function getAccountBlocklistByAccount ( diff --git a/server/tests/utils/users/user-subscriptions.ts b/server/tests/utils/users/user-subscriptions.ts index b0e7da7cc..7148fbfca 100644 --- a/server/tests/utils/users/user-subscriptions.ts +++ b/server/tests/utils/users/user-subscriptions.ts @@ -1,4 +1,4 @@ -import { makeDeleteRequest, makeGetRequest, makePostBodyRequest } from '../' +import { makeDeleteRequest, makeGetRequest, makePostBodyRequest } from '../requests/requests' function addUserSubscription (url: string, token: string, targetUri: string, statusCodeExpected = 204) { const path = '/api/v1/users/me/subscriptions' diff --git a/server/tests/utils/users/users.ts b/server/tests/utils/users/users.ts index d77233d62..2c21a9ecf 100644 --- a/server/tests/utils/users/users.ts +++ b/server/tests/utils/users/users.ts @@ -1,5 +1,5 @@ import * as request from 'supertest' -import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../' +import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../requests/requests' import { UserRole } from '../../../../shared/index' import { NSFWPolicyType } from '../../../../shared/models/videos/nsfw-policy.type' diff --git a/server/tests/utils/videos/video-abuses.ts b/server/tests/utils/videos/video-abuses.ts index 14907e6a0..4ad82ad8c 100644 --- a/server/tests/utils/videos/video-abuses.ts +++ b/server/tests/utils/videos/video-abuses.ts @@ -1,6 +1,6 @@ import * as request from 'supertest' import { VideoAbuseUpdate } from '../../../../shared/models/videos/abuse/video-abuse-update.model' -import { makeDeleteRequest, makePutBodyRequest } from '..' +import { makeDeleteRequest, makePutBodyRequest } from '../requests/requests' function reportVideoAbuse (url: string, token: string, videoId: number | string, reason: string, specialStatus = 200) { const path = '/api/v1/videos/' + videoId + '/abuse' diff --git a/server/tests/utils/videos/video-captions.ts b/server/tests/utils/videos/video-captions.ts index 41e52be07..8d67f617b 100644 --- a/server/tests/utils/videos/video-captions.ts +++ b/server/tests/utils/videos/video-captions.ts @@ -1,7 +1,7 @@ -import { makeDeleteRequest, makeGetRequest } from '../' -import { buildAbsoluteFixturePath, makeUploadRequest } from '../index' +import { makeDeleteRequest, makeGetRequest, makeUploadRequest } from '../requests/requests' import * as request from 'supertest' import * as chai from 'chai' +import { buildAbsoluteFixturePath } from '../miscs/miscs' const expect = chai.expect diff --git a/server/tests/utils/videos/video-channels.ts b/server/tests/utils/videos/video-channels.ts index 092985777..70e8d1a6b 100644 --- a/server/tests/utils/videos/video-channels.ts +++ b/server/tests/utils/videos/video-channels.ts @@ -1,6 +1,6 @@ import * as request from 'supertest' import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared/models/videos' -import { updateAvatarRequest } from '../index' +import { updateAvatarRequest } from '../requests/requests' function getVideoChannelsList (url: string, start: number, count: number, sort?: string) { const path = '/api/v1/video-channels' diff --git a/server/tests/utils/videos/video-comments.ts b/server/tests/utils/videos/video-comments.ts index 7d4cae364..0ebf69ced 100644 --- a/server/tests/utils/videos/video-comments.ts +++ b/server/tests/utils/videos/video-comments.ts @@ -1,5 +1,5 @@ import * as request from 'supertest' -import { makeDeleteRequest } from '../' +import { makeDeleteRequest } from '../requests/requests' function getVideoCommentThreads (url: string, videoId: number | string, start: number, count: number, sort?: string, token?: string) { const path = '/api/v1/videos/' + videoId + '/comment-threads' diff --git a/server/tests/utils/videos/video-imports.ts b/server/tests/utils/videos/video-imports.ts index 59dfd481a..eb985a5b1 100644 --- a/server/tests/utils/videos/video-imports.ts +++ b/server/tests/utils/videos/video-imports.ts @@ -1,5 +1,5 @@ import { VideoImportCreate } from '../../../../shared/models/videos' -import { makeGetRequest, makeUploadRequest } from '..' +import { makeGetRequest, makeUploadRequest } from '../requests/requests' function getYoutubeVideoUrl () { return 'https://youtu.be/msX3jv1XdvM' diff --git a/server/tests/utils/videos/videos.ts b/server/tests/utils/videos/videos.ts index 87c385f38..d6c3e5dac 100644 --- a/server/tests/utils/videos/videos.ts +++ b/server/tests/utils/videos/videos.ts @@ -17,8 +17,8 @@ import { testImage } from '../' import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos' -import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers' -import { dateIsValid, webtorrentAdd } from '../index' +import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers/constants' +import { dateIsValid, webtorrentAdd } from '../miscs/miscs' type VideoAttributes = { name?: string From 65f02679303bbf7beebe222eff3ad9394fe23fea Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Mon, 19 Nov 2018 22:07:29 +0100 Subject: [PATCH 5/6] fix rest api quickstart and specify values in openapi spec --- support/doc/api/openapi.yaml | 9 +++++++-- support/doc/api/quickstart.md | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index af829cc62..8fbc52e99 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -101,14 +101,13 @@ x-tagGroups: - Video - Video Channel - Video Comment - - Video Abuse - Video Following - Video Rate - name: Moderation tags: - Video Abuse - Video Blacklist - - name: Public Instance Information + - name: Instance Configuration tags: - Config - Server Following @@ -316,6 +315,12 @@ paths: description: The state of the job schema: type: string + enum: + - active + - completed + - failed + - waiting + - delayed - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' diff --git a/support/doc/api/quickstart.md b/support/doc/api/quickstart.md index 844248a7f..6c19b59ee 100644 --- a/support/doc/api/quickstart.md +++ b/support/doc/api/quickstart.md @@ -43,7 +43,7 @@ Response example: Just use the `access_token` in the `Authorization` header: ``` -$ curl -H 'Authorization: Bearer 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0' https://peertube.example.com/api/v1/jobs/complete +$ curl -H 'Authorization: Bearer 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0' https://peertube.example.com/api/v1/jobs/completed ``` @@ -51,4 +51,4 @@ $ curl -H 'Authorization: Bearer 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0' https ``` $ curl https://peertube.example.com/api/v1/videos -``` \ No newline at end of file +``` From d216b5387fb774d1355df3ace002f7be469bd450 Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Mon, 19 Nov 2018 22:10:35 +0100 Subject: [PATCH 6/6] add job state in path in openapi spec --- support/doc/api/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index 8fbc52e99..aa6be7e87 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -300,7 +300,7 @@ paths: responses: '200': description: successful operation - /jobs: + /jobs/{state}: get: summary: Get list of jobs security: