aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/helpers
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2019-02-26 10:55:40 +0100
committerChocobozzz <chocobozzz@cpy.re>2019-03-18 11:17:59 +0100
commit418d092afa81e2c8fe8ac6838fc4b5eb0af6a782 (patch)
tree5e9bc5604fd5d66a006cfebb7acdbdd5486e5d1e /server/helpers
parentb427febb4d5cebf03b815bca2c59af6e82491569 (diff)
downloadPeerTube-418d092afa81e2c8fe8ac6838fc4b5eb0af6a782.tar.gz
PeerTube-418d092afa81e2c8fe8ac6838fc4b5eb0af6a782.tar.zst
PeerTube-418d092afa81e2c8fe8ac6838fc4b5eb0af6a782.zip
Playlist server API
Diffstat (limited to 'server/helpers')
-rw-r--r--server/helpers/activitypub.ts9
-rw-r--r--server/helpers/custom-validators/activitypub/activity.ts3
-rw-r--r--server/helpers/custom-validators/activitypub/playlist.ts25
-rw-r--r--server/helpers/custom-validators/video-playlists.ts44
-rw-r--r--server/helpers/custom-validators/videos.ts2
5 files changed, 81 insertions, 2 deletions
diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts
index e850efe13..31c6187d1 100644
--- a/server/helpers/activitypub.ts
+++ b/server/helpers/activitypub.ts
@@ -28,6 +28,9 @@ function activityPubContextify <T> (data: T) {
28 state: 'sc:Number', 28 state: 'sc:Number',
29 size: 'sc:Number', 29 size: 'sc:Number',
30 fps: 'sc:Number', 30 fps: 'sc:Number',
31 startTimestamp: 'sc:Number',
32 stopTimestamp: 'sc:Number',
33 position: 'sc:Number',
31 commentsEnabled: 'sc:Boolean', 34 commentsEnabled: 'sc:Boolean',
32 downloadEnabled: 'sc:Boolean', 35 downloadEnabled: 'sc:Boolean',
33 waitTranscoding: 'sc:Boolean', 36 waitTranscoding: 'sc:Boolean',
@@ -46,6 +49,10 @@ function activityPubContextify <T> (data: T) {
46 '@id': 'as:dislikes', 49 '@id': 'as:dislikes',
47 '@type': '@id' 50 '@type': '@id'
48 }, 51 },
52 playlists: {
53 '@id': 'pt:playlists',
54 '@type': '@id'
55 },
49 shares: { 56 shares: {
50 '@id': 'as:shares', 57 '@id': 'as:shares',
51 '@type': '@id' 58 '@type': '@id'
@@ -67,7 +74,7 @@ async function activityPubCollectionPagination (baseUrl: string, handler: Activi
67 74
68 return { 75 return {
69 id: baseUrl, 76 id: baseUrl,
70 type: 'OrderedCollection', 77 type: 'OrderedCollectionPage',
71 totalItems: result.total, 78 totalItems: result.total,
72 first: baseUrl + '?page=1' 79 first: baseUrl + '?page=1'
73 } 80 }
diff --git a/server/helpers/custom-validators/activitypub/activity.ts b/server/helpers/custom-validators/activitypub/activity.ts
index b24590d9d..e0d170d9d 100644
--- a/server/helpers/custom-validators/activitypub/activity.ts
+++ b/server/helpers/custom-validators/activitypub/activity.ts
@@ -9,6 +9,7 @@ import { isViewActivityValid } from './view'
9import { exists } from '../misc' 9import { exists } from '../misc'
10import { isCacheFileObjectValid } from './cache-file' 10import { isCacheFileObjectValid } from './cache-file'
11import { isFlagActivityValid } from './flag' 11import { isFlagActivityValid } from './flag'
12import { isPlaylistObjectValid } from './playlist'
12 13
13function isRootActivityValid (activity: any) { 14function isRootActivityValid (activity: any) {
14 return Array.isArray(activity['@context']) && ( 15 return Array.isArray(activity['@context']) && (
@@ -78,6 +79,7 @@ function checkCreateActivity (activity: any) {
78 isViewActivityValid(activity.object) || 79 isViewActivityValid(activity.object) ||
79 isDislikeActivityValid(activity.object) || 80 isDislikeActivityValid(activity.object) ||
80 isFlagActivityValid(activity.object) || 81 isFlagActivityValid(activity.object) ||
82 isPlaylistObjectValid(activity.object) ||
81 83
82 isCacheFileObjectValid(activity.object) || 84 isCacheFileObjectValid(activity.object) ||
83 sanitizeAndCheckVideoCommentObject(activity.object) || 85 sanitizeAndCheckVideoCommentObject(activity.object) ||
@@ -89,6 +91,7 @@ function checkUpdateActivity (activity: any) {
89 return isBaseActivityValid(activity, 'Update') && 91 return isBaseActivityValid(activity, 'Update') &&
90 ( 92 (
91 isCacheFileObjectValid(activity.object) || 93 isCacheFileObjectValid(activity.object) ||
94 isPlaylistObjectValid(activity.object) ||
92 sanitizeAndCheckVideoTorrentObject(activity.object) || 95 sanitizeAndCheckVideoTorrentObject(activity.object) ||
93 sanitizeAndCheckActorObject(activity.object) 96 sanitizeAndCheckActorObject(activity.object)
94 ) 97 )
diff --git a/server/helpers/custom-validators/activitypub/playlist.ts b/server/helpers/custom-validators/activitypub/playlist.ts
new file mode 100644
index 000000000..ecdc7975e
--- /dev/null
+++ b/server/helpers/custom-validators/activitypub/playlist.ts
@@ -0,0 +1,25 @@
1import { exists } from '../misc'
2import { PlaylistObject } from '../../../../shared/models/activitypub/objects/playlist-object'
3import * as validator from 'validator'
4import { PlaylistElementObject } from '../../../../shared/models/activitypub/objects/playlist-element-object'
5import { isActivityPubUrlValid } from './misc'
6
7function isPlaylistObjectValid (object: PlaylistObject) {
8 return exists(object) &&
9 object.type === 'Playlist' &&
10 validator.isInt(object.totalItems + '')
11}
12
13function isPlaylistElementObjectValid (object: PlaylistElementObject) {
14 return exists(object) &&
15 object.type === 'PlaylistElement' &&
16 validator.isInt(object.position + '') &&
17 isActivityPubUrlValid(object.url)
18}
19
20// ---------------------------------------------------------------------------
21
22export {
23 isPlaylistObjectValid,
24 isPlaylistElementObjectValid
25}
diff --git a/server/helpers/custom-validators/video-playlists.ts b/server/helpers/custom-validators/video-playlists.ts
new file mode 100644
index 000000000..0f5af4ec0
--- /dev/null
+++ b/server/helpers/custom-validators/video-playlists.ts
@@ -0,0 +1,44 @@
1import { exists } from './misc'
2import * as validator from 'validator'
3import { CONSTRAINTS_FIELDS, VIDEO_PLAYLIST_PRIVACIES } from '../../initializers'
4import * as express from 'express'
5import { VideoPlaylistModel } from '../../models/video/video-playlist'
6import { VideoPlaylistElementModel } from '../../models/video/video-playlist-element'
7
8const PLAYLISTS_CONSTRAINT_FIELDS = CONSTRAINTS_FIELDS.VIDEO_PLAYLISTS
9
10function isVideoPlaylistNameValid (value: any) {
11 return exists(value) && validator.isLength(value, PLAYLISTS_CONSTRAINT_FIELDS.NAME)
12}
13
14function isVideoPlaylistDescriptionValid (value: any) {
15 return value === null || (exists(value) && validator.isLength(value, PLAYLISTS_CONSTRAINT_FIELDS.DESCRIPTION))
16}
17
18function isVideoPlaylistPrivacyValid (value: number) {
19 return validator.isInt(value + '') && VIDEO_PLAYLIST_PRIVACIES[ value ] !== undefined
20}
21
22async function isVideoPlaylistExist (id: number | string, res: express.Response) {
23 const videoPlaylist = await VideoPlaylistModel.load(id, undefined)
24
25 if (!videoPlaylist) {
26 res.status(404)
27 .json({ error: 'Video playlist not found' })
28 .end()
29
30 return false
31 }
32
33 res.locals.videoPlaylist = videoPlaylist
34 return true
35}
36
37// ---------------------------------------------------------------------------
38
39export {
40 isVideoPlaylistExist,
41 isVideoPlaylistNameValid,
42 isVideoPlaylistDescriptionValid,
43 isVideoPlaylistPrivacyValid
44}
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts
index dd04aa5f6..d00d24c4c 100644
--- a/server/helpers/custom-validators/videos.ts
+++ b/server/helpers/custom-validators/videos.ts
@@ -165,7 +165,7 @@ function checkUserCanManageVideo (user: UserModel, video: VideoModel, right: Use
165 return true 165 return true
166} 166}
167 167
168async function isVideoExist (id: string, res: Response, fetchType: VideoFetchType = 'all') { 168async function isVideoExist (id: number | string, res: Response, fetchType: VideoFetchType = 'all') {
169 const userId = res.locals.oauth ? res.locals.oauth.token.User.id : undefined 169 const userId = res.locals.oauth ? res.locals.oauth.token.User.id : undefined
170 170
171 const video = await fetchVideo(id, fetchType, userId) 171 const video = await fetchVideo(id, fetchType, userId)