openvk/Web/Models/Entities/Post.php

211 lines
5.6 KiB
PHP
Raw Normal View History

2020-06-07 19:04:43 +03:00
<?php declare(strict_types=1);
namespace openvk\Web\Models\Entities;
2021-09-20 15:19:15 +03:00
use Chandler\Database\DatabaseConnection as DB;
2020-06-07 19:04:43 +03:00
use openvk\Web\Models\Repositories\Clubs;
use openvk\Web\Models\RowModel;
use openvk\Web\Models\Entities\Notifications\LikeNotification;
2020-06-07 19:04:43 +03:00
class Post extends Postable
{
protected $tableName = "posts";
protected $upperNodeReferenceColumnName = "wall";
private function setLikeRecursively(bool $liked, User $user, int $depth): 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) && !$this instanceof Comment)
(new LikeNotification($this->getOwner(false), $this, $user))->emit();
parent::setLike($liked, $user);
}
if($depth < ovkGetQuirk("wall.repost-liking-recursion-limit"))
foreach($this->getChildren() as $attachment)
if($attachment instanceof Post)
$attachment->setLikeRecursively($liked, $user, $depth + 1);
}
2020-06-07 19:04:43 +03:00
/**
* May return fake owner (group), if flags are [1, (*)]
*
* @param bool $honourFlags - check flags
*/
2021-11-15 22:45:48 +03:00
function getOwner(bool $honourFlags = true, bool $real = false): RowModel
2020-06-07 19:04:43 +03:00
{
if($honourFlags && $this->isPostedOnBehalfOfGroup()) {
2020-06-07 19:04:43 +03:00
if($this->getRecord()->wall < 0)
return (new Clubs)->get(abs($this->getRecord()->wall));
}
2021-11-15 22:45:48 +03:00
return parent::getOwner($real);
2020-06-07 19:04:43 +03:00
}
function getPrettyId(): string
{
return $this->getRecord()->wall . "_" . $this->getVirtualId();
}
function getTargetWall(): int
{
return $this->getRecord()->wall;
}
function getRepostCount(): int
{
return sizeof(
$this->getRecord()
->related("attachments.attachable_id")
->where("attachable_type", get_class($this))
);
}
2021-09-20 15:19:15 +03:00
function isPinned(): bool
{
return (bool) $this->getRecord()->pinned;
}
2020-06-07 19:04:43 +03:00
function isAd(): bool
{
return (bool) $this->getRecord()->ad;
}
function isPostedOnBehalfOfGroup(): bool
{
return ($this->getRecord()->flags & 0b10000000) > 0;
}
function isSigned(): bool
{
return ($this->getRecord()->flags & 0b01000000) > 0;
}
2022-08-05 23:00:52 +03:00
function isDeactivationMessage(): bool
{
return ($this->getRecord()->flags & 0b00100000) > 0;
}
2020-06-07 19:04:43 +03:00
function isExplicit(): bool
{
return (bool) $this->getRecord()->nsfw;
2020-06-07 19:04:43 +03:00
}
function isClosed(): bool
{
return (bool) $this->getRecord()->closed;
}
2020-06-07 19:04:43 +03:00
function isDeleted(): bool
{
return (bool) $this->getRecord()->deleted;
}
function getOwnerPost(): int
{
return $this->getOwner(false)->getId();
2020-06-07 19:04:43 +03:00
}
2021-09-20 15:19:15 +03:00
function pin(): void
{
DB::i()
->getContext()
->table("posts")
->where([
"wall" => $this->getTargetWall(),
"pinned" => true,
])
->update(["pinned" => false]);
$this->stateChanges("pinned", true);
$this->save();
}
function unpin(): void
{
$this->stateChanges("pinned", false);
$this->save();
}
function close(): void
{
DB::i()
->getContext()
->table("posts")
->where([
"wall" => $this->getTargetWall(),
"closed" => true,
])
->update(["closed" => false]);
$this->stateChanges("closed", true);
$this->save();
}
function open(): void
{
$this->stateChanges("closed", false);
$this->save();
}
2021-09-20 15:19:15 +03:00
function canBePinnedBy(User $user): bool
{
if($this->getTargetWall() < 0)
return (new Clubs)->get(abs($this->getTargetWall()))->canBeModifiedBy($user);
return $this->getTargetWall() === $user->getId();
}
function canBeDeletedBy(User $user): bool
{
return $this->getOwnerPost() === $user->getId() || $this->canBePinnedBy($user);
}
function canBeClosedBy(User $user): bool
{
return $this->canBeDeletedBy($user);
}
2020-06-07 19:04:43 +03:00
function setContent(string $content): void
{
if(ctype_space($content))
throw new \LengthException("Content length must be at least 1 character (not counting whitespaces).");
2020-08-20 15:58:40 +03:00
else if(iconv_strlen($content) > OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["postSizes"]["maxSize"])
throw new \LengthException("Content is too large.");
2020-06-07 19:04:43 +03:00
$this->stateChanges("content", $content);
}
function toggleLike(User $user): bool
{
$liked = parent::toggleLike($user);
if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club) && !$this instanceof Comment)
(new LikeNotification($this->getOwner(false), $this, $user))->emit();
foreach($this->getChildren() as $attachment)
if($attachment instanceof Post)
$attachment->setLikeRecursively($liked, $user, 2);
return $liked;
}
function setLike(bool $liked, User $user): void
{
$this->setLikeRecursively($liked, $user, 1);
}
2020-06-07 19:04:43 +03:00
function deletePost(): void
{
$this->setDeleted(1);
$this->unwire();
$this->save();
}
use Traits\TRichText;
}