Skip to content

Release: develop -> main#3970

Merged
TaprootFreak merged 2 commits into
mainfrom
develop
Jun 25, 2026
Merged

Release: develop -> main#3970
TaprootFreak merged 2 commits into
mainfrom
develop

Conversation

@github-actions

Copy link
Copy Markdown

Automatic Release PR

This PR was automatically created after changes were pushed to develop.

Commits: 1 new commit(s)

Checklist

  • Review all changes
  • Verify CI passes
  • Approve and merge when ready for production

…lients vom Storage-Backend) (#3958)

* /gs/db: host-stabile proxied Dokument-URLs statt roher Storage-URLs

Die /gs/db-Dokumentausgabe (GsService.setUserDataDocs) liefert in
documents[].url bisher die rohe Storage-URL, gebaut aus dem konkreten
Storage-Endpoint. Das koppelt API-/Sheet-Clients an das Storage-Backend;
jede Storage-Migration aendert/zerbricht die ausgelieferten URLs.

Aenderungen:
- KycDocumentService.getUserFileProxyUrlMap(userDataId): bildet den
  Storage-Pfad einer KYC-Datei auf ihre host-stabile, proxied URL ab
  (<services>/file/<uid>?show, ausgeliefert von GET /kyc/file/:id).
- setUserDataDocs: ersetzt vor der Ausgabe die rohe .url durch die
  proxied URL, sofern eine zugehoerige KycFile-Entity (uid) existiert.
- Die interne Filterung partitioniert jetzt ueber den Storage-Pfad
  (doc.path) statt ueber die nun proxied .url - host-unabhaengig und
  verhaltensgleich zur bisherigen URL-Substring-Filterung.

Dateien ohne KycFile-Entity (z. B. Legacy-/Spider-Dateien) haben keine
uid und behalten die rohe URL als sicheren Fallback.

* test(gs): echten Round-Trip der proxied Dokument-URLs absichern und any aus Tests entfernen

- neuer Test ohne Mock von getUserFileProxyUrlMap: gelistetes Blob matcht
  über den Storage-Pfad (b.name == user/<id>/<type>/<name>) die aus einer
  KycFile gebaute Proxy-Map und wird proxied; spider-/Legacy-Dokument fällt
  auf die rohe Storage-URL zurueck
- any[] durch Partial<UserData>[] ersetzt, as-never-Casts in den neuen Tests
  durch typisierte Mock-Helfer (asKycFileBlobs/storageBlob) abgeloest
- GsService-Konstruktion in wiederverwendbaren buildGsService-Helfer extrahiert

* gs: bewusste raw-URL-Abweichung im /gs/support-Pfad dokumentieren

* gs/kyc: Test-Konstruktor entdoppeln und Proxy-URL-Map deterministisch sortieren

- gs.service.spec: beforeEach nutzt buildGsService-Helper wieder, statt die ~22 Mocks erneut auszuschreiben (Helper nimmt appInsightsQueryService optional entgegen, damit die Tests dieselben Mock-Instanzen sehen)
- getUserFileProxyUrlMap: KycFile-Zeilen vor dem Map-Aufbau deterministisch nach id aufsteigend sortieren, damit bei Re-Uploads (gleicher type+name) der neueste Eintrag konsistent gewinnt

* /gs/db: pfad-erhaltende host-stabile Dokument-URLs (Konsumenten-Invariant)

Die uid-basierte Proxy-URL-Form bricht aktive Konsumenten: Die Auswertungen
extrahieren den Dateinamen ueber url.split('<scope>/<id>/<type>')[1] und
brauchen daher den Storage-Pfad als Substring der URL. Die uid-Form enthaelt
diesen nicht mehr.

Statt der uid-Form wird jetzt nur der Host auf Config.frontend.services
gepinnt, der vollstaendige Storage-Pfad bleibt erhalten:
<services>/kyc/<scope>/<id>/<type>/<name>. Damit ist die URL host-stabil
(kein Storage-Backend-Host) und gleichzeitig pfad-erhaltend, der Konsumenten-
Invariant bleibt gewahrt.

- KycDocumentService.getUserFileProxyUrlMap durch toHostStableUrl(path) ersetzt
- GsService.setUserDataDocs schreibt doc.url = toHostStableUrl(doc.path)
- Tests asserten Host-Stabilitaet, Pfad-Erhalt und das Split-Parsing der
  Konsumenten; Round-Trip ueber die reale KycDocumentService

* gs: Dokument-URL-Pfadsegmente wie rohe Blob-URL enkodieren (echter Drop-in)

* gs/kyc: Pfad-Encoding in AzureStorageService.encodePath auslagern, Test-Imports absolut

Die per-Segment-Encoding-Zeile (encodeURIComponent je Segment, Slashes
erhalten) lag dupliziert in azure-storage.service.ts blobUrl und in
kyc-document.service.ts toHostStableUrl. Sie wird in die geteilte statische
Methode AzureStorageService.encodePath ausgelagert; beide Aufrufer nutzen sie,
womit der "byte-identisch ausser Host"-Invariant strukturell erzwungen ist
(Verhalten unverändert).

Die neu hinzugefügten Test-Imports in gs.service.spec.ts werden gemäss
CONTRIBUTING auf absolute src/-Pfade umgestellt.
… erfassen (#3969)

* fix(log): offenes Referral-Guthaben als Liability im FinancialDataLog verbuchen

Das offene Referral-Guthaben (refCredit + partnerRefCredit - paidRefCredit) ist eine
reale Verbindlichkeit, war aber nicht auf der minus-Seite des FinancialDataLog erfasst.
Dadurch war totalBalanceChf (Operating Equity) um den offenen Betrag ueberbewertet und
jede Ref-Auszahlung erschien als Abwaerts-Step statt bilanzneutral.

- UserService.getOpenRefCreditEur: einzelnes SQL-SUM ueber auszahlbare offene Guthaben
  (status-gefiltert, beide Auszahlungs-Frequenzen)
- RefRewardService.getOpenRefCreditLiability: EUR->CHF-Umrechnung via pricingService
- LogJobService: bucht die Liability als synthetischen balancesByFinancialType-Eintrag,
  der automatisch in minusBalanceChf/totalBalanceChf einfliesst
- Partial-Index auf user fuer die Every-Minute-Aggregat-Query

* refactor(user): geteilten Filter fuer offenes Ref-Guthaben

filterOpenRefCredit kapselt die Eligibility-Kriterien (offener Saldo > 0,
auszahlbares Konto). getOpenRefCreditUser (Payout-Auswahl) und getOpenRefCreditEur
(Liability-Summe) nutzen denselben Filter, damit beide nicht auseinanderdriften
koennen. Generiertes SQL unveraendert.

* style: Migrations-Semikolons an Konvention + toten Mock-Stub entfernen

- Migration: Semikolons nach name/Klasse wie in den neueren Migrationen
- user.service.spec: nach dem Filter-Refactor ungenutzten where-Mock-Stub entfernt
@TaprootFreak TaprootFreak merged commit 315f5cf into main Jun 25, 2026
12 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.

1 participant