+async function processCreateDislike (byAccount: AccountInstance, activity: ActivityCreate) {
+ const options = {
+ arguments: [ byAccount, activity ],
+ errorMessage: 'Cannot dislike the video with many retries.'
+ }
+
+ return retryTransactionWrapper(createVideoDislike, options)
+}
+
+function createVideoDislike (byAccount: AccountInstance, activity: ActivityCreate) {
+ const dislike = activity.object as DislikeObject
+
+ return db.sequelize.transaction(async t => {
+ const video = await db.Video.loadByUrlAndPopulateAccount(dislike.object, t)
+ if (!video) throw new Error('Unknown video ' + dislike.object)
+
+ const rate = {
+ type: 'dislike' as 'dislike',
+ videoId: video.id,
+ accountId: byAccount.id
+ }
+ const [ , created ] = await db.AccountVideoRate.findOrCreate({
+ where: rate,
+ defaults: rate,
+ transaction: t
+ })
+ if (created === true) await video.increment('dislikes', { transaction: t })
+
+ if (video.isOwned() && created === true) {
+ // Don't resend the activity to the sender
+ const exceptions = [ byAccount ]
+ await forwardActivity(activity, t, exceptions)
+ }
+ })
+}
+
+async function processCreateView (byAccount: AccountInstance, activity: ActivityCreate) {
+ const view = activity.object as ViewObject
+
+ const video = await db.Video.loadByUrlAndPopulateAccount(view.object)
+
+ if (!video) throw new Error('Unknown video ' + view.object)
+
+ const account = await db.Account.loadByUrl(view.actor)
+ if (!account) throw new Error('Unknown account ' + view.actor)
+
+ await video.increment('views')
+
+ if (video.isOwned()) {
+ // Don't resend the activity to the sender
+ const exceptions = [ byAccount ]
+ await forwardActivity(activity, undefined, exceptions)
+ }
+}
+
+async function processCreateVideoChannel (account: AccountInstance, videoChannelToCreateData: VideoChannelObject) {