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;
|
|
|
|
|
|
|
|
class Post extends Postable
|
|
|
|
{
|
|
|
|
protected $tableName = "posts";
|
|
|
|
protected $upperNodeReferenceColumnName = "wall";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* May return fake owner (group), if flags are [1, (*)]
|
|
|
|
*
|
|
|
|
* @param bool $honourFlags - check flags
|
|
|
|
*/
|
|
|
|
function getOwner(bool $honourFlags = true): RowModel
|
|
|
|
{
|
|
|
|
if($honourFlags && ( ($this->getRecord()->flags & 0b10000000) > 0 )) {
|
|
|
|
if($this->getRecord()->wall < 0)
|
|
|
|
return (new Clubs)->get(abs($this->getRecord()->wall));
|
|
|
|
}
|
|
|
|
|
|
|
|
return parent::getOwner();
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
function isExplicit(): bool
|
|
|
|
{
|
2021-01-07 19:19:36 +03:00
|
|
|
return (bool) $this->getRecord()->nsfw;
|
2020-06-07 19:04:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function isDeleted(): bool
|
|
|
|
{
|
|
|
|
return (bool) $this->getRecord()->deleted;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getOwnerPost(): int
|
|
|
|
{
|
|
|
|
return $this->getRecord()->owner;
|
|
|
|
}
|
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2021-09-20 16:46:55 +03:00
|
|
|
function canBePinnedBy(User $user): bool
|
2020-06-18 14:22:32 +03:00
|
|
|
{
|
|
|
|
if($this->getTargetWall() < 0)
|
2021-09-20 16:46:55 +03:00
|
|
|
return (new Clubs)->get(abs($this->getTargetWall()))->canBeModifiedBy($user);
|
2020-06-18 14:22:32 +03:00
|
|
|
|
2021-09-20 16:46:55 +03:00
|
|
|
return $this->getTargetWall() === $user->getId();
|
|
|
|
}
|
|
|
|
|
|
|
|
function canBeDeletedBy(User $user): bool
|
|
|
|
{
|
|
|
|
return $this->getOwnerPost() === $user->getId() || $this->canBePinnedBy($user);
|
2020-06-18 14:22:32 +03:00
|
|
|
}
|
|
|
|
|
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 deletePost(): void
|
|
|
|
{
|
|
|
|
$this->setDeleted(1);
|
|
|
|
$this->unwire();
|
|
|
|
$this->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
use Traits\TRichText;
|
|
|
|
}
|