Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Entity/SearchForumUserCache.php
<?php

namespace XF\Entity;

use
XF\Mvc\Entity\Entity;
use
XF\Mvc\Entity\Structure;

use function
array_slice, count;

/**
 * COLUMNS
 * @property int $node_id
 * @property int $user_id
 * @property array $results
 * @property int $cache_date
 *
 * GETTERS
 * @property int $result_count
 *
 * RELATIONS
 * @property \XF\Entity\SearchForum $SearchForum
 */
class SearchForumUserCache extends Entity
{
   
/**
     * @return bool
     */
   
public function isExpired(): bool
   
{
       
$cacheTtl = $this->SearchForum->cache_ttl ?? 0;
       
$cutOff = \XF::$time - $cacheTtl * 60;
        return
$this->cache_date < $cutOff;
    }

   
/**
     * @param int $page
     * @param int $perPage
     *
     * @return int[]
     */
   
public function sliceResultsToPage(int $page, int $perPage): array
    {
       
$page = max(1, $page);
       
$perPage = max(1, $perPage);

        return
array_slice($this->results, ($page - 1) * $perPage, $perPage);
    }

   
/**
     * @param int $page
     * @param int $perPage
     * @param string[] $extraWith
     *
     * @return \XF\Mvc\Entity\AbstractCollection|\XF\Entity\Thread[]
     */
   
public function getThreadsByPage(int $page, int $perPage, array $extraWith = [])
    {
       
$threadIds = $this->sliceResultsToPage($page, $perPage);

        return
$this->getSearchForumRepo()
            ->
getThreadsByIdsOrdered($threadIds, $extraWith)
            ->
filterViewable();
    }

   
/**
     * @return int
     */
   
public function getResultCount(): int
   
{
        return
count($this->results);
    }

    public function
_preSave()
    {
       
$this->cache_date = \XF::$time;
    }

   
/**
     * @return Structure
     */
   
public static function getStructure(Structure $structure)
    {
       
$structure->table = 'xf_search_forum_cache_user';
       
$structure->shortName = 'XF:SearchForumUserCache';
       
$structure->primaryKey = ['node_id', 'user_id'];
       
$structure->columns = [
           
'node_id' => [
               
'type' => self::UINT,
               
'required' => true
           
],
           
'user_id' => [
               
'type' => self::UINT,
               
'required' => true
           
],
           
'results' => [
               
'type' => self::LIST_COMMA,
               
'default' => [],
               
'list' => [
                   
'type' => 'posint',
                   
'unique' => true
               
]
            ],
           
'cache_date' => [
               
'type' => self::UINT,
               
'default' => 0
           
]
        ];
       
$structure->getters = [
           
'result_count' => true
       
];
       
$structure->relations = [
           
'SearchForum' => [
               
'entity' => 'XF:SearchForum',
               
'type' => self::TO_ONE,
               
'conditions' => 'node_id',
               
'primary' => true
           
]
        ];

        return
$structure;
    }

   
/**
     * @return \XF\Repository\SearchForum
     */
   
protected function getSearchForumRepo()
    {
        return
$this->repository('XF:SearchForum');
    }
}