diff --git a/Web/Models/Entities/Post.php b/Web/Models/Entities/Post.php index fe6a3078..03385736 100644 --- a/Web/Models/Entities/Post.php +++ b/Web/Models/Entities/Post.php @@ -3,6 +3,7 @@ namespace openvk\Web\Models\Entities; use Chandler\Database\DatabaseConnection as DB; use openvk\Web\Models\Repositories\Clubs; use openvk\Web\Models\RowModel; +use openvk\Web\Models\Entities\Notifications\LikeNotification; class Post extends Postable { @@ -121,6 +122,42 @@ class Post extends Postable $this->stateChanges("content", $content); } + + function toggleLike(User $user): bool + { + $liked = parent::toggleLike($user); + + if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club)) + (new LikeNotification($this->getOwner(false), $this, $user))->emit(); + + foreach($this->getChildren() as $attachment) { + if($attachment instanceof Post) + $attachment->setLike($liked, $user); + } + + return $liked; + } + + function setLike(bool $liked, User $user): void + { + $searchData = [ + "origin" => $user->getId(), + "model" => static::class, + "target" => $this->getRecord()->id, + ]; + + if((sizeof(DB::i()->getContext()->table("likes")->where($searchData)) > 0) !== $liked) { + if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club)) + (new LikeNotification($this->getOwner(false), $this, $user))->emit(); + + parent::setLike($liked, $user); + } + + foreach($this->getChildren() as $attachment) { + if($attachment instanceof Post) + $attachment->setLike($liked, $user); + } + } function deletePost(): void { diff --git a/Web/Models/Entities/Postable.php b/Web/Models/Entities/Postable.php index 05a39777..26670e94 100644 --- a/Web/Models/Entities/Postable.php +++ b/Web/Models/Entities/Postable.php @@ -96,17 +96,35 @@ abstract class Postable extends Attachable yield (new Users)->get($like->origin); } - function toggleLike(User $user): void + function toggleLike(User $user): bool { $searchData = [ "origin" => $user->getId(), "model" => static::class, "target" => $this->getRecord()->id, ]; - if(sizeof(DB::i()->getContext()->table("likes")->where($searchData)) > 0) + + if(sizeof(DB::i()->getContext()->table("likes")->where($searchData)) > 0) { DB::i()->getContext()->table("likes")->where($searchData)->delete(); - else + return false; + } + + DB::i()->getContext()->table("likes")->insert($searchData); + return true; + } + + function setLike(bool $liked, User $user): void + { + $searchData = [ + "origin" => $user->getId(), + "model" => static::class, + "target" => $this->getRecord()->id, + ]; + + if($liked) DB::i()->getContext()->table("likes")->insert($searchData); + else + DB::i()->getContext()->table("likes")->where($searchData)->delete(); } function hasLikeFrom(User $user): bool diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php index d36d3db1..51734a3d 100644 --- a/Web/Presenters/WallPresenter.php +++ b/Web/Presenters/WallPresenter.php @@ -1,7 +1,7 @@ user)) { $post->toggleLike($this->user->identity); - - if($post->getOwner(false)->getId() !== $this->user->identity->getId() && !($post->getOwner() instanceof Club)) - (new LikeNotification($post->getOwner(false), $post, $this->user->identity))->emit(); } $this->redirect(