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:80 → saas_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:1207–1227 |
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:1235–1261 |
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)
- Vaihe 1 → 2: tenantin tunnistus. Metadatan
customer_idvoittaa; muutensaas.stripe_customer_id-vertailu koko säiliön yli (saas_onboarding.py:681).invoice.*-tapahtumissa metadata luetaan ensinsubscription_details.metadatasta ja vasta sittenmetadatasta (stripe_webhook/handler.py:104,stripe_webhook/handler.py:115). - Vaihe 2 → 3: tapahtumatyyppi kiinnittää tilan:
invoice.paid→active,invoice.payment_failed→past_due,customer.subscription.deleted→canceled,customer.subscription.updated→ Stripen tila sellaisenaan. Aikaleimat muunnetaan Unix-sekunneista ISO-merkkijonoiksi (stripe_webhook/handler.py:88,stripe_webhook/handler.py:89). - Vaihe 3 → 4: ehdollinen kirjoitus.
if stripe_customer_id:-tyyliset vartijat estävät tyhjän argumentin ylikirjoittamasta olemassa olevaa arvoa (saas_onboarding.py:1209–1226). Elinkaarikentät kirjoitetaan yhtenä joukkona (saas_onboarding.py:1227). - Vaihe 4 → 5: kolmihaarainen johtaminen tilasta lippuihin
(
saas_onboarding.py:1235). Tämä on ainoa paikka, jossa tilaus muuttuu oikeuksiksi. - Vaihe 6 → 7: luku- ja normalisointipuoli. Normalisointi tapahtuu joka kerta uudelleen; välimuistia ei ole.
- Vaihe 7 → 8: JWT- ja access-token-poluissa tätä ennen ajetaan
täsmäytys Stripeä vasten
(
auth_provider.py:415,auth_provider.py:513), joten istunnon liput perustuvat mahdollisesti juuri päivitettyyn tilaan.
Sarjallistetut kentät:
saas,featuresjacomplianceovat sisäkkäisiä objekteja yhdessä JSON-dokumentissa (CONFIG_BUCKET/{customer_id}/config.json). Serialisointidata_sources.py:89(json.dumps), deserialisointisource_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, jotenNoneei 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
- Prosessit: Stripe-tapahtuman käsittely · Tilauksen tilan päivitys (ei näytteessä) · Tilauksen täsmäytys Stripestä · Tuoteominaisuuksien ratkaisu (ei näytteessä)
- Datarakenteet: Tenantin saas-lohko (ei näytteessä) · Tuoteominaisuudet ja compliance (ei näytteessä) · Stripe-tapahtumalukko