Release: develop -> main#3970
Merged
Merged
Conversation
…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
approved these changes
Jun 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automatic Release PR
This PR was automatically created after changes were pushed to develop.
Commits: 1 new commit(s)
Checklist