taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 6f6e9a6fab4ecbf05264766e9b2661bdebad49eb
parent 2785521f6eaaed711ba5705086988f30746748b7
Author: Florian Dold <florian@dold.me>
Date:   Tue, 27 Aug 2024 01:56:53 +0200

auditor SPA: minor cleanup, base URL canonicalization

Diffstat:
Mpackages/auditor-backoffice-ui/src/InstanceRoutes.tsx | 6+-----
Mpackages/auditor-backoffice-ui/src/hooks/backend.ts | 35+++++++----------------------------
Mpackages/auditor-backoffice-ui/src/hooks/critical.ts | 16++++++----------
Mpackages/auditor-backoffice-ui/src/hooks/entity.ts | 28+++++++++++++++-------------
Mpackages/auditor-backoffice-ui/src/hooks/finance.ts | 20+++++++++++++-------
Mpackages/auditor-backoffice-ui/src/hooks/index.ts | 9+++++----
Mpackages/auditor-backoffice-ui/src/hooks/operational.ts | 26+++++++++++---------------
Mpackages/web-util/src/context/api.ts | 15++++++++++-----
Mpackages/web-util/src/utils/request.ts | 20+++++++++-----------
9 files changed, 77 insertions(+), 98 deletions(-)

diff --git a/packages/auditor-backoffice-ui/src/InstanceRoutes.tsx b/packages/auditor-backoffice-ui/src/InstanceRoutes.tsx @@ -272,11 +272,7 @@ export interface Props { path: string; } -export function InstanceRoutes({ - // id, - path, - // setInstanceName -}: Props): VNode { +export function InstanceRoutes({ path }: Props): VNode { type GlobalNotifState = | (Notification & { to: string | undefined }) | undefined; diff --git a/packages/auditor-backoffice-ui/src/hooks/backend.ts b/packages/auditor-backoffice-ui/src/hooks/backend.ts @@ -20,6 +20,9 @@ * @author Nic Eigel */ +/** + * Imports. + */ import { HttpResponse, HttpResponseOk, @@ -162,9 +165,6 @@ interface useBackendInstanceRequestType { ) => Promise<HttpResponseOk<T>>; fetcher: <T>(endpoint: string) => Promise<HttpResponseOk<T>>; multiFetcher: <T>(params: string[]) => Promise<HttpResponseOk<T>[]>; - depositConfirmationFetcher: <T>( - params: [endpoint: string], - ) => Promise<HttpResponseOk<T>>; } interface useBackendBaseRequestType { @@ -183,9 +183,6 @@ interface useBackendBaseRequestType { export function useBackendBaseRequest(): useBackendBaseRequestType { const { url: backend } = useBackendContext(); const { request: requestHandler } = useApiContext(); - //const { token } = useBackendTokenContext(); - const token = - "D4CST1Z6AHN3RT03M0T9NSTF2QGHTB5ZD2D3RYZB4HAWG8SX0JEFWBXCKXZHMB7Y3Z7KVFW0B3XPXD5BHCFP8EB0R6CNH2KAWDWVET0"; const request = useCallback( function requestImpl<T>( @@ -193,7 +190,7 @@ export function useBackendBaseRequest(): useBackendBaseRequestType { //todo: remove options: RequestOptions = {}, ): Promise<HttpResponseOk<T>> { - return requestHandler<T>(backend, endpoint, { ...options, token }) + return requestHandler<T>(backend, endpoint, { ...options }) .then((res) => { return res; }) @@ -211,15 +208,12 @@ export function useBackendRequest(): useBackendInstanceRequestType { const { url: baseUrl } = useBackendContext(); const { request: requestHandler } = useApiContext(); - const token = - "D4CST1Z6AHN3RT03M0T9NSTF2QGHTB5ZD2D3RYZB4HAWG8SX0JEFWBXCKXZHMB7Y3Z7KVFW0B3XPXD5BHCFP8EB0R6CNH2KAWDWVET0"; - const request = useCallback( function requestImpl<T>( endpoint: string, options: RequestOptions = {}, ): Promise<HttpResponseOk<T>> { - return requestHandler<T>(baseUrl, endpoint, { ...options, token }); + return requestHandler<T>(baseUrl, endpoint, { ...options }); }, [baseUrl], ); @@ -231,7 +225,7 @@ export function useBackendRequest(): useBackendInstanceRequestType { ): Promise<HttpResponseOk<T>[]> { return Promise.all( params.map((endpoint) => - requestHandler<T>(baseUrl, endpoint, { ...options, token }), + requestHandler<T>(baseUrl, endpoint, { ...options }), ), ); }, @@ -240,21 +234,7 @@ export function useBackendRequest(): useBackendInstanceRequestType { const fetcher = useCallback( function fetcherImpl<T>(endpoint: string): Promise<HttpResponseOk<T>> { - return requestHandler<T>(baseUrl, endpoint, { token }); - }, - [baseUrl], - ); - - const depositConfirmationFetcher = useCallback( - function orderFetcherImpl<T>( - args: [endpoint: string], - ): Promise<HttpResponseOk<T>> { - const [endpoint] = args; - const params: any = { - token: - "D4CST1Z6AHN3RT03M0T9NSTF2QGHTB5ZD2D3RYZB4HAWG8SX0JEFWBXCKXZHMB7Y3Z7KVFW0B3XPXD5BHCFP8EB0R6CNH2KAWDWVET0", - }; - return requestHandler<T>(baseUrl, endpoint, { params, token }); + return requestHandler<T>(baseUrl, endpoint, {}); }, [baseUrl], ); @@ -262,7 +242,6 @@ export function useBackendRequest(): useBackendInstanceRequestType { return { request, fetcher, - depositConfirmationFetcher, multiFetcher, }; } diff --git a/packages/auditor-backoffice-ui/src/hooks/critical.ts b/packages/auditor-backoffice-ui/src/hooks/critical.ts @@ -16,16 +16,13 @@ import { HttpResponse, HttpResponseOk, - HttpResponsePaginated, RequestError, } from "@gnu-taler/web-util/browser"; -import { useEffect, useState } from "preact/hooks"; -import { AuditorBackend, WithId } from "../declaration.js"; -import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; -import { useBackendRequest, useMatchMutate } from "./backend.js"; +import { AuditorBackend } from "../declaration.js"; +import { useBackendRequest } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 -import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -50,9 +47,9 @@ export function getCriticalData( "monitoring/reserve-balance-insufficient-inconsistency", ]; - const { data: list, error: listError } = useSWR< - HttpResponseOk<any>[], RequestError<AuditorBackend.ErrorDetail> + HttpResponseOk<any>[], + RequestError<AuditorBackend.ErrorDetail> >(endpoints, multiFetcher, { refreshInterval: 60, refreshWhenHidden: false, @@ -67,4 +64,4 @@ export function getCriticalData( return { ok: true, data: [list] }; } return { loading: true }; -} -\ No newline at end of file +} diff --git a/packages/auditor-backoffice-ui/src/hooks/entity.ts b/packages/auditor-backoffice-ui/src/hooks/entity.ts @@ -13,16 +13,20 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ + +/** + * Imports. + */ import { HttpResponse, HttpResponseOk, RequestError, } from "@gnu-taler/web-util/browser"; -import { AuditorBackend, WithId } from "../declaration.js"; +import { AuditorBackend } from "../declaration.js"; import { useBackendRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 -import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import _useSWR, { SWRHook } from "swr"; import { useEntityContext } from "../context/entity.js"; const useSWR = _useSWR as unknown as SWRHook; @@ -34,7 +38,10 @@ interface Props { entity: any; } -export function getEntityList({ endpoint, entity }: Props): HttpResponse<any, AuditorBackend.ErrorDetail> { +export function getEntityList({ + endpoint, + entity, +}: Props): HttpResponse<any, AuditorBackend.ErrorDetail> { const { fetcher } = useBackendRequest(); const { data: list, error: listError } = useSWR< @@ -56,20 +63,16 @@ export function getEntityList({ endpoint, entity }: Props): HttpResponse<any, Au return { loading: true }; } export interface EntityAPI { - updateEntity: ( - id: string - ) => Promise<void>; + updateEntity: (id: string) => Promise<void>; } export function useEntityAPI(): EntityAPI { const mutateAll = useMatchMutate(); const { request } = useBackendRequest(); - const { endpoint } = useEntityContext(); - const data = {"suppressed": true}; + const { endpoint } = useEntityContext(); + const data = { suppressed: true }; - const updateEntity = async ( - id: string, - ): Promise<void> => { + const updateEntity = async (id: string): Promise<void> => { const r = await request(`monitoring/${endpoint}/${id}`, { method: "PATCH", data, @@ -79,4 +82,4 @@ export function useEntityAPI(): EntityAPI { }; return { updateEntity }; -} -\ No newline at end of file +} diff --git a/packages/auditor-backoffice-ui/src/hooks/finance.ts b/packages/auditor-backoffice-ui/src/hooks/finance.ts @@ -13,21 +13,27 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ + +/** + * Imports. + */ import { HttpResponse, HttpResponseOk, RequestError, } from "@gnu-taler/web-util/browser"; -import { AuditorBackend, WithId } from "../declaration.js"; -import { useBackendRequest, useMatchMutate } from "./backend.js"; +import { AuditorBackend } from "../declaration.js"; +import { useBackendRequest } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 -import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; - -export function getKeyFiguresData(): HttpResponse<any, AuditorBackend.ErrorDetail> { +export function getKeyFiguresData(): HttpResponse< + any, + AuditorBackend.ErrorDetail +> { const { multiFetcher } = useBackendRequest(); const endpoints = [ "monitoring/misattribution-in-inconsistency", @@ -39,11 +45,11 @@ export function getKeyFiguresData(): HttpResponse<any, AuditorBackend.ErrorDetai "monitoring/wire-format-inconsistency", "monitoring/wire-out-inconsistency", "monitoring/reserve-balance-summary-wrong-inconsistency", - ]; const { data: list, error: listError } = useSWR< - HttpResponseOk<any>[], RequestError<AuditorBackend.ErrorDetail> + HttpResponseOk<any>[], + RequestError<AuditorBackend.ErrorDetail> >(endpoints, multiFetcher, { refreshInterval: 60, refreshWhenHidden: false, diff --git a/packages/auditor-backoffice-ui/src/hooks/index.ts b/packages/auditor-backoffice-ui/src/hooks/index.ts @@ -14,16 +14,17 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ +import { canonicalizeBaseUrl } from "@gnu-taler/taler-util"; import { StateUpdater, useState } from "preact/hooks"; import { ValueOrFunction } from "../utils/types.js"; export function useBackendURL(url?: string): [string, StateUpdater<string>] { - const [value, setter] = useSimpleLocalStorage( - "auditor-base-url", - url || calculateRootPath(), - ); + const canonUrl = canonicalizeBaseUrl(url ?? calculateRootPath()); + + const [value, setter] = useSimpleLocalStorage("auditor-base-url", canonUrl); const checkedSetter = (v: ValueOrFunction<string>) => { + // FIXME: Explain?! return setter((p) => (v instanceof Function ? v(p ?? "") : v).replace(/\/$/, ""), ); diff --git a/packages/auditor-backoffice-ui/src/hooks/operational.ts b/packages/auditor-backoffice-ui/src/hooks/operational.ts @@ -18,11 +18,11 @@ import { HttpResponseOk, RequestError, } from "@gnu-taler/web-util/browser"; -import { AuditorBackend, WithId } from "../declaration.js"; -import { useBackendRequest, useMatchMutate } from "./backend.js"; +import { AuditorBackend } from "../declaration.js"; +import { useBackendRequest } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 -import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -49,17 +49,16 @@ export function getOperationData( "monitoring/denomination-key-validity-withdraw-inconsistency", "monitoring/refreshes-hanging", //TODO fix endpoint - // "monitoring/closure-lags", - // "monitoring/row-minor-inconsistencies", - // "monitoring/historic-denomination-revenue", - // "monitoring/denomination-pending", + // "monitoring/closure-lags", + // "monitoring/row-minor-inconsistencies", + // "monitoring/historic-denomination-revenue", + // "monitoring/denomination-pending", "monitoring/historic-reserve-summary", - ]; - const { data: list, error: listError } = useSWR< - HttpResponseOk<any>[], RequestError<AuditorBackend.ErrorDetail> + HttpResponseOk<any>[], + RequestError<AuditorBackend.ErrorDetail> >(endpoints, multiFetcher, { refreshInterval: 60, refreshWhenHidden: false, @@ -77,7 +76,5 @@ export function getOperationData( } export interface EntityAPI { - updateEntity: ( - id: string, - ) => Promise<void>; -} -\ No newline at end of file + updateEntity: (id: string) => Promise<void>; +} diff --git a/packages/web-util/src/context/api.ts b/packages/web-util/src/context/api.ts @@ -19,7 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { TalerBankIntegrationHttpClient, TalerCoreBankHttpClient, TalerRevenueHttpClient, TalerWireGatewayHttpClient } from "@gnu-taler/taler-util"; +import { + TalerBankIntegrationHttpClient, + TalerCoreBankHttpClient, + TalerRevenueHttpClient, + TalerWireGatewayHttpClient, +} from "@gnu-taler/taler-util"; import { ComponentChildren, createContext, h, VNode } from "preact"; import { useContext } from "preact/hooks"; import { defaultRequestHandler } from "../utils/request.js"; @@ -29,10 +34,10 @@ interface Type { * @deprecated this show not be used */ request: typeof defaultRequestHandler; - bankCore: TalerCoreBankHttpClient, - bankIntegration: TalerBankIntegrationHttpClient, - bankWire: TalerWireGatewayHttpClient, - bankRevenue: TalerRevenueHttpClient, + bankCore: TalerCoreBankHttpClient; + bankIntegration: TalerBankIntegrationHttpClient; + bankWire: TalerWireGatewayHttpClient; + bankRevenue: TalerRevenueHttpClient; } const Context = createContext<Type>({ request: defaultRequestHandler } as any); diff --git a/packages/web-util/src/utils/request.ts b/packages/web-util/src/utils/request.ts @@ -28,8 +28,6 @@ export enum ErrorType { UNEXPECTED, } - - /** * * @param baseUrl URL where the service is located @@ -53,7 +51,9 @@ export async function defaultRequestHandler<T>( } requestHeaders["Content-Type"] = - !options.contentType || options.contentType === "json" ? "application/json" : "text/plain"; + !options.contentType || options.contentType === "json" + ? "application/json" + : "text/plain"; if (options.talerAmlOfficerSignature) { requestHeaders["Taler-AML-Officer-Signature"] = @@ -83,7 +83,7 @@ export async function defaultRequestHandler<T>( loading: false, message: `invalid URL: "${baseUrl}${endpoint}"`, }; - throw new RequestError(error) + throw new RequestError(error); } Object.entries(requestParams).forEach(([key, value]) => { @@ -114,7 +114,7 @@ export async function defaultRequestHandler<T>( loading: false, message: `unsupported request body type: "${typeof requestBody}"`, }; - throw new RequestError(error) + throw new RequestError(error); } } @@ -159,7 +159,7 @@ export async function defaultRequestHandler<T>( type: ErrorType.UNEXPECTED, exception: ex, loading: false, - message: (ex instanceof Error ? ex.message : ""), + message: ex instanceof Error ? ex.message : "", }; throw new RequestError(error); } @@ -470,9 +470,8 @@ export function buildRequestFailed<ErrorDetail>( */ function validateURL(baseUrl: string, endpoint: string): URL | undefined { try { - return new URL(`${baseUrl}${endpoint}`) + return new URL(`${baseUrl}${endpoint}`); } catch (ex) { - return undefined + return undefined; } - -} -\ No newline at end of file +}