]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Make some fields optional when uploading a video
authorChocobozzz <florian.bigard@gmail.com>
Thu, 7 Dec 2017 16:03:56 +0000 (17:03 +0100)
committerChocobozzz <florian.bigard@gmail.com>
Thu, 7 Dec 2017 16:05:23 +0000 (17:05 +0100)
server/initializers/migrations/0120-video-null.ts [new file with mode: 0644]
server/middlewares/validators/videos.ts
server/models/video/video.ts
server/tests/api/check-params/videos.ts
server/tests/api/single-server.ts

diff --git a/server/initializers/migrations/0120-video-null.ts b/server/initializers/migrations/0120-video-null.ts
new file mode 100644 (file)
index 0000000..3506a50
--- /dev/null
@@ -0,0 +1,46 @@
+import * as Sequelize from 'sequelize'
+import { PeerTubeDatabase } from '../database'
+
+async function up (utils: {
+  transaction: Sequelize.Transaction,
+  queryInterface: Sequelize.QueryInterface,
+  sequelize: Sequelize.Sequelize,
+  db: PeerTubeDatabase
+}): Promise<void> {
+
+  {
+    const data = {
+      type: Sequelize.INTEGER,
+      allowNull: true,
+      defaultValue: null
+    }
+    await utils.queryInterface.changeColumn('Videos', 'licence', data)
+  }
+
+  {
+    const data = {
+      type: Sequelize.INTEGER,
+      allowNull: true,
+      defaultValue: null
+    }
+    await utils.queryInterface.changeColumn('Videos', 'category', data)
+  }
+
+  {
+    const data = {
+      type: Sequelize.INTEGER,
+      allowNull: true,
+      defaultValue: null
+    }
+    await utils.queryInterface.changeColumn('Videos', 'description', data)
+  }
+}
+
+function down (options) {
+  throw new Error('Not implemented.')
+}
+
+export {
+  up,
+  down
+}
index ee2ac50c8931840d923447a37181966ab810af8b..10625e41d450a16f3b9a2b64188a39e7a51ab588 100644 (file)
@@ -31,11 +31,11 @@ const videosAddValidator = [
     + CONSTRAINTS_FIELDS.VIDEOS.EXTNAME.join(', ')
   ),
   body('name').custom(isVideoNameValid).withMessage('Should have a valid name'),
-  body('category').custom(isVideoCategoryValid).withMessage('Should have a valid category'),
-  body('licence').custom(isVideoLicenceValid).withMessage('Should have a valid licence'),
+  body('category').optional().custom(isVideoCategoryValid).withMessage('Should have a valid category'),
+  body('licence').optional().custom(isVideoLicenceValid).withMessage('Should have a valid licence'),
   body('language').optional().custom(isVideoLanguageValid).withMessage('Should have a valid language'),
   body('nsfw').custom(isVideoNSFWValid).withMessage('Should have a valid NSFW attribute'),
-  body('description').custom(isVideoDescriptionValid).withMessage('Should have a valid description'),
+  body('description').optional().custom(isVideoDescriptionValid).withMessage('Should have a valid description'),
   body('channelId').custom(isIdValid).withMessage('Should have correct video channel id'),
   body('privacy').custom(isVideoPrivacyValid).withMessage('Should have correct video privacy'),
   body('tags').optional().custom(isVideoTagsValid).withMessage('Should have correct tags'),
