Search and Health Endpoints with Multilingual Support#42
Open
RichardCMX wants to merge 36 commits intomainfrom
Open
Search and Health Endpoints with Multilingual Support#42RichardCMX wants to merge 36 commits intomainfrom
RichardCMX wants to merge 36 commits intomainfrom
Conversation
…as HH:MM:SS; validate stop_id; add Fuseki flags and DAL docs; add /api/schedule/departures/ endpoint
…tures endpoint; tests(api): add tests for DAL-backed schedule departures
…sts package __init__
…CACHE_TTL_SECONDS and pass via factory
…test; add tiny TTL sample
…add Fuseki dev guide and update README/architecture; fix duplicate FUSEKI_ENDPOINT
…tion (LimitOffsetPagination, page size 50)\n- Add /api/alerts route (ServiceAlertViewSet)\n- Add /api/arrivals endpoint integrating with ETAS_API_URL (Project 4)\n- Add /api/status endpoint reporting DB/Redis/Fuseki health\n- Update OpenAPI (datahub.yml) for pagination + new endpoints
…vals endpoint tests with mocked upstream
…ema to drf-spectacular
…Message, StopTimeUpdate to real model fields
…, stop-time-updates), pagination, OpenAPI docs, ETAs config, and testing instructions
…rules, feed-messages, stop-time-updates; polish examples for core endpoints
- Implement /api/search/ endpoint with ranking for stops and routes - Support for fuzzy text matching with relevance scoring - Configurable search types (stops, routes, all) - Limit and pagination support - Feed-specific search capability - Add /api/health/ endpoint for basic health checks - Simple status check returning 200 OK - Minimal response for lightweight monitoring - Add /api/ready/ endpoint for readiness checks - Database connectivity verification - Current feed availability check - Returns 503 when not ready to serve requests - Comprehensive test coverage for all new endpoints - Search functionality tests with various scenarios - Health endpoint validation tests - Edge cases and error handling tests - Full OpenAPI documentation integration - Proper error handling and validation - Follows existing code patterns and conventions
- Fix missing FloatField import in views.py for search functionality - Add comprehensive edge case tests for search: - Case insensitivity testing - Special characters and Unicode handling - Numbers and symbols in queries - Very long query handling - Add additional health endpoint test for multiple current feeds - Ensure robust error handling and graceful degradation
- Add custom API root view to include search, health, and ready endpoints - Update /api/ to show all endpoints including new search and health services - Add comprehensive README documentation for Issue #28: - Search API with intelligent ranking and fuzzy matching - Health monitoring endpoints for load balancers and Kubernetes - Complete usage examples with curl commands - Response format documentation - Integration examples (Docker health checks, K8s probes) The API root now shows: - search: http://localhost:8000/api/search/ - health: http://localhost:8000/api/health/ - ready: http://localhost:8000/api/ready/
- Remove Fuseki Docker service from docker-compose.yml - Remove fuseki_data volume - Delete storage/fuseki_schedule.py implementation - Delete api/tests/test_fuseki_schedule.py integration tests - Remove docker/fuseki/ configuration directory - Remove docs/dev/fuseki.md documentation - Update storage/factory.py to use only PostgreSQL repository - Remove FUSEKI_ENABLED and FUSEKI_ENDPOINT from settings.py - Remove Fuseki environment variables from .env.local.example - Update README.md and docs/architecture.md to remove Fuseki references PostgreSQL with Redis caching is now the sole storage backend.
- Document Data Access Layer implementation - Document new /api/schedule/departures/ endpoint - Document Redis caching configuration - Document Fuseki removal - Follow Keep a Changelog format
- Add class-level docstring explaining DAL testing - Document setUp method for test data preparation - Add docstrings for test_returns_404_when_stop_missing - Add docstrings for test_returns_departures_with_expected_shape - Improve test readability and maintainability
- Document test structure and organization - Explain test coverage for schedule departures endpoint - Provide examples for running tests - Document test data setup approach - Add guidelines for adding new tests
- Document /api/arrivals/ endpoint with ETA service integration - Document /api/status/ health check endpoint - Document /api/alerts/, /api/feed-messages/, /api/stop-time-updates/ - Document global pagination implementation - Document ETAS_API_URL configuration - Document comprehensive test suite for arrivals endpoint
- Add class-level docstring explaining ETA service integration testing - Document test_arrivals_returns_expected_shape - Document test_arrivals_propagates_upstream_error - Document test_arrivals_requires_stop_id - Document test_arrivals_accepts_wrapped_results_object - Document test_arrivals_handles_unexpected_upstream_structure_as_empty_list - Document limit validation tests - Document test_arrivals_returns_501_if_not_configured
- Add test_arrivals.py documentation - Document all 9 test cases for arrivals endpoint - Add examples for running arrivals tests - Document mocked HTTP request testing approach - Update coverage section with new test areas - Add unittest.mock to dependencies
- Update search queries to use __unaccent lookup for accent-insensitive matching - Support multilingual searches (Spanish, Portuguese, etc.) - Searches like 'San José' now match 'San Jose' and vice versa - Trigram similarity now operates on unaccented text for better fuzzy matching This improves search experience for Costa Rican transit data with accented characters.
BUG DISCOVERED: Issue #28 (search/autocomplete endpoints) implemented TrigramSimilarity for fuzzy text matching but never created the required PostgreSQL pg_trgm extension. The code silently fell back to basic string matching (icontains) via try/except blocks in api/views.py lines 1064-1104 and 1125-1179. This bug went undetected because: - Original tests validated API response structure, not trigram functionality - Exception handling masked the missing extension - Fallback logic allowed endpoints to return results IMPACT: - Search accuracy degraded (no fuzzy matching) - Search performance reduced (no trigram indexing) - Feature deployed incomplete FIX: Add PostgreSQL extension setup for both main and test databases: 1. docker/db/init.sql - Creates pg_trgm extension in dev/prod database on first container run - Mounted via docker-compose.yml at /docker-entrypoint-initdb.d/ - Enables TrigramSimilarity queries in search endpoints 2. datahub/test_runner.py - Custom Django test runner (InfobusTestRunner) - Creates pg_trgm extension in isolated test database - Required because Django doesn't copy extensions to test DB 3. datahub/settings.py - Configure TEST_RUNNER to use InfobusTestRunner - Ensures extensions available during test execution 4. docker-compose.yml - Mount init.sql to PostgreSQL initialization directory - Extension created automatically on database first start VERIFICATION: Comprehensive integration tests now verify actual trigram functionality instead of just API response structure, catching this missing setup. Resolves incomplete implementation from commit ea877e2 (Issue #28).
- Add SpectacularSwaggerView to api/urls.py - Available at /api/docs/swagger/ - Provides interactive forms for testing all API endpoints - Complements existing ReDoc documentation at /api/docs/
- Document /api/search/ with fuzzy matching and unaccent support - Document /api/health/ and /api/ready/ endpoints - Document PostgreSQL extensions (pg_trgm, unaccent) - Document Swagger UI and ReDoc integration - Document comprehensive test suites
- Add multilingual search documentation with unaccent extension - Document accent-insensitive search (San Jose matches San José) - Add Interactive API Documentation section - Document Swagger UI at /api/docs/swagger/ - Document ReDoc and DRF Browsable API - Improve search feature descriptions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📋 Summary
Implements intelligent search functionality with fuzzy matching and accent-insensitive search for multilingual support, plus comprehensive health monitoring endpoints. Adds interactive Swagger UI for API testing and exploration.
This PR resolves issue #28 (Search/autocomplete endpoints and health checks)
✨ Features Added
🔍 Search API with Advanced Matching
Query parameters:
q(required): Search query stringtype(optional): 'stops', 'routes', or 'all' (default)limit(optional): Maximum results (1-100), defaults to 20feed_id(optional): Limit search to specific feedKey Features:
🏥 Health & Monitoring Endpoints
GET /api/health/ - Simple health check
{"status": "ok", "timestamp": "..."}GET /api/ready/ - Comprehensive readiness check
🗄️ PostgreSQL Extensions
docker/db/init.sql- Automatic setup on database creationdatahub/test_runner.py- Custom test runner ensures extensions in test database🎮 Interactive API Documentation
Swagger UI - Added at
/api/docs/swagger/ReDoc - Available at
/api/docs/🧪 Testing
Search Endpoint Tests (
test_search.py)Health Endpoint Tests (
test_health.py)📚 Documentation
📝 Commits
🔍 Related Issues
Closes #28
✅ Checklist
📸 Example Usage
Search with Multilingual Support
Health Checks
Interactive Testing
Visit in your browser:
🎯 Next Steps
After merging, the following branches will need to be rebased/merged to include these changes:
feature/auth-rate-limitsfeature/client-managementfeature/security-performancefeature/admin-panel-metricsfeature/unit-integration-contract-tests💡 Technical Notes