-function processUndoLike (actor: string, likeActivity: ActivityLike) {
- const options = {
- arguments: [ actor, likeActivity ],
- errorMessage: 'Cannot undo like with many retries.'
- }
+async function processUndoLike (byActor: MActorSignature, activity: ActivityUndo) {
+ const likeActivity = activity.object as ActivityLike
+
+ 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 })