index 60023bc8c2a93c252506cc8f78dd9f77b95c95a8..8b1eb1f96cb554a66dc616ce2b04abb4c2bdffdf 100644 (file)
@@ -104,7 +104,8 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da
       },
       category: {
         type: DataTypes.INTEGER,
-        allowNull: false,
+        allowNull: true,
+        defaultValue: null,
         validate: {
           categoryValid: value => {
             const res = isVideoCategoryValid(value)
@@ -114,7 +115,7 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da
       },
       licence: {
         type: DataTypes.INTEGER,
-        allowNull: false,
+        allowNull: true,
         defaultValue: null,
         validate: {
           licenceValid: value => {
@@ -126,6 +127,7 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da
       language: {
         type: DataTypes.INTEGER,
         allowNull: true,
+        defaultValue: null,
         validate: {
           languageValid: value => {
             const res = isVideoLanguageValid(value)
@@ -155,7 +157,8 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da
       },
       description: {
         type: DataTypes.STRING(CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.max),
-        allowNull: false,
+        allowNull: true,
+        defaultValue: null,
         validate: {
           descriptionValid: value => {
             const res = isVideoDescriptionValid(value)
@@ -664,6 +667,8 @@ toActivityPubObject = function (this: VideoInstance) {
 }
 
 getTruncatedDescription = function (this: VideoInstance) {
+  if (!this.description) return null
+
   const options = {
     length: CONSTRAINTS_FIELDS.VIDEOS.TRUNCATED_DESCRIPTION.max
   }
@@ -754,8 +759,6 @@ getDescriptionPath = function (this: VideoInstance) {
 
 getCategoryLabel = function (this: VideoInstance) {
   let categoryLabel = VIDEO_CATEGORIES[this.category]
-
-  // Maybe our server is not up to date and there are new categories since our version
   if (!categoryLabel) categoryLabel = 'Misc'
 
   return categoryLabel
@@ -763,15 +766,12 @@ getCategoryLabel = function (this: VideoInstance) {
 
 getLicenceLabel = function (this: VideoInstance) {
   let licenceLabel = VIDEO_LICENCES[this.licence]
-
-  // Maybe our server is not up to date and there are new licences since our version
   if (!licenceLabel) licenceLabel = 'Unknown'
 
   return licenceLabel
 }
 
 getLanguageLabel = function (this: VideoInstance) {
-  // Language is an optional attribute
   let languageLabel = VIDEO_LANGUAGES[this.language]
   if (!languageLabel) languageLabel = 'Unknown'
 
index 2962f5640a3d5a4aff0f6fa5aa4a619c1beda671..00a209665d7ed211f0b2e1887300205ff0857826 100644 (file)
@@ -189,14 +189,6 @@ describe('Test videos API validator', function () {
       await makePostUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
     })
 
-    it('Should fail without a category', async function () {
-      const fields = getCompleteVideoUploadAttributes()
-      delete fields.category
-
-      const attaches = getVideoUploadAttaches
-      await makePostUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
-    })
-
     it('Should fail with a bad category', async function () {
       const fields = getCompleteVideoUploadAttributes()
       fields.category = 125
@@ -205,14 +197,6 @@ describe('Test videos API validator', function () {
       await makePostUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
     })
 
-    it('Should fail without a licence', async function () {
-      const fields = getCompleteVideoUploadAttributes()
-      delete fields.licence
-
-      const attaches = getVideoUploadAttaches()
-      await makePostUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
-    })
-
     it('Should fail with a bad licence', async function () {
       const fields = getCompleteVideoUploadAttributes()
       fields.licence = 125
@@ -245,14 +229,6 @@ describe('Test videos API validator', function () {
       await makePostUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
     })
 
-    it('Should fail without description', async function () {
-      const fields = getCompleteVideoUploadAttributes()
-      delete fields.description
-
-      const attaches = getVideoUploadAttaches()
-      await makePostUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
-    })
-
     it('Should fail with a long description', async function () {
       const fields = getCompleteVideoUploadAttributes()
       fields.description = 'my super description which is very very very very very very very very very very very very long'.repeat(35)
index d7e9ad41f78a09438a604eb8712b123d94737e9a..fbb2dd1fb1c6ec5900afee9ad4505433f8a6cc90 100644 (file)
@@ -1,40 +1,41 @@
 /* tslint:disable:no-unused-expression */
 
+import * as chai from 'chai'
 import { keyBy } from 'lodash'
-import { join } from 'path'
 import 'mocha'
-import * as chai from 'chai'
-const expect = chai.expect
-
+import { join } from 'path'
+import * as request from 'supertest'
 import {
-  ServerInfo,
-  flushTests,
-  runServer,
-  uploadVideo,
-  getVideosList,
-  rateVideo,
-  removeVideo,
-  wait,
-  setAccessTokensToServers,
-  searchVideo,
-  killallServers,
   dateIsValid,
+  flushTests,
+  getVideo,
   getVideoCategories,
-  getVideoLicences,
   getVideoLanguages,
+  getVideoLicences,
   getVideoPrivacies,
-  testVideoImage,
-  webtorrentAdd,
-  getVideo,
-  readdirPromise,
+  getVideosList,
   getVideosListPagination,
-  searchVideoWithPagination,
   getVideosListSort,
+  killallServers,
+  rateVideo,
+  readdirPromise,
+  removeVideo,
+  runServer,
+  searchVideo,
+  searchVideoWithPagination,
   searchVideoWithSort,
-  updateVideo
+  ServerInfo,
+  setAccessTokensToServers,
+  testVideoImage,
+  updateVideo,
+  uploadVideo,
+  wait,
+  webtorrentAdd
 } from '../utils'
 import { viewVideo } from '../utils/videos'
 
+const expect = chai.expect
+
 describe('Test a single server', function () {
   let server: ServerInfo = null
   let videoId = -1
@@ -693,6 +694,43 @@ describe('Test a single server', function () {
     expect(video.dislikes).to.equal(1)
   })
 
+  it('Should upload a video with minimum parameters', async function () {
+    const path = '/api/v1/videos/upload'
+
+    const req = request(server.url)
+      .post(path)
+      .set('Accept', 'application/json')
+      .set('Authorization', 'Bearer ' + server.accessToken)
+      .field('name', 'minimum parameters')
+      .field('privacy', '1')
+      .field('nsfw', 'false')
+      .field('channelId', '1')
+
+    const filePath = join(__dirname, '..', 'api', 'fixtures', 'video_short.webm')
+
+    await req.attach('videofile', filePath)
+      .expect(204)
+
+    const res = await getVideosList(server.url)
+    const video = res.body.data.find(v => v.name === 'minimum parameters')
+
+    expect(video.name).to.equal('minimum parameters')
+    expect(video.category).to.equal(null)
+    expect(video.categoryLabel).to.equal('Misc')
+    expect(video.licence).to.equal(null)
+    expect(video.licenceLabel).to.equal('Unknown')
+    expect(video.language).to.equal(null)
+    expect(video.languageLabel).to.equal('Unknown')
+    expect(video.nsfw).to.not.be.ok
+    expect(video.description).to.equal(null)
+    expect(video.serverHost).to.equal('localhost:9001')
+    expect(video.accountName).to.equal('root')
+    expect(video.isLocal).to.be.true
+    expect(video.tags).to.deep.equal([ ])
+    expect(dateIsValid(video.createdAt)).to.be.true
+    expect(dateIsValid(video.updatedAt)).to.be.true
+  })
+
   after(async function () {
     killallServers([ server ])