-function processUndoDislike (actor: string, activity: ActivityUndo) {
- const options = {
- arguments: [ actor, activity ],
- errorMessage: 'Cannot undo dislike with many retries.'
- }
+async function processUndoDislike (byActor: MActorSignature, activity: ActivityUndo) {
+ const dislike = activity.object.type === 'Dislike'
+ ? activity.object
+ : activity.object.object as DislikeObject
+
+ const { video: onlyVideo } = await getOrCreateAPVideo({ videoObject: dislike.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, dislike.id, t)
+ if (!rate || rate.type !== 'dislike') {
+ logger.warn(`Unknown dislike by account %d for video %d.`, byActor.Account.id, video.id)
+ return
+ }
+
+ await rate.destroy({ transaction: t })
+ await video.decrement('dislikes', { transaction: t })
+ video.dislikes--