mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-04 10:19:35 +02:00
Add video channels
This commit is contained in:
parent
8113a93a0d
commit
72c7248b6f
56 changed files with 2011 additions and 280 deletions
|
@ -3,4 +3,6 @@ export * from './misc'
|
|||
export * from './pods'
|
||||
export * from './pods'
|
||||
export * from './users'
|
||||
export * from './video-authors'
|
||||
export * from './video-channels'
|
||||
export * from './videos'
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import 'express-validator'
|
||||
import * as validator from 'validator'
|
||||
|
||||
function exists (value: any) {
|
||||
return value !== undefined && value !== null
|
||||
|
@ -8,9 +8,29 @@ function isArray (value: any) {
|
|||
return Array.isArray(value)
|
||||
}
|
||||
|
||||
function isDateValid (value: string) {
|
||||
return exists(value) && validator.isISO8601(value)
|
||||
}
|
||||
|
||||
function isIdValid (value: string) {
|
||||
return exists(value) && validator.isInt('' + value)
|
||||
}
|
||||
|
||||
function isUUIDValid (value: string) {
|
||||
return exists(value) && validator.isUUID('' + value, 4)
|
||||
}
|
||||
|
||||
function isIdOrUUIDValid (value: string) {
|
||||
return isIdValid(value) || isUUIDValid(value)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
exists,
|
||||
isArray
|
||||
isArray,
|
||||
isIdValid,
|
||||
isUUIDValid,
|
||||
isIdOrUUIDValid,
|
||||
isDateValid
|
||||
}
|
||||
|
|
|
@ -6,18 +6,15 @@ import {
|
|||
REQUEST_ENDPOINT_ACTIONS,
|
||||
REQUEST_VIDEO_EVENT_TYPES
|
||||
} from '../../../initializers'
|
||||
import { isArray } from '../misc'
|
||||
import { isArray, isDateValid, isUUIDValid } from '../misc'
|
||||
import {
|
||||
isVideoAuthorValid,
|
||||
isVideoThumbnailDataValid,
|
||||
isVideoUUIDValid,
|
||||
isVideoAbuseReasonValid,
|
||||
isVideoAbuseReporterUsernameValid,
|
||||
isVideoViewsValid,
|
||||
isVideoLikesValid,
|
||||
isVideoDislikesValid,
|
||||
isVideoEventCountValid,
|
||||
isVideoDateValid,
|
||||
isVideoCategoryValid,
|
||||
isVideoLicenceValid,
|
||||
isVideoLanguageValid,
|
||||
|
@ -30,9 +27,22 @@ import {
|
|||
isVideoFileExtnameValid,
|
||||
isVideoFileResolutionValid
|
||||
} from '../videos'
|
||||
import { isVideoChannelDescriptionValid, isVideoChannelNameValid } from '../video-channels'
|
||||
import { isVideoAuthorNameValid } from '../video-authors'
|
||||
|
||||
const ENDPOINT_ACTIONS = REQUEST_ENDPOINT_ACTIONS[REQUEST_ENDPOINTS.VIDEOS]
|
||||
|
||||
const checkers: { [ id: string ]: (obj: any) => boolean } = {}
|
||||
checkers[ENDPOINT_ACTIONS.ADD_VIDEO] = checkAddVideo
|
||||
checkers[ENDPOINT_ACTIONS.UPDATE_VIDEO] = checkUpdateVideo
|
||||
checkers[ENDPOINT_ACTIONS.REMOVE_VIDEO] = checkRemoveVideo
|
||||
checkers[ENDPOINT_ACTIONS.REPORT_ABUSE] = checkReportVideo
|
||||
checkers[ENDPOINT_ACTIONS.ADD_CHANNEL] = checkAddVideoChannel
|
||||
checkers[ENDPOINT_ACTIONS.UPDATE_CHANNEL] = checkUpdateVideoChannel
|
||||
checkers[ENDPOINT_ACTIONS.REMOVE_CHANNEL] = checkRemoveVideoChannel
|
||||
checkers[ENDPOINT_ACTIONS.ADD_AUTHOR] = checkAddAuthor
|
||||
checkers[ENDPOINT_ACTIONS.REMOVE_AUTHOR] = checkRemoveAuthor
|
||||
|
||||
function isEachRemoteRequestVideosValid (requests: any[]) {
|
||||
return isArray(requests) &&
|
||||
requests.every(request => {
|
||||
|
@ -40,26 +50,11 @@ function isEachRemoteRequestVideosValid (requests: any[]) {
|
|||
|
||||
if (!video) return false
|
||||
|
||||
return (
|
||||
isRequestTypeAddValid(request.type) &&
|
||||
isCommonVideoAttributesValid(video) &&
|
||||
isVideoAuthorValid(video.author) &&
|
||||
isVideoThumbnailDataValid(video.thumbnailData)
|
||||
) ||
|
||||
(
|
||||
isRequestTypeUpdateValid(request.type) &&
|
||||
isCommonVideoAttributesValid(video)
|
||||
) ||
|
||||
(
|
||||
isRequestTypeRemoveValid(request.type) &&
|
||||
isVideoUUIDValid(video.uuid)
|
||||
) ||
|
||||
(
|
||||
isRequestTypeReportAbuseValid(request.type) &&
|
||||
isVideoUUIDValid(request.data.videoUUID) &&
|
||||
isVideoAbuseReasonValid(request.data.reportReason) &&
|
||||
isVideoAbuseReporterUsernameValid(request.data.reporterUsername)
|
||||
)
|
||||
const checker = checkers[request.type]
|
||||
// We don't know the request type
|
||||
if (checker === undefined) return false
|
||||
|
||||
return checker(video)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -71,7 +66,7 @@ function isEachRemoteRequestVideosQaduValid (requests: any[]) {
|
|||
if (!video) return false
|
||||
|
||||
return (
|
||||
isVideoUUIDValid(video.uuid) &&
|
||||
isUUIDValid(video.uuid) &&
|
||||
(has(video, 'views') === false || isVideoViewsValid(video.views)) &&
|
||||
(has(video, 'likes') === false || isVideoLikesValid(video.likes)) &&
|
||||
(has(video, 'dislikes') === false || isVideoDislikesValid(video.dislikes))
|
||||
|
@ -87,7 +82,7 @@ function isEachRemoteRequestVideosEventsValid (requests: any[]) {
|
|||
if (!eventData) return false
|
||||
|
||||
return (
|
||||
isVideoUUIDValid(eventData.uuid) &&
|
||||
isUUIDValid(eventData.uuid) &&
|
||||
values(REQUEST_VIDEO_EVENT_TYPES).indexOf(eventData.eventType) !== -1 &&
|
||||
isVideoEventCountValid(eventData.count)
|
||||
)
|
||||
|
@ -105,8 +100,8 @@ export {
|
|||
// ---------------------------------------------------------------------------
|
||||
|
||||
function isCommonVideoAttributesValid (video: any) {
|
||||
return isVideoDateValid(video.createdAt) &&
|
||||
isVideoDateValid(video.updatedAt) &&
|
||||
return isDateValid(video.createdAt) &&
|
||||
isDateValid(video.updatedAt) &&
|
||||
isVideoCategoryValid(video.category) &&
|
||||
isVideoLicenceValid(video.licence) &&
|
||||
isVideoLanguageValid(video.language) &&
|
||||
|
@ -115,7 +110,7 @@ function isCommonVideoAttributesValid (video: any) {
|
|||
isVideoDurationValid(video.duration) &&
|
||||
isVideoNameValid(video.name) &&
|
||||
isVideoTagsValid(video.tags) &&
|
||||
isVideoUUIDValid(video.uuid) &&
|
||||
isUUIDValid(video.uuid) &&
|
||||
isVideoViewsValid(video.views) &&
|
||||
isVideoLikesValid(video.likes) &&
|
||||
isVideoDislikesValid(video.dislikes) &&
|
||||
|
@ -131,18 +126,53 @@ function isCommonVideoAttributesValid (video: any) {
|
|||
})
|
||||
}
|
||||
|
||||
function isRequestTypeAddValid (value: string) {
|
||||
return value === ENDPOINT_ACTIONS.ADD
|
||||
function checkAddVideo (video: any) {
|
||||
return isCommonVideoAttributesValid(video) &&
|
||||
isUUIDValid(video.channelUUID) &&
|
||||
isVideoThumbnailDataValid(video.thumbnailData)
|
||||
}
|
||||
|
||||
function isRequestTypeUpdateValid (value: string) {
|
||||
return value === ENDPOINT_ACTIONS.UPDATE
|
||||
function checkUpdateVideo (video: any) {
|
||||
return isCommonVideoAttributesValid(video)
|
||||
}
|
||||
|
||||
function isRequestTypeRemoveValid (value: string) {
|
||||
return value === ENDPOINT_ACTIONS.REMOVE
|
||||
function checkRemoveVideo (video: any) {
|
||||
return isUUIDValid(video.uuid)
|
||||
}
|
||||
|
||||
function isRequestTypeReportAbuseValid (value: string) {
|
||||
return value === ENDPOINT_ACTIONS.REPORT_ABUSE
|
||||
function checkReportVideo (abuse: any) {
|
||||
return isUUIDValid(abuse.videoUUID) &&
|
||||
isVideoAbuseReasonValid(abuse.reportReason) &&
|
||||
isVideoAbuseReporterUsernameValid(abuse.reporterUsername)
|
||||
}
|
||||
|
||||
function checkAddVideoChannel (videoChannel: any) {
|
||||
return isUUIDValid(videoChannel.uuid) &&
|
||||
isVideoChannelNameValid(videoChannel.name) &&
|
||||
isVideoChannelDescriptionValid(videoChannel.description) &&
|
||||
isDateValid(videoChannel.createdAt) &&
|
||||
isDateValid(videoChannel.updatedAt) &&
|
||||
isUUIDValid(videoChannel.ownerUUID)
|
||||
}
|
||||
|
||||
function checkUpdateVideoChannel (videoChannel: any) {
|
||||
return isUUIDValid(videoChannel.uuid) &&
|
||||
isVideoChannelNameValid(videoChannel.name) &&
|
||||
isVideoChannelDescriptionValid(videoChannel.description) &&
|
||||
isDateValid(videoChannel.createdAt) &&
|
||||
isDateValid(videoChannel.updatedAt) &&
|
||||
isUUIDValid(videoChannel.ownerUUID)
|
||||
}
|
||||
|
||||
function checkRemoveVideoChannel (videoChannel: any) {
|
||||
return isUUIDValid(videoChannel.uuid)
|
||||
}
|
||||
|
||||
function checkAddAuthor (author: any) {
|
||||
return isUUIDValid(author.uuid) &&
|
||||
isVideoAuthorNameValid(author.name)
|
||||
}
|
||||
|
||||
function checkRemoveAuthor (author: any) {
|
||||
return isUUIDValid(author.uuid)
|
||||
}
|
||||
|
|
45
server/helpers/custom-validators/video-authors.ts
Normal file
45
server/helpers/custom-validators/video-authors.ts
Normal file
|
@ -0,0 +1,45 @@
|
|||
import * as Promise from 'bluebird'
|
||||
import * as validator from 'validator'
|
||||
import * as express from 'express'
|
||||
import 'express-validator'
|
||||
|
||||
import { database as db } from '../../initializers'
|
||||
import { AuthorInstance } from '../../models'
|
||||
import { logger } from '../logger'
|
||||
|
||||
import { isUserUsernameValid } from './users'
|
||||
|
||||
function isVideoAuthorNameValid (value: string) {
|
||||
return isUserUsernameValid(value)
|
||||
}
|
||||
|
||||
function checkVideoAuthorExists (id: string, res: express.Response, callback: () => void) {
|
||||
let promise: Promise<AuthorInstance>
|
||||
if (validator.isInt(id)) {
|
||||
promise = db.Author.load(+id)
|
||||
} else { // UUID
|
||||
promise = db.Author.loadByUUID(id)
|
||||
}
|
||||
|
||||
promise.then(author => {
|
||||
if (!author) {
|
||||
return res.status(404)
|
||||
.json({ error: 'Video author not found' })
|
||||
.end()
|
||||
}
|
||||
|
||||
res.locals.author = author
|
||||
callback()
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error('Error in video author request validator.', err)
|
||||
return res.sendStatus(500)
|
||||
})
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
checkVideoAuthorExists,
|
||||
isVideoAuthorNameValid
|
||||
}
|
57
server/helpers/custom-validators/video-channels.ts
Normal file
57
server/helpers/custom-validators/video-channels.ts
Normal file
|
@ -0,0 +1,57 @@
|
|||
import * as Promise from 'bluebird'
|
||||
import * as validator from 'validator'
|
||||
import * as express from 'express'
|
||||
import 'express-validator'
|
||||
import 'multer'
|
||||
|
||||
import { database as db, CONSTRAINTS_FIELDS } from '../../initializers'
|
||||
import { VideoChannelInstance } from '../../models'
|
||||
import { logger } from '../logger'
|
||||
import { exists } from './misc'
|
||||
|
||||
const VIDEO_CHANNELS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_CHANNELS
|
||||
|
||||
function isVideoChannelDescriptionValid (value: string) {
|
||||
return value === null || validator.isLength(value, VIDEO_CHANNELS_CONSTRAINTS_FIELDS.DESCRIPTION)
|
||||
}
|
||||
|
||||
function isVideoChannelNameValid (value: string) {
|
||||
return exists(value) && validator.isLength(value, VIDEO_CHANNELS_CONSTRAINTS_FIELDS.NAME)
|
||||
}
|
||||
|
||||
function isVideoChannelUUIDValid (value: string) {
|
||||
return exists(value) && validator.isUUID('' + value, 4)
|
||||
}
|
||||
|
||||
function checkVideoChannelExists (id: string, res: express.Response, callback: () => void) {
|
||||
let promise: Promise<VideoChannelInstance>
|
||||
if (validator.isInt(id)) {
|
||||
promise = db.VideoChannel.loadAndPopulateAuthor(+id)
|
||||
} else { // UUID
|
||||
promise = db.VideoChannel.loadByUUIDAndPopulateAuthor(id)
|
||||
}
|
||||
|
||||
promise.then(videoChannel => {
|
||||
if (!videoChannel) {
|
||||
return res.status(404)
|
||||
.json({ error: 'Video channel not found' })
|
||||
.end()
|
||||
}
|
||||
|
||||
res.locals.videoChannel = videoChannel
|
||||
callback()
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error('Error in video channel request validator.', err)
|
||||
return res.sendStatus(500)
|
||||
})
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
isVideoChannelDescriptionValid,
|
||||
isVideoChannelNameValid,
|
||||
isVideoChannelUUIDValid,
|
||||
checkVideoChannelExists
|
||||
}
|
|
@ -23,18 +23,6 @@ const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
|
|||
const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
|
||||
const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS
|
||||
|
||||
function isVideoIdOrUUIDValid (value: string) {
|
||||
return validator.isInt(value) || isVideoUUIDValid(value)
|
||||
}
|
||||
|
||||
function isVideoAuthorValid (value: string) {
|
||||
return isUserUsernameValid(value)
|
||||
}
|
||||
|
||||
function isVideoDateValid (value: string) {
|
||||
return exists(value) && validator.isISO8601(value)
|
||||
}
|
||||
|
||||
function isVideoCategoryValid (value: number) {
|
||||
return VIDEO_CATEGORIES[value] !== undefined
|
||||
}
|
||||
|
@ -79,10 +67,6 @@ function isVideoThumbnailDataValid (value: string) {
|
|||
return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA)
|
||||
}
|
||||
|
||||
function isVideoUUIDValid (value: string) {
|
||||
return exists(value) && validator.isUUID('' + value, 4)
|
||||
}
|
||||
|
||||
function isVideoAbuseReasonValid (value: string) {
|
||||
return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON)
|
||||
}
|
||||
|
@ -170,9 +154,6 @@ function checkVideoExists (id: string, res: express.Response, callback: () => vo
|
|||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
isVideoIdOrUUIDValid,
|
||||
isVideoAuthorValid,
|
||||
isVideoDateValid,
|
||||
isVideoCategoryValid,
|
||||
isVideoLicenceValid,
|
||||
isVideoLanguageValid,
|
||||
|
@ -185,7 +166,6 @@ export {
|
|||
isVideoThumbnailValid,
|
||||
isVideoThumbnailDataValid,
|
||||
isVideoFileExtnameValid,
|
||||
isVideoUUIDValid,
|
||||
isVideoAbuseReasonValid,
|
||||
isVideoAbuseReporterUsernameValid,
|
||||
isVideoFile,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue