'forbidden', 'message' => __( 'Administrator capabilities are required to update ActionPanel AI settings.', 'actionpanel-ai' ), ), 403 ); } $previous_allow_requests = $this->settings->get_allow_requests(); $previous_allow_log_reads = $this->settings->get_allow_log_reads(); $previous_allow_write_ops = $this->settings->get_allow_write_operations(); $previous_auto_approve = $this->settings->get_auto_approve_safe_write_operations(); $previous_require_approval = $this->settings->get_require_read_approval(); $previous_setup_completed = $this->settings->is_setup_completed(); $has_allow_requests = $request->has_param( 'allowActionPanelAiRequests' ) || $request->has_param( 'assistantEnabled' ); $has_allow_log_reads = $request->has_param( 'allowLogReads' ); $has_allow_write_ops = $request->has_param( 'allowWriteOperations' ); $has_auto_approve = $request->has_param( 'autoApproveSafeWriteOperations' ); $has_require_approval = $request->has_param( 'requireReadApproval' ); $has_setup_completed = $request->has_param( 'setupCompleted' ); $next_allow_requests = $has_allow_requests ? self::to_bool( $request->has_param( 'allowActionPanelAiRequests' ) ? $request->get_param( 'allowActionPanelAiRequests' ) : $request->get_param( 'assistantEnabled' ) ) : $previous_allow_requests; $next_allow_log_reads = $has_allow_log_reads ? self::to_bool( $request->get_param( 'allowLogReads' ) ) : $previous_allow_log_reads; $next_allow_write_ops = $has_allow_write_ops ? self::to_bool( $request->get_param( 'allowWriteOperations' ) ) : $previous_allow_write_ops; $next_auto_approve = $has_auto_approve ? self::to_bool( $request->get_param( 'autoApproveSafeWriteOperations' ) ) : $previous_auto_approve; $next_require_approval = $has_require_approval ? self::to_bool( $request->get_param( 'requireReadApproval' ) ) : $previous_require_approval; $next_setup_completed = $has_setup_completed ? self::to_bool( $request->get_param( 'setupCompleted' ) ) : $previous_setup_completed; $this->settings->set_allow_requests( $next_allow_requests ); $this->settings->set_allow_log_reads( $next_allow_log_reads ); $this->settings->set_allow_write_operations( $next_allow_write_ops ); $this->settings->set_auto_approve_safe_write_operations( $next_auto_approve ); $this->settings->set_require_read_approval( $next_require_approval ); if ( $has_setup_completed ) { $this->settings->set_setup_completed( $next_setup_completed ); } return new WP_REST_Response( array( 'settings' => $this->build_settings_payload(), ), 200 ); } /** * Build the settings payload returned to the frontend. */ private function build_settings_payload(): array { $allow_requests = (bool) $this->settings->get_allow_requests(); return array( 'allowActionPanelAiRequests' => $allow_requests, 'assistantEnabled' => $allow_requests, 'allowLogReads' => (bool) $this->settings->get_allow_log_reads(), 'allowWriteOperations' => (bool) $this->settings->get_allow_write_operations(), 'autoApproveSafeWriteOperations' => (bool) $this->settings->get_auto_approve_safe_write_operations(), 'requireReadApproval' => (bool) $this->settings->get_require_read_approval(), 'setupCompleted' => (bool) $this->settings->is_setup_completed(), ); } /** * Convert accepted REST boolean shapes to a strict boolean. * * @param mixed $value Raw setting value. */ private static function to_bool( mixed $value ): bool { if ( is_bool( $value ) ) { return $value; } if ( is_int( $value ) || is_float( $value ) ) { return (bool) $value; } if ( is_string( $value ) ) { return in_array( strtolower( trim( $value ) ), array( '1', 'true', 'on', 'yes' ), true ); } return false; } /** * Sanitize REST boolean settings. * * @param mixed $value Raw setting value. */ public static function sanitize_bool_arg( mixed $value ): bool { return self::to_bool( $value ); } /** * Validate REST boolean settings before saving. * * @param mixed $value Raw setting value. */ public static function validate_bool_arg( mixed $value ): bool { if ( is_bool( $value ) || is_int( $value ) || is_float( $value ) ) { return true; } if ( is_string( $value ) ) { return in_array( strtolower( trim( $value ) ), array( '0', '1', 'false', 'no', 'off', 'on', 'true', 'yes' ), true ); } return false; } }