Skip to content

Release v13: dev/v13 into release/v13 - #191

Merged
AaronSadlerUK merged 81 commits into
release/v13from
dev/v13
Nov 3, 2026
Merged

AaronSadlerUK merged 81 commits into
release/v13from
dev/v13

Conversation

@AaronSadlerUK

Copy link
Copy Markdown
Member

Stable release for v13 (UmbCheckout 1.6.0 / UmbHost.Licensing 1.5.0). Testing passed.

Merge with a merge commit, not squash.

🤖 Generated with Claude Code

Aaron and others added 30 commits March 14, 2025 14:00
…f options of to Get method of Stripe Session Service
…t develop and main are gone; GitVersion matches the new branch names

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…otherwise the NuGet package (1.5.0 by default, pinned with -p:UmbHostLicensingVersion), as on v17

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cl.TimeProvider 8.0.1 on net6.0 and net7.0; submodule pointers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ither composer order. UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tree controller and the configuration, database and session services no longer ask for one on every resolve (the licence is checked in the background); their constructors keep the LicenseService parameter. Backoffice licence panel: on a domain the licence doesn't list, it explains that licensed features are off there and shows the licensed domains; Valid Domains is listed readably. Any status other than Active or Development is unlicensed for the dashboard warning. UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion

#7: tests that a site's shipping calculator replaces the default (v13)
…ISK whole units x100), rounding, supported codes, basket currency, and the checkout line items of a two-line basket (including a legacy lower-case line). UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…default interface method, so existing implementations still compile: the old currency when shaped like a code). CurrencyService uses the product's site root umbCheckoutCurrencyCode, then the Configuration currency, else null with one error per process. BasketAdd.CurrencyCode is obsolete and ignored. LineItemExtensions.SingleCurrency and AcceptsCurrency; TempData UmbCheckoutAddToBasketFailed. Tests: currency service, pricing service, line-item currency helpers, and the basket controller (posted currency ignored, refused adds, constructor chosen by DI). The open tests see the Core internals. UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pe, and a throwing handler stops checkout. UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… symbol and decimals (JPY 0, KWD 3); an unknown code follows the amount, no code is a plain amount. A new overload takes the culture (the two-argument one keeps using the current culture). The basket link's subtotal is in the basket lines' own currency. Tests: GBP, EUR, JPY and KWD under en-GB and de-DE, rounding as charged, and the currency each view component shows. UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tests: session-options handlers run before the session is created (v13)
…y or white-space currency keeps the minor units with no major amount) and the Stripe shipping-rate API (fixedAmountMoney for JPY and GBP, single and list; every existing field unchanged; no fixed amount adds nothing). UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rrencyDecimals (new, public, in UmbCheckout.Shared), the table the Stripe charge uses, so AFN, ALL, LAK, LBP, MMK, RSD, SOS and YER show the 2 decimals they are charged with; the currency's culture gives only the symbol. GetCurrencyForContentAsync: a null content is null; after the site root and Configuration it falls back to the current UI culture's currency when shaped like a code (as the old chain did), with a warning once per process. Tests: display decimals equal chargeable digits for every Stripe-supported code; the culture fallback and its warning (only a culture with no region gives null); null content; the add-to-basket button with a null product and with a currencyNodeKey in another currency; the checkout metadata merge. UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ww.umbpanel.io), and the README's licence purchase links go to https://umbcheckout.net (My.UmbHost is retired)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s own notification, and every webhook is covered, as v17. Basket.ItemCount documents that it counts lines, not quantity (IBasketService.TotalItems sums quantities). UmbCheckout.Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AaronSadlerUK and others added 28 commits October 13, 2026 19:23
…rds and finds, twice and racing are harmless, 30-day pruning, its own open plan, idempotent migration), the webhook handler (paid, no payment required, unpaid, delayed success, no session, failure propagates) and the composer (replaces only Core's default in either order, keeps a site's own, handlers and table registered); Stripe pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d-trips, checked by reflection; an older file keeps the site's current values; an empty shipping-countries element clears them); Stripe.uSync pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ngs save fails the uSync import (the tests now reference UmbCheckout.uSync); uSync and Stripe.uSync pointers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tings, shipping rates, configuration); Stripe.uSync pointer (the Stripe settings handler is now registered)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ket-context interfaces, as default interface methods that call the old overloads (a site's own implementations still compile); UmbCheckout's implementations take them. A token stops a change before the basket is stored, never part-way through (session, cookie and database copies), and a cancelled request isn't logged. The session service's overloads without a token use the request's (as v17); the basket link view component passes the request's token.

Tests: every async member of the shop interfaces (open Core and Stripe) has a token overload that is a default interface method and is implemented; the token reaches the session service and Stripe; a cancelled update stores nothing; a Stripe timeout is a Warning, a cancelled request is silent, a request already cancelled never reaches Stripe; checkout reads the settings before opening its scope. Mocks of the services set up the token overloads (Moq doesn't call through default interface methods). Stripe and Forms pointers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…apped on every read) instead of read several times on every shop request. A save clears the cache here; once the outermost scope commits, the Saved handler clears it again and tells every load-balanced server through Umbraco's distributed cache (UmbCheckoutConfigurationCacheRefresher, ICacheRefresher, registered by SettingsCacheComposer). A read can't put an older row back after a save (the new public SettingsCache: a generation-guarded set), and a read inside someone else's scope (a uSync import, a save) isn't cached.

A save reads the existing row from the database, not the cache (another server's first save may not have reached this one yet), and publishes Saved with the row as stored (it used to re-read through the service). The first save now publishes Saved too, so its uSync file is written and other servers refresh.

Tests (configuration on mocked NPoco, Stripe settings on real NPoco and SQLite): read once; a fresh instance per read; a save is read back and its notification carries the saved row; the first save publishes Saved; no second row when this server's cache says none is saved; reads inside another scope aren't cached but still use the cache; a read that started before a clear isn't cached; the refreshers clear the caches; the Saved handlers clear and queue a refresh-all for their refresher; the composers register the cache, the handler and the refresher. Stripe pointer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a 5 s timeout; constant log templates, BasketService, ConfigurationService, CurrencyService and DatabaseService no longer log and rethrow; old overloads and constructors are [Obsolete] naming the replacement (removal in 17.1); tests for the log scan, the telemetry handler, shipping-rate key migration, migration order against uSync's first-boot import; submodule pointers (uSync cookie expiry, Forms, Stripe)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	src/UmbCheckout.Stripe
…en overload, currency on the line, the static services it reads

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v13 update: back-port of the v17 fixes (1.6.0 / Licensing 1.5.0)
…ntainers fixtures), Integration tests against both

Test infrastructure only; no production code changed.
- New UmbCheckout.Testing (net6.0/net8.0): StripeMockFixture (stripe-mock pinned by digest), CapturingHandler, SqlServerContainerFixture (mssql 2022, started on first use).
- stripe-mock tests: shipping rate service, line item price on the wire, checkout session service, all through the existing client factory.
- SqliteTestDatabase becomes NPocoTestDatabase (SQLite or a new SQL Server database); the NPoco persistence tests that work on SQL Server as the code stands also run there (Integration trait), SQLite cases unchanged and Docker-free.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eature provided by a separate licensed package): IDatabaseService, IDatabaseMapperService, DatabaseService, DatabaseMapperService and the UmbCheckoutBasket poco, with their registrations and mapping; the configuration flags stay. UmbCheckout.Stripe pointer: tax rates removed from the open package

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ble; no null-forgiving operators in production or test code; source scan test; submodule pointers

Public API annotation changes (binary compatible): the LicenseService parameter of ConfigurationService, SessionService, StripeSessionService, StripeSettingsService, StripeSettingsApiController and ConfigurationApiController is LicenseService?; ICurrencyService.GetCurrencyForContentAsync and the add-to-basket view component take IPublishedContent? (they already handled null).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…restored a stable UmbHost.Licensing that is not published (NU1103)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…d tests; nodeKey tests

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…eutral comment in LoggingTests

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… text and an AssemblyMetadata("Notice") attribute (open-source wording for open builds, proprietary wording for paid builds); tests (as v17)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…-v13 head, so a fresh checkout builds

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…r flags a logical not after a lambda arrow (as v17); test cases

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
v13: UmbCheckout.Testing project and Testcontainers Integration tests
Licence boundary (v13): stored-basket support is provided by a licensed add-on
…in); submodule pointers to the dev/v13 merge commits (Stripe, Stripe.Forms, uSync, Stripe.uSync)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nullable problems fail the build (v13)
…nstalled, as v17 (#188); Stripe submodule pointer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ipe #19)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v13: unlicensed message is an info bar without paid add-ons
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
1 out of 2 committers have signed the CLA.

✅ AaronSadlerUK
❌ Aaron


Aaron seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

@AaronSadlerUK
AaronSadlerUK merged commit 2f4b4cd into release/v13 Nov 3, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants