feat: real FX quote gateway, swapped in behind useMockData
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
FxQuoteApiGateway calls GET /api/v2/pricing/fx-quote per PHASE-1-MONEY-FX-PAYMENTS-CONTRACT.md §3.1. Deliberately thin - no caching or retry here, since the caller decides what an expired quote means (re-fetch vs block checkout) and baking that into the gateway would hide the decision. Token now resolves to the real gateway whenever useMockData is false, matching the existing pattern in runtime-provider-strategy.service.ts. Additive only: nothing that reads prices today was rewired to this gateway yet. That rewiring touches checkout's charge-amount computation and is deferred - see the session summary for why. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
23
src/app/core/pricing/services/fx-quote-api.gateway.ts
Normal file
23
src/app/core/pricing/services/fx-quote-api.gateway.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import { HttpClient, HttpParams } from '@angular/common/http';
|
||||||
|
import { Injectable, inject } from '@angular/core';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { FxQuote } from '../models/fx-quote.model';
|
||||||
|
import { FxQuoteGateway } from './fx-quote-gateway.interface';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Real FX gateway. Contract: docs/backend/PHASE-1-MONEY-FX-PAYMENTS-CONTRACT.md §3.1.
|
||||||
|
*
|
||||||
|
* Deliberately thin: no caching, no retry logic here. TTL/expiry handling is
|
||||||
|
* the caller's job (isFxQuoteExpired), because the caller decides what to do
|
||||||
|
* with an expired quote (re-fetch vs block checkout) - baking a policy into
|
||||||
|
* the gateway would hide that decision.
|
||||||
|
*/
|
||||||
|
@Injectable({ providedIn: 'root' })
|
||||||
|
export class FxQuoteApiGateway implements FxQuoteGateway {
|
||||||
|
private readonly http = inject(HttpClient);
|
||||||
|
|
||||||
|
getQuote(base: string, quote: string): Observable<FxQuote> {
|
||||||
|
const params = new HttpParams().set('base', base).set('quote', quote);
|
||||||
|
return this.http.get<FxQuote>('/api/v2/pricing/fx-quote', { params });
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
import { InjectionToken, inject } from '@angular/core';
|
import { InjectionToken, inject } from '@angular/core';
|
||||||
|
import { environment } from '../../../../environments/environment';
|
||||||
import { FxQuoteGateway } from './fx-quote-gateway.interface';
|
import { FxQuoteGateway } from './fx-quote-gateway.interface';
|
||||||
import { FxQuoteLocalGateway } from './fx-quote-local.gateway';
|
import { FxQuoteLocalGateway } from './fx-quote-local.gateway';
|
||||||
|
import { FxQuoteApiGateway } from './fx-quote-api.gateway';
|
||||||
|
|
||||||
/** Swap point for the real FX backend from docs/backend/PHASE-1-MONEY-FX-PAYMENTS-CONTRACT.md §3.1. */
|
/** Swap point for docs/backend/PHASE-1-MONEY-FX-PAYMENTS-CONTRACT.md §3.1. */
|
||||||
export const FX_QUOTE_GATEWAY = new InjectionToken<FxQuoteGateway>('FX_QUOTE_GATEWAY', {
|
export const FX_QUOTE_GATEWAY = new InjectionToken<FxQuoteGateway>('FX_QUOTE_GATEWAY', {
|
||||||
providedIn: 'root',
|
providedIn: 'root',
|
||||||
factory: () => inject(FxQuoteLocalGateway),
|
factory: () => (environment.useMockData ? inject(FxQuoteLocalGateway) : inject(FxQuoteApiGateway)),
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user