From b6150a3237a50b24f9aa5ca6c92dc929f7981d4c Mon Sep 17 00:00:00 2001 From: wiz Date: Fri, 27 Nov 2020 23:01:47 +0900 Subject: [PATCH] Route all Angular Universal requests to nginx, remove simon's hacks --- frontend/src/app/services/api.service.ts | 42 ++++++++---------- frontend/src/app/services/assets.service.ts | 10 ++--- .../src/app/services/electrs-api.service.ts | 44 +++++++++---------- .../app/services/http-cache.interceptor.ts | 3 -- frontend/src/app/services/state.service.ts | 10 +++-- 5 files changed, 52 insertions(+), 57 deletions(-) diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index a7d6addf2..2b2fa6525 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -5,60 +5,56 @@ import { Observable } from 'rxjs'; import { StateService } from './state.service'; import { WebsocketResponse } from '../interfaces/websocket.interface'; -const API_BASE_URL = '{network}/api/v1'; - @Injectable({ providedIn: 'root' }) export class ApiService { - private apiBaseUrl: string; + private apiBaseUrl: string; // base URL is protocol, hostname, and port + private apiBasePath: string; // network path is /testnet, etc. or '' for mainnet constructor( private httpClient: HttpClient, private stateService: StateService, ) { + this.apiBaseUrl = ''; // use relative URL by default + if (!stateService.isBrowser) { // except when inside AU SSR process + this.apiBaseUrl = this.stateService.env.NGINX_PROTOCOL + '://' + this.stateService.env.NGINX_HOSTNAME + ':' + this.stateService.env.NGINX_PORT; + } + this.apiBasePath = ''; // assume mainnet by default this.stateService.networkChanged$.subscribe((network) => { if (network === 'bisq' && !this.stateService.env.BISQ_SEPARATE_BACKEND) { network = ''; } - this.apiBaseUrl = API_BASE_URL.replace('{network}', network ? '/' + network : ''); - if (!stateService.isBrowser) { - this.apiBaseUrl = this.stateService.env.BACKEND_URL + this.apiBaseUrl; - } + this.apiBasePath = network ? '/' + network : ''; }); - - this.apiBaseUrl = API_BASE_URL.replace('{network}', ''); - if (!stateService.isBrowser) { - this.apiBaseUrl = this.stateService.env.BACKEND_URL + this.apiBaseUrl; - } } list2HStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/2h'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/2h'); } list24HStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/24h'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/24h'); } list1WStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/1w'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/1w'); } list1MStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/1m'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/1m'); } list3MStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/3m'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/3m'); } list6MStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/6m'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/6m'); } list1YStatistics$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/statistics/1y'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/1y'); } getTransactionTimes$(txIds: string[]): Observable { @@ -66,7 +62,7 @@ export class ApiService { txIds.forEach((txId: string) => { params = params.append('txId[]', txId); }); - return this.httpClient.get(this.apiBaseUrl + '/transaction-times', { params }); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/transaction-times', { params }); } requestDonation$(amount: number, orderId: string): Observable { @@ -74,14 +70,14 @@ export class ApiService { amount: amount, orderId: orderId, }; - return this.httpClient.post(this.apiBaseUrl + '/donations', params); + return this.httpClient.post(this.apiBaseUrl + this.apiBasePath + '/api/v1/donations', params); } getDonation$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/donations'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/donations'); } getInitData$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/init-data'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/init-data'); } } diff --git a/frontend/src/app/services/assets.service.ts b/frontend/src/app/services/assets.service.ts index bc83b0bce..4f35532a9 100644 --- a/frontend/src/app/services/assets.service.ts +++ b/frontend/src/app/services/assets.service.ts @@ -16,13 +16,13 @@ export class AssetsService { private httpClient: HttpClient, private stateService: StateService, ) { - let baseApiUrl = ''; + let apiBaseUrl = ''; if (!this.stateService.isBrowser) { - baseApiUrl = this.stateService.env.STATIC_WEBSERVER_URL; + apiBaseUrl = this.stateService.env.NGINX_PROTOCOL + '://' + this.stateService.env.NGINX_HOSTNAME + ':' + this.stateService.env.NGINX_PORT; } - this.getAssetsJson$ = this.httpClient.get(baseApiUrl + '/resources/assets.json').pipe(shareReplay()); - this.getAssetsMinimalJson$ = this.httpClient.get(baseApiUrl + '/resources/assets.minimal.json').pipe(shareReplay()); - this.getMiningPools$ = this.httpClient.get(baseApiUrl + '/resources/pools.json').pipe(shareReplay()); + this.getAssetsJson$ = this.httpClient.get(apiBaseUrl + '/resources/assets.json').pipe(shareReplay()); + this.getAssetsMinimalJson$ = this.httpClient.get(apiBaseUrl + '/resources/assets.minimal.json').pipe(shareReplay()); + this.getMiningPools$ = this.httpClient.get(apiBaseUrl + '/resources/pools.json').pipe(shareReplay()); } } diff --git a/frontend/src/app/services/electrs-api.service.ts b/frontend/src/app/services/electrs-api.service.ts index 19c38a40f..3964e463e 100644 --- a/frontend/src/app/services/electrs-api.service.ts +++ b/frontend/src/app/services/electrs-api.service.ts @@ -4,87 +4,87 @@ import { Observable } from 'rxjs'; import { Block, Transaction, Address, Outspend, Recent, Asset } from '../interfaces/electrs.interface'; import { StateService } from './state.service'; -let API_BASE_URL = '{network}/api'; - @Injectable({ providedIn: 'root' }) export class ElectrsApiService { - private apiBaseUrl: string; + private apiBaseUrl: string; // base URL is protocol, hostname, and port + private apiBasePath: string; // network path is /testnet, etc. or '' for mainnet constructor( private httpClient: HttpClient, private stateService: StateService, ) { - if (!stateService.isBrowser) { - API_BASE_URL = this.stateService.env.ELECTRS_URL; + this.apiBaseUrl = ''; // use relative URL by default + if (!stateService.isBrowser) { // except when inside AU SSR process + this.apiBaseUrl = this.stateService.env.NGINX_PROTOCOL + '://' + this.stateService.env.NGINX_HOSTNAME + ':' + this.stateService.env.NGINX_PORT; } - this.apiBaseUrl = API_BASE_URL.replace('{network}', ''); + this.apiBasePath = ''; // assume mainnet by default this.stateService.networkChanged$.subscribe((network) => { if (network === 'bisq') { network = ''; } - this.apiBaseUrl = API_BASE_URL.replace('{network}', network ? '/' + network : ''); + this.apiBasePath = network ? '/' + network : ''; }); } getBlock$(hash: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/block/' + hash); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/block/' + hash); } listBlocks$(height?: number): Observable { - return this.httpClient.get(this.apiBaseUrl + '/blocks/' + (height || '')); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/blocks/' + (height || '')); } getTransaction$(txId: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/tx/' + txId); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/tx/' + txId); } getRecentTransaction$(): Observable { - return this.httpClient.get(this.apiBaseUrl + '/mempool/recent'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/mempool/recent'); } getOutspend$(hash: string, vout: number): Observable { - return this.httpClient.get(this.apiBaseUrl + '/tx/' + hash + '/outspend/' + vout); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/tx/' + hash + '/outspend/' + vout); } getOutspends$(hash: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/tx/' + hash + '/outspends'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/tx/' + hash + '/outspends'); } getBlockTransactions$(hash: string, index: number = 0): Observable { - return this.httpClient.get(this.apiBaseUrl + '/block/' + hash + '/txs/' + index); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/block/' + hash + '/txs/' + index); } getBlockHashFromHeight$(height: number): Observable { - return this.httpClient.get(this.apiBaseUrl + '/block-height/' + height, {responseType: 'text'}); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/block-height/' + height, {responseType: 'text'}); } getAddress$(address: string): Observable
{ - return this.httpClient.get
(this.apiBaseUrl + '/address/' + address); + return this.httpClient.get
(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address); } getAddressTransactions$(address: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/address/' + address + '/txs'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address + '/txs'); } getAddressTransactionsFromHash$(address: string, txid: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/address/' + address + '/txs/chain/' + txid); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address + '/txs/chain/' + txid); } getAsset$(assetId: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/asset/' + assetId); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/asset/' + assetId); } getAssetTransactions$(assetId: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/asset/' + assetId + '/txs'); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/asset/' + assetId + '/txs'); } getAssetTransactionsFromHash$(assetId: string, txid: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/asset/' + assetId + '/txs/chain/' + txid); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/asset/' + assetId + '/txs/chain/' + txid); } getAddressesByPrefix$(prefix: string): Observable { - return this.httpClient.get(this.apiBaseUrl + '/address-prefix/' + prefix); + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address-prefix/' + prefix); } } diff --git a/frontend/src/app/services/http-cache.interceptor.ts b/frontend/src/app/services/http-cache.interceptor.ts index 4199e9b23..e98629743 100644 --- a/frontend/src/app/services/http-cache.interceptor.ts +++ b/frontend/src/app/services/http-cache.interceptor.ts @@ -35,9 +35,6 @@ export class HttpCacheInterceptor implements HttpInterceptor { .pipe(tap((event: HttpEvent) => { if (!this.isBrowser && event instanceof HttpResponse) { let keyId = request.url.split('/').slice(3).join('/'); - if (keyId.indexOf('api/') === -1) { - keyId = 'api/' + keyId; - } this.transferState.set(makeStateKey('/' + keyId), event); } })); diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 97c226602..29b501f1e 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -21,10 +21,9 @@ export interface Env { SPONSORS_ENABLED: boolean; ELECTRS_ITEMS_PER_PAGE: number; KEEP_BLOCKS_AMOUNT: number; - BACKEND_URL?: string; - ELECTRS_URL?: string; - ELECTRS_URL_SERVER?: string; - STATIC_WEBSERVER_URL?: string; + NGINX_PROTOCOL?: string; + NGINX_HOSTNAME?: string; + NGINX_PORT?: string; } const defaultEnv: Env = { @@ -35,6 +34,9 @@ const defaultEnv: Env = { 'SPONSORS_ENABLED': false, 'ELECTRS_ITEMS_PER_PAGE': 25, 'KEEP_BLOCKS_AMOUNT': 8, + 'NGINX_PROTOCOL': 'http', + 'NGINX_HOSTNAME': '127.0.0.1', + 'NGINX_PORT': '81', }; @Injectable({