162 lines
6.8 KiB
PHP
162 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use UserData;
|
|
use DB;
|
|
|
|
class FeedModel extends \Hleb\Scheme\App\Models\MainModel
|
|
{
|
|
public static function feed($page, $limit, $sheet, $slug, $topic = '')
|
|
{
|
|
$user_id = UserData::getUserId();
|
|
$string = self::sorting($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 <= " . UserData::getUserTl();
|
|
$display = "AND post_is_deleted = 0 $trust_level";
|
|
|
|
// Sorting posts by conditions
|
|
// Сортировка постов по условиям
|
|
$sort = "ORDER BY post_answers_count DESC";
|
|
if (in_array($sheet, ['facet.feed', 'web.feed', 'questions', 'posts'])) {
|
|
$sort = "ORDER BY post_top DESC, post_date DESC";
|
|
} elseif (in_array($sheet, ['admin.posts.all', 'admin.posts.ban', 'profile.posts'])) {
|
|
$sort = "ORDER BY post_date DESC";
|
|
}
|
|
|
|
$start = ($page - 1) * $limit;
|
|
$sql = "SELECT
|
|
post_id,
|
|
post_title,
|
|
post_slug,
|
|
post_feature,
|
|
post_translation,
|
|
post_draft,
|
|
post_nsfw,
|
|
post_hidden,
|
|
post_date,
|
|
post_published,
|
|
post_user_id,
|
|
post_votes,
|
|
post_hits_count,
|
|
post_answers_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 $sort LIMIT :start, :limit";
|
|
|
|
if (in_array($sheet, ['facet.feed', 'recommend', 'questions', 'posts'])) {
|
|
return DB::run($sql, ['qa' => "%" . $slug . "@%", 'start' => $start, 'limit' => $limit])->fetchAll();
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
public static function feedCount($sheet, $slug, $topic = '')
|
|
{
|
|
$string = self::sorting($sheet);
|
|
$user_id = UserData::getUserId();
|
|
|
|
$trust_level = ($user_id == 0) ? "AND post_tl = 0" : "AND post_tl <= " . UserData::getUserTl();
|
|
$display = "AND post_is_deleted = 0 $trust_level";
|
|
|
|
$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";
|
|
|
|
if (in_array($sheet, ['facet.feed', 'recommend', 'questions', 'posts'])) {
|
|
return DB::run($sql, ['qa' => "%" . $slug . "@%"])->rowCount();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public static function sorting($sheet)
|
|
{
|
|
$hidden = UserData::checkAdmin() ? "" : "AND post_hidden = 0";
|
|
|
|
switch ($sheet) {
|
|
case 'facet.feed':
|
|
$string = "WHERE facet_list LIKE :qa AND post_draft = 0 AND post_type = 'post' $hidden";
|
|
break;
|
|
case 'facet.feed.topic':
|
|
$string = "WHERE facet_list LIKE :qa AND facet_list LIKE :topic AND post_draft = 0 AND post_type = 'post'";
|
|
break;
|
|
case 'questions':
|
|
$string = "WHERE facet_list LIKE :qa AND post_draft = 0 AND post_feature = 1 $hidden";
|
|
break;
|
|
case 'posts':
|
|
$string = "WHERE facet_list LIKE :qa AND post_draft = 0 AND post_feature = 0 $hidden";
|
|
break;
|
|
case 'recommend':
|
|
$string = "WHERE facet_list LIKE :qa AND post_is_recommend = 1 AND post_draft = 0 AND post_type = 'post' $hidden";
|
|
break;
|
|
case 'web.feed':
|
|
$string = "WHERE post_url_domain = :qa AND post_draft = 0 $hidden";
|
|
break;
|
|
case 'profile.posts':
|
|
$string = "WHERE post_user_id = :qa AND post_draft = 0 AND post_type = 'post'";
|
|
break;
|
|
}
|
|
|
|
return $string;
|
|
}
|
|
}
|