+ const { video: onlyVideo } = await getOrCreateAPVideo({ videoObject: likeActivity.object })
+ // We don't care about likes of remote videos
+ if (!onlyVideo.isOwned()) return
+
+ return sequelizeTypescript.transaction(async t => {
+ if (!byActor.Account) throw new Error('Unknown account ' + byActor.url)
+
+ const video = await VideoModel.loadFull(onlyVideo.id, t)
+ const rate = await AccountVideoRateModel.loadByAccountAndVideoOrUrl(byActor.Account.id, video.id, likeActivity.id, t)
+ if (!rate || rate.type !== 'like') {
+ logger.warn('Unknown like by account %d for video %d.', byActor.Account.id, video.id)
+ return
+ }
+
+ await rate.destroy({ transaction: t })
+ await video.decrement('likes', { transaction: t })
+
+ video.likes--
+ await federateVideoIfNeeded(video, false, t)
+ })