Files
wordpress-theme-aksrt/inc/classes/admin/class-aksrt-admin-shop-controller-frontend-flow-operations.php
T

325 lines
12 KiB
PHP

<?php
/**
* AKSRT admin shop frontend flow operations.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
trait AKSRT_Admin_Shop_Controller_Frontend_Flow_Operations {
public function check_logged_in_permission(): bool {
return is_user_logged_in();
}
public function preview_checkout(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$result = AKSRT_Shop::get_instance()->preview_checkout(get_current_user_id(), $this->get_json_params($request));
if (empty($result['success'])) {
return $this->error($result['message'] ?? '结算预览失败');
}
return $this->success(['data' => $result['data']]);
}
public function create_frontend_order(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$result = AKSRT_Shop::get_instance()->create_checkout_order(get_current_user_id(), $this->get_json_params($request));
if (empty($result['success'])) {
return $this->error($result['message'] ?? '订单创建失败');
}
return $this->success([
'message' => __('订单已创建', 'aksrt'),
'data' => $result['data'],
], 201);
}
public function get_frontend_orders(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->success(['data' => ['items' => [], 'total' => 0, 'total_pages' => 1, 'page' => 1]]);
}
$page = max(1, (int) $request->get_param('page'));
$per_page = max(1, min(50, (int) $request->get_param('per_page'))) ?: 20;
$status = sanitize_key((string) $request->get_param('status'));
$view = AKSRT_Shop::get_instance()->get_order_center_view(get_current_user_id(), [
'page' => $page,
'per_page' => $per_page,
'status' => $status,
]);
return $this->success(['data' => $view]);
}
public function get_frontend_order(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$order_number = sanitize_text_field((string) $request->get_param('order_number'));
$order = AKSRT_Shop::get_instance()->get_order_detail_view(get_current_user_id(), $order_number);
if (!$order) {
return $this->error('订单不存在', 404);
}
return $this->success(['data' => $order]);
}
public function pay_frontend_order(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$params = $this->get_json_params($request);
$payment_method = sanitize_key((string) ($params['payment_method'] ?? 'balance'));
$order_number = sanitize_text_field((string) $request->get_param('order_number'));
$result = AKSRT_Shop::get_instance()->pay_order(get_current_user_id(), $order_number, $payment_method);
if (empty($result['success'])) {
return $this->error($result['message'] ?? '支付失败');
}
return $this->success(['data' => $result['data']]);
}
public function cancel_frontend_order(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$order_number = sanitize_text_field((string) $request->get_param('order_number'));
$result = AKSRT_Shop::get_instance()->cancel_order(get_current_user_id(), $order_number);
if (empty($result['success'])) {
return $this->error($result['message'] ?? '取消订单失败');
}
return $this->success(['data' => $result['data']]);
}
public function create_frontend_after_sale(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$params = $this->get_json_params($request);
$params['order_number'] = sanitize_text_field((string) $request->get_param('order_number'));
$result = AKSRT_Shop::get_instance()->create_after_sale_request(get_current_user_id(), $params);
if (empty($result['success'])) {
return $this->error($result['message'] ?? '提交售后失败');
}
return $this->success([
'message' => __('售后申请已提交', 'aksrt'),
'data' => $result['data'],
], 201);
}
public function get_cart(WP_REST_Request $request): WP_REST_Response {
$user_id = get_current_user_id();
$shop = AKSRT_Shop::get_instance();
$cart = $shop->get_cart($user_id);
$items = [];
foreach ($cart as $pid => $opts_map) {
$product = $shop->build_product_card_view((int) $pid);
if (empty($product) || !is_array($opts_map)) {
continue;
}
foreach ($opts_map as $opt_str => $qty) {
$items[] = [
'product_id' => (int) $pid,
'options_string' => $opt_str === '_default' ? '' : $opt_str,
'quantity' => (int) $qty,
'product' => $product,
];
}
}
return $this->success([
'data' => [
'items' => $items,
'count' => $shop->get_cart_count($user_id),
],
]);
}
public function get_cart_count(WP_REST_Request $request): WP_REST_Response {
$user_id = get_current_user_id();
return $this->success(['data' => ['count' => AKSRT_Shop::get_instance()->get_cart_count($user_id)]]);
}
public function handle_add_to_cart(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
$product_id = (int) ($params['product_id'] ?? 0);
$options_string = sanitize_text_field((string) ($params['options_string'] ?? ''));
$count = max(1, (int) ($params['count'] ?? 1));
$result = AKSRT_Shop::get_instance()->add_to_cart(get_current_user_id(), $product_id, $options_string, $count);
if (isset($result['error'])) {
return $this->error($result['error']);
}
return $this->success(['data' => $result]);
}
public function handle_reduce_from_cart(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
$product_id = (int) ($params['product_id'] ?? 0);
$options_string = sanitize_text_field((string) ($params['options_string'] ?? ''));
$count = max(1, (int) ($params['count'] ?? 1));
$result = AKSRT_Shop::get_instance()->reduce_from_cart(get_current_user_id(), $product_id, $options_string, $count);
if (isset($result['error'])) {
return $this->error($result['error']);
}
return $this->success(['data' => $result]);
}
public function handle_remove_from_cart(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
$product_id = (int) ($params['product_id'] ?? 0);
$options_string = sanitize_text_field((string) ($params['options_string'] ?? ''));
$result = AKSRT_Shop::get_instance()->remove_from_cart(get_current_user_id(), $product_id, $options_string);
if (isset($result['error'])) {
return $this->error($result['error']);
}
return $this->success(['data' => $result]);
}
public function handle_remove_multi_from_cart(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
$items = is_array($params['items'] ?? null) ? $params['items'] : [];
$result = AKSRT_Shop::get_instance()->remove_multi_from_cart(get_current_user_id(), $items);
if (isset($result['error'])) {
return $this->error($result['error']);
}
return $this->success(['data' => $result]);
}
public function handle_empty_cart(WP_REST_Request $request): WP_REST_Response {
$result = AKSRT_Shop::get_instance()->empty_cart(get_current_user_id());
if (isset($result['error'])) {
return $this->error($result['error']);
}
return $this->success(['data' => $result]);
}
public function get_frontend_addresses(): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->success(['data' => ['addresses' => []]]);
}
$addresses = AKSRT_Shop::get_instance()->get_address_book(get_current_user_id());
return $this->success(['data' => ['addresses' => $addresses]]);
}
public function create_frontend_address(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$params = $this->get_json_params($request);
$user_id = get_current_user_id();
$result = AKSRT_Shop::get_instance()->add_address($user_id, $params);
if (empty($result['success'])) {
return $this->error($result['error'] ?? '添加地址失败');
}
return $this->success([
'message' => __('地址已添加', 'aksrt'),
'data' => ['address' => $result['address']],
], 201);
}
public function update_frontend_address(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$address_id = (int) $request->get_param('id');
$params = $this->get_json_params($request);
$user_id = get_current_user_id();
$result = AKSRT_Shop::get_instance()->update_address($user_id, $address_id, $params);
if (empty($result['success'])) {
return $this->error($result['error'] ?? '更新地址失败');
}
return $this->success([
'message' => __('地址已更新', 'aksrt'),
'data' => ['address' => $result['address']],
]);
}
public function delete_frontend_address(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$address_id = (int) $request->get_param('id');
$user_id = get_current_user_id();
$result = AKSRT_Shop::get_instance()->delete_address($user_id, $address_id);
if (empty($result['success'])) {
return $this->error($result['error'] ?? '删除地址失败');
}
return $this->success(['message' => __('地址已删除', 'aksrt')]);
}
public function set_default_frontend_address(WP_REST_Request $request): WP_REST_Response {
if (!class_exists('AKSRT_Shop')) {
return $this->error('商城服务不可用', 500);
}
$address_id = (int) $request->get_param('id');
$user_id = get_current_user_id();
$result = AKSRT_Shop::get_instance()->set_default_address($user_id, $address_id);
if (empty($result['success'])) {
return $this->error($result['error'] ?? '设置默认地址失败');
}
return $this->success(['message' => __('已设为默认地址', 'aksrt')]);
}
public function create_frontend_product(WP_REST_Request $request): WP_REST_Response {
$params = $this->get_json_params($request);
$params['author_id'] = get_current_user_id();
$frontend_request = new WP_REST_Request('POST', '/');
$frontend_request->set_body(wp_json_encode($params));
return $this->create_product($frontend_request);
}
public function update_frontend_product(WP_REST_Request $request): WP_REST_Response {
$id = (int) $request->get_param('id');
$post = get_post($id);
if (!$post || $post->post_type !== 'aksrt_product') {
return $this->error('商品不存在', 404);
}
if ((int) $post->post_author !== get_current_user_id() && !current_user_can('manage_options')) {
return $this->error('没有权限编辑该商品', 403);
}
return $this->update_product($request);
}
}