'recurring_bookings', '#^(?:admin/)?credit(?:/|$)#'=>'credits', '#^admin/member-import(?:/|$)#'=>'member_import', '#^admin/membership-(?:bulk|renew|operations)#'=>'bulk_membership_renewal', '#^(?:members|memberships|membership-types|seasons|wordpress-users|member-search|membership-link|settings/membership)(?:/|$)#'=>'memberships', '#^admin/(?:memberships|membership-seasons|membership-bulk)(?:/|$)#'=>'bulk_membership_renewal', '#^admin/members/[^/]+/usage$#'=>'usage_limits', '#^(?:admin/usage-limit-rules|membership-usage|admin/membership-usage)(?:/|$)#'=>'usage_limits', '#^(?:admin/)?customer-restrictions(?:/|$)#'=>'customer_restrictions', '#^settings/bank-profiles(?:/|$)#'=>'bank_transfer', '#^admin/statistics/export$#'=>'report_exports', '#^admin/statistics/finance$#'=>'financial_reporting', '#^admin/statistics/(?:members|heatmap)$#'=>'statistics_advanced', ]as $pattern=>$feature)if(preg_match($pattern,$path))return $feature; return null; } public static function register():void{ static $registered=false;if(!$registered){add_filter('rest_endpoints',[self::class,'gate']);$registered=true;} register_rest_route('abece-booking/v1','/admin/edition',['methods'=>'GET','permission_callback'=>static fn()=>current_user_can('manage_options')?:new \WP_Error('abece_booking_forbidden',__('You do not have permission to access this ABeCe Booking page.','abece-booking'),['status'=>rest_authorization_required_code()]),'callback'=>static fn()=>new \WP_REST_Response(Entitlements::current()->manifest()+['license'=>(new \ABeCe\Booking\Licensing\FreemiusEntitlementProvider(function_exists('abece_booking_fs')?abece_booking_fs():null))->status(),'catalog'=>FeatureCatalog::FEATURES,'plans'=>array_combine(FeatureCatalog::PLANS,array_map(static fn($p)=>['features'=>FeatureCatalog::features($p),'limits'=>['resources'=>FeatureCatalog::resourceLimit($p),'online_resources'=>FeatureCatalog::onlineResourceLimit($p)]],FeatureCatalog::PLANS))],200,['Cache-Control'=>'private, no-store'])]); } public static function gate(array $routes):array{ $e=Entitlements::current();foreach($routes as $route=>&$handlers){if(!str_starts_with($route,'/abece-booking/v1/'))continue;$feature=self::feature($route);if(!$feature)continue; if($e->edition()==='lite'){unset($routes[$route]);continue;} foreach($handlers as &$handler){if(!is_array($handler)||!isset($handler['callback']))continue;$permission=$handler['permission_callback']??static fn()=>false; $handler['permission_callback']=static function($request)use($permission,$feature){$allowed=$permission($request);if(is_wp_error($allowed)||$allowed===false||$allowed===null)return $allowed;return Entitlements::current()->has($feature)?$allowed:new \WP_Error('feature_not_available',__('This feature is not available in this edition.','abece-booking'),['status'=>403,'feature'=>$feature]);}; }unset($handler); }unset($handlers);return $routes; } }