datavirta tilaukset-laskutus valmis metodi v2 päivitetty 2026-08-12 git 944016d
Lähteet (koodi)
  • backend/lambdas/stripe_webhook/handler.py
  • backend/lambdas/generate/saas_onboarding.py
  • backend/lambdas/generate/feature_flags.py
  • backend/lambdas/generate/auth_provider.py
  • frontend/src/lib/auth.ts

Stripe-tapahtumasta tuoteoikeuksiksi

Miten laskutustapahtuma muuttuu käyttäjän näkemiksi oikeuksiksi. Sama tieto vaihtaa muotoa viisi kertaa: Stripen tapahtumakuorma → sisäiset argumentit → saas-lohko → features-lohko → istunnon lippusanakirja selaimessa.

Virran hallitseva skeema vaihtuu matkalla: alussa Stripen oma tapahtumaskeema (dokumentoitu Stripen päässä, ei tässä repossa), lopussa selaimen TypeScript-tyyppi. Välissä ei ole yhtään skeematiedostoa — muoto on koodissa.

Yleiskuva

flowchart TD
    A["Stripe-tapahtuma<br/>JSON (Stripen skeema)"] --> B["Tunnistettu tenantti<br/>+ argumentit"]
    B --> C["saas-lohko<br/>config.json"]
    C --> D["features-lohko<br/>config.json"]
    D --> E["normalize_customer_features<br/>14 lippua"]
    E --> F["user.features<br/>istunto → selain"]
    C --> G["rate_limit_override<br/>ylätaso"]
    E --> H["portitus: 403 tai jatka"]

Vaiheet — mitä kenttiä koodilla on käytettävissä

# Kohta koodissa Hallitseva skeema/tyyppi Käytettävissä olevat kentät Muutos edelliseen
1 stripe_webhook/handler.py:53 Stripen tapahtumaskeema (ulkoinen) id, type, data.object.* — tapahtumatyypistä riippuen customer, subscription, status, cancel_at, cancel_at_period_end, current_period_end, items.data[0].price.id, metadata, subscription_details.metadata (sisääntulo)
2 stripe_webhook/handler.py:137 (_resolve_customer_id) sisäinen str customer_id + customer_id metadatasta tai koko konfiguraatiosäiliön selauksesta (saas_onboarding.py:676); kaikki muu kuorma
3 stripe_webhook/handler.py:80saas_onboarding.py:1181 funktion nimetyt argumentit customer_id, status, plan, stripe_customer_id, stripe_subscription_id, stripe_price_id, cancel_at_period_end, current_period_end_at, cancel_at_at, last_stripe_sync_at + ISO-muunnetut aikaleimat (_utc_iso); Stripen sisäkkäinen rakenne
4 saas_onboarding.py:12071227 Tenantin saas-lohko (ei näytteessä) (sarjallistettu JSON-objekti) 18 kenttää: paketti, tila, laskuttaja, omistaja, 4 Stripe-viitettä, 3 ajoituskenttää, 7 elinkaarikenttää + elinkaarikentät (canceled_at, scheduled_deletion_at, deletion_state, last_billing_event_at, last_reactivation_at); tyhjät argumentit eivät ylikirjoita
5 saas_onboarding.py:1230, saas_onboarding.py:12351261 Tuoteominaisuudet ja compliance (ei näytteessä) rate_limit_override (int) + 8 kirjoitettua ominaisuuslippua + johdetut liput tilasta; compliance-lohkoon ei kosketa
6 data_sources.py:86 (save_customer_config) koko tenanttikonfiguraatio JSONina objektitallennuksessa kaikki ylätason kentät (19+) koko dokumentti kirjoitetaan; ei osittaispäivitystä, ei versiotarkistusta
7 feature_flags.py:39 (normalize_customer_features) 14 avaimen dict[str, bool] kaikki DEFAULT_FEATURESin avaimet, aina läsnä + puuttuvat liput oletuksina; konfiguraation tuntemattomat avaimet
8 auth_provider.py:120, auth_provider.py:420, auth_provider.py:518 istunnon käyttäjäobjekti features, compliance, saas, source_catalog, default_source_groups, document_templates, ui, role, customer_id, email + koko saas-lohko sellaisenaan (myös Stripe-tunnukset)
9 frontend/src/lib/auth.ts:36, frontend/src/lib/auth.ts:52, frontend/src/lib/auth.ts:68 TypeScript-tyyppi AuthUser features?, compliance?, saas? (9 kenttää tyypissä) tyyppimäärittely ei tunne kaikkia saapuvia saas-kenttiä; ne kulkevat silti

Muunnokset (kenttätason delta)

Sarjallistetut kentät: saas, features ja compliance ovat sisäkkäisiä objekteja yhdessä JSON-dokumentissa (CONFIG_BUCKET/{customer_id}/config.json). Serialisointi data_sources.py:89 (json.dumps), deserialisointi source_adapter.py:366 (json.loads). Sisältörakenteet: Tenantin saas-lohko (ei näytteessä) · Tuoteominaisuudet ja compliance (ei näytteessä) · Tenanttikonfiguraatio (ei näytteessä).

Aidosti dynaaminen kohta: Stripen tapahtumakuorman rakenne vaihtelee tapahtumatyypin ja Stripen API-version mukaan. Koodi lukee siitä vain yllä luetellut kentät .getillä, joten tuntemattomat kentät ohitetaan hiljaa — mutta myös odotetun kentän katoaminen Stripen puolella näkyy vain siinä, että arvo jää tyhjäksi. Poikkeus: int(obj.get("current_period_end")) (stripe_webhook/handler.py:88) suoritetaan vain totuusarvotarkistuksen jälkeen, joten None ei kaada sitä.

Kaksi rinnakkaista polkua samaan lohkoon

flowchart LR
    W["Webhook<br/>Stripe → meille"] --> U["update_saas_subscription"]
    S["Täsmäytys<br/>me → Stripeltä"] --> U
    U --> C["config.json"]
    L["Kirjautuminen"] --> S
    O["Operaattoriskripti"] --> S

Webhook on push ja täsmäytys pull; molemmat päätyvät samaan update_saas_subscription-funktioon ja kirjoittavat saman lohkon. Kirjoitukset eivät ole synkronoituja: konfiguraatio luetaan, muokataan ja kirjoitetaan kokonaan, joten kahden samanaikaisen kirjoittajan tapauksessa jälkimmäinen voittaa ilman että ristiriita havaitaan.

Liittyvät