Files
wordpress-theme-aksrt/inc/classes/admin/forum-ctrl-traits/trait-aksrt-admin-forum-controller-part-1.php
T

385 lines
14 KiB
PHP

<?php
defined('ABSPATH') || exit;
trait AKSRT_Admin_Forum_Controller_Part_1 {
public function update_plate(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$plate_id = (int) $request->get_param('id');
$params = $this->get_json_params($request);
$result = $forum->update_plate($plate_id, $params);
if (!$result) {
return $this->error(__('更新版块失败', 'aksrt'));
}
return $this->success(['message' => __('版块已更新', 'aksrt')]);
}
public function delete_plate(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$plate_id = (int) $request->get_param('id');
$params = $this->get_json_params($request);
$cascade = sanitize_key((string) ($params['cascade'] ?? 'trash'));
$move_to = (int) ($params['move_to'] ?? 0);
$result = $forum->delete_plate($plate_id, $cascade, $move_to);
if (!$result) {
return $this->error(__('删除版块失败', 'aksrt'));
}
return $this->success(['message' => __('版块已删除', 'aksrt')]);
}
public function reorder_plates(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$params = $this->get_json_params($request);
$order = $params['order'] ?? [];
if (!is_array($order) || empty($order)) {
return $this->error(__('排序参数无效', 'aksrt'));
}
$forum->reorder_plates($order);
return $this->success(['message' => __('排序已更新', 'aksrt')]);
}
public function toggle_follow_plate(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$plate_id = (int) $request->get_param('id');
$user_id = get_current_user_id();
$result = $forum->toggle_follow_plate($user_id, $plate_id);
return $this->success($result);
}
public function get_plate_categories(): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->success(['data' => []]);
}
return $this->success(['data' => $forum->get_plate_categories()]);
}
public function get_sorted_plates(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->success(['data' => []]);
}
$orderby = sanitize_key((string) ($request->get_param('orderby') ?: 'menu_order'));
$order = sanitize_key((string) ($request->get_param('order') ?: 'ASC'));
$limit = max(1, min(100, (int) ($request->get_param('limit') ?: 50)));
return $this->success(['data' => $forum->get_sorted_plates($orderby, $order, $limit)]);
}
public function get_topics(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->success(['data' => ['items' => [], 'total' => 0, 'page' => 1, 'total_pages' => 1]]);
}
$args = [
'page' => max(1, (int) ($request->get_param('page') ?: 1)),
'per_page' => max(1, min(100, (int) ($request->get_param('per_page') ?: 20))),
'status' => sanitize_key((string) ($request->get_param('status') ?: 'all')),
'board_id' => (int) ($request->get_param('board_id') ?: 0),
'visibility' => sanitize_key((string) ($request->get_param('visibility') ?: '')),
'review_status' => sanitize_key((string) ($request->get_param('review_status') ?: '')),
'keyword' => sanitize_text_field((string) ($request->get_param('keyword') ?: '')),
'orderby' => sanitize_key((string) ($request->get_param('orderby') ?: 'date')),
'viewer_user_id' => get_current_user_id(),
'include_hidden' => true,
];
$view = $forum->get_topic_list($args);
return $this->success([
'data' => [
'items' => $view['items'],
'total' => $view['total'],
'page' => $view['page'],
'total_pages' => $view['max_pages'],
'options' => [
'boards' => $forum->get_boards(),
'visibility' => $forum->get_visibility_options(),
'review' => $forum->get_review_options(),
'status' => [
['label' => __('全部', 'aksrt'), 'value' => 'all'],
['label' => __('已发布', 'aksrt'), 'value' => 'publish'],
['label' => __('待审核', 'aksrt'), 'value' => 'pending'],
['label' => __('草稿/拒绝', 'aksrt'), 'value' => 'draft'],
],
],
],
]);
}
public function get_topic_detail(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$topic_id = (int) $request->get_param('id');
if ($topic_id <= 0) {
return $this->error(__('参数无效', 'aksrt'));
}
return $this->success([
'data' => $forum->get_topic_detail($topic_id, get_current_user_id()),
]);
}
public function moderate_topic(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$topic_id = (int) $request->get_param('id');
$params = $this->get_json_params($request);
$action = sanitize_key((string) ($params['action'] ?? ''));
if ($topic_id <= 0 || $action === '') {
return $this->error(__('参数无效', 'aksrt'));
}
$result = $forum->moderate_topic($topic_id, $action, $params, get_current_user_id());
if (is_wp_error($result)) {
return $this->error($result->get_error_message(), $result->get_error_code() === 'forbidden' ? 403 : 400);
}
return $this->success([
'message' => $result['message'] ?? __('治理动作已执行', 'aksrt'),
'data' => $result,
]);
}
public function vote_topic(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$topic_id = (int) $request->get_param('id');
$params = $this->get_json_params($request);
$option_ids = $params['option_ids'] ?? [];
if (!is_array($option_ids)) {
$option_ids = [];
}
$result = $forum->submit_vote($topic_id, get_current_user_id(), $option_ids);
if (is_wp_error($result)) {
$status = $result->get_error_code() === 'not_logged_in' ? 401 : 400;
return $this->error($result->get_error_message(), $status);
}
return $this->success([
'message' => $result['message'] ?? __('投票成功', 'aksrt'),
'data' => $result,
]);
}
/**
* Legacy admin moderation endpoint kept for compatibility.
*/
public function update_topic_legacy(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
$topic_id = (int) ($params['topic_id'] ?? 0);
if ($topic_id <= 0) {
return $this->error(__('参数无效', 'aksrt'));
}
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$actions = [];
if (isset($params['sticky'])) {
$actions[] = ['action' => 'sticky', 'value' => !empty($params['sticky'])];
}
if (isset($params['featured'])) {
$actions[] = ['action' => 'featured', 'value' => !empty($params['featured'])];
}
if (isset($params['locked'])) {
$actions[] = ['action' => 'locked', 'value' => !empty($params['locked'])];
}
foreach ($actions as $action) {
$result = $forum->moderate_topic($topic_id, $action['action'], ['value' => $action['value']], get_current_user_id());
if (is_wp_error($result)) {
return $this->error($result->get_error_message());
}
}
return $this->success(['message' => __('治理状态已更新', 'aksrt')]);
}
public function get_moderators(): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->success(['data' => ['boards' => []]]);
}
$board_id = isset($_GET['board_id']) ? (int) $_GET['board_id'] : 0;
$result = [];
foreach ($forum->get_boards() as $board) {
$current_board_id = (int) ($board['id'] ?? 0);
if ($board_id > 0 && $current_board_id !== $board_id) {
continue;
}
$result[] = [
'board_id' => $current_board_id,
'board_name' => (string) ($board['name'] ?? ''),
'topic_count' => (int) ($board['post_count'] ?? 0),
'pending_application_count' => (int) ($board['pending_application_count'] ?? 0),
'moderators' => $forum->get_board_moderator_profiles_with_roles($current_board_id),
];
}
return $this->success(['data' => ['boards' => $result]]);
}
public function update_moderators(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$params = $this->get_json_params($request);
$board_id = (int) ($params['board_id'] ?? 0);
$user_id = (int) ($params['user_id'] ?? 0);
$action = sanitize_key((string) ($params['action'] ?? ''));
$role = sanitize_key((string) ($params['role'] ?? 'moderator'));
if ($board_id <= 0 || $user_id <= 0 || !in_array($action, ['add', 'remove'], true)) {
return $this->error(__('参数无效', 'aksrt'));
}
$valid_roles = ['super_moderator', 'moderator', 'junior_moderator'];
if (!in_array($role, $valid_roles, true)) {
$role = 'moderator';
}
$board = get_term($board_id, 'aksrt_forum_board');
if (!$board || is_wp_error($board)) {
return $this->error(__('版块不存在', 'aksrt'), 404);
}
$user = get_userdata($user_id);
if (!$user) {
return $this->error(__('用户不存在', 'aksrt'), 404);
}
if ($action === 'add') {
$forum->add_moderator($user_id, $board_id, $role);
} else {
$forum->remove_moderator($user_id, $board_id);
}
return $this->success([
'message' => $action === 'add' ? __('版主已添加', 'aksrt') : __('版主已移除', 'aksrt'),
]);
}
public function change_moderator_role(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$params = $this->get_json_params($request);
$board_id = (int) ($params['board_id'] ?? 0);
$user_id = (int) ($params['user_id'] ?? 0);
$role = sanitize_key((string) ($params['role'] ?? ''));
if ($board_id <= 0 || $user_id <= 0 || !$role) {
return $this->error(__('参数无效', 'aksrt'));
}
$valid_roles = ['super_moderator', 'moderator', 'junior_moderator'];
if (!in_array($role, $valid_roles, true)) {
return $this->error(__('无效的角色', 'aksrt'));
}
$result = $forum->set_moderator_role($user_id, $board_id, $role);
if (!$result) {
return $this->error(__('设置角色失败,用户可能不是该版块版主', 'aksrt'));
}
return $this->success(['message' => __('角色已更新', 'aksrt')]);
}
public function apply_moderator(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->error(__('论坛系统未启用', 'aksrt'));
}
$params = $this->get_json_params($request);
$board_id = (int) ($params['board_id'] ?? 0);
$reason = sanitize_textarea_field((string) ($params['reason'] ?? ''));
$result = $forum->apply_moderator(get_current_user_id(), $board_id, $reason);
if (is_wp_error($result)) {
$status = $result->get_error_code() === 'not_logged_in' ? 401 : 400;
return $this->error($result->get_error_message(), $status);
}
return $this->success([
'message' => $result['message'] ?? __('申请已提交', 'aksrt'),
'data' => $result,
]);
}
public function get_moderator_applications(WP_REST_Request $request): WP_REST_Response {
$forum = $this->get_forum_service();
if (!$forum) {
return $this->success(['data' => ['items' => [], 'total' => 0]]);
}
$items = $forum->get_moderator_application_list([
'status' => sanitize_key((string) ($request->get_param('status') ?: '')),
'board_id' => (int) ($request->get_param('board_id') ?: 0),
'keyword' => sanitize_text_field((string) ($request->get_param('keyword') ?: '')),
]);
return $this->success([
'data' => [
'items' => $items,
'total' => count($items),
'options' => [
'boards' => $forum->get_boards(),
'status' => [
['label' => __('全部', 'aksrt'), 'value' => ''],
['label' => __('待处理', 'aksrt'), 'value' => AKSRT_Forum::APPLICATION_PENDING],
['label' => __('已通过', 'aksrt'), 'value' => AKSRT_Forum::APPLICATION_APPROVED],
['label' => __('已拒绝', 'aksrt'), 'value' => AKSRT_Forum::APPLICATION_REJECTED],
],
],
],
]);
}
}