namespace, '/' . $this->rest_base, array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'args' => array(), 'permission_callback' => '__return_true', ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_item' ), 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), 'permission_callback' => array( $this, 'get_item_permissions_check', ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); register_rest_route( $this->namespace, '/' . $this->rest_base . '/public', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_public_item' ), 'args' => array(), 'permission_callback' => array( $this, 'get_public_item_permissions_check', ), ), ) ); register_rest_route( $this->namespace, '/' . $this->rest_base . '/stripe/disconnect', array( array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'stripe_disconnect', ), 'permission_callback' => array( $this, 'stripe_disconnect_permissions_check', ), ), ) ); } /** * Check if a given request has access to get items. * * @param WP_REST_Request $request Full data about the request. * * @return WP_Error */ public function get_item_permissions_check( $request ): bool { return current_user_can( 'manage_options' ); } /** * Format settings for API response. * * @param array $settings Settings array. * * @return array */ private function format_settings_for_response( array $settings ): array { $settings['reschedule_restriction'] = empty( $settings['reschedule_restriction'] ) ? (object) array() : $settings['reschedule_restriction']; $settings['custom_reschedule_status'] = empty( $settings['custom_reschedule_status'] ) ? (object) array() : $settings['custom_reschedule_status']; $settings['cancellation_restriction'] = empty( $settings['cancellation_restriction'] ) ? (object) array() : $settings['cancellation_restriction']; if ( ! is_plugin_active( 'booktics-stripe-addon/booktics_stripe.php' ) ) { $settings['stripe_addon_install_status'] = 0; } else { $settings['stripe_addon_install_status'] = 1; $stripe = ( new Payment_Method_Manager() )->get_payment_method( 'stripe' ); $settings['stripe_connect_test_url'] = $stripe::connect_account( 'test' ); $settings['stripe_connect_live_url'] = $stripe::connect_account( 'live' ); $settings['stripe_account_id'] = $stripe::account_id(); } return $settings; } /** * Get a collection of items. * * @param WP_REST_Request $request Full data about the request. * * @return WP_REST_Response */ public function get_item( $request ) { $settings = Settings::get(); $settings = apply_filters( 'booktics_rest_settings', $settings ); $settings = $this->format_settings_for_response( $settings ); return $this->response( $settings, __( 'Settings fetched successfully.', 'booktics' ) ); } /** * Update plugin settings. * * @param WP_Rest_Request $request Request object. * * @return WP_Rest_Response */ public function update_item( $request ) { $params = $request->get_params(); if ( isset( $params['schedule'] ) || isset( $params['custom'] ) || isset( $params['holiday'] ) ) { $input_data = json_decode( $request->get_body(), true ); $schedule_manager = Schedule_Manager::make( $input_data ); $schedule_manager->save(); unset( $params['schedule'], $params['custom'], $params['holiday'] ); } Settings::update( $params ); $settings = Settings::get(); $settings = apply_filters( 'booktics_rest_settings', $settings ); $settings = $this->format_settings_for_response( $settings ); return $this->response( $settings, __( 'Settings updated successfully.', 'booktics' ) ); } /** * Get public settings */ public function get_public_item( $request ): array { return array(); } /** * Check if a given request has access to get items. * * @param WP_REST_Request $request Full data about the request. * * @return WP_Error */ public function get_public_item_permissions_check( $request ): bool { return true; } /** * Check if a given request has access to get items. * * @param WP_REST_Request $request Full data about the request. * * @return WP_Error */ public function stripe_disconnect_permissions_check( $request ): bool { return current_user_can( 'manage_options' ); } /** * Disconnect Stripe account by clearing account ID * * @param $request Full data about the request. */ public function stripe_disconnect( $request ) { Settings::update( 'stripe_account_id', '' ); Settings::update( 'stripe_account_type', '' ); return $this->response( array(), __( 'Successfully disconnected Stripe account.', 'booktics' ) ); } }