diff --git a/src/AKSRT/Admin/Native/UsersMenus.php b/src/AKSRT/Admin/Native/UsersMenus.php index b4071d24..8741fc7f 100644 --- a/src/AKSRT/Admin/Native/UsersMenus.php +++ b/src/AKSRT/Admin/Native/UsersMenus.php @@ -31,6 +31,7 @@ class UsersMenus { add_action('admin_notices', [$this, 'pending_notices']); add_action('admin_post_aksrt_users_send_message', [$this, 'handle_send_message']); add_action('admin_post_aksrt_users_review_verify', [$this, 'handle_review_verify']); + add_action('admin_post_aksrt_users_delete_verify', [$this, 'handle_delete_verify']); add_action('admin_post_aksrt_users_update_report', [$this, 'handle_update_report']); add_action('admin_post_aksrt_users_add_restriction', [$this, 'handle_add_restriction']); add_action('admin_post_aksrt_users_remove_restriction', [$this, 'handle_remove_restriction']); @@ -143,6 +144,7 @@ class UsersMenus { 'message_sent' => __('消息已发送。', 'aksrt'), 'message_failed' => __('消息发送失败。', 'aksrt'), 'verify_updated' => __('认证状态已更新。', 'aksrt'), + 'verify_deleted' => __('认证记录已删除。', 'aksrt'), 'verify_failed' => __('认证审核失败。', 'aksrt'), 'report_updated' => __('举报状态已更新。', 'aksrt'), 'report_failed' => __('举报更新失败。', 'aksrt'), diff --git a/src/AKSRT/Admin/Native/UsersMenusVerify.php b/src/AKSRT/Admin/Native/UsersMenusVerify.php index 99462639..05c9a178 100644 --- a/src/AKSRT/Admin/Native/UsersMenusVerify.php +++ b/src/AKSRT/Admin/Native/UsersMenusVerify.php @@ -176,6 +176,10 @@ trait UsersMenusVerify { } else { echo '' . esc_html__('无需人工操作', 'aksrt') . ''; } + echo '
'; + echo ''; + wp_nonce_field('aksrt_users_delete_verify_' . (string) $row['application_uuid']); + echo '
'; } public function handle_review_verify(): void { @@ -197,6 +201,23 @@ trait UsersMenusVerify { $this->redirect('aksrt_user_auth', is_wp_error($result) ? 'verify_failed' : 'verify_updated', $extra); } + public function handle_delete_verify(): void { + if (!current_user_can('aksrt_review_identity') && !current_user_can(self::CAPABILITY)) { + wp_die(esc_html__('权限不足', 'aksrt')); + } + $uuid = sanitize_text_field((string) wp_unslash($_POST['application_uuid'] ?? '')); + check_admin_referer('aksrt_users_delete_verify_' . $uuid); + $repo = new \AKSRT\Identity\ApplicationRepository(); + $application = $repo->find_by_uuid($uuid); + if (!$application) { + $this->redirect('aksrt_user_auth', 'verify_failed', ['aksrt_verify_error' => __('认证记录不存在', 'aksrt')]); + } + (new \AKSRT\Identity\EvidenceService())->delete((array) ($application['evidence_ids'] ?? [])); + (new \AKSRT\Identity\EventRepository())->delete_for_application((int) $application['id']); + $deleted = $repo->delete((int) $application['id']); + $this->redirect('aksrt_user_auth', $deleted ? 'verify_deleted' : 'verify_failed', $deleted ? [] : ['aksrt_verify_error' => __('认证记录删除失败', 'aksrt')]); + } + private function get_verify_history(int $user_id): array { return \AKSRT\User\AuthApply::get_review_history($user_id); } diff --git a/src/AKSRT/Identity/ApplicationRepository.php b/src/AKSRT/Identity/ApplicationRepository.php index fb71f799..7b828e08 100644 --- a/src/AKSRT/Identity/ApplicationRepository.php +++ b/src/AKSRT/Identity/ApplicationRepository.php @@ -148,6 +148,11 @@ final class ApplicationRepository { )); } + public function delete(int $id): bool { + global $wpdb; + return $wpdb->delete($this->table, ['id' => $id], ['%d']) === 1; + } + /** @return array */ private function normalize(array $row): array { foreach (['id', 'user_id', 'reviewer_id', 'attempt_ordinal', 'retry_count'] as $key) { diff --git a/src/AKSRT/Identity/EventRepository.php b/src/AKSRT/Identity/EventRepository.php index cc397a99..4de94827 100644 --- a/src/AKSRT/Identity/EventRepository.php +++ b/src/AKSRT/Identity/EventRepository.php @@ -51,4 +51,9 @@ final class EventRepository { ), ARRAY_A); return is_array($rows) ? $rows : []; } + + public function delete_for_application(int $application_id): bool { + global $wpdb; + return $wpdb->delete($this->table, ['application_id' => $application_id], ['%d']) !== false; + } }