ec2b21d8f7
Closes the gap from :2 where Connect Zaprite swapped the
in-memory provider but BTCPay would silently re-take active on
the next daemon restart (because the boot-time loader picked
BTCPay first whenever btcpay_config was present, regardless of
operator intent).
What changed:
**New settings key `active_payment_provider`** in the existing
settings table. Records the operator's last explicit choice
('btcpay' | 'zaprite' | NULL = no preference). Both
btcpay_config and zaprite_config can coexist; the flag is what
determines which one the daemon loads.
**Boot-time loader respects the preference.** main.rs now reads
the flag at startup. If set to 'zaprite', Zaprite wins; if set to
'btcpay', BTCPay wins; if unset (legacy installs), falls back to
the previous BTCPay-first ordering. Cross-load fallbacks log a
WARN and try the other provider — operators with a stale flag
pointing at a wiped config don't boot unconfigured.
**Connect endpoints write the preference.**
- finish_connect (BTCPay) now sets the flag to 'btcpay' on
successful authorize-callback completion.
- ZapriteAuthorize::connect now sets the flag to 'zaprite' on
successful API-key validation.
- Both Disconnect endpoints clear the flag IF it pointed at the
provider being disconnected — but leave it alone if it pointed
at the OTHER provider (different operator intent).
**New endpoints for fast switching without re-Connect:**
- GET /v1/admin/payment-provider/status — both configs' state +
current preference + runtime active provider, in one call.
- POST /v1/admin/payment-provider/activate { provider: "btcpay" |
"zaprite" } — flips the active provider and the flag together,
without going through the full Connect flow. 400 if the named
provider isn't configured (operator must run Connect first).
**New StartOS Actions** under existing groups:
- "Activate BTCPay" (in BTCPay group)
- "Activate Zaprite" (in Zaprite group)
Both call the new activate endpoint. Operators with both
providers configured can flip back and forth in one click.
**Test:** payment_provider_preference_round_trip pre-seeds both
configs, walks through Activate-Zaprite → Activate-BTCPay →
attempt-Activate-on-wiped-config → bad-provider-name → manual
write/read of the preference key. Pins the contract.
Test count: 42 (was 41; +1).
Migration not needed — settings table from 0005 already has the
key/value/updated_at shape we need.
49 lines
2.0 KiB
TypeScript
49 lines
2.0 KiB
TypeScript
// Register actions with StartOS.
|
|
//
|
|
// As of v0.1.0:11 the StartOS Actions tab is intentionally minimal —
|
|
// only setup-time operations live here:
|
|
//
|
|
// - General → Set operator name
|
|
// - BTCPay → Connect / Check / Disconnect
|
|
// - License → Activate Keysat license / Show license status
|
|
// - Credentials → Show admin API key
|
|
//
|
|
// Everything else (products, policies, discount codes, licenses,
|
|
// machines, webhooks, audit log) lives in the embedded admin web UI
|
|
// at /admin/. The action source files remain in this directory for
|
|
// reference — and the underlying admin HTTP API is unchanged — but
|
|
// they're no longer registered as StartOS UI buttons. This keeps the
|
|
// dashboard from feeling like an undifferentiated wall of buttons.
|
|
//
|
|
// The web UI uses the same /v1/admin/* endpoints those actions used to
|
|
// call, so functionality is identical; only the UI surface changed.
|
|
|
|
import { sdk } from '../sdk'
|
|
import { activateLicense, showLicenseStatus } from './activateLicense'
|
|
import { activateBtcpay, activateZaprite } from './activatePaymentProvider'
|
|
import { btcpayStatus, configureBtcpay, disconnectBtcpay } from './configureBtcpay'
|
|
import { configureZaprite, disconnectZaprite, zapriteStatus } from './configureZaprite'
|
|
import { setOperatorName } from './setOperatorName'
|
|
import { setWebUiPassword } from './setWebUiPassword'
|
|
import { showCredentials } from './showCredentials'
|
|
|
|
export const actions = sdk.Actions.of()
|
|
// General
|
|
.addAction(setOperatorName)
|
|
.addAction(setWebUiPassword)
|
|
// BTCPay setup (Bitcoin-only payments via your own BTCPay Server)
|
|
.addAction(configureBtcpay)
|
|
.addAction(btcpayStatus)
|
|
.addAction(activateBtcpay)
|
|
.addAction(disconnectBtcpay)
|
|
// Zaprite setup (Bitcoin + fiat-card payments via Zaprite's broker)
|
|
.addAction(configureZaprite)
|
|
.addAction(zapriteStatus)
|
|
.addAction(activateZaprite)
|
|
.addAction(disconnectZaprite)
|
|
// Keysat self-license (Keysat-licenses-Keysat)
|
|
.addAction(activateLicense)
|
|
.addAction(showLicenseStatus)
|
|
// Credentials
|
|
.addAction(showCredentials)
|