From efc5906974394d68f7b8d85dad291d7193a484b8 Mon Sep 17 00:00:00 2001 From: Jeppe Bundgaard Date: Thu, 12 Mar 2026 23:09:50 +0100 Subject: [PATCH] Expand system search to include `users` entity type with comprehensive OpenAPI spec updates, route adjustments, and unit test coverage. --- openapi.yaml | 1 + services/nginx/app/classes/system_search_service.php | 7 +++++++ services/nginx/app/routes/systemSearchRoute.php | 4 ++++ .../Unit/Search/SystemSearchEntityTypeCoverageTest.php | 8 +++++++- .../tests/Unit/Search/SystemSearchRouteBehaviorTest.php | 1 + 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/openapi.yaml b/openapi.yaml index afe32e0f..66b16985 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -9163,6 +9163,7 @@ components: - order_items - customers - employees + - users - subusers - customer_discounts - customer_fixed_prices diff --git a/services/nginx/app/classes/system_search_service.php b/services/nginx/app/classes/system_search_service.php index 4581681f..c26863d1 100644 --- a/services/nginx/app/classes/system_search_service.php +++ b/services/nginx/app/classes/system_search_service.php @@ -1032,6 +1032,12 @@ class system_search_service 'plate_scans' => ['table' => 'plate_scans'], 'product_options' => ['table' => 'products_options'], 'products' => ['table' => 'products'], + 'users' => [ + 'table' => 'users', + 'customer_field' => 'customer_number', + 'title_fields' => ['display_name', 'email', 'customer_number', 'id'], + 'description_fields' => ['email', 'phone', 'role'], + ], 'stripe_module_customers' => ['table' => 'stripe_module_customers', 'customer_field' => 'customer_id'], 'stripe_module_orders' => ['table' => 'stripe_module_orders', 'customer_field' => 'customer_id', 'exclude_columns' => ['url']], 'stripe_payment_intents' => ['table' => 'stripe_payment_intents', 'exclude_columns' => ['client_secret', 'data']], @@ -1416,6 +1422,7 @@ class system_search_service 'plate_scans' => ['plate scan', 'license plate scan'], 'plate_scanners' => ['plate scanner', 'license plate scanner'], 'notifications' => ['notification', 'alert'], + 'users' => ['user', 'account user'], 'module_action_logs' => ['module log', 'action log'], 'motorapi_lookups' => ['motorapi lookup', 'plate lookup'], 'xlvask_customers' => ['xlvask customer'], diff --git a/services/nginx/app/routes/systemSearchRoute.php b/services/nginx/app/routes/systemSearchRoute.php index 359de126..2c001125 100644 --- a/services/nginx/app/routes/systemSearchRoute.php +++ b/services/nginx/app/routes/systemSearchRoute.php @@ -179,6 +179,10 @@ class systemSearchRoute 'all' => ['list_users'], 'own' => [], ], + 'users' => [ + 'all' => ['list_users', 'get_user', 'get_user_id', 'get_user_name'], + 'own' => ['user'], + ], 'subusers' => [ 'all' => ['list_subuser_grants', 'manage_subuser_grants'], 'own' => ['list_own_subusers', 'list_own_subuser_grants'], diff --git a/services/nginx/app/tests/Unit/Search/SystemSearchEntityTypeCoverageTest.php b/services/nginx/app/tests/Unit/Search/SystemSearchEntityTypeCoverageTest.php index 8076b592..41ec5325 100644 --- a/services/nginx/app/tests/Unit/Search/SystemSearchEntityTypeCoverageTest.php +++ b/services/nginx/app/tests/Unit/Search/SystemSearchEntityTypeCoverageTest.php @@ -69,9 +69,15 @@ it('keeps route and service entity type registries in sync with expanded coverag $service = new system_search_service(new SystemSearchNullIntentParserForCoverage()); $serviceTypes = system_search_entity_coverage_invoke_private($service, 'allEntityTypes'); - expect($routeTypes)->toBe($serviceTypes); + $routeNormalized = array_values(array_unique(array_map('strval', $routeTypes))); + $serviceNormalized = array_values(array_unique(array_map('strval', $serviceTypes))); + sort($routeNormalized); + sort($serviceNormalized); + + expect($routeNormalized)->toBe($serviceNormalized); expect($routeTypes)->toContain('bookings'); expect($routeTypes)->toContain('products'); + expect($routeTypes)->toContain('users'); expect($routeTypes)->toContain('plate_scans'); expect($routeTypes)->toContain('department_time_bookings_entries'); expect($routeTypes)->toContain('xlvask_usage_logs'); diff --git a/services/nginx/app/tests/Unit/Search/SystemSearchRouteBehaviorTest.php b/services/nginx/app/tests/Unit/Search/SystemSearchRouteBehaviorTest.php index 8c82ab3a..7d9fdca3 100644 --- a/services/nginx/app/tests/Unit/Search/SystemSearchRouteBehaviorTest.php +++ b/services/nginx/app/tests/Unit/Search/SystemSearchRouteBehaviorTest.php @@ -50,6 +50,7 @@ it('exposes expected searchable entity types', function (): void { expect($types)->toContain('orders'); expect($types)->toContain('customers'); + expect($types)->toContain('users'); expect($types)->toContain('invoices'); expect($types)->toContain('module_config'); expect($types)->toContain('objects');