1
0
Fork 0

Make some fields optional when uploading a video

This commit is contained in:
Chocobozzz 2017-12-07 17:03:56 +01:00
parent 27e1a06c33
commit 8e7f08b5a5
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
5 changed files with 120 additions and 60 deletions

View File

@ -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
}

View 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'),

View 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'

View 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)

View File

@ -1,40 +1,41 @@
/* tslint:disable:no-unused-expression */
import { keyBy } from 'lodash'
import { join } from 'path'
import 'mocha'
import * as chai from 'chai'
const expect = chai.expect
import { keyBy } from 'lodash'
import 'mocha'
import { join } from 'path'
import * as request from 'supertest'
import {
ServerInfo,
flushTests,
runServer,
uploadVideo,
getVideosList,
rateVideo,
removeVideo,
wait,
setAccessTokensToServers,
searchVideo,
killallServers,
dateIsValid,
getVideoCategories,
getVideoLicences,
getVideoLanguages,
getVideoPrivacies,
testVideoImage,
webtorrentAdd,
flushTests,
getVideo,
readdirPromise,
getVideoCategories,
getVideoLanguages,
getVideoLicences,
getVideoPrivacies,
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 ])