Fixed soft delete listing issues.

This commit is contained in:
flash 2019-01-03 16:57:17 +01:00
parent eed6fb7764
commit 4f15544a30
4 changed files with 105 additions and 71 deletions

View file

@ -49,7 +49,7 @@ $topics = $forumMayHaveTopics
user_session_current('user_id', 0), user_session_current('user_id', 0),
$topicsOffset, $topicsOffset,
$forumPagination['range'], $forumPagination['range'],
perms_check($perms, MSZ_FORUM_PERM_DELETE_TOPIC) perms_check($perms, MSZ_FORUM_PERM_DELETE_TOPIC | MSZ_FORUM_PERM_DELETE_ANY_POST)
) )
: []; : [];

View file

@ -5,7 +5,11 @@ $categories = forum_get_root_categories(user_session_current('user_id', 0));
$blankForum = count($categories) <= 1 && $categories[0]['forum_children'] < 1; $blankForum = count($categories) <= 1 && $categories[0]['forum_children'] < 1;
foreach ($categories as $key => $category) { foreach ($categories as $key => $category) {
$categories[$key]['forum_subforums'] = forum_get_children($category['forum_id'], user_session_current('user_id', 0)); $categories[$key]['forum_subforums'] = forum_get_children(
$category['forum_id'],
user_session_current('user_id', 0),
perms_check($category['forum_permissions'], MSZ_FORUM_PERM_DELETE_TOPIC | MSZ_FORUM_PERM_DELETE_ANY_POST)
);
foreach ($categories[$key]['forum_subforums'] as $skey => $sub) { foreach ($categories[$key]['forum_subforums'] as $skey => $sub) {
if (!forum_may_have_children($sub['forum_type'])) { if (!forum_may_have_children($sub['forum_type'])) {
@ -13,7 +17,12 @@ foreach ($categories as $key => $category) {
} }
$categories[$key]['forum_subforums'][$skey]['forum_subforums'] $categories[$key]['forum_subforums'][$skey]['forum_subforums']
= forum_get_children($sub['forum_id'], user_session_current('user_id', 0), true); = forum_get_children(
$sub['forum_id'],
user_session_current('user_id', 0),
perms_check($sub['forum_permissions'], MSZ_FORUM_PERM_DELETE_TOPIC | MSZ_FORUM_PERM_DELETE_ANY_POST),
true
);
} }
} }

View file

@ -61,6 +61,7 @@ define('MSZ_FORUM_ROOT_DATA', [ // should be compatible with the data fetched in
'forum_children' => 0, 'forum_children' => 0,
'forum_type' => MSZ_FORUM_TYPE_CATEGORY, 'forum_type' => MSZ_FORUM_TYPE_CATEGORY,
'forum_colour' => null, 'forum_colour' => null,
'forum_permissions' => MSZ_FORUM_PERM_SET_READ,
]); ]);
function forum_is_valid_type(int $type): bool function forum_is_valid_type(int $type): bool
@ -78,9 +79,10 @@ function forum_may_have_topics(int $forumType): bool
return in_array($forumType, MSZ_FORUM_MAY_HAVE_TOPICS); return in_array($forumType, MSZ_FORUM_MAY_HAVE_TOPICS);
} }
function forum_fetch(int $forumId): array function forum_fetch(int $forumId, bool $showDeleted = false): array
{ {
$getForum = db_prepare(' $getForum = db_prepare(sprintf(
'
SELECT SELECT
`forum_id`, `forum_name`, `forum_type`, `forum_link`, `forum_archived`, `forum_id`, `forum_name`, `forum_type`, `forum_link`, `forum_archived`,
`forum_link_clicks`, `forum_parent`, `forum_colour`, `forum_link_clicks`, `forum_parent`, `forum_colour`,
@ -88,10 +90,13 @@ function forum_fetch(int $forumId): array
SELECT COUNT(`topic_id`) SELECT COUNT(`topic_id`)
FROM `msz_forum_topics` FROM `msz_forum_topics`
WHERE `forum_id` = f.`forum_id` WHERE `forum_id` = f.`forum_id`
%1$s
) as `forum_topic_count` ) as `forum_topic_count`
FROM `msz_forum_categories` as f FROM `msz_forum_categories` as f
WHERE `forum_id` = :forum_id WHERE `forum_id` = :forum_id
'); ',
$showDeleted ? '' : 'AND `topic_deleted` IS NULL'
));
$getForum->bindValue('forum_id', $forumId); $getForum->bindValue('forum_id', $forumId);
$forums = $getForum->execute() ? $getForum->fetch(PDO::FETCH_ASSOC) : false; $forums = $getForum->execute() ? $getForum->fetch(PDO::FETCH_ASSOC) : false;
@ -101,21 +106,23 @@ function forum_fetch(int $forumId): array
function forum_get_root_categories(int $userId): array function forum_get_root_categories(int $userId): array
{ {
$getCategories = db_prepare(sprintf( $getCategories = db_prepare(sprintf(
" '
SELECT SELECT
f.`forum_id`, f.`forum_name`, f.`forum_type`, f.`forum_colour`, f.`forum_id`, f.`forum_name`, f.`forum_type`, f.`forum_colour`,
( (
SELECT COUNT(`forum_id`) SELECT COUNT(`forum_id`)
FROM `msz_forum_categories` as sf FROM `msz_forum_categories` AS sf
WHERE sf.`forum_parent` = f.`forum_id` WHERE sf.`forum_parent` = f.`forum_id`
) as `forum_children` ) AS `forum_children`,
FROM `msz_forum_categories` as f (%2$s) AS `forum_permissions`
FROM `msz_forum_categories` AS f
WHERE f.`forum_parent` = 0 WHERE f.`forum_parent` = 0
AND f.`forum_type` = %d AND f.`forum_type` = %1$d
AND f.`forum_hidden` = 0 AND f.`forum_hidden` = 0
AND (%s & %d) > 0 GROUP BY f.`forum_id`
HAVING (`forum_permissions` & %3$d) > 0
ORDER BY f.`forum_order` ORDER BY f.`forum_order`
", ',
MSZ_FORUM_TYPE_CATEGORY, MSZ_FORUM_TYPE_CATEGORY,
forum_perms_get_user_sql('forum', 'f.`forum_id`'), forum_perms_get_user_sql('forum', 'f.`forum_id`'),
MSZ_FORUM_PERM_SET_READ MSZ_FORUM_PERM_SET_READ
@ -264,11 +271,12 @@ define(
'MSZ_FORUM_GET_CHILDREN_QUERY_SMALL', 'MSZ_FORUM_GET_CHILDREN_QUERY_SMALL',
' '
SELECT SELECT
:user_id as `target_user_id`, :user_id AS `target_user_id`,
f.`forum_id`, f.`forum_name`, f.`forum_id`, f.`forum_name`,
(%1$s) as `forum_unread` (%1$s) AS `forum_unread`,
FROM `msz_forum_categories` as f (%4$s) AS `forum_permissions`
LEFT JOIN `msz_forum_topics` as t FROM `msz_forum_categories` AS f
LEFT JOIN `msz_forum_topics` AS t
ON t.`topic_id` = ( ON t.`topic_id` = (
SELECT `topic_id` SELECT `topic_id`
FROM `msz_forum_topics` FROM `msz_forum_topics`
@ -279,7 +287,8 @@ define(
) )
WHERE `forum_parent` = :parent_id WHERE `forum_parent` = :parent_id
AND `forum_hidden` = false AND `forum_hidden` = false
AND (%4$s & %5$d) > 0 GROUP BY f.`forum_id`
HAVING (`forum_permissions` & %5$d) > 0
ORDER BY f.`forum_order` ORDER BY f.`forum_order`
' '
); );
@ -288,60 +297,65 @@ define(
'MSZ_FORUM_GET_CHILDREN_QUERY_STANDARD', 'MSZ_FORUM_GET_CHILDREN_QUERY_STANDARD',
' '
SELECT SELECT
:user_id as `target_user_id`, :user_id AS `target_user_id`,
f.`forum_id`, f.`forum_name`, f.`forum_description`, f.`forum_type`, f.`forum_id`, f.`forum_name`, f.`forum_description`, f.`forum_type`,
f.`forum_link`, f.`forum_link_clicks`, f.`forum_archived`, f.`forum_colour`, f.`forum_link`, f.`forum_link_clicks`, f.`forum_archived`, f.`forum_colour`,
t.`topic_id` as `recent_topic_id`, p.`post_id` as `recent_post_id`, t.`topic_id` AS `recent_topic_id`, p.`post_id` AS `recent_post_id`,
t.`topic_title` as `recent_topic_title`, t.`topic_bumped` as `recent_topic_bumped`, t.`topic_title` AS `recent_topic_title`, t.`topic_bumped` AS `recent_topic_bumped`,
p.`post_created` as `recent_post_created`, p.`post_created` AS `recent_post_created`,
u.`user_id` as `recent_post_user_id`, u.`user_id` AS `recent_post_user_id`,
u.`username` as `recent_post_username`, u.`username` AS `recent_post_username`,
COALESCE(u.`user_colour`, r.`role_colour`) as `recent_post_user_colour`, COALESCE(u.`user_colour`, r.`role_colour`) AS `recent_post_user_colour`,
( (
SELECT COUNT(`topic_id`) SELECT COUNT(`topic_id`)
FROM `msz_forum_topics` FROM `msz_forum_topics`
WHERE `forum_id` = f.`forum_id` WHERE `forum_id` = f.`forum_id`
) as `forum_topic_count`, %6$s
) AS `forum_topic_count`,
( (
SELECT COUNT(`post_id`) SELECT COUNT(`post_id`)
FROM `msz_forum_posts` FROM `msz_forum_posts`
WHERE `forum_id` = f.`forum_id` WHERE `forum_id` = f.`forum_id`
) as `forum_post_count`, %7$s
(%1$s) as `forum_unread` ) AS `forum_post_count`,
FROM `msz_forum_categories` as f (%1$s) AS `forum_unread`,
LEFT JOIN `msz_forum_topics` as t (%4$s) AS `forum_permissions`
FROM `msz_forum_categories` AS f
LEFT JOIN `msz_forum_topics` AS t
ON t.`topic_id` = ( ON t.`topic_id` = (
SELECT `topic_id` SELECT `topic_id`
FROM `msz_forum_topics` FROM `msz_forum_topics`
WHERE `forum_id` = f.`forum_id` WHERE `forum_id` = f.`forum_id`
AND `topic_deleted` IS NULL %6$s
ORDER BY `topic_bumped` DESC ORDER BY `topic_bumped` DESC
LIMIT 1 LIMIT 1
) )
LEFT JOIN `msz_forum_posts` as p LEFT JOIN `msz_forum_posts` AS p
ON p.`post_id` = ( ON p.`post_id` = (
SELECT `post_id` SELECT `post_id`
FROM `msz_forum_posts` FROM `msz_forum_posts`
WHERE `topic_id` = t.`topic_id` WHERE `topic_id` = t.`topic_id`
%7$s
ORDER BY `post_id` DESC ORDER BY `post_id` DESC
LIMIT 1 LIMIT 1
) )
LEFT JOIN `msz_users` as u LEFT JOIN `msz_users` AS u
ON u.`user_id` = p.`user_id` ON u.`user_id` = p.`user_id`
LEFT JOIN `msz_roles` as r LEFT JOIN `msz_roles` AS r
ON r.`role_id` = u.`display_role` ON r.`role_id` = u.`display_role`
WHERE f.`forum_parent` = :parent_id WHERE f.`forum_parent` = :parent_id
AND f.`forum_hidden` = 0 AND f.`forum_hidden` = 0
AND (%4$s & %5$d) > 0
AND ( AND (
(f.`forum_parent` = %2$d AND f.`forum_type` != %3$d) (f.`forum_parent` = %2$d AND f.`forum_type` != %3$d)
OR f.`forum_parent` != %2$d OR f.`forum_parent` != %2$d
) )
GROUP BY f.`forum_id`
HAVING (`forum_permissions` & %5$d) > 0
ORDER BY f.`forum_order` ORDER BY f.`forum_order`
' '
); );
function forum_get_children_query(bool $small = false): string function forum_get_children_query(bool $showDeleted = false, bool $small = false): string
{ {
return sprintf( return sprintf(
$small $small
@ -351,13 +365,15 @@ function forum_get_children_query(bool $small = false): string
MSZ_FORUM_ROOT, MSZ_FORUM_ROOT,
MSZ_FORUM_TYPE_CATEGORY, MSZ_FORUM_TYPE_CATEGORY,
forum_perms_get_user_sql('forum', 'f.`forum_id`'), forum_perms_get_user_sql('forum', 'f.`forum_id`'),
MSZ_FORUM_PERM_SET_READ MSZ_FORUM_PERM_SET_READ,
$showDeleted ? '' : 'AND `topic_deleted` IS NULL',
$showDeleted ? '' : 'AND `post_deleted` IS NULL'
); );
} }
function forum_get_children(int $parentId, int $userId, bool $small = false): array function forum_get_children(int $parentId, int $userId, bool $showDeleted = false, bool $small = false): array
{ {
$getListing = db_prepare(forum_get_children_query($small)); $getListing = db_prepare(forum_get_children_query($showDeleted, $small));
$getListing->bindValue('user_id', $userId); $getListing->bindValue('user_id', $userId);
$getListing->bindValue('perm_user_id_user', $userId); $getListing->bindValue('perm_user_id_user', $userId);
$getListing->bindValue('perm_user_id_role', $userId); $getListing->bindValue('perm_user_id_role', $userId);

View file

@ -69,9 +69,10 @@ function forum_topic_update(int $topicId, ?string $title, ?int $type = null): bo
return $updateTopic->execute(); return $updateTopic->execute();
} }
function forum_topic_fetch(int $topicId): array function forum_topic_fetch(int $topicId, bool $showDeleted = false): array
{ {
$getTopic = db_prepare(' $getTopic = db_prepare(sprintf(
'
SELECT SELECT
t.`topic_id`, t.`forum_id`, t.`topic_title`, t.`topic_type`, t.`topic_locked`, t.`topic_created`, t.`topic_id`, t.`forum_id`, t.`topic_title`, t.`topic_type`, t.`topic_locked`, t.`topic_created`,
f.`forum_archived` as `topic_archived`, t.`topic_deleted`, t.`topic_bumped`, f.`forum_archived` as `topic_archived`, t.`topic_deleted`, t.`topic_bumped`,
@ -79,17 +80,21 @@ function forum_topic_fetch(int $topicId): array
SELECT MIN(`post_id`) SELECT MIN(`post_id`)
FROM `msz_forum_posts` FROM `msz_forum_posts`
WHERE `topic_id` = t.`topic_id` WHERE `topic_id` = t.`topic_id`
%1$s
) as `topic_first_post_id`, ) as `topic_first_post_id`,
( (
SELECT COUNT(`post_id`) SELECT COUNT(`post_id`)
FROM `msz_forum_posts` FROM `msz_forum_posts`
WHERE `topic_id` = t.`topic_id` WHERE `topic_id` = t.`topic_id`
%1$s
) as `topic_post_count` ) as `topic_post_count`
FROM `msz_forum_topics` as t FROM `msz_forum_topics` as t
LEFT JOIN `msz_forum_categories` as f LEFT JOIN `msz_forum_categories` as f
ON f.`forum_id` = t.`forum_id` ON f.`forum_id` = t.`forum_id`
WHERE t.`topic_id` = :topic_id WHERE t.`topic_id` = :topic_id
'); ',
$showDeleted ? '' : 'AND `post_deleted` IS NULL'
));
$getTopic->bindValue('topic_id', $topicId); $getTopic->bindValue('topic_id', $topicId);
$topic = $getTopic->execute() ? $getTopic->fetch(PDO::FETCH_ASSOC) : false; $topic = $getTopic->execute() ? $getTopic->fetch(PDO::FETCH_ASSOC) : false;
return $topic ? $topic : []; return $topic ? $topic : [];
@ -101,6 +106,7 @@ function forum_topic_bump(int $topicId): bool
UPDATE `msz_forum_topics` UPDATE `msz_forum_topics`
SET `topic_bumped` = NOW() SET `topic_bumped` = NOW()
WHERE `topic_id` = :topic_id WHERE `topic_id` = :topic_id
AND `topic_deleted` IS NULL
'); ');
$bumpTopic->bindValue('topic_id', $topicId); $bumpTopic->bindValue('topic_id', $topicId);
return $bumpTopic->execute(); return $bumpTopic->execute();
@ -144,6 +150,7 @@ function forum_topic_listing(int $forumId, int $userId, int $offset = 0, int $ta
SELECT COUNT(`post_id`) SELECT COUNT(`post_id`)
FROM `msz_forum_posts` FROM `msz_forum_posts`
WHERE `topic_id` = t.`topic_id` WHERE `topic_id` = t.`topic_id`
%5$s
) as `topic_post_count`, ) as `topic_post_count`,
( (
SELECT COUNT(`user_id`) SELECT COUNT(`user_id`)
@ -175,6 +182,7 @@ function forum_topic_listing(int $forumId, int $userId, int $offset = 0, int $ta
SELECT `post_id` SELECT `post_id`
FROM `msz_forum_posts` FROM `msz_forum_posts`
WHERE `topic_id` = t.`topic_id` WHERE `topic_id` = t.`topic_id`
%5$s
ORDER BY `post_id` DESC ORDER BY `post_id` DESC
LIMIT 1 LIMIT 1
) )
@ -193,7 +201,8 @@ function forum_topic_listing(int $forumId, int $userId, int $offset = 0, int $ta
$showDeleted ? '' : 'AND t.`topic_deleted` IS NULL', $showDeleted ? '' : 'AND t.`topic_deleted` IS NULL',
$hasPagination ? 'LIMIT :offset, :take' : '', $hasPagination ? 'LIMIT :offset, :take' : '',
MSZ_TOPIC_TYPE_GLOBAL_ANNOUNCEMENT, MSZ_TOPIC_TYPE_GLOBAL_ANNOUNCEMENT,
implode(',', array_reverse(MSZ_TOPIC_TYPE_ORDER)) implode(',', array_reverse(MSZ_TOPIC_TYPE_ORDER)),
$showDeleted ? '' : 'AND `post_deleted` IS NULL'
)); ));
$getTopics->bindValue('forum_id', $forumId); $getTopics->bindValue('forum_id', $forumId);
$getTopics->bindValue('user_id', $userId); $getTopics->bindValue('user_id', $userId);