Add ability to remove a video import
authorChocobozzz <me@florianbigard.com>
Thu, 2 Aug 2018 14:33:29 +0000 (16:33 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 6 Aug 2018 09:19:16 +0000 (11:19 +0200)
client/src/app/videos/+video-edit/video-import.component.html
server/controllers/api/videos/import.ts
server/helpers/custom-validators/video-imports.ts
server/lib/schedulers/youtube-dl-update-scheduler.ts
server/middlewares/validators/video-imports.ts

index 9d71a07178145262497ef39e147288818e4ffe57..d59c6a23acf2a1920133ac7ff29de253827015a8 100644 (file)
@@ -4,6 +4,11 @@
 
     <div class="form-group">
       <label i18n for="targetUrl">URL</label>
+      <my-help
+        helpType="custom" i18n-customHtml
+        customHtml="You can import any URL <a href='https://rg3.github.io/youtube-dl/supportedsites.html'>supported by youtube-dl</a> or URL that points to a raw MP4 file. Failure to secure these rights could cause legal trouble to yourself and your instance."
+      ></my-help>
+
       <input type="text" id="targetUrl" [(ngModel)]="targetUrl" />
     </div>
 
index 9761cdbcfb3bc53682003dd6e3fd45c528175fe6..680d8665fdfcf0eaea0f4b2b5201d8dfef6b3714 100644 (file)
@@ -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()
 }
index 36c0559fd82326019e89531f0014c038ff74f742..d8b9bfaff09ba6274e00e79975a0ba6536192671 100644 (file)
@@ -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
 }
index b736f17ee19961f5b763ec1f1811bcb74ce3a6a5..a2d91960359223a07d09f5409229e5c3ac94ea1e 100644 (file)
@@ -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'
index 0ba759ff01fd2da448f0bec3db36f396828d7e07..0dedcf803cdf4fa7c0e342ab60c7b88a163e6e4c 100644 (file)
@@ -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()
   }