feat: Add Store Settings backend with full countries/timezones

 StoreSettingsProvider.php:
- get_countries() - All WooCommerce countries
- get_timezones() - All PHP timezones with UTC offsets
- get_currencies() - All WooCommerce currencies with symbols
- get_settings() - Current store settings
- save_settings() - Save store settings

 StoreController.php:
- GET /woonoow/v1/store/settings
- POST /woonoow/v1/store/settings
- GET /woonoow/v1/store/countries (200+ countries)
- GET /woonoow/v1/store/timezones (400+ timezones)
- GET /woonoow/v1/store/currencies (100+ currencies)
- Response caching (1 hour for static data)

🔌 Integration:
- Registered in Api/Routes.php
- Permission checks (manage_woocommerce)
- Error handling

Next: Update Store.tsx to use real API
This commit is contained in:
dwindown
2025-11-05 22:08:53 +07:00
parent c7d20e6e20
commit b405fd49cc
3 changed files with 397 additions and 0 deletions

View File

@@ -0,0 +1,223 @@
<?php
/**
* Store REST API Controller
*
* Provides REST endpoints for store settings management.
*
* @package WooNooW
*/
namespace WooNooW\API;
use WooNooW\Compat\StoreSettingsProvider;
use WP_REST_Controller;
use WP_REST_Server;
use WP_REST_Request;
use WP_REST_Response;
use WP_Error;
class StoreController extends WP_REST_Controller {
/**
* Namespace
*/
protected $namespace = 'woonoow/v1';
/**
* Rest base
*/
protected $rest_base = 'store';
/**
* Register routes
*/
public function register_routes() {
// GET /woonoow/v1/store/settings
register_rest_route($this->namespace, '/' . $this->rest_base . '/settings', [
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'get_settings'],
'permission_callback' => [$this, 'check_permission'],
],
]);
// POST /woonoow/v1/store/settings
register_rest_route($this->namespace, '/' . $this->rest_base . '/settings', [
[
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'save_settings'],
'permission_callback' => [$this, 'check_permission'],
],
]);
// GET /woonoow/v1/store/countries
register_rest_route($this->namespace, '/' . $this->rest_base . '/countries', [
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'get_countries'],
'permission_callback' => [$this, 'check_permission'],
],
]);
// GET /woonoow/v1/store/timezones
register_rest_route($this->namespace, '/' . $this->rest_base . '/timezones', [
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'get_timezones'],
'permission_callback' => [$this, 'check_permission'],
],
]);
// GET /woonoow/v1/store/currencies
register_rest_route($this->namespace, '/' . $this->rest_base . '/currencies', [
[
'methods' => WP_REST_Server::READABLE,
'callback' => [$this, 'get_currencies'],
'permission_callback' => [$this, 'check_permission'],
],
]);
}
/**
* Get store settings
*
* @param WP_REST_Request $request Request object
* @return WP_REST_Response|WP_Error Response object or error
*/
public function get_settings(WP_REST_Request $request) {
try {
$settings = StoreSettingsProvider::get_settings();
$response = rest_ensure_response($settings);
$response->header('Cache-Control', 'max-age=60');
return $response;
} catch (\Exception $e) {
return new WP_Error(
'get_settings_failed',
$e->getMessage(),
['status' => 500]
);
}
}
/**
* Save store settings
*
* @param WP_REST_Request $request Request object
* @return WP_REST_Response|WP_Error Response object or error
*/
public function save_settings(WP_REST_Request $request) {
$settings = $request->get_json_params();
if (empty($settings)) {
return new WP_Error(
'missing_settings',
'No settings provided',
['status' => 400]
);
}
try {
$result = StoreSettingsProvider::save_settings($settings);
if (!$result) {
return new WP_Error(
'save_failed',
'Failed to save settings',
['status' => 500]
);
}
return rest_ensure_response([
'success' => true,
'message' => 'Settings saved successfully',
'settings' => StoreSettingsProvider::get_settings(),
]);
} catch (\Exception $e) {
return new WP_Error(
'save_settings_failed',
$e->getMessage(),
['status' => 500]
);
}
}
/**
* Get countries
*
* @param WP_REST_Request $request Request object
* @return WP_REST_Response|WP_Error Response object or error
*/
public function get_countries(WP_REST_Request $request) {
try {
$countries = StoreSettingsProvider::get_countries();
$response = rest_ensure_response($countries);
$response->header('Cache-Control', 'max-age=3600'); // Cache for 1 hour
return $response;
} catch (\Exception $e) {
return new WP_Error(
'get_countries_failed',
$e->getMessage(),
['status' => 500]
);
}
}
/**
* Get timezones
*
* @param WP_REST_Request $request Request object
* @return WP_REST_Response|WP_Error Response object or error
*/
public function get_timezones(WP_REST_Request $request) {
try {
$timezones = StoreSettingsProvider::get_timezones();
$response = rest_ensure_response($timezones);
$response->header('Cache-Control', 'max-age=3600'); // Cache for 1 hour
return $response;
} catch (\Exception $e) {
return new WP_Error(
'get_timezones_failed',
$e->getMessage(),
['status' => 500]
);
}
}
/**
* Get currencies
*
* @param WP_REST_Request $request Request object
* @return WP_REST_Response|WP_Error Response object or error
*/
public function get_currencies(WP_REST_Request $request) {
try {
$currencies = StoreSettingsProvider::get_currencies();
$response = rest_ensure_response($currencies);
$response->header('Cache-Control', 'max-age=3600'); // Cache for 1 hour
return $response;
} catch (\Exception $e) {
return new WP_Error(
'get_currencies_failed',
$e->getMessage(),
['status' => 500]
);
}
}
/**
* Check permission
*
* @return bool True if user has permission
*/
public function check_permission() {
return current_user_can('manage_woocommerce');
}
}