diff options
Diffstat (limited to 'packages/demobank-ui/src/context/config.ts')
-rw-r--r-- | packages/demobank-ui/src/context/config.ts | 201 |
1 files changed, 93 insertions, 108 deletions
diff --git a/packages/demobank-ui/src/context/config.ts b/packages/demobank-ui/src/context/config.ts index 72c176679..39d12be86 100644 --- a/packages/demobank-ui/src/context/config.ts +++ b/packages/demobank-ui/src/context/config.ts @@ -15,20 +15,16 @@ */ import { - AccessToken, - AmountJson, - HttpStatusCode, + assertUnreachable, LibtoolVersion, - OperationFail, - OperationOk, - TalerBankConversionApi, + TalerBankConversionCacheEviction, TalerBankConversionHttpClient, TalerCorebankApi, + TalerAuthenticationHttpClient, + TalerCoreBankCacheEviction, TalerCoreBankHttpClient, - TalerError, - UserAndToken, + TalerError } from "@gnu-taler/taler-util"; -import { HttpRequestLibrary } from "@gnu-taler/taler-util/http"; import { BrowserHttpLib, ErrorLoading, @@ -61,7 +57,9 @@ import { export type Type = { url: URL; config: TalerCorebankApi.Config; - api: TalerCoreBankHttpClient; + bank: TalerCoreBankHttpClient; + conversion: TalerBankConversionHttpClient; + authenticator: (user: string) => TalerAuthenticationHttpClient; hints: VersionHint[]; }; @@ -95,13 +93,14 @@ export const BankCoreApiProvider = ({ }): VNode => { const [checked, setChecked] = useState<ConfigResult>(); const { i18n } = useTranslationContext(); - const url = new URL(baseUrl); - const api = new CacheAwareTalerCoreBankHttpClient(url.href, new BrowserHttpLib()); + + const { bankClient, conversionClient, authClient } = buildApiClient(new URL(baseUrl)) + useEffect(() => { - api + bankClient .getConfig() .then((resp) => { - if (api.isCompatible(resp.body.version)) { + if (bankClient.isCompatible(resp.body.version)) { setChecked({ type: "ok", config: resp.body, hints: [] }); } else { // this API supports version 3.0.3 @@ -116,7 +115,7 @@ export const BankCoreApiProvider = ({ setChecked({ type: "incompatible", result: resp.body, - supported: api.PROTOCOL_VERSION, + supported: bankClient.PROTOCOL_VERSION, }); } } @@ -146,9 +145,11 @@ export const BankCoreApiProvider = ({ }); } const value: Type = { - url, + url: new URL(bankClient.baseUrl), config: checked.config, - api: api, + bank: bankClient, + conversion: conversionClient, + authenticator: authClient, hints: checked.hints, }; return h(Context.Provider, { @@ -158,100 +159,84 @@ export const BankCoreApiProvider = ({ }; /** - * + * build http client with cache breaker due to SWR + * @param url + * @returns */ -class CacheAwareTalerBankConversionHttpClient extends TalerBankConversionHttpClient { - constructor(baseUrl: string, httpClient?: HttpRequestLibrary) { - super(baseUrl, httpClient); - } - async updateConversionRate(auth: AccessToken, body: TalerBankConversionApi.ConversionRate) { - const resp = await super.updateConversionRate(auth, body); - if (resp.type === "ok") { - await revalidateConversionInfo(); - } - return resp - } -} +function buildApiClient(url: URL) { + const httpLib = new BrowserHttpLib(); -class CacheAwareTalerCoreBankHttpClient extends TalerCoreBankHttpClient { - constructor(baseUrl: string, httpClient?: HttpRequestLibrary) { - super(baseUrl, httpClient); - } - async deleteAccount(auth: UserAndToken, cid?: string | undefined) { - const resp = await super.deleteAccount(auth, cid); - if (resp.type === "ok") { - await revalidatePublicAccounts(); - await revalidateBusinessAccounts(); - } - return resp; - } - async createAccount( - auth: AccessToken, - body: TalerCorebankApi.RegisterAccountRequest, - ) { - const resp = await super.createAccount(auth, body); - if (resp.type === "ok") { - // admin balance change on new account - await revalidateAccountDetails(); - await revalidateTransactions(); - await revalidatePublicAccounts(); - await revalidateBusinessAccounts(); - } - return resp; - } - async updateAccount( - auth: UserAndToken, - body: TalerCorebankApi.AccountReconfiguration, - cid?: string | undefined, - ) { - const resp = await super.updateAccount(auth, body, cid); - if (resp.type === "ok") { - await revalidateAccountDetails(); - } - return resp; - } - async createTransaction( - auth: UserAndToken, - body: TalerCorebankApi.CreateTransactionRequest, - cid?: string | undefined, - ) { - const resp = await super.createTransaction(auth, body, cid); - if (resp.type === "ok") { - await revalidateAccountDetails(); - await revalidateTransactions(); - } - return resp; - } - async confirmWithdrawalById( - auth: UserAndToken, - wid: string, - cid?: string | undefined, - ) { - const resp = await super.confirmWithdrawalById(auth, wid, cid); - if (resp.type === "ok") { - await revalidateAccountDetails(); - await revalidateTransactions(); + const bankClient = new TalerCoreBankHttpClient(url.href, httpLib, { + async notifySuccess(op) { + switch (op) { + case TalerCoreBankCacheEviction.DELELE_ACCOUNT: { + await Promise.all([ + revalidatePublicAccounts(), + revalidateBusinessAccounts(), + ]); + return + } + case TalerCoreBankCacheEviction.CREATE_ACCOUNT: { + // admin balance change on new account + await Promise.all([ + revalidateAccountDetails(), + revalidateTransactions(), + revalidatePublicAccounts(), + revalidateBusinessAccounts(), + ]) + return; + } + case TalerCoreBankCacheEviction.UPDATE_ACCOUNT: { + await Promise.all([ + revalidateAccountDetails(), + ]) + return; + } + case TalerCoreBankCacheEviction.CREATE_TRANSACTION: { + await Promise.all([ + revalidateAccountDetails(), + revalidateTransactions(), + ]) + return; + } + case TalerCoreBankCacheEviction.CONFIRM_WITHDRAWAL: { + await Promise.all([ + revalidateAccountDetails(), + revalidateTransactions(), + ]) + return; + } + case TalerCoreBankCacheEviction.CREATE_CASHOUT: { + await Promise.all([ + revalidateAccountDetails(), + revalidateCashouts(), + revalidateTransactions(), + ]) + return; + } + case TalerCoreBankCacheEviction.UPDATE_PASSWORD: + case TalerCoreBankCacheEviction.ABORT_WITHDRAWAL: + case TalerCoreBankCacheEviction.CREATE_WITHDRAWAL: + return; + default: + assertUnreachable(op) + } } - return resp; - } - async createCashout( - auth: UserAndToken, - body: TalerCorebankApi.CashoutRequest, - cid?: string | undefined, - ) { - const resp = await super.createCashout(auth, body, cid); - if (resp.type === "ok") { - await revalidateAccountDetails(); - await revalidateCashouts(); - await revalidateTransactions(); + }); + const conversionClient = new TalerBankConversionHttpClient(bankClient.getConversionInfoAPI(), httpLib, { + async notifySuccess(op) { + switch (op) { + case TalerBankConversionCacheEviction.UPDATE_RATE: { + await revalidateConversionInfo(); + return + } + default: + assertUnreachable(op) + } } - return resp; - } - - getConversionInfoAPI(): TalerBankConversionHttpClient { - const api = super.getConversionInfoAPI(); - return new CacheAwareTalerBankConversionHttpClient(api.baseUrl, this.httpLib) - } + }); + const authClient = (user: string) => new TalerAuthenticationHttpClient(bankClient.getAuthenticationAPI(user), user, httpLib); + return { bankClient, conversionClient, authClient } } export const BankCoreApiProviderTesting = ({ @@ -267,7 +252,7 @@ export const BankCoreApiProviderTesting = ({ url: new URL(url), config: state, // @ts-expect-error this API is not being used, not really needed - api: undefined, + bank: undefined, hints: [], }; |