From 299474e8279675adb6c5ce140e7e39c6f3439453 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 2 Aug 2018 16:33:29 +0200 Subject: [PATCH] Add ability to remove a video import --- .../+video-edit/video-import.component.html | 5 +++++ server/controllers/api/videos/import.ts | 12 +++++++++-- .../custom-validators/video-imports.ts | 21 ++++++++++++++++++- .../schedulers/youtube-dl-update-scheduler.ts | 2 +- .../middlewares/validators/video-imports.ts | 14 ++++++++++--- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/client/src/app/videos/+video-edit/video-import.component.html b/client/src/app/videos/+video-edit/video-import.component.html index 9d71a0717..d59c6a23a 100644 --- a/client/src/app/videos/+video-edit/video-import.component.html +++ b/client/src/app/videos/+video-edit/video-import.component.html @@ -4,6 +4,11 @@
+ +
diff --git a/server/controllers/api/videos/import.ts b/server/controllers/api/videos/import.ts index 9761cdbcf..680d8665f 100644 --- a/server/controllers/api/videos/import.ts +++ b/server/controllers/api/videos/import.ts @@ -41,7 +41,7 @@ videoImportsRouter.post('/imports', videoImportsRouter.delete('/imports/:id', authenticate, - videoImportDeleteValidator, + asyncMiddleware(videoImportDeleteValidator), asyncRetryTransactionMiddleware(deleteVideoImport) ) @@ -147,5 +147,13 @@ async function addVideoImport (req: express.Request, res: express.Response) { } async function deleteVideoImport (req: express.Request, res: express.Response) { - // TODO: delete video import + await sequelizeTypescript.transaction(async t => { + const videoImport = res.locals.videoImport + const video = videoImport.Video + + await videoImport.destroy({ transaction: t }) + await video.destroy({ transaction: t }) + }) + + return res.status(204).end() } diff --git a/server/helpers/custom-validators/video-imports.ts b/server/helpers/custom-validators/video-imports.ts index 36c0559fd..d8b9bfaff 100644 --- a/server/helpers/custom-validators/video-imports.ts +++ b/server/helpers/custom-validators/video-imports.ts @@ -3,6 +3,9 @@ import 'multer' import * as validator from 'validator' import { CONSTRAINTS_FIELDS, VIDEO_IMPORT_STATES } from '../../initializers' import { exists } from './misc' +import * as express from 'express' +import { VideoChannelModel } from '../../models/video/video-channel' +import { VideoImportModel } from '../../models/video/video-import' function isVideoImportTargetUrlValid (url: string) { const isURLOptions = { @@ -22,9 +25,25 @@ function isVideoImportStateValid (value: any) { return exists(value) && VIDEO_IMPORT_STATES[ value ] !== undefined } +async function isVideoImportExist (id: number, res: express.Response) { + const videoImport = await VideoImportModel.loadAndPopulateVideo(id) + + if (!videoImport) { + res.status(404) + .json({ error: 'Video import not found' }) + .end() + + return false + } + + res.locals.videoImport = videoImport + return true +} + // --------------------------------------------------------------------------- export { isVideoImportStateValid, - isVideoImportTargetUrlValid + isVideoImportTargetUrlValid, + isVideoImportExist } diff --git a/server/lib/schedulers/youtube-dl-update-scheduler.ts b/server/lib/schedulers/youtube-dl-update-scheduler.ts index b736f17ee..a2d919603 100644 --- a/server/lib/schedulers/youtube-dl-update-scheduler.ts +++ b/server/lib/schedulers/youtube-dl-update-scheduler.ts @@ -1,5 +1,5 @@ // Thanks: https://github.com/przemyslawpluta/node-youtube-dl/blob/master/lib/downloader.js -// Use rewrote it to avoid sync calls +// We rewrote it to avoid sync calls import { AbstractScheduler } from './abstract-scheduler' import { SCHEDULER_INTERVALS_MS } from '../../initializers' diff --git a/server/middlewares/validators/video-imports.ts b/server/middlewares/validators/video-imports.ts index 0ba759ff0..0dedcf803 100644 --- a/server/middlewares/validators/video-imports.ts +++ b/server/middlewares/validators/video-imports.ts @@ -4,9 +4,11 @@ import { isIdValid } from '../../helpers/custom-validators/misc' import { logger } from '../../helpers/logger' import { areValidationErrors } from './utils' import { getCommonVideoAttributes } from './videos' -import { isVideoImportTargetUrlValid } from '../../helpers/custom-validators/video-imports' +import { isVideoImportTargetUrlValid, isVideoImportExist } from '../../helpers/custom-validators/video-imports' import { cleanUpReqFiles } from '../../helpers/utils' -import { isVideoChannelOfAccountExist, isVideoNameValid } from '../../helpers/custom-validators/videos' +import { isVideoChannelOfAccountExist, isVideoNameValid, checkUserCanManageVideo } from '../../helpers/custom-validators/videos' +import { VideoImportModel } from '../../models/video/video-import' +import { UserRight } from '../../../shared' const videoImportAddValidator = getCommonVideoAttributes().concat([ body('targetUrl').custom(isVideoImportTargetUrlValid).withMessage('Should have a valid video import target URL'), @@ -32,10 +34,16 @@ const videoImportAddValidator = getCommonVideoAttributes().concat([ const videoImportDeleteValidator = [ param('id').custom(isIdValid).not().isEmpty().withMessage('Should have a valid id'), - (req: express.Request, res: express.Response, next: express.NextFunction) => { + async (req: express.Request, res: express.Response, next: express.NextFunction) => { logger.debug('Checking videoImportDeleteValidator parameters', { parameters: req.body }) if (areValidationErrors(req, res)) return + if (!await isVideoImportExist(req.params.id, res)) return + + const user = res.locals.oauth.token.User + const videoImport: VideoImportModel = res.locals.videoImport + + if (!await checkUserCanManageVideo(user, videoImport.Video, UserRight.UPDATE_ANY_VIDEO, res)) return return next() }