Gate mortgage and personal-loan verticals on app entitlement

FeatureSecurityService
Shipped
August 8, 2026 at 4:47 PM UTC
Author
Kamo
Commit
620a257

A MORTGAGE market appeared on /commerce whenever POS was on, regardless of the MLOS app, and /features/enable had no billing check at all — the padlock in the settings UI was presentation only, so a direct POST switched on an unentitled app. - FeatureController: 403 on enable when the plan does not include the app; serialize an 'entitled' verdict on both features[] and available[] so the UI padlock and the 403 are computed by the same service and cannot disagree. - CommerceMarketController: GET /allowed-types for the market-type picker (model allow-list intersected with entitlement); the market list drops unentitled verticals — hidden, never archived, so restoring the plan brings the market back with its data intact. - **************** fail-closed guard over every /{marketId}/... sub-route. AppAvailabilityInterceptor cannot express this — its prefix map is one prefix to one ServiceType and /commerce-markets serves all seven verticals under POS. - POSController: public callers of the subscription catalog no longer see rows bound to an app that has not reached COMPLETED, so moving a ServiceType to COMPLETED is what publishes it to the marketing site. Internal callers still see everything in order to price it beforehand. - MortgageVerticalResolver: readiness measured POS only, so an org that never bought MLOS still read as ready; it now reports MLOS in 'missing' too.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing