Changed from full timestamp to hour-only format to match implementation.
OLD: /active-rate-limits/2025-12-31T13:34:46Z (YYYY-MM-DDTHH:MM:SSZ)
NEW: /active-rate-limits/2025-12-31-13 (YYYY-MM-DD-HH)
Benefits:
- API now matches actual implementation (hour-level caching)
- Eliminates timezone/minute truncation confusion
- Clearer semantics: 'active during this hour' not 'at this second'
- Direct cache key mapping improves performance
- Simpler date parsing (no timezone handling needed)
Files changed:
- APIMethods600.scala: Updated endpoint and date parsing
- RateLimitsTest.scala: Updated all test cases to new format
- Glossary.scala: Updated API documentation
- introductory_system_documentation.md: Updated user docs
This is a breaking change but necessary to align API with implementation.
Rate limits are cached and queried at hour granularity, so the API
should reflect that reality.
Bug #1: getActiveCallLimitsByConsumerIdAtDate ignored date parameter
- Used LocalDateTime.now() instead of provided date parameter
- Broke queries for future dates
- API endpoint /active-rate-limits/{DATE} was non-functional
Bug #2: Hour-based caching caused off-by-minute timing bug
- Query truncated to start of hour (12:00:00)
- Rate limits created mid-hour (12:01:47) not found
- Condition: fromDate <= 12:00:00 failed when fromDate = 12:01:47
Bug #3: Timezone mismatch between system and tests
- Code used ZoneId.systemDefault() (CET/CEST)
- Tests use ZoneOffset.UTC
- Caused hour boundary mismatches
Solution:
- Use actual date parameter in getActiveCallLimitsByConsumerIdAtDate
- Query full hour range (12:00:00 to 12:59:59) instead of point-in-time
- Use UTC timezone consistently
- Add debug logging for troubleshooting
Note: Test still failing - may be cache or transaction timing issue.
Further investigation needed.
See RATE_LIMITING_BUG_FIX.md for detailed analysis.
Bug #1: getActiveCallLimitsByConsumerIdAtDate ignored the date parameter
- Always used LocalDateTime.now() instead of the provided date
- Broke queries for future dates
- API endpoint /active-rate-limits/{DATE} was non-functional
Bug #2: Hour-based caching created off-by-minute query bug
- Query truncated to start of hour (12:00:00)
- Rate limits created mid-hour (12:01:47) were not found
- Condition: fromDate <= 12:00:00 failed when fromDate = 12:01:47
Solution:
- Use the actual date parameter in getActiveCallLimitsByConsumerIdAtDate
- Query full hour range (12:00:00 to 12:59:59) instead of point-in-time
- Ensures rate limits created anytime during the hour are found
Fixes test: RateLimitsTest.scala:259 - aggregated rate limits
Expected: 15 (10 + 5), Got: -1 (not found) → Now returns: 15 ✅
See RATE_LIMITING_BUG_FIX.md for detailed analysis.
Remove duplicate/corrupted lines that were accidentally introduced in commit 0d4a318.
The lines included:
- Duplicate 'Unlimited' bullet point
- Stray HTTP header lines (X-Rate-Limit-Remaining, X-Rate-Limit-Reset)
- Dangling opening brace
Also improved markdown formatting with blank lines before code blocks.
- Update `getResourceDocsList` to include v7.0.0 in `ResourceDocsAPIMethods`
- Modify `Http4s700` to utilize centralized `ResourceDocs140` for fetching resource docs
- Simplify resource docs filtering logic for v7.0.0 with tailored handling
- Add `v7_0_0` to supported API versions in `ApiVersionUtils`
- Update `Http4s700` to return pre-defined resource docs instead of scanning for version 7.0.0
- Introduce `getResourceDocsObpV700` to handle resource docs retrieval for API version 7.0.0
- Add `getResourceDocsList` helper function for fetching version-specific resource docs
- Update `allRoutes` to include the new endpoint
- Modify imports to include necessary utilities and remove unused references
- Add `Http4sEndpoint` type alias and `http4sPartialFunction` in APIUtil for handling http4s routes
- Refactor Http4s700 to define routes as standalone functions (e.g., `root`, `getBanks`) within Implementations7_0_0 object
- Attach resource documentation to each route for better maintainability
- Create a unified `allRoutes` combining v7.0.0 route handlers
- Update imports and clean up unused references
- Rename MappedAbacRule class to AbacRule for cleaner naming convention
- Extract AbacRuleTrait as the base trait for ABAC rule contracts
- Update AbacRuleProvider to return AbacRuleTrait instead of concrete class
- Update all references in Boot.scala to use new AbacRule naming
- Update JSONFactory6.0.0.scala to accept AbacRuleTrait in factory methods
- Simplify object singleton naming from MappedAbacRule to AbacRule
- Improves code clarity by separating trait definition from implementation
- Update view ID field references from "id" to "view_id" in getAllSystemViews test
- Update view ID field references from "id" to "view_id" in getOneSystemView test
- Update view ID field references from "id" to "view_id" in getMultipleSystemViews test
- Align test assertions with actual API response schema for system views endpoint
- Update WebUiPropsTest to assert empty body as JNothing instead of "{}"
- Change response body assertion to use `shouldBe(JNothing)` for proper HTTP 204 handling
- Remove default "{}" placeholder in SendServerRequests when response body is empty
- Return empty string "" instead of "{}" to correctly represent No Content responses
- Add clarifying comment explaining that HTTP 204 should have empty body, not JSON object
- Align test expectations with proper REST semantics for 204 No Content status code
BREAKING CHANGE: Migration from Akka to Apache Pekko 1.1.2
## Key Changes:
### Dependency Migration:
- Replaced Akka 2.6.20 with Apache Pekko 1.1.2
- Updated all imports from com.typesafe.akka to org.apache.pekko
- Updated Jetty from 9.4.50 to 9.4.58 for better Java 17 compatibility
### Actor System Architecture:
- Migrated all actor systems to Pekko
- Fixed critical scheduler initialization conflicts
- Consolidated schedulers to use shared ObpActorSystem.localActorSystem
- Prevented multiple actor system creation during boot
### Scheduler Fixes:
- DataBaseCleanerScheduler: Fixed actor system reference
- DatabaseDriverScheduler: Fixed actor system reference
- MetricsArchiveScheduler: Fixed actor system reference
- SchedulerUtil: Fixed actor system reference
- TransactionRequestStatusScheduler: Fixed actor system reference
### Technical Improvements:
- Resolved 'Address already in use' port binding errors
- Eliminated ExceptionInInitializerError during boot
- Fixed race conditions in actor system initialization
- Maintained all scheduler functionality (MUST-have features preserved)
### Files Modified:
- Core: pom.xml, obp-api/pom.xml
- Actor Systems: ObpActorConfig.scala, ObpActorSystem.scala, ObpLookupSystem.scala
- Connectors: AkkaConnector_vDec2018.scala, CardanoConnector, EthereumConnector
- Schedulers: All scheduler classes updated to use shared actor system
- Utilities: AkkaHttpClient.scala, DynamicUtil.scala, NewStyle.scala
## Testing:
✅ Application starts successfully on port 8080
✅ All schedulers operational with shared actor system
✅ Pekko actor system running on dynamically allocated port
✅ No port binding conflicts or initialization errors
✅ HTTP endpoints responding correctly
## Migration Notes:
- Akka licensing issues addressed by moving to Apache Pekko
- Backward compatibility maintained through Pekko's API compatibility
- All existing connector and scheduling functionality preserved
- Improved stability and reduced memory footprint