All versions since 31.2.0
31.2.0
- feat: add comprehensive external webhook event catalogue (#479)
- test: :green_heart: fixed test
31.3.0
- docs: :globe_with_meridians: updated translation keys
- docs: :memo: add JaCoCo 85% rollout plan and cache-domain test logback config
- docs: :memo: JaCoCo 85% rollout COMPLETE — 40 modules gated, 500+ tests added
- docs: :memo: phase0 discovery complete — 40 real modules, 13 empty stubs, 500+ tests needed
- docs: :memo: phase1 task1 json-domain complete — 100% coverage
- docs: :memo: phase1 task2 geo-name-web complete — 89% coverage
- docs: :memo: phase1 task3 analytics-domain complete — 86.6% coverage
- docs: :memo: phase1 tasks 1-3 complete
- docs: :memo: phase1 tasks 1-3 complete — 3 modules at 85%+
- docs: :memo: phase1-2 summary — 7 modules complete at 91.2% avg coverage
- docs: :memo: phase2 task6 inventory-domain complete — 85.8% coverage + bug fix
- docs: :memo: phase2 task7 message-template-domain complete — 100% coverage
- docs: :memo: phase2 tasks 12-15 complete — 15/16 Tier 2 modules at 85%+
- docs: :memo: phase2 tasks 8-11 complete — 4 modules at 85%+ (11/7 total complete)
- docs: :memo: phase2-3 checkoint — 20 modules at 85%+ (16 Tier2 + 4 Tier3)
- feat(analytics): multi-party server-side GA4/GTM purchase tracking (#485)
- feat(booking): only email travelers on concrete Stripe payment failures (#491)
- feat(cache): add managingEntityIdsByUser ID-list cache to ManagingEntityService (#484)
- feat(room-type): draft + per-section PATCH endpoints; refactor: remove fake-async from request/response services (#481)
- fix: :recycle: fixed selfAcquired and selfDisburses
- fix(booking,accounting): agent refunds settle + self-managed agents kept off the ledger (#488)
- fix(booking): :bug: settle admin manual refunds with no Stripe PaymentIntent (#492)
- fix(booking): apply channel-manager status filter to all pull paths (Exely, CloudBeds)
- fix(booking): filter booking status for channel-manager delivery and review emails (#489)
- fix(booking): scope channel-manager pulls by rateSource + hide INITIALIZED from non-admin (#490)
- fix(customization): map CustomizationException to 404; 409 for primary removal (#482)
- fix(lookup-web): handle missing ‘term’ param as 400 Bad Request (#483)
- perf(rate): eliminate N+1 query in RateRepository.findByDateRange Map overloads
- refactor: :recycle: fixed Stripe issues due to new Stripe version
- refactor: :recycle: remove leftover PasswordEncoder dependency from YanoljaServiceImpl
- refactor: :recycle: removed property status everywhere
- refactor: :recycle: removed unused imports
- refactor: :recycle: tried to get more insight into why Exely is failing in staging
- refactor: :recycle: updated Yanolja by removing bcrypted password
- test: :green_heart: fixed some AI generated tests
- test: :white_check_mark: booking-domain — enable JaCoCo 85% gate → 86.9%
- test: :white_check_mark: booking-web — boost instruction coverage from 85% to 93%
- test: :white_check_mark: booking-web — enable JaCoCo 85% gate → 85%+
- test: :white_check_mark: cache-domain, lookup-web — → 85%+
- test: :white_check_mark: caldav-web — enable JaCoCo 85% gate and add 404 test
- test: :white_check_mark: customization-web — enable JaCoCo 85% gate → 100%
- test: :white_check_mark: customization-web, message-template-web, report-web — → 85%+
- test: :white_check_mark: enable JaCoCo 85% gate on 49 empty/tiny modules (integrations, mcp stubs, scaffolding)
- test: :white_check_mark: fix cancellationType assertion in BookingPhase0TypesTest
- test: :white_check_mark: fix disabled tests and raise coverage in 5 modules to 80%+ gate
- test: :white_check_mark: improve room-type-domain JaCoCo coverage with comprehensive event listener tests
- test: :white_check_mark: lookup-web — enable JaCoCo 85% gate → 95%+
- test: :white_check_mark: message-template-domain coverage verified at 100%
- test: :white_check_mark: message-template-web — enable JaCoCo 85% gate → 100%
- test: :white_check_mark: payment-web — enable JaCoCo 85% gate → 89.6%
- test: :white_check_mark: phase1 analytics-domain coverage — 65% → 85%+
- test: :white_check_mark: phase1 analytics-domain coverage — 86.6%
- test: :white_check_mark: phase1 application-domain coverage — 50% → 95.7%
- test: :white_check_mark: phase1 application-domain coverage — 50% → 95.7%+
- test: :white_check_mark: phase1 geo-name-web coverage — 50% → 89%+ (gate enabled)
- test: :white_check_mark: phase1 json-domain coverage — 0% → 85%
- test: :white_check_mark: phase1 point-of-interest-domain coverage — ~40% → 89%+
- test: :white_check_mark: phase1 point-of-interest-domain coverage — 40% → 89.3%
- test: :white_check_mark: phase2 add-on-web — → 85%+
- test: :white_check_mark: phase2 customization-client-domain — → 85%+
- test: :white_check_mark: phase2 exchange-rate-web — → 85%+
- test: :white_check_mark: phase2 geo-ip-web — → 85%+
- test: :white_check_mark: phase2 inventory-domain coverage — 65% → 85.8%+
- test: :white_check_mark: phase2 invite-domain — → 85%+
- test: :white_check_mark: phase2-final cancellation-policy-web — → 85%+
- test: :white_check_mark: phase3 accounting-domain — → 85%+
- test: :white_check_mark: phase3 checkout-domain — → 85%+
- test: :white_check_mark: phase3 lookup-domain — → 85%+
- test: :white_check_mark: reconcile tests after origin/develop merge
- test: :white_check_mark: report-web — enable JaCoCo 85% gate → pass
- test: :white_check_mark: scheduler-domain — → 85%+
- test: :white_check_mark: shortened-url-domain — enable JaCoCo 85% gate
- test(room-type): :white_check_mark: fix failing tests and restore 85% gate; enable events-command-gateway and translate-inventory gates
31.4.0
- feat(financials): fee-total model rework — totalPlatformFee(+InPercent), TripPay→PaymentProcessing rename, gross-based platform fee (#493)
- fix(acl): register managing-entity cache so @RequireAccountPermission resolves teams
- refactor: :recycle: changed Exely query so bookings will return when the exely booking is confirmed
- refactor(api): use native mapping version attribute for v2.0 endpoints
31.5.0
- feat: Partner API usage metering + standalone partner-app (#298)
- feat(cache): two-tier L1 caching for inventory, master-rate & property-aggregate (#494)
- feat(customization): GTM-as-black-box — caching, client-side purchase, drop server-side MP fields (#495)
- fix(sso): drop trailing slash before query string in portal dashboard redirect URLs
- refactor: :recycle: disabled lazy init
- refactor: :recycle: fixed Exely JSON payload structure
- refactor: :recycle: fixed payment_intent.succeeded
- refactor: :recycle: reset Exely booking status on cancel
- refactor: shed eager mail/google-places infra from lean apps (#500)
- refactor(datasource): extract stripe-free booking/checkout repositories into datasource modules
- refactor(google-hotel): integrator feed gets an add-on/sellable-free rate path; trim IntegrationsDbConfig (#497)
- refactor(integrations-app): trim IntegrationsDbConfig to runtime-needed repositories
- refactor(inventory): split inventory-domain into datasource/consumer/projection modules (#496)
- refactor(managing-entity): platform-wide consumer/publisher split to keep ShortenedUrl off integrations-app (#499)
- refactor(rate-plan): split into datasource/consumer/publisher to keep cancellation-policy off integrations-app (#498)
- test(checkout): cover GA4-redirect + Stripe session-id two-layer URL hand-off
31.5.1
- fix: :bug: emit GCP-recognized severity field in structured logs
- fix: :bug: normalize negative-zero Decimal128 when reading BigDecimal fields
- refactor(partner-app): shed 12 unused MongoDB repositories via module splits (#501)
- test: :green_heart: all tests pass
- test(booking): :white_check_mark: provide CacheManager bean in BookingServiceConfig
31.5.2
- refactor: :recycle: added quote cache to integrations-app
32.0.0
- chore: disable automatic claude-code-review workflow (#517)
- chore(mongo): single combined Initiative D migration (run-once) (#626)
- chore(scripts): :wrench: shut down local redis in stopServices
- docs: :memo: added some custom agents
- docs: :memo: updated banner.txt
- docs: :memo: updated claude
- docs(webhook): add AsyncAPI 3.0 spec for the outbound webhook contract (Initiative C) (#617)
- feat: add-on sub-resource endpoints for six inventory types (#635)
- feat(api-usage): weighted hotel-day metering for the Partner API (#631)
- feat(billing): pay-as-you-go platform billing via Metronome (#641)
- feat(cache): optional L2 (Redis/Memorystore) tier behind L1 Caffeine (#633)
- feat(computed): add refundableUntilDays to RoomTypeBestPriceForDateRange (#629)
- feat(dto): :sparkles: add optimistic-locking version to AbstractDto and wire If-Match
- feat(dto): add Lightweight DTOs for 7 more entities (batch 2) (#622)
- feat(dto): add Lightweight DTOs for 8 entities lacking them (batch 1) (#621)
- feat(inventory): add dedicated active-flag PATCH endpoint per hub
- feat(inventory): draft-create + per-section PATCH hub endpoints for 7 inventory types (#627)
- feat(lookup): Atlas Search autocomplete, remove lookup cache, fix public-endpoint ReDoS (#639)
- feat(openapi): document Page
responses as the pagination envelope - feat(payment): :sparkles: reconcile Stripe refunds whose settlement webhook never arrived (#638)
- feat(rate-limit): per-user Redis token-bucket rate limiter for the Partner API (#634)
- feat(rate): cache daily rates per RateKey with precise + prefix eviction (#630)
- feat(webhook): add schemaVersion to the webhook delivery envelope (Initiative C foundation) (#613)
- fix(api-usage-subscription): restore compile-scope cache-api/events-command-gateway deps (#607)
- fix(booking): :bug: settle Stripe refunds that are created as pending (#637)
- fix(cache): :bug: exclude Redis autoconfigs that break with two connection factories
- fix(integrations-app): bundle netty-resolver-dns-native-macos for local reactor-netty
- fix(mail): eliminate partner-app/integrations-app pdf boot crash; split booking/external-event mail listeners (#628)
- fix(module-boundary): fix 2 remaining MasterRate leaks found by independent review
- fix(module-boundary): fix remaining MasterRate test fixtures surfaced by full-reactor sweep
- fix(module-boundary): fix remaining MasterRate test/consumer fixtures surfaced by full-reactor sweep
- fix(module-boundary): fix unrelated geo-name compile-scope break, regenerate stale ArchUnit baseline
- fix(mongo): add missing roomType/guestRoom/review identifier->id migration steps
- fix(security): un-break MCP OAuth for browser clients — DCR proxy contamination, SSO discovery CORS, session-id exposure (#601)
- fix(shared-api): :lock: enforce VariableCharge percent/fixedAmount are always non-negative
- fix(test,master-rate): repair runtime test regressions from event-retype waves + a MasterRate NPE (#620)
- refactor: :recycle: added a strict monetary amount deserializer everywhere
- refactor: :recycle: fixing tests and some configs
- refactor: :recycle: updated Exely daily rate amounts
- refactor: :wrench: updated index name
- refactor(architecture-tests): widen ModuleBoundaryTest from review+booking pilot to all of travel.wink (#549)
- refactor(dto): migrate 4 read-projection Lightweights onto AbstractDto (Initiative A batch 1) (#603)
- refactor(dto): migrate apex Lightweights onto AbstractDto (batch 3) (#605)
- refactor(dto): migrate BookingLightweight, GooglePlaceLeadLightweight, ShortenedUrlLightweight onto AbstractDto (batch 2) (#604)
- refactor(dto): migrate BookingSyncEntryLightweight onto AbstractDto (keep local version) (#608)
- refactor(dto): migrate InventoryAggregate onto AbstractDto + fix escaped compile breaks (#606)
- refactor(dto): migrate travel-inventory Lightweight hierarchy onto AbstractDto (BREAKING: identifier→id) (#609)
- refactor(events,webhook): retype 6 cluster entities’ events to Lightweight — webhook now delivers the DTO (Initiative C) (#614)
- refactor(events,webhook): retype Property + ManagingEntity events to Lightweight (Initiative C apex) (#616)
- refactor(events,webhook): retype RatePlan/MasterRate/SalesChannel/SpecialRate events to Lightweight (Initiative C) (#615)
- refactor(events,webhook): widen BookingLightweight + retype Booking events (Initiative C, final) (#619)
- refactor(events): retype 12 non-webhook tail entities’ events to Lightweight (Initiative B tail) (#618)
- refactor(events): retype 7 entities’ event payloads from raw entity to Lightweight (Initiative B wave 1) (#610)
- refactor(events): retype Attraction + Place event payloads to Lightweight (Initiative B wave 2) (#611)
- refactor(events): retype Inventory/SalesChannelRequest/Customization/User event payloads to Lightweight (Initiative B wave 3) (#612)
- refactor(module-boundary): consumer-side repository rerouting — 12 modules gated off foreign repositories (#503)
- refactor(module-boundary): evict Activity entity from Consumer service interfaces (#594)
- refactor(module-boundary): evict AddOn entity, widening AddOnLightweight for write-path parity (#597)
- refactor(module-boundary): evict Attraction entity from Consumer service interfaces (#595)
- refactor(module-boundary): evict Booking entity from BookingConsumerService (#585)
- refactor(module-boundary): evict BookingSyncEntry entity from Consumer/Publisher interfaces (#581)
- refactor(module-boundary): evict CancellationPolicy entity from Consumer/Publisher interfaces (#583)
- refactor(module-boundary): evict Customization entity from CustomizationConsumerService (#574)
- refactor(module-boundary): evict DynamicList entity from DynamicListConsumerService (PRD Phase 3, entity #5) (#562)
- refactor(module-boundary): evict GooglePlaceLead entity from Consumer/Publisher interfaces (#580)
- refactor(module-boundary): evict Inventory entity from cross-domain interfaces (Phase 3) (#575)
- refactor(module-boundary): evict InventoryMap entity from InventoryMapConsumerService (PRD Phase 3, entity #12) (#569)
- refactor(module-boundary): evict Lookup entity from lookup-api (PRD Phase 3 pilot) (#559)
- refactor(module-boundary): evict ManagedSocialPost entity from Consumer/Publisher interfaces (#584)
- refactor(module-boundary): evict ManagingEntity from Consumer/Publisher interfaces (phase 1) (#578)
- refactor(module-boundary): evict MeetingRoom entity from Consumer service interfaces (#593)
- refactor(module-boundary): evict OrganizationView entity from organization-api (PRD Phase 3) (#560)
- refactor(module-boundary): evict Perk entity from PerkConsumerService (#599)
- refactor(module-boundary): evict Place entity from Consumer service interfaces (#596)
- refactor(module-boundary): evict Place/Post/PostRendition entities from PlacesConsumerService (PRD Phase 3, entity #4) (#561)
- refactor(module-boundary): evict Profile entity from ProfileConsumerService (PRD Phase 3, entity #13) (#570)
- refactor(module-boundary): evict Property entity from Consumer/Publisher interfaces (Phase 3, final apex entity) (#579)
- refactor(module-boundary): evict PropertyAggregate entity from Consumer/Publisher service interfaces (#588)
- refactor(module-boundary): evict Rate entity from cross-domain interfaces (Phase 3) (#576)
- refactor(module-boundary): evict RatePlan entity from RatePlanConsumerService (#573)
- refactor(module-boundary): evict Restaurant entity from Consumer service interfaces (#591)
- refactor(module-boundary): evict RoomType entity from Consumer service interfaces (#592)
- refactor(module-boundary): evict SalesChannel entity from SalesChannelConsumerService (#572)
- refactor(module-boundary): evict SellableInventoryUrl entity from SellableInventoryUrlConsumerService (PRD Phase 3, entity #11) (#568)
- refactor(module-boundary): evict SellableItem entity from SellableItemConsumerService (PRD Phase 3, entity #10) (#567)
- refactor(module-boundary): evict SellableList entity from SellableListConsumerService (PRD Phase 3, entity #8) (#565)
- refactor(module-boundary): evict SellableRankedList entity from SellableRankedListConsumerService (PRD Phase 3, entity #7) (#564)
- refactor(module-boundary): evict SellableSupplierUrl entity from SellableSupplierUrlConsumerService (PRD Phase 3, entity #9) (#566)
- refactor(module-boundary): evict ShortenedUrl entity from ConsumableShortenedUrlService (#587)
- refactor(module-boundary): evict ShortenedUrl entity from Publisher/Consumer service interfaces (#586)
- refactor(module-boundary): evict Spa entity from Consumer service interfaces (#590)
- refactor(module-boundary): evict SpecialRate entity from SpecialRateConsumerService (PRD Phase 3, entity #15) (#571)
- refactor(module-boundary): evict SpecialRateBundle entity from SpecialRateBundleConsumerService (PRD Phase 3, entity #6) (#563)
- refactor(module-boundary): evict StaticList/StaticListItem entities from cross-domain surfaces (#598)
- refactor(module-boundary): exempt api-usage + cache as shared platform infra in ArchUnit (#554)
- refactor(module-boundary): expand ManagingEntityConsumerService, gate 13 consumers off ManagingEntityRepository (#522)
- refactor(module-boundary): expand MasterRateConsumerService, gate 34 consumers off MasterRateRepository (#521)
- refactor(module-boundary): extract lean booking-consumer module, route notification-endpoint off booking repository (#508)
- refactor(module-boundary): extract property-aggregate-datasource + consumer/publisher services, gate 9 consumers off PropertyAggregateRepository (#520)
- refactor(module-boundary): extract property-datasource + consumer/publisher services, gate 24 consumers off PropertyRepository (#519)
- refactor(module-boundary): extract shortened-url-datasource + consumer/publisher services, gate 6 consumers (#513)
- refactor(module-boundary): flip dead/leeched cross-family compile-scope deps to runtime (Tier 5 hygiene sweep) (#558)
- refactor(module-boundary): fold RoomTypeLightweight into AbstractCommonTravelInventoryLightweight hierarchy (#589)
- refactor(module-boundary): fully gate computed-property-review off review repository via ReviewService (#511)
- refactor(module-boundary): gate 8 inventory domains off TravelInventoryService via PropertyConsumerService (#542)
- refactor(module-boundary): gate booking and checkout off ProfileRepository via ConsumerService (#536)
- refactor(module-boundary): gate campaigns off PlacesPlaceRepository/PostRepository/PostRenditionsRepository via ConsumerService (#537)
- refactor(module-boundary): gate cancellation-policy off CancellationPolicyRepository via CancellationPolicyConsumerService (#532)
- refactor(module-boundary): gate channel-manager cluster off booking repository via consumer + new publisher service (#512)
- refactor(module-boundary): gate channel-manager-internal off OrganizationViewRepository via ConsumerService (#535)
- refactor(module-boundary): gate check-list off GreenIndexAnswerRepository via ConsumerService (#534)
- refactor(module-boundary): gate computed-curated/computed-grid off StaticListRepository via full boundary closure (#540)
- refactor(module-boundary): gate customization off raw CustomizationRepository injection (#528)
- refactor(module-boundary): gate inventory-content cluster (8 domains) off raw repository injection (#523)
- refactor(module-boundary): gate lookup-web off CityRepository/GeoNameRepository via GeoNameService (#541)
- refactor(module-boundary): gate master-rate off PerkRepository via PerkConsumerService (#533)
- refactor(module-boundary): gate notification-endpoint off booking-sync repository via consumer + publisher services (#514)
- refactor(module-boundary): gate rate-cluster off raw RateRepository injection (#525)
- refactor(module-boundary): gate registration and inventory-app off GooglePlaceLeadRepository via Consumer/Publisher services (#539)
- refactor(module-boundary): gate remaining InventoryRepository consumers off raw repository injection (#527)
- refactor(module-boundary): gate remaining RatePlanRepository consumers off raw repository injection (#531)
- refactor(module-boundary): gate sales-channel off raw SalesChannelRepository injection (#526)
- refactor(module-boundary): gate sellable-cluster (8 domains) off raw repository injection (#524)
- refactor(module-boundary): gate special-rate off raw SpecialRateRepository injection (#529)
- refactor(module-boundary): gate special-rate-bundle off raw SpecialRateBundleRepository injection (#530)
- refactor(module-boundary): introduce BookingConsumerService, route caldav off booking repository (#506)
- refactor(module-boundary): narrow AnalyticsTrackingConsumerService off BookingTimeSeries (#582)
- refactor(module-boundary): narrow MasterRateConsumerService/RatePublisherService to MasterRateLightweight
- refactor(module-boundary): publish PropertyTranslationService/AddOnTranslationService into their -api modules (#550)
- refactor(module-boundary): remove dead CityRepository cross-domain injection from property-domain (#538)
- refactor(module-boundary): remove dead syndication repo injections from managed-social (#518)
- refactor(module-boundary): retype channel-manager-rate-gain MasterRate consumers to MasterRateLightweight
- refactor(module-boundary): retype Inventory.of(MasterRate) and InventoryEventListener’s consumer-service path
- refactor(module-boundary): retype remaining channel-manager MasterRate consumers
- refactor(module-boundary): retype remaining computed-rate-core fan-out MasterRate consumers
- refactor(module-boundary): retype remaining MasterRate leaf consumers to MasterRateLightweight
- refactor(module-boundary): route 16 cross-domain consumers off RateService onto RatePublisherService (#548)
- refactor(module-boundary): route 4 cross-domain consumers off CustomizationService onto CustomizationConsumerService (#544)
- refactor(module-boundary): route activity-stream off user repository onto UserService (#507)
- refactor(module-boundary): route AddOnContentCreator off AddOnService onto AddOnConsumerService (#546)
- refactor(module-boundary): route AffiliateController/LeaderboardController off LeaderboardService onto new Consumer/Publisher services (#547)
- refactor(module-boundary): route booking off CheckoutService onto CheckoutConsumerService (#557)
- refactor(module-boundary): route booking/checkout/winklinks off GoogleMapsService onto GoogleMapsConsumerService (#555)
- refactor(module-boundary): route city lookups off CityRepository onto GeoNameService (#515)
- refactor(module-boundary): route computed-property/managed-social off PropertyService onto PropertyConsumerService (#543)
- refactor(module-boundary): route ConsumableShortenedUrlServiceImpl off OpenGraphImageGeneratorService onto OpenGraphImageConsumerService (#552)
- refactor(module-boundary): route managed-social + sellable-inventory-url off customization repository (#505)
- refactor(module-boundary): route managed-social off property-embeddings-domain via PropertyEmbeddingsConsumerService (#553)
- refactor(module-boundary): route notification off message-template repository onto MessageTemplateService (#510)
- refactor(module-boundary): route PartnerLookupServiceImpl off LookupService onto LookupConsumerService (#551)
- refactor(module-boundary): route rate-check + google-hotel off master-rate repository (#504)
- refactor(module-boundary): route sellable-inventory-url off inventory repository onto InventoryConsumerService (#509)
- refactor(module-boundary): route StudioBookingAnalyticsController off BookingService onto BookingConsumerService (#545)
- refactor(module-boundary): route winklinks/consumer-web/shortened-url off ShareAnalyticsService and AnalyticsTrackingService (#556)
- refactor(module-boundary): service-boundary enforcement + review pilot (#502)
- refactor(shared-api): AbstractDto foundation — id wire name + createdDate/lastUpdate (#600)
- refactor(shared-api): align AbstractDto to id + migrate first 2 Lightweights (Initiative A pilot) (#602)
- refactor(web): evict *Repository injections + flip 8 non-auth -web modules to api-compile/domain-runtime (#632)
- refactor(web): Initiative D — evict entities from -web + relocate @JsonView to DTOs (#624)
32.0.1 Latest
- refactor: :arrow_down: reverted maxmind DB
