id = 'memberships'; // Whitelist of membership fields that can be altered and their associated query arg name. $this->membership_fields = array( 'id', 'customer_id', 'object_id', 'object_type', 'currency', 'initial_amount', 'recurring_amount', 'created_date', 'trial_end_date', 'renewed_date', 'cancellation_date', 'expiration_date', 'payment_plan_completed_date', 'auto_renew', 'times_billed', 'maximum_renewals', 'status', 'gateway_customer_id', 'gateway_subscription_id', 'gateway', 'signup_method', 'subscription_key', 'notes', 'upgraded_from', 'disabled' ); } /** * Register our routes * * @since 1.0 */ public function register_v1_routes() { parent::register_v1_routes(); // Renew a membership register_rest_route( 'rcp/v1', '/' . $this->id . '/(?P\d+)/renew', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'renew_membership' ), 'permission_callback' => array( $this, 'can_edit' ), 'args' => array( 'id' => array( 'required' => true, 'sanitize_callback' => function ( $param, $request, $key ) { return absint( $param ); } ), 'recurring' => array( 'sanitize_callback' => function ( $param, $request, $key ) { return filter_var( $param, FILTER_VALIDATE_BOOLEAN ); } ), 'status' => array( 'default' => 'active', 'validate_callback' => function ( $param, $request, $key ) { $statuses = array( 'pending', 'active', 'cancelled', 'expired' ); return in_array( $param, $statuses ); }, 'sanitize_callback' => function ( $param, $request, $key ) { return sanitize_text_field( strtolower( $param ) ); } ), 'expiration' => array( 'validate_callback' => function ( $param, $request, $key ) { return false !== strtotime( $param ); }, 'sanitize_callback' => function ( $param, $request, $key ) { return date( 'Y-m-d H:i:s', strtotime( $param ) ); } ), ) ) ); // Cancel a membership register_rest_route( 'rcp/v1', '/' . $this->id . '/(?P\d+)/cancel', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'cancel_membership' ), 'permission_callback' => array( $this, 'can_edit' ), 'args' => array( 'id' => array( 'required' => true, 'sanitize_callback' => function ( $param, $request, $key ) { return absint( $param ); } ) ) ) ); } /** * @param RCP_Membership $membership * * @since 1.1 * @return object */ private function format_membership( RCP_Membership $membership ) { $data = new stdClass(); $data->id = $membership->get_id(); $data->customer_id = $membership->get_customer_id(); $data->object_id = $membership->get_object_id(); $data->object_type = $membership->get_object_type(); $data->currency = $membership->get_currency(); $data->initial_amount = $membership->get_initial_amount(); $data->recurring_amount = $membership->get_recurring_amount(); $data->created_date = $membership->get_created_date( false ); $data->trial_end_date = $membership->get_trial_end_date(); $data->renewed_date = $membership->get_renewed_date( false ); $data->cancellation_date = $membership->get_cancellation_date( false ); $data->expiration_date = $membership->get_expiration_date( false ); $data->payment_plan_completed_date = $membership->get_payment_plan_completed_date(); $data->auto_renew = $membership->is_recurring(); $data->times_billed = $membership->get_times_billed(); $data->maximum_renewals = $membership->get_maximum_renewals(); $data->status = $membership->get_status(); $data->gateway_customer_id = $membership->get_gateway_customer_id(); $data->gateway_subscription_id = $membership->get_gateway_subscription_id(); $data->gateway = $membership->get_gateway(); $data->signup_method = $membership->get_signup_method(); $data->subscription_key = $membership->get_subscription_key(); $data->notes = $membership->get_notes(); $data->upgraded_from = $membership->get_upgraded_from(); $data->disabled = $membership->is_disabled(); return $data; } /** * Get data * * If the `id` parameter is provided then information about a single membership is retrieved. * Otherwise, an array of membership results is returned. * * @param WP_REST_Request $request * * @since 1.1 * @return WP_REST_Response */ public function get_data( WP_REST_Request $request ) { if ( $request->get_param( 'id' ) ) { /** * Get single membership by ID. */ $membership = rcp_get_membership( absint( $request->get_param( 'id' ) ) ); if ( empty( $membership ) ) { return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ), 404 ); } return new WP_REST_Response( $this->format_membership( $membership ) ); } else { /** * Get array of memberships. */ $memberships = rcp_get_memberships( $this->query_args ); if ( ! empty( $memberships ) ) { $response = array_map( array( $this, 'format_membership' ), $memberships ); } else { $response = new WP_Error( 'no_memberships', __( 'No memberships found', 'rcp-rest-api' ), array( 'status' => 404 ) ); } return new WP_REST_Response( $response ); } } /** * Renew a membership * * @param WP_REST_Request $request * * @since 1.2 * @return WP_REST_Response Updated membership object on success. */ public function renew_membership( WP_REST_Request $request ) { $membership = rcp_get_membership( $request->get_param( 'id' ) ); if ( ! $membership instanceof RCP_Membership ) { return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ), 404 ); } $recurring = $request->has_param( 'recurring' ) ? $request->get_param( 'recurring' ) : $membership->is_recurring(); $status = $request->get_param( 'status' ); $expiration = $request->get_param( 'expiration' ); $result = $membership->renew( $recurring, $status, $expiration ); if ( ! $result ) { return new WP_REST_Response( new WP_Error( 'membership_renewal_failed', __( 'Renewal failed', 'rcp-rest' ), array( 'status' => 400 ) ), 400 ); } return new WP_REST_Response( $this->format_membership( $membership ) ); } /** * Cancel a membership * * @param WP_REST_Request $request * * @since 1.2 * @return WP_REST_Response Updated membership object on success. */ public function cancel_membership( WP_REST_Request $request ) { $membership = rcp_get_membership( $request->get_param( 'id' ) ); if ( ! $membership instanceof RCP_Membership ) { return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ), 404 ); } if ( $membership->can_cancel() ) { // Cancel recurring billing if possible. $cancelled = $membership->cancel_payment_profile(); if ( is_wp_error( $cancelled ) ) { return new WP_REST_Response( new WP_Error( $cancelled->get_error_code(), $cancelled->get_error_message(), array( 'status' => 400 ) ), 400 ); } } else { // Just changes the membership status. $membership->cancel(); } return new WP_REST_Response( $this->format_membership( $membership ) ); } /** * Add a new membership * * @param WP_REST_Request $request * * @since 1.1 * @return WP_REST_Response ID of the newly created membership on success. */ public function new_post_data( WP_REST_Request $request ) { $args = array(); foreach ( $request->get_params() as $key => $value ) { if ( in_array( $key, $this->membership_fields ) ) { $args[$key] = wp_slash( $value ); } } // Customer ID is required. if ( ! $request->get_param( 'customer_id' ) ) { $response = new WP_Error( 'missing_customer_id', __( 'No customer ID supplied', 'rcp-rest' ), array( 'status' => 500 ) ); return new WP_REST_Response( $response ); } // Object ID is required. if ( ! $request->get_param( 'object_id' ) ) { $response = new WP_Error( 'missing_object_id', __( 'No object ID supplied', 'rcp-rest' ), array( 'status' => 500 ) ); return new WP_REST_Response( $response ); } $membership_id = rcp_add_membership( $args ); if ( empty( $membership_id ) ) { return new WP_REST_Response( new WP_Error( 'create_failed', __( 'Failed to add new membership', 'rcp-rest' ), array( 'status' => 500 ) ) ); } return new WP_REST_Response( absint( $membership_id ) ); } /** * Update an existing membership * * @param WP_REST_Request $request * * @since 1.1 * @return WP_REST_Response */ public function update_post_data( WP_REST_Request $request ) { if ( $request->has_param( 'ID' ) ) { $request->set_param( 'id', $request->get_param( 'ID' ) ); } if ( ! $request->get_param( 'id' ) ) { $response = new WP_Error( 'missing_id', __( 'No membership ID supplied', 'rcp-rest' ), array( 'status' => 500 ) ); return new WP_REST_Response( $response ); } $args = array(); foreach ( $request->get_params() as $key => $value ) { if ( in_array( $key, $this->membership_fields ) ) { $args[ $key ] = wp_slash( $value ); } } $updated = rcp_update_membership( absint( $request->get_param( 'id' ) ), $args ); if ( $updated ) { $response = 1; } else { $response = new WP_Error( 'update_failed', __( 'Update Failed', 'rcp-rest' ), array( 'status' => 500 ) ); } return new WP_REST_Response( $response ); } /** * Delete a membership * * @param WP_REST_Request $request * * @since 1.1 * @return WP_REST_Response */ public function delete_data( WP_REST_Request $request ) { if ( $request->has_param( 'ID' ) ) { $request->set_param( 'id', $request->get_param( 'ID' ) ); } $membership = rcp_get_membership( absint( $request->get_param( 'id' ) ) ); if ( empty( $membership ) ) { return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ) ); } $membership->disable(); return new WP_REST_Response( 1 ); } /** * Determine if authenticated user has permission to access response data * * @since 1.1 * @return bool */ public function can_view() { return current_user_can( 'rcp_view_members' ); } /** * Determine if authenticated user has permission to edit data * * @since 1.1 * @return bool */ public function can_edit() { return current_user_can( 'rcp_manage_members' ); } }