mirror of
https://github.com/openvk/openvk
synced 2024-12-24 17:41:07 +03:00
4699fcbeb9
* Wall: add early suggestions * Fix br * Fix empty posts * fck * Add offset for api * Add notifications of new suggestion posts * Fix mentions in suggested posts * 🤮🤢 * Change regex Теперь оно удаляет все теги а не только <br> * Add da koroche pohuy * Эдд апи метходс Методы нестандартные немного * Pon * Add skloneniyia * newlines * int * Update loaders and add avtopodgruzka postov * Update JOERGK.strings * Blin * Remove repeated code, fix loaded buttons on chr... ...ome and fix getting suggested posts via API.Wall.getPost * Fix polls * Fihes Теперь уведомление о принятии поста не приходит, если вы приняли свой же пост Пофикшен баг перехода в предложку Добавлен старый вид постов в предложке Теперь счётчик постов в предложке у прикреплённой группы обновляется при принятии или отклонении поста Убрано всплывающее уведомление об отклонении поста (оно раздражает) Теперь если вы посмотрели все посты на одной странице (не на первой) и на ней не осталось постов, вас телепортирует на предыдущую страницу * Remove ability to delete your accepted psto * oi blin * Improvements 2 api * g * openvk.uk Возможно, приведение кода к кодстайлу (удаление скобочек то есть) * aiaks * al_wall.js -> al_suggestions.js * 👨💻 Add 👨💻 fading 👨💻 * Add "owner's posts' and "other's posts" Давайте рофлить👨💻👨💻👨💻 * planshet openvk Add tabs for post view, add signer's object in wall get and add person icon in microblog * Simplefai ze kod * PHP 8 FIX WATAFAK * Add indesk
185 lines
5.3 KiB
PHP
185 lines
5.3 KiB
PHP
<?php declare(strict_types=1);
|
|
namespace openvk\Web\Models\Entities;
|
|
use openvk\Web\Util\DateTime;
|
|
use openvk\Web\Models\RowModel;
|
|
use openvk\Web\Models\Entities\User;
|
|
use openvk\Web\Models\Repositories\Users;
|
|
use openvk\Web\Models\Repositories\Clubs;
|
|
use openvk\Web\Models\Repositories\Comments;
|
|
use Chandler\Database\DatabaseConnection as DB;
|
|
use Nette\InvalidStateException as ISE;
|
|
use Nette\Database\Table\Selection;
|
|
|
|
abstract class Postable extends Attachable
|
|
{
|
|
/**
|
|
* Column name, that references to an object, that
|
|
* is hieararchically higher than this Postable.
|
|
*
|
|
* For example: Images belong to User, but Posts belong to Wall.
|
|
* Formally users still own posts, but walls also own posts and they are
|
|
* their direct parent.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $upperNodeReferenceColumnName = "owner";
|
|
|
|
private function getTable(): Selection
|
|
{
|
|
return DB::i()->getContext()->table($this->tableName);
|
|
}
|
|
|
|
function getOwner(bool $real = false): RowModel
|
|
{
|
|
$oid = (int) $this->getRecord()->owner;
|
|
if(!$real && $this->isAnonymous())
|
|
$oid = (int) OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["anonymousPosting"]["account"];
|
|
|
|
$oid = abs($oid);
|
|
if($oid > 0)
|
|
return (new Users)->get($oid);
|
|
else
|
|
return (new Clubs)->get($oid * -1);
|
|
}
|
|
|
|
function getVirtualId(): int
|
|
{
|
|
return $this->getRecord()->virtual_id;
|
|
}
|
|
|
|
function getPrettyId(): string
|
|
{
|
|
return $this->getRecord()->owner . "_" . $this->getVirtualId();
|
|
}
|
|
|
|
function getPublicationTime(): DateTime
|
|
{
|
|
return new DateTime($this->getRecord()->created);
|
|
}
|
|
|
|
function getEditTime(): ?DateTime
|
|
{
|
|
$edited = $this->getRecord()->edited;
|
|
if(is_null($edited)) return NULL;
|
|
|
|
return new DateTime($edited);
|
|
}
|
|
|
|
function getComments(int $page, ?int $perPage = NULL): \Traversable
|
|
{
|
|
return (new Comments)->getCommentsByTarget($this, $page, $perPage);
|
|
}
|
|
|
|
function getCommentsCount(): int
|
|
{
|
|
return (new Comments)->getCommentsCountByTarget($this);
|
|
}
|
|
|
|
function getLastComments(int $count): \Traversable
|
|
{
|
|
return (new Comments)->getLastCommentsByTarget($this, $count);
|
|
}
|
|
|
|
function getLikesCount(): int
|
|
{
|
|
return sizeof(DB::i()->getContext()->table("likes")->where([
|
|
"model" => static::class,
|
|
"target" => $this->getRecord()->id,
|
|
])->group("origin"));
|
|
}
|
|
|
|
function getLikers(int $page = 1, ?int $perPage = NULL): \Traversable
|
|
{
|
|
$perPage ??= OPENVK_DEFAULT_PER_PAGE;
|
|
|
|
$sel = DB::i()->getContext()->table("likes")->where([
|
|
"model" => static::class,
|
|
"target" => $this->getRecord()->id,
|
|
])->page($page, $perPage);
|
|
|
|
foreach($sel as $like)
|
|
yield (new Users)->get($like->origin);
|
|
}
|
|
|
|
function isAnonymous(): bool
|
|
{
|
|
return (bool) $this->getRecord()->anonymous;
|
|
}
|
|
|
|
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) {
|
|
DB::i()->getContext()->table("likes")->where($searchData)->delete();
|
|
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) {
|
|
if(!$this->hasLikeFrom($user)) {
|
|
DB::i()->getContext()->table("likes")->insert($searchData);
|
|
}
|
|
} else {
|
|
if($this->hasLikeFrom($user)) {
|
|
DB::i()->getContext()->table("likes")->where($searchData)->delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hasLikeFrom(User $user): bool
|
|
{
|
|
$searchData = [
|
|
"origin" => $user->getId(),
|
|
"model" => static::class,
|
|
"target" => $this->getRecord()->id,
|
|
];
|
|
|
|
return sizeof(DB::i()->getContext()->table("likes")->where($searchData)) > 0;
|
|
}
|
|
|
|
function setVirtual_Id(int $id): void
|
|
{
|
|
throw new ISE("Setting virtual id manually is forbidden");
|
|
}
|
|
|
|
function save(?bool $log = false): void
|
|
{
|
|
$vref = $this->upperNodeReferenceColumnName;
|
|
|
|
$vid = $this->getRecord()->{$vref} ?? $this->changes[$vref];
|
|
if(!$vid)
|
|
throw new ISE("Can't presist post due to inability to calculate it's $vref post count. Have you set it?");
|
|
|
|
$pCount = sizeof($this->getTable()->where($vref, $vid));
|
|
if(is_null($this->getRecord())) {
|
|
# lol allow ppl to taint created value
|
|
if(!isset($this->changes["created"]))
|
|
$this->stateChanges("created", time());
|
|
|
|
$this->stateChanges("virtual_id", $pCount + 1);
|
|
} /*else {
|
|
$this->stateChanges("edited", time());
|
|
}*/
|
|
|
|
parent::save($log);
|
|
}
|
|
|
|
use Traits\TAttachmentHost;
|
|
use Traits\TOwnable;
|
|
}
|