Просмотр файла libarea-0.9/app/Models/FeedModel.php

Размер файла: 6.37Kb
<?php

declare(strict_types=1);

namespace App\Models;

use Hleb\Base\Model;
use Hleb\Static\DB;
use Sorting;

class FeedModel extends Model
{
    public static function feed($page, $limit, $sheet, $slug, $topic = '')
    {
        $user_id    = self::container()->user()->id();
        $string     = self::display($sheet);

        // Deleted post, banned from showing in the feed and limited by TL (trust_level)
        // Удаленный пост, запрещенный к показу в ленте и ограниченный по TL (trust_level)
        $trust_level =  ($user_id == 0) ? "AND post_tl = 0" : "AND post_tl <= " . self::container()->user()->tl();
        $display = "AND post_is_deleted = 0 $trust_level";

        // Sorting posts by conditions
        // Сортировка постов по условиям
        $sort = Sorting::day($sheet);
		
		$nsfw = self::container()->user()->nsfw() ? "" : "AND post_nsfw = 0";

        $start  = ($page - 1) * $limit;
        $sql = "SELECT 
                    post_id,
                    post_title,
                    post_slug,
                    post_translation,
                    post_draft,
					post_type,
                    post_nsfw,
                    post_hidden,
                    post_date,
                    post_published,
                    post_user_id,
                    post_votes,
                    post_hits_count,
                    post_comments_count,
                    post_content,
                    post_content_img,
                    post_thumb_img,
                    post_merged_id,
                    post_closed,
                    post_tl,
                    post_ip,
                    post_lo,
                    post_top,
                    post_url_domain,
                    post_is_deleted,
                    rel.*,
                    votes_post_item_id, votes_post_user_id,
                    u.id, u.login, u.avatar, u.created_at,
                    fav.tid, fav.user_id, fav.action_type
                    
                        FROM posts
                            LEFT JOIN
                            (
                                SELECT 
                                    relation_post_id,
                                    GROUP_CONCAT(facet_type, '@', facet_slug, '@', facet_title SEPARATOR '@') AS facet_list
                                    FROM facets      
                                    LEFT JOIN facets_posts_relation on facet_id = relation_facet_id 
                                        
                                    GROUP BY relation_post_id  
                            ) AS rel ON rel.relation_post_id = post_id 
                            
                            INNER JOIN users u ON u.id = post_user_id
                            LEFT JOIN favorites fav ON fav.tid = post_id AND fav.user_id = " . $user_id . " AND fav.action_type = 'post'
                            LEFT JOIN votes_post ON votes_post_item_id = post_id AND votes_post_user_id = " . $user_id . "
                                        
                                $string $display AND post_type != 'page' $nsfw $sort LIMIT :start, :limit";

        if (in_array($sheet, ['profile.posts', 'web.feed'])) {
            return DB::run($sql, ['qa' => $slug, 'start' => $start, 'limit' => $limit])->fetchAll();
        }

        if ($sheet == 'facet.feed.topic') {
            return DB::run($sql, ['qa' => "%" . $slug . "@%", 'topic' => "%" . $topic . "@%", 'start' => $start, 'limit' => $limit])->fetchAll();
        }

        return DB::run($sql, ['qa' => "%" . $slug . "@%", 'start' => $start, 'limit' => $limit])->fetchAll();
    }

    public static function feedCount($sheet, $slug, $topic = '')
    {
        $string     = self::display($sheet);
        $user_id    = self::container()->user()->id();

        $trust_level = ($user_id == 0) ? "AND post_tl = 0" : "AND post_tl <= " . self::container()->user()->tl();
        $display = "AND post_is_deleted = 0 $trust_level";
		$nsfw = (self::container()->user()->tl()) ? "" : "AND post_nsfw = 0";

        $sql = "SELECT 
                    post_id,
                    rel.*
                        FROM posts
                             LEFT JOIN
                        (
                            SELECT 
                                relation_post_id,
                                GROUP_CONCAT(facet_type, '@', facet_slug, '@', facet_title SEPARATOR '@') AS facet_list
                                FROM facets      
                                    LEFT JOIN facets_posts_relation on facet_id = relation_facet_id 
                                        GROUP BY relation_post_id  
                        ) AS rel ON rel.relation_post_id = post_id 
                            $string $display AND post_type != 'page' $nsfw";

        if (in_array($sheet, ['profile.posts', 'web.feed'])) {
            return DB::run($sql, ['qa' => $slug])->rowCount();
        }

        if ($sheet === 'facet.feed.topic') {
            return DB::run($sql, ['qa' => "%" . $slug . "@%", 'topic' => "%" . $topic . "@%"])->rowCount();
        }

        return DB::run($sql, ['qa' => "%" . $slug . "@%"])->rowCount();
    }

    public static function display(string $type)
    {
        $hidden = self::container()->user()->admin() ? '' : ' AND post_hidden = 0';

		return match ($type) {
			'facet.feed'		=> 	'WHERE facet_list LIKE :qa AND post_draft = 0 ' . $hidden,
			'facet.feed.topic'	=> 	'WHERE facet_list LIKE :qa AND facet_list LIKE :topic AND post_draft = 0 AND post_type = \'post\'',
			'question'			=> 	'WHERE facet_list LIKE :qa AND post_draft = 0 AND post_type = \'question\' ' . $hidden,
			'article'			=> 	'WHERE facet_list LIKE :qa AND post_draft = 0 AND post_type = \'article\' ' . $hidden ,
			'post'				=> 	'WHERE facet_list LIKE :qa AND post_draft = 0 AND post_type = \'post\' ' . $hidden ,
			'note'				=> 	'WHERE facet_list LIKE :qa AND post_draft = 0 AND post_type = \'note\' ' . $hidden ,
			'recommend'			=>	'WHERE facet_list LIKE :qa AND post_is_recommend = 1 AND post_draft = 0 AND post_type = \'post\'' . $hidden,
			'web.feed'			=> 	'WHERE post_url_domain = :qa AND post_draft = 0 ' . $hidden,
			'profile.posts'		=> 	'WHERE post_user_id = :qa AND post_draft = 0',
		};
        /** @toDo здесь возможно нужно выбрасывать ошибку вместо этой переменной. */
		
	
        return $string;
    }
}