'POST', 'callback' => [ $this, 'generate_link' ], 'permission_callback' => [ $this, 'require_login' ], ] ); // Get user rewards register_rest_route( self::NAMESPACE, '/rewards', [ 'methods' => 'GET', 'callback' => [ $this, 'get_rewards' ], 'permission_callback' => [ $this, 'require_login' ], ] ); // Get dashboard data register_rest_route( self::NAMESPACE, '/dashboard', [ 'methods' => 'GET', 'callback' => [ $this, 'get_dashboard' ], 'permission_callback' => [ $this, 'require_login' ], ] ); // Checker: validate reward code register_rest_route( self::NAMESPACE, '/check-reward', [ 'methods' => 'POST', 'callback' => [ $this, 'check_reward' ], 'permission_callback' => '__return_true', ] ); // Checker: mark reward as used register_rest_route( self::NAMESPACE, '/mark-used', [ 'methods' => 'POST', 'callback' => [ $this, 'mark_used' ], 'permission_callback' => '__return_true', ] ); } public function require_login(): bool { return is_user_logged_in(); } // ─── Handlers ───────────────────────────────────────────────────────────── public function generate_link( WP_REST_Request $req ): WP_REST_Response { $user_id = get_current_user_id(); $result = ADSD_RCC_Referral_Engine::instance()->generate_link( $user_id ); if ( is_wp_error( $result ) ) { return new WP_REST_Response( [ 'error' => $result->get_error_message() ], 400 ); } return new WP_REST_Response( $result, 200 ); } public function get_rewards( WP_REST_Request $req ): WP_REST_Response { $user_id = get_current_user_id(); $rewards = ADSD_RCC_DB::instance()->get_rewards_for_user( $user_id ); $formatted = array_map( function( $r ) { $r->reward_display = ADSD_RCC_Reward_Engine::format_value( $r ); return $r; }, $rewards ); return new WP_REST_Response( $formatted, 200 ); } public function get_dashboard( WP_REST_Request $req ): WP_REST_Response { $user_id = get_current_user_id(); $data = ADSD_RCC_Referral_Engine::instance()->get_dashboard_data( $user_id ); return new WP_REST_Response( $data, 200 ); } public function check_reward( WP_REST_Request $req ): WP_REST_Response { $params = $req->get_json_params(); $passkey = sanitize_text_field( $params['passkey'] ?? '' ); $code = sanitize_text_field( $params['reward_code'] ?? '' ); if ( ! ADSD_RCC_DB::instance()->validate_passkey( $passkey ) ) { return new WP_REST_Response( [ 'error' => __( 'Invalid passkey.', 'adsd-referral-couponcore' ) ], 403 ); } $reward = ADSD_RCC_DB::instance()->get_reward_by_code( $code ); if ( ! $reward ) { return new WP_REST_Response( [ 'error' => __( 'Reward code not found.', 'adsd-referral-couponcore' ) ], 404 ); } $user = get_user_by( 'id', (int) $reward->user_id ); return new WP_REST_Response( [ 'reward_code' => $reward->reward_code, 'reward_value' => ADSD_RCC_Reward_Engine::format_value( $reward ), 'status' => $reward->status, 'expires_at' => $reward->expires_at, 'user_email' => $user ? $user->user_email : '', 'can_mark_used' => $reward->status === 'active', ], 200 ); } public function mark_used( WP_REST_Request $req ): WP_REST_Response { $params = $req->get_json_params(); $passkey = sanitize_text_field( $params['passkey'] ?? '' ); $code = sanitize_text_field( $params['reward_code'] ?? '' ); if ( ! ADSD_RCC_DB::instance()->validate_passkey( $passkey ) ) { return new WP_REST_Response( [ 'error' => __( 'Invalid passkey.', 'adsd-referral-couponcore' ) ], 403 ); } $db = ADSD_RCC_DB::instance(); $reward = $db->get_reward_by_code( $code ); if ( ! $reward ) { return new WP_REST_Response( [ 'error' => __( 'Reward not found.', 'adsd-referral-couponcore' ) ], 404 ); } if ( $reward->status !== 'active' ) { return new WP_REST_Response( [ /* translators: %s: current status of the reward (e.g. expired, used) */ 'error' => sprintf( __( 'Reward is already %s.', 'adsd-referral-couponcore' ), $reward->status ), ], 409 ); } $db->update_reward( (int) $reward->id, [ 'status' => 'used', 'used_at' => current_time( 'mysql', true ), 'used_by' => 'local_shop', 'shopkeeper_used' => 1, ] ); $user = get_user_by( 'id', (int) $reward->user_id ); if ( $user ) { ADSD_RCC_Reward_Engine::instance()->send_used_email( $user, $reward ); } $db->log( 'reward_used_local', (int) $reward->user_id, (int) $reward->id, 'Reward marked as used by local shopkeeper.' ); return new WP_REST_Response( [ 'success' => true ], 200 ); } }