From 2df82d42cb57783cd90ccfc11fc8ffe4b95ebb70 Mon Sep 17 00:00:00 2001
From: Chocobozzz <florian.bigard@gmail.com>
Date: Fri, 18 Mar 2016 16:28:09 +0100
Subject: [PATCH] Change api output for videos

---
 .../list/videos-list.component.html           |  4 +--
 client/angular/videos/models/video.ts         |  4 ++-
 server/controllers/api/v1/videos.js           | 36 +++++++++++++++----
 server/lib/videos.js                          |  4 +--
 server/middlewares/reqValidators/videos.js    | 16 ++++-----
 server/tests/api/multiplePods.js              | 14 ++++----
 server/tests/api/singlePod.js                 | 26 ++++++++++++--
 server/tests/api/utils.js                     | 12 +++++++
 8 files changed, 87 insertions(+), 29 deletions(-)

diff --git a/client/angular/videos/components/list/videos-list.component.html b/client/angular/videos/components/list/videos-list.component.html
index 7ecdacee47..38708aff61 100644
--- a/client/angular/videos/components/list/videos-list.component.html
+++ b/client/angular/videos/components/list/videos-list.component.html
@@ -1,8 +1,8 @@
 <div *ngFor="#video of videos" class="video">
   <div>
-    <a [routerLink]="['VideosWatch', { id: video._id }]" class="video_name">{{ video.name }}</a>
+    <a [routerLink]="['VideosWatch', { id: video.id }]" class="video_name">{{ video.name }}</a>
     <span class="video_pod_url">{{ video.podUrl }}</span>
-    <span *ngIf="video.namePath !== null" (click)="removeVideo(video._id)" class="video_remove glyphicon glyphicon-remove"></span>
+    <span *ngIf="video.isLocal === true" (click)="removeVideo(video.id)" class="video_remove glyphicon glyphicon-remove"></span>
   </div>
 
   <div class="video_description">
diff --git a/client/angular/videos/models/video.ts b/client/angular/videos/models/video.ts
index 2f998c49a4..e52c6d8861 100644
--- a/client/angular/videos/models/video.ts
+++ b/client/angular/videos/models/video.ts
@@ -1,6 +1,8 @@
 export interface Video {
-  _id: string;
+  id: string;
   name: string;
   description: string;
   magnetUri: string;
+  podUrl: string;
+  isLocal: boolean;
 }
diff --git a/server/controllers/api/v1/videos.js b/server/controllers/api/v1/videos.js
index 1eea417d41..4384724c14 100644
--- a/server/controllers/api/v1/videos.js
+++ b/server/controllers/api/v1/videos.js
@@ -83,14 +83,15 @@ function addVideo (req, res, next) {
 }
 
 function getVideos (req, res, next) {
-  Videos.get(req.params.id, function (err, video) {
+  Videos.get(req.params.id, function (err, video_obj) {
     if (err) return next(err)
 
-    if (video === null) {
-      res.type('json').status(204).end()
+    const state = videos.getVideoState(video_obj)
+    if (state.exist === false) {
+      return res.type('json').status(204).end()
     }
 
-    res.json(video)
+    res.json(getFormatedVideo(video_obj))
   })
 }
 
@@ -98,7 +99,7 @@ function listVideos (req, res, next) {
   Videos.list(function (err, videos_list) {
     if (err) return next(err)
 
-    res.json(videos_list)
+    res.json(getFormatedVideos(videos_list))
   })
 }
 
@@ -127,12 +128,35 @@ function searchVideos (req, res, next) {
   Videos.search(req.params.name, function (err, videos_list) {
     if (err) return next(err)
 
-    res.json(videos_list)
+    res.json(getFormatedVideos(videos_list))
   })
 }
 
 // ---------------------------------------------------------------------------
 
+function getFormatedVideo (video_obj) {
+  const formated_video = {
+    id: video_obj._id,
+    name: video_obj.name,
+    description: video_obj.description,
+    podUrl: video_obj.podUrl,
+    isLocal: videos.getVideoState(video_obj).owned,
+    magnetUri: video_obj.magnetUri
+  }
+
+  return formated_video
+}
+
+function getFormatedVideos (videos_obj) {
+  const formated_videos = []
+
+  videos_obj.forEach(function (video_obj) {
+    formated_videos.push(getFormatedVideo(video_obj))
+  })
+
+  return formated_videos
+}
+
 // Maybe the torrent is not seeded, but we catch the error to don't stop the removing process
 function removeTorrent (magnetUri, callback) {
   try {
diff --git a/server/lib/videos.js b/server/lib/videos.js
index eb3a0125a8..24178561d9 100644
--- a/server/lib/videos.js
+++ b/server/lib/videos.js
@@ -16,14 +16,14 @@ const videos = {
   seedAllExisting: seedAllExisting
 }
 
-function getVideoState (video, callback) {
+function getVideoState (video) {
   const exist = (video !== null)
   let owned = false
   if (exist === true) {
     owned = (video.namePath !== null)
   }
 
-  return callback({ exist: exist, owned: owned })
+  return { exist: exist, owned: owned }
 }
 
 function seed (path, callback) {
diff --git a/server/middlewares/reqValidators/videos.js b/server/middlewares/reqValidators/videos.js
index 4057e72cd3..12e878e811 100644
--- a/server/middlewares/reqValidators/videos.js
+++ b/server/middlewares/reqValidators/videos.js
@@ -35,11 +35,10 @@ function videosGet (req, res, next) {
         res.sendStatus(500)
       }
 
-      videos.getVideoState(video, function (state) {
-        if (state.exist === false) return res.status(404).send('Video not found')
+      const state = videos.getVideoState(video)
+      if (state.exist === false) return res.status(404).send('Video not found')
 
-        next()
-      })
+      next()
     })
   })
 }
@@ -56,12 +55,11 @@ function videosRemove (req, res, next) {
         res.sendStatus(500)
       }
 
-      videos.getVideoState(video, function (state) {
-        if (state.exist === false) return res.status(404).send('Video not found')
-        else if (state.owned === false) return res.status(403).send('Cannot remove video of another pod')
+      const state = videos.getVideoState(video)
+      if (state.exist === false) return res.status(404).send('Video not found')
+      else if (state.owned === false) return res.status(403).send('Cannot remove video of another pod')
 
-        next()
-      })
+      next()
     })
   })
 }
diff --git a/server/tests/api/multiplePods.js b/server/tests/api/multiplePods.js
index e8b1826221..0e2355a553 100644
--- a/server/tests/api/multiplePods.js
+++ b/server/tests/api/multiplePods.js
@@ -205,8 +205,8 @@ describe('Test multiple pods', function () {
         if (err) throw err
 
         const video = res.body[0]
-        to_remove.push(res.body[2]._id)
-        to_remove.push(res.body[3]._id)
+        to_remove.push(res.body[2].id)
+        to_remove.push(res.body[3].id)
 
         webtorrent.add(video.magnetUri, function (torrent) {
           expect(torrent.files).to.exist
@@ -300,11 +300,11 @@ describe('Test multiple pods', function () {
           const videos = res.body
           expect(videos).to.be.an('array')
           expect(videos.length).to.equal(2)
-          expect(videos[0]._id).not.to.equal(videos[1]._id)
-          expect(videos[0]._id).not.to.equal(to_remove[0])
-          expect(videos[1]._id).not.to.equal(to_remove[0])
-          expect(videos[0]._id).not.to.equal(to_remove[1])
-          expect(videos[1]._id).not.to.equal(to_remove[1])
+          expect(videos[0].id).not.to.equal(videos[1].id)
+          expect(videos[0].id).not.to.equal(to_remove[0])
+          expect(videos[1].id).not.to.equal(to_remove[0])
+          expect(videos[0].id).not.to.equal(to_remove[1])
+          expect(videos[1].id).not.to.equal(to_remove[1])
 
           callback()
         })
diff --git a/server/tests/api/singlePod.js b/server/tests/api/singlePod.js
index 14f893f13e..0b96f221a0 100644
--- a/server/tests/api/singlePod.js
+++ b/server/tests/api/singlePod.js
@@ -68,7 +68,30 @@ describe('Test a single pod', function () {
       expect(video.podUrl).to.equal('http://localhost:9001')
       expect(video.magnetUri).to.exist
 
-      video_id = video._id
+      video_id = video.id
+
+      webtorrent.add(video.magnetUri, function (torrent) {
+        expect(torrent.files).to.exist
+        expect(torrent.files.length).to.equal(1)
+        expect(torrent.files[0].path).to.exist.and.to.not.equal('')
+
+        done()
+      })
+    })
+  })
+
+  it('Should get the video', function (done) {
+    // Yes, this could be long
+    this.timeout(60000)
+
+    utils.getVideo(url, video_id, function (err, res) {
+      if (err) throw err
+
+      const video = res.body
+      expect(video.name).to.equal('my super name')
+      expect(video.description).to.equal('my super description')
+      expect(video.podUrl).to.equal('http://localhost:9001')
+      expect(video.magnetUri).to.exist
 
       webtorrent.add(video.magnetUri, function (torrent) {
         expect(torrent.files).to.exist
@@ -91,7 +114,6 @@ describe('Test a single pod', function () {
       expect(video.name).to.equal('my super name')
       expect(video.description).to.equal('my super description')
       expect(video.podUrl).to.equal('http://localhost:9001')
-      expect(video.magnetUri).to.exist
 
       done()
     })
diff --git a/server/tests/api/utils.js b/server/tests/api/utils.js
index 05142085f1..ea0982e816 100644
--- a/server/tests/api/utils.js
+++ b/server/tests/api/utils.js
@@ -9,6 +9,7 @@ const request = require('supertest')
 const testUtils = {
   flushTests: flushTests,
   getFriendsList: getFriendsList,
+  getVideo: getVideo,
   getVideosList: getVideosList,
   makeFriends: makeFriends,
   quitFriends: quitFriends,
@@ -36,6 +37,17 @@ function getFriendsList (url, end) {
     .end(end)
 }
 
+function getVideo (url, id, end) {
+  const path = '/api/v1/videos/' + id
+
+  request(url)
+    .get(path)
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
 function getVideosList (url, end) {
   const path = '/api/v1/videos'
 
-- 
GitLab