First version with PostgreSQL
[oweals/peertube.git] / server / controllers / api / remote.js
index 17b1d07c4bcd40bbe17a08393ba0151da58b3ca2..d856576a9f2ae880c4f134bc4f9b3750566e0d41 100644 (file)
@@ -3,21 +3,19 @@
 const each = require('async/each')
 const eachSeries = require('async/eachSeries')
 const express = require('express')
-const mongoose = require('mongoose')
+const waterfall = require('async/waterfall')
 
+const db = require('../../initializers/database')
 const middlewares = require('../../middlewares')
 const secureMiddleware = middlewares.secure
 const validators = middlewares.validators.remote
 const logger = require('../../helpers/logger')
 
 const router = express.Router()
-const Video = mongoose.model('Video')
 
 router.post('/videos',
   validators.signature,
-  validators.dataToDecrypt,
   secureMiddleware.checkSignature,
-  secureMiddleware.decryptBody,
   validators.remoteVideos,
   remoteVideos
 )
@@ -30,7 +28,7 @@ module.exports = router
 
 function remoteVideos (req, res, next) {
   const requests = req.body.data
-  const fromUrl = req.body.signature.url
+  const fromHost = req.body.signature.host
 
   // We need to process in the same order to keep consistency
   // TODO: optimization
@@ -38,9 +36,9 @@ function remoteVideos (req, res, next) {
     const videoData = request.data
 
     if (request.type === 'add') {
-      addRemoteVideo(videoData, callbackEach)
+      addRemoteVideo(videoData, fromHost, callbackEach)
     } else if (request.type === 'remove') {
-      removeRemoteVideo(videoData, fromUrl, callbackEach)
+      removeRemoteVideo(videoData, fromHost, callbackEach)
     } else {
       logger.error('Unkown remote request type %s.', request.type)
     }
@@ -52,32 +50,102 @@ function remoteVideos (req, res, next) {
   return res.type('json').status(204).end()
 }
 
-function addRemoteVideo (videoToCreateData, callback) {
-  logger.debug('Adding remote video %s.', videoToCreateData.magnetUri)
-
-  // Mongoose pre hook will automatically create the thumbnail on disk
-  videoToCreateData.thumbnail = videoToCreateData.thumbnailBase64
+function addRemoteVideo (videoToCreateData, fromHost, callback) {
+  logger.debug('Adding remote video "%s".', videoToCreateData.name)
+
+  waterfall([
+
+    function findOrCreatePod (callback) {
+      fromHost
+
+      const query = {
+        where: {
+          host: fromHost
+        },
+        defaults: {
+          host: fromHost
+        }
+      }
+
+      db.Pod.findOrCreate(query).asCallback(function (err, result) {
+        // [ instance, wasCreated ]
+        return callback(err, result[0])
+      })
+    },
+
+    function findOrCreateAuthor (pod, callback) {
+      const username = videoToCreateData.author
+
+      const query = {
+        where: {
+          name: username,
+          podId: pod.id
+        },
+        defaults: {
+          name: username,
+          podId: pod.id
+        }
+      }
+
+      db.Author.findOrCreate(query).asCallback(function (err, result) {
+        // [ instance, wasCreated ]
+        return callback(err, result[0])
+      })
+    },
+
+    function createVideoObject (author, callback) {
+      const videoData = {
+        name: videoToCreateData.name,
+        remoteId: videoToCreateData.remoteId,
+        extname: videoToCreateData.extname,
+        infoHash: videoToCreateData.infoHash,
+        description: videoToCreateData.description,
+        authorId: author.id,
+        duration: videoToCreateData.duration,
+        tags: videoToCreateData.tags
+      }
+
+      const video = db.Video.build(videoData)
+
+      return callback(null, video)
+    },
+
+    function generateThumbnail (video, callback) {
+      db.Video.generateThumbnailFromBase64(video, videoToCreateData.thumbnailBase64, function (err) {
+        if (err) {
+          logger.error('Cannot generate thumbnail from base 64 data.', { error: err })
+          return callback(err)
+        }
+
+        video.save().asCallback(callback)
+      })
+    },
+
+    function insertIntoDB (video, callback) {
+      video.save().asCallback(callback)
+    }
 
-  const video = new Video(videoToCreateData)
-  video.save(callback)
+  ], callback)
 }
 
-function removeRemoteVideo (videoToRemoveData, fromUrl, callback) {
+function removeRemoteVideo (videoToRemoveData, fromHost, callback) {
+  // TODO: use bulkDestroy?
+
   // We need the list because we have to remove some other stuffs (thumbnail etc)
-  Video.listByUrlAndMagnet(fromUrl, videoToRemoveData.magnetUri, function (err, videosList) {
+  db.Video.listByHostAndRemoteId(fromHost, videoToRemoveData.remoteId, function (err, videosList) {
     if (err) {
-      logger.error('Cannot list videos from url and magnets.', { error: err })
+      logger.error('Cannot list videos from host and remote id.', { error: err.message })
       return callback(err)
     }
 
     if (videosList.length === 0) {
-      logger.error('No remote video was found for this pod.', { magnetUri: videoToRemoveData.magnetUri, podUrl: fromUrl })
+      logger.error('No remote video was found for this pod.', { remoteId: videoToRemoveData.remoteId, podHost: fromHost })
     }
 
     each(videosList, function (video, callbackEach) {
-      logger.debug('Removing remote video %s.', video.magnetUri)
+      logger.debug('Removing remote video %s.', video.remoteId)
 
-      video.remove(callbackEach)
+      video.destroy().asCallback(callbackEach)
     }, callback)
   })
 }