diff options
author | Chocobozzz <florian.bigard@gmail.com> | 2017-11-23 14:19:55 +0100 |
---|---|---|
committer | Chocobozzz <florian.bigard@gmail.com> | 2017-11-27 19:40:53 +0100 |
commit | 0032ebe94aa83fab761c7de3ceb6210ac4532824 (patch) | |
tree | 3ea407d7ea6de4c7f7bc66caba7e23c0cc4036e3 /server/lib/activitypub/process/process-like.ts | |
parent | d52eb8f656242c7e34afdb2dee681861fb9bce35 (diff) | |
download | PeerTube-0032ebe94aa83fab761c7de3ceb6210ac4532824.tar.gz PeerTube-0032ebe94aa83fab761c7de3ceb6210ac4532824.tar.zst PeerTube-0032ebe94aa83fab761c7de3ceb6210ac4532824.zip |
Federate likes/dislikes
Diffstat (limited to 'server/lib/activitypub/process/process-like.ts')
-rw-r--r-- | server/lib/activitypub/process/process-like.ts | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/server/lib/activitypub/process/process-like.ts b/server/lib/activitypub/process/process-like.ts new file mode 100644 index 000000000..d77b30f24 --- /dev/null +++ b/server/lib/activitypub/process/process-like.ts | |||
@@ -0,0 +1,50 @@ | |||
1 | import { ActivityLike } from '../../../../shared/models/activitypub/activity' | ||
2 | import { database as db } from '../../../initializers' | ||
3 | import { AccountInstance } from '../../../models/account/account-interface' | ||
4 | import { getOrCreateAccountAndServer } from '../account' | ||
5 | import { sendLikeToVideoFollowers } from '../send/send-like' | ||
6 | import { retryTransactionWrapper } from '../../../helpers/database-utils' | ||
7 | |||
8 | async function processLikeActivity (activity: ActivityLike) { | ||
9 | const account = await getOrCreateAccountAndServer(activity.actor) | ||
10 | |||
11 | return processLikeVideo(account, activity.object) | ||
12 | } | ||
13 | |||
14 | // --------------------------------------------------------------------------- | ||
15 | |||
16 | export { | ||
17 | processLikeActivity | ||
18 | } | ||
19 | |||
20 | // --------------------------------------------------------------------------- | ||
21 | |||
22 | async function processLikeVideo (byAccount: AccountInstance, videoUrl: string) { | ||
23 | const options = { | ||
24 | arguments: [ byAccount, videoUrl ], | ||
25 | errorMessage: 'Cannot like the video with many retries.' | ||
26 | } | ||
27 | |||
28 | return retryTransactionWrapper(createVideoLike, options) | ||
29 | } | ||
30 | |||
31 | function createVideoLike (byAccount: AccountInstance, videoUrl: string) { | ||
32 | return db.sequelize.transaction(async t => { | ||
33 | const video = await db.Video.loadByUrlAndPopulateAccount(videoUrl) | ||
34 | |||
35 | if (!video) throw new Error('Unknown video ' + videoUrl) | ||
36 | |||
37 | const rate = { | ||
38 | type: 'like' as 'like', | ||
39 | videoId: video.id, | ||
40 | accountId: byAccount.id | ||
41 | } | ||
42 | const [ , created ] = await db.AccountVideoRate.findOrCreate({ | ||
43 | where: rate, | ||
44 | defaults: rate | ||
45 | }) | ||
46 | await video.increment('likes') | ||
47 | |||
48 | if (video.isOwned() && created === true) await sendLikeToVideoFollowers(byAccount, video, undefined) | ||
49 | }) | ||
50 | } | ||