db->transStart(); $this->insert([ 'actor_id' => $actor->id, 'comment_id' => $comment->id, ]); (new EpisodeCommentModel()) ->where('id', service('uuid')->fromString($comment->id)->getBytes()) ->increment('likes_count'); if ($registerActivity) { $likeActivity = new LikeActivity(); $likeActivity->set('actor', $actor->uri) ->set('object', $comment->uri); $activityId = model(ActivityModel::class) ->newActivity( 'Like', $actor->id, null, null, $likeActivity->toJSON(), $comment->created_at, 'queued', ); $likeActivity->set('id', url_to('activity', esc($actor->username), $activityId)); model(ActivityModel::class) ->update($activityId, [ 'payload' => $likeActivity->toJSON(), ]); } $this->db->transComplete(); } public function removeLike(Actor $actor, EpisodeComment $comment, bool $registerActivity = true): void { $this->db->transStart(); (new EpisodeCommentModel()) ->where('id', service('uuid') ->fromString($comment->id) ->getBytes()) ->decrement('likes_count'); $this->where([ 'actor_id' => $actor->id, 'comment_id' => service('uuid') ->fromString($comment->id) ->getBytes(), ]) ->delete(); if ($registerActivity) { $undoActivity = new UndoActivity(); // FIXME: get like activity associated with the deleted like $activity = model(ActivityModel::class) ->where([ 'type' => 'Like', 'actor_id' => $actor->id, ]) ->first(); $likeActivity = new LikeActivity(); $likeActivity ->set('id', url_to('activity', esc($actor->username), $activity->id)) ->set('actor', $actor->uri) ->set('object', $comment->uri); $undoActivity ->set('actor', $actor->uri) ->set('object', $likeActivity); $activityId = model(ActivityModel::class) ->newActivity( 'Undo', $actor->id, null, null, $undoActivity->toJSON(), $comment->created_at, 'queued', ); $undoActivity->set('id', url_to('activity', esc($actor->username), $activityId)); model(ActivityModel::class) ->update($activityId, [ 'payload' => $undoActivity->toJSON(), ]); } $this->db->transComplete(); } /** * Adds or removes likes from database */ public function toggleLike(Actor $actor, EpisodeComment $comment): void { if ( $this->where([ 'actor_id' => $actor->id, 'comment_id' => service('uuid') ->fromString($comment->id) ->getBytes(), ])->first() ) { $this->removeLike($actor, $comment); } else { $this->addLike($actor, $comment); } } }