diff --git a/includes/admin/class-settings-fields-extended.php b/includes/admin/class-settings-fields-extended.php index 17d4bd8..f58fcd5 100644 --- a/includes/admin/class-settings-fields-extended.php +++ b/includes/admin/class-settings-fields-extended.php @@ -266,6 +266,6 @@ class PRAutoBlogger_Settings_Fields_Extended { 'section' => 'prautoblogger_images', 'description' => __( 'Live model catalog sync status and on-demand refresh.', 'prautoblogger' ), ), - ); + ); } } diff --git a/includes/class-ajax-handlers.php b/includes/class-ajax-handlers.php index 64740b9..86e06fe 100644 --- a/includes/class-ajax-handlers.php +++ b/includes/class-ajax-handlers.php @@ -158,52 +158,52 @@ class PRAutoBlogger_Ajax_Handlers { */ public function get_registry(): PRAutoBlogger_OpenRouter_Model_Registry { - /** - * AJAX handler: sync Runware model catalog on demand. - * - * Nonce-protected and requires manage_options capability. - * Returns the updated cache timestamp and model count. - * - * Side effects: makes HTTP request to Runware API, writes WP options. - */ - public function on_ajax_sync_runware_models_now(): void { - check_ajax_referer( 'prautoblogger_sync_runware_models_now', 'nonce' ); + /** + * AJAX handler: sync Runware model catalog on demand. + * + * Nonce-protected and requires manage_options capability. + * Returns the updated cache timestamp and model count. + * + * Side effects: makes HTTP request to Runware API, writes WP options. + */ + public function on_ajax_sync_runware_models_now(): void { + check_ajax_referer( 'prautoblogger_sync_runware_models_now', 'nonce' ); - if ( ! current_user_can( 'manage_options' ) ) { - wp_send_json_error( array( 'message' => __( 'Insufficient permissions.', 'prautoblogger' ) ), 403 ); - return; - } - - try { - $catalog = new PRAutoBlogger_Runware_Model_Catalog(); - $success = $catalog->sync(); - - if ( ! $success ) { - wp_send_json_error( array( 'message' => __( 'Catalog sync failed. Check logs for details.', 'prautoblogger' ) ) ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( array( 'message' => __( 'Insufficient permissions.', 'prautoblogger' ) ), 403 ); return; } - $models = $catalog->get_models(); - $synced_at = $catalog->get_last_synced_at(); - $synced_at_str = $synced_at + try { + $catalog = new PRAutoBlogger_Runware_Model_Catalog(); + $success = $catalog->sync(); + + if ( ! $success ) { + wp_send_json_error( array( 'message' => __( 'Catalog sync failed. Check logs for details.', 'prautoblogger' ) ) ); + return; + } + + $models = $catalog->get_models(); + $synced_at = $catalog->get_last_synced_at(); + $synced_at_str = $synced_at ? wp_date( __( 'Y-m-d H:i:s', 'prautoblogger' ), $synced_at ) : __( 'Never', 'prautoblogger' ); - wp_send_json_success( - array( - 'message' => __( 'Runware model catalog synced successfully.', 'prautoblogger' ), - 'model_count' => count( $models ), - 'synced_at' => $synced_at_str, - ) - ); - } catch ( \Throwable $e ) { - PRAutoBlogger_Logger::instance()->error( - sprintf( 'AJAX sync Runware models failed: %s (%s)', $e->getMessage(), get_class( $e ) ), - 'runware-catalog' - ); - wp_send_json_error( array( 'message' => $e->getMessage() ) ); + wp_send_json_success( + array( + 'message' => __( 'Runware model catalog synced successfully.', 'prautoblogger' ), + 'model_count' => count( $models ), + 'synced_at' => $synced_at_str, + ) + ); + } catch ( \Throwable $e ) { + PRAutoBlogger_Logger::instance()->error( + sprintf( 'AJAX sync Runware models failed: %s (%s)', $e->getMessage(), get_class( $e ) ), + 'runware-catalog' + ); + wp_send_json_error( array( 'message' => $e->getMessage() ) ); + } } - } return $this->model_registry; } diff --git a/includes/class-prautoblogger.php b/includes/class-prautoblogger.php index efa399b..f407a03 100644 --- a/includes/class-prautoblogger.php +++ b/includes/class-prautoblogger.php @@ -181,7 +181,7 @@ class PRAutoBlogger { add_action( 'wp_ajax_prautoblogger_test_connection', array( $this->ajax_handlers, 'on_ajax_test_connection' ) ); add_action( 'wp_ajax_prautoblogger_get_models', array( $this->ajax_handlers, 'on_ajax_get_models' ) ); add_action( 'wp_ajax_prautoblogger_refresh_models', array( new PRAutoBlogger_Model_Registry_Refresh( $this->ajax_handlers->get_registry() ), 'handle' ) ); -t add_action( 'wp_ajax_prautoblogger_sync_runware_models_now', array( $this->ajax_handlers, 'on_ajax_sync_runware_models_now' ) ); + t add_action( 'wp_ajax_prautoblogger_sync_runware_models_now', array( $this->ajax_handlers, 'on_ajax_sync_runware_models_now' ) ); $review_queue = new PRAutoBlogger_Review_Queue(); add_action( 'wp_ajax_prautoblogger_approve_post', array( $review_queue, 'on_ajax_approve_post' ) );