diff options
author | Chocobozzz <me@florianbigard.com> | 2018-09-11 16:27:07 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-09-13 14:05:49 +0200 |
commit | c48e82b5e0478434de30626d14594a97f2402e7c (patch) | |
tree | a78e5272bd0fe4f5b41831e571e02d05f1515b82 /server/controllers | |
parent | a651038487faa838bda3ce04695b08bc65baff70 (diff) | |
download | PeerTube-c48e82b5e0478434de30626d14594a97f2402e7c.tar.gz PeerTube-c48e82b5e0478434de30626d14594a97f2402e7c.tar.zst PeerTube-c48e82b5e0478434de30626d14594a97f2402e7c.zip |
Basic video redundancy implementation
Diffstat (limited to 'server/controllers')
-rw-r--r-- | server/controllers/activitypub/client.ts | 34 | ||||
-rw-r--r-- | server/controllers/activitypub/outbox.ts | 6 | ||||
-rw-r--r-- | server/controllers/api/search.ts | 2 | ||||
-rw-r--r-- | server/controllers/api/server/follows.ts | 5 | ||||
-rw-r--r-- | server/controllers/api/server/index.ts | 2 | ||||
-rw-r--r-- | server/controllers/api/server/redundancy.ts | 32 | ||||
-rw-r--r-- | server/controllers/api/videos/abuse.ts | 2 |
7 files changed, 71 insertions, 12 deletions
diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts index 54cf44419..2e168ea78 100644 --- a/server/controllers/activitypub/client.ts +++ b/server/controllers/activitypub/client.ts | |||
@@ -3,9 +3,9 @@ import * as express from 'express' | |||
3 | import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos' | 3 | import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos' |
4 | import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub' | 4 | import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub' |
5 | import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers' | 5 | import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers' |
6 | import { buildVideoAnnounce } from '../../lib/activitypub/send' | 6 | import { buildAnnounceWithVideoAudience } from '../../lib/activitypub/send' |
7 | import { audiencify, getAudience } from '../../lib/activitypub/audience' | 7 | import { audiencify, getAudience } from '../../lib/activitypub/audience' |
8 | import { createActivityData } from '../../lib/activitypub/send/send-create' | 8 | import { buildCreateActivity } from '../../lib/activitypub/send/send-create' |
9 | import { asyncMiddleware, executeIfActivityPub, localAccountValidator, localVideoChannelValidator } from '../../middlewares' | 9 | import { asyncMiddleware, executeIfActivityPub, localAccountValidator, localVideoChannelValidator } from '../../middlewares' |
10 | import { videosGetValidator, videosShareValidator } from '../../middlewares/validators' | 10 | import { videosGetValidator, videosShareValidator } from '../../middlewares/validators' |
11 | import { videoCommentGetValidator } from '../../middlewares/validators/video-comments' | 11 | import { videoCommentGetValidator } from '../../middlewares/validators/video-comments' |
@@ -26,6 +26,8 @@ import { | |||
26 | getVideoSharesActivityPubUrl | 26 | getVideoSharesActivityPubUrl |
27 | } from '../../lib/activitypub' | 27 | } from '../../lib/activitypub' |
28 | import { VideoCaptionModel } from '../../models/video/video-caption' | 28 | import { VideoCaptionModel } from '../../models/video/video-caption' |
29 | import { videoRedundancyGetValidator } from '../../middlewares/validators/redundancy' | ||
30 | import { getServerActor } from '../../helpers/utils' | ||
29 | 31 | ||
30 | const activityPubClientRouter = express.Router() | 32 | const activityPubClientRouter = express.Router() |
31 | 33 | ||
@@ -93,6 +95,11 @@ activityPubClientRouter.get('/video-channels/:name/following', | |||
93 | executeIfActivityPub(asyncMiddleware(videoChannelFollowingController)) | 95 | executeIfActivityPub(asyncMiddleware(videoChannelFollowingController)) |
94 | ) | 96 | ) |
95 | 97 | ||
98 | activityPubClientRouter.get('/redundancy/videos/:videoId/:resolution([0-9]+)(-:fps([0-9]+))?', | ||
99 | executeIfActivityPub(asyncMiddleware(videoRedundancyGetValidator)), | ||
100 | executeIfActivityPub(asyncMiddleware(videoRedundancyController)) | ||
101 | ) | ||
102 | |||
96 | // --------------------------------------------------------------------------- | 103 | // --------------------------------------------------------------------------- |
97 | 104 | ||
98 | export { | 105 | export { |
@@ -131,7 +138,7 @@ async function videoController (req: express.Request, res: express.Response, nex | |||
131 | const videoObject = audiencify(video.toActivityPubObject(), audience) | 138 | const videoObject = audiencify(video.toActivityPubObject(), audience) |
132 | 139 | ||
133 | if (req.path.endsWith('/activity')) { | 140 | if (req.path.endsWith('/activity')) { |
134 | const data = createActivityData(video.url, video.VideoChannel.Account.Actor, videoObject, audience) | 141 | const data = buildCreateActivity(video.url, video.VideoChannel.Account.Actor, videoObject, audience) |
135 | return activityPubResponse(activityPubContextify(data), res) | 142 | return activityPubResponse(activityPubContextify(data), res) |
136 | } | 143 | } |
137 | 144 | ||
@@ -140,9 +147,9 @@ async function videoController (req: express.Request, res: express.Response, nex | |||
140 | 147 | ||
141 | async function videoAnnounceController (req: express.Request, res: express.Response, next: express.NextFunction) { | 148 | async function videoAnnounceController (req: express.Request, res: express.Response, next: express.NextFunction) { |
142 | const share = res.locals.videoShare as VideoShareModel | 149 | const share = res.locals.videoShare as VideoShareModel |
143 | const object = await buildVideoAnnounce(share.Actor, share, res.locals.video, undefined) | 150 | const { activity } = await buildAnnounceWithVideoAudience(share.Actor, share, res.locals.video, undefined) |
144 | 151 | ||
145 | return activityPubResponse(activityPubContextify(object), res) | 152 | return activityPubResponse(activityPubContextify(activity), res) |
146 | } | 153 | } |
147 | 154 | ||
148 | async function videoAnnouncesController (req: express.Request, res: express.Response, next: express.NextFunction) { | 155 | async function videoAnnouncesController (req: express.Request, res: express.Response, next: express.NextFunction) { |
@@ -219,13 +226,28 @@ async function videoCommentController (req: express.Request, res: express.Respon | |||
219 | const videoCommentObject = audiencify(videoComment.toActivityPubObject(threadParentComments), audience) | 226 | const videoCommentObject = audiencify(videoComment.toActivityPubObject(threadParentComments), audience) |
220 | 227 | ||
221 | if (req.path.endsWith('/activity')) { | 228 | if (req.path.endsWith('/activity')) { |
222 | const data = createActivityData(videoComment.url, videoComment.Account.Actor, videoCommentObject, audience) | 229 | const data = buildCreateActivity(videoComment.url, videoComment.Account.Actor, videoCommentObject, audience) |
223 | return activityPubResponse(activityPubContextify(data), res) | 230 | return activityPubResponse(activityPubContextify(data), res) |
224 | } | 231 | } |
225 | 232 | ||
226 | return activityPubResponse(activityPubContextify(videoCommentObject), res) | 233 | return activityPubResponse(activityPubContextify(videoCommentObject), res) |
227 | } | 234 | } |
228 | 235 | ||
236 | async function videoRedundancyController (req: express.Request, res: express.Response) { | ||
237 | const videoRedundancy = res.locals.videoRedundancy | ||
238 | const serverActor = await getServerActor() | ||
239 | |||
240 | const audience = getAudience(serverActor) | ||
241 | const object = audiencify(videoRedundancy.toActivityPubObject(), audience) | ||
242 | |||
243 | if (req.path.endsWith('/activity')) { | ||
244 | const data = buildCreateActivity(videoRedundancy.url, serverActor, object, audience) | ||
245 | return activityPubResponse(activityPubContextify(data), res) | ||
246 | } | ||
247 | |||
248 | return activityPubResponse(activityPubContextify(object), res) | ||
249 | } | ||
250 | |||
229 | // --------------------------------------------------------------------------- | 251 | // --------------------------------------------------------------------------- |
230 | 252 | ||
231 | async function actorFollowing (req: express.Request, actor: ActorModel) { | 253 | async function actorFollowing (req: express.Request, actor: ActorModel) { |
diff --git a/server/controllers/activitypub/outbox.ts b/server/controllers/activitypub/outbox.ts index db69ae54b..bd0e4fe9d 100644 --- a/server/controllers/activitypub/outbox.ts +++ b/server/controllers/activitypub/outbox.ts | |||
@@ -3,7 +3,7 @@ import { Activity } from '../../../shared/models/activitypub/activity' | |||
3 | import { VideoPrivacy } from '../../../shared/models/videos' | 3 | import { VideoPrivacy } from '../../../shared/models/videos' |
4 | import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub' | 4 | import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub' |
5 | import { logger } from '../../helpers/logger' | 5 | import { logger } from '../../helpers/logger' |
6 | import { announceActivityData, createActivityData } from '../../lib/activitypub/send' | 6 | import { buildAnnounceActivity, buildCreateActivity } from '../../lib/activitypub/send' |
7 | import { buildAudience } from '../../lib/activitypub/audience' | 7 | import { buildAudience } from '../../lib/activitypub/audience' |
8 | import { asyncMiddleware, localAccountValidator, localVideoChannelValidator } from '../../middlewares' | 8 | import { asyncMiddleware, localAccountValidator, localVideoChannelValidator } from '../../middlewares' |
9 | import { AccountModel } from '../../models/account/account' | 9 | import { AccountModel } from '../../models/account/account' |
@@ -60,12 +60,12 @@ async function buildActivities (actor: ActorModel, start: number, count: number) | |||
60 | // This is a shared video | 60 | // This is a shared video |
61 | if (video.VideoShares !== undefined && video.VideoShares.length !== 0) { | 61 | if (video.VideoShares !== undefined && video.VideoShares.length !== 0) { |
62 | const videoShare = video.VideoShares[0] | 62 | const videoShare = video.VideoShares[0] |
63 | const announceActivity = announceActivityData(videoShare.url, actor, video.url, createActivityAudience) | 63 | const announceActivity = buildAnnounceActivity(videoShare.url, actor, video.url, createActivityAudience) |
64 | 64 | ||
65 | activities.push(announceActivity) | 65 | activities.push(announceActivity) |
66 | } else { | 66 | } else { |
67 | const videoObject = video.toActivityPubObject() | 67 | const videoObject = video.toActivityPubObject() |
68 | const createActivity = createActivityData(video.url, byActor, videoObject, createActivityAudience) | 68 | const createActivity = buildCreateActivity(video.url, byActor, videoObject, createActivityAudience) |
69 | 69 | ||
70 | activities.push(createActivity) | 70 | activities.push(createActivity) |
71 | } | 71 | } |
diff --git a/server/controllers/api/search.ts b/server/controllers/api/search.ts index bb7174891..28a7a04ca 100644 --- a/server/controllers/api/search.ts +++ b/server/controllers/api/search.ts | |||
@@ -17,8 +17,6 @@ import { | |||
17 | import { VideoChannelsSearchQuery, VideosSearchQuery } from '../../../shared/models/search' | 17 | import { VideoChannelsSearchQuery, VideosSearchQuery } from '../../../shared/models/search' |
18 | import { getOrCreateActorAndServerAndModel, getOrCreateVideoAndAccountAndChannel } from '../../lib/activitypub' | 18 | import { getOrCreateActorAndServerAndModel, getOrCreateVideoAndAccountAndChannel } from '../../lib/activitypub' |
19 | import { logger } from '../../helpers/logger' | 19 | import { logger } from '../../helpers/logger' |
20 | import { User } from '../../../shared/models/users' | ||
21 | import { CONFIG } from '../../initializers/constants' | ||
22 | import { VideoChannelModel } from '../../models/video/video-channel' | 20 | import { VideoChannelModel } from '../../models/video/video-channel' |
23 | import { loadActorUrlOrGetFromWebfinger } from '../../helpers/webfinger' | 21 | import { loadActorUrlOrGetFromWebfinger } from '../../helpers/webfinger' |
24 | 22 | ||
diff --git a/server/controllers/api/server/follows.ts b/server/controllers/api/server/follows.ts index 23308445f..a4eae6b45 100644 --- a/server/controllers/api/server/follows.ts +++ b/server/controllers/api/server/follows.ts | |||
@@ -96,6 +96,11 @@ async function removeFollow (req: express.Request, res: express.Response, next: | |||
96 | await sequelizeTypescript.transaction(async t => { | 96 | await sequelizeTypescript.transaction(async t => { |
97 | if (follow.state === 'accepted') await sendUndoFollow(follow, t) | 97 | if (follow.state === 'accepted') await sendUndoFollow(follow, t) |
98 | 98 | ||
99 | // Disable redundancy on unfollowed instances | ||
100 | const server = follow.ActorFollowing.Server | ||
101 | server.redundancyAllowed = false | ||
102 | await server.save({ transaction: t }) | ||
103 | |||
99 | await follow.destroy({ transaction: t }) | 104 | await follow.destroy({ transaction: t }) |
100 | }) | 105 | }) |
101 | 106 | ||
diff --git a/server/controllers/api/server/index.ts b/server/controllers/api/server/index.ts index 850a52cdb..43bca2c10 100644 --- a/server/controllers/api/server/index.ts +++ b/server/controllers/api/server/index.ts | |||
@@ -1,10 +1,12 @@ | |||
1 | import * as express from 'express' | 1 | import * as express from 'express' |
2 | import { serverFollowsRouter } from './follows' | 2 | import { serverFollowsRouter } from './follows' |
3 | import { statsRouter } from './stats' | 3 | import { statsRouter } from './stats' |
4 | import { serverRedundancyRouter } from './redundancy' | ||
4 | 5 | ||
5 | const serverRouter = express.Router() | 6 | const serverRouter = express.Router() |
6 | 7 | ||
7 | serverRouter.use('/', serverFollowsRouter) | 8 | serverRouter.use('/', serverFollowsRouter) |
9 | serverRouter.use('/', serverRedundancyRouter) | ||
8 | serverRouter.use('/', statsRouter) | 10 | serverRouter.use('/', statsRouter) |
9 | 11 | ||
10 | // --------------------------------------------------------------------------- | 12 | // --------------------------------------------------------------------------- |
diff --git a/server/controllers/api/server/redundancy.ts b/server/controllers/api/server/redundancy.ts new file mode 100644 index 000000000..4216b9e35 --- /dev/null +++ b/server/controllers/api/server/redundancy.ts | |||
@@ -0,0 +1,32 @@ | |||
1 | import * as express from 'express' | ||
2 | import { UserRight } from '../../../../shared/models/users' | ||
3 | import { asyncMiddleware, authenticate, ensureUserHasRight } from '../../../middlewares' | ||
4 | import { updateServerRedundancyValidator } from '../../../middlewares/validators/redundancy' | ||
5 | import { ServerModel } from '../../../models/server/server' | ||
6 | |||
7 | const serverRedundancyRouter = express.Router() | ||
8 | |||
9 | serverRedundancyRouter.put('/redundancy/:host', | ||
10 | authenticate, | ||
11 | ensureUserHasRight(UserRight.MANAGE_SERVER_FOLLOW), | ||
12 | asyncMiddleware(updateServerRedundancyValidator), | ||
13 | asyncMiddleware(updateRedundancy) | ||
14 | ) | ||
15 | |||
16 | // --------------------------------------------------------------------------- | ||
17 | |||
18 | export { | ||
19 | serverRedundancyRouter | ||
20 | } | ||
21 | |||
22 | // --------------------------------------------------------------------------- | ||
23 | |||
24 | async function updateRedundancy (req: express.Request, res: express.Response, next: express.NextFunction) { | ||
25 | const server = res.locals.server as ServerModel | ||
26 | |||
27 | server.redundancyAllowed = req.body.redundancyAllowed | ||
28 | |||
29 | await server.save() | ||
30 | |||
31 | return res.sendStatus(204) | ||
32 | } | ||
diff --git a/server/controllers/api/videos/abuse.ts b/server/controllers/api/videos/abuse.ts index 59bdf6257..08e11b00b 100644 --- a/server/controllers/api/videos/abuse.ts +++ b/server/controllers/api/videos/abuse.ts | |||
@@ -112,7 +112,7 @@ async function reportVideoAbuse (req: express.Request, res: express.Response) { | |||
112 | 112 | ||
113 | // We send the video abuse to the origin server | 113 | // We send the video abuse to the origin server |
114 | if (videoInstance.isOwned() === false) { | 114 | if (videoInstance.isOwned() === false) { |
115 | await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance, t) | 115 | await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance) |
116 | } | 116 | } |
117 | 117 | ||
118 | auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON())) | 118 | auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON())) |