diff options
Diffstat (limited to 'packages/merchant-backoffice-ui/src/hooks')
17 files changed, 293 insertions, 773 deletions
diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts b/packages/merchant-backoffice-ui/src/hooks/backend.ts index 37dfd8fd6..8eb9b4cf2 100644 --- a/packages/merchant-backoffice-ui/src/hooks/backend.ts +++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts @@ -20,24 +20,21 @@ */ import { - AbsoluteTime, - AccessToken, - HttpStatusCode, + TalerErrorDetail, + TalerMerchantApi } from "@gnu-taler/taler-util"; import { EmptyObject, - ErrorType, HttpError, HttpResponse, HttpResponseOk, RequestError, RequestOptions, - useApiContext, + useApiContext } from "@gnu-taler/web-util/browser"; import { useCallback, useEffect, useState } from "preact/hooks"; import { useSWRConfig } from "swr"; import { useSessionContext } from "../context/session.js"; -import { LoginToken, MerchantBackend, Timestamp } from "../declaration.js"; export function useMatchMutate(): ( re?: RegExp, @@ -72,21 +69,21 @@ export function useMatchMutate(): ( } export function useBackendInstancesTestForAdmin(): HttpResponse< - MerchantBackend.Instances.InstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.InstancesResponse, + TalerErrorDetail > { const { request } = useBackendBaseRequest(); - type Type = MerchantBackend.Instances.InstancesResponse; + type Type = TalerMerchantApi.InstancesResponse; const [result, setResult] = useState< - HttpResponse<Type, MerchantBackend.ErrorDetail> + HttpResponse<Type, TalerErrorDetail> >({ loading: true }); useEffect(() => { request<Type>(`/management/instances`) .then((data) => setResult(data)) - .catch((error: RequestError<MerchantBackend.ErrorDetail>) => + .catch((error: RequestError<TalerErrorDetail>) => setResult(error.cause), ); }, [request]); @@ -98,14 +95,14 @@ const CHECK_CONFIG_INTERVAL_OK = 5 * 60 * 1000; const CHECK_CONFIG_INTERVAL_FAIL = 2 * 1000; export function useBackendConfig(): HttpResponse< - MerchantBackend.VersionResponse | undefined, - RequestError<MerchantBackend.ErrorDetail> + TalerMerchantApi.VersionResponse | undefined, + RequestError<TalerErrorDetail> > { const { request } = useBackendBaseRequest(); - type Type = MerchantBackend.VersionResponse; + type Type = TalerMerchantApi.VersionResponse; type State = { - data: HttpResponse<Type, RequestError<MerchantBackend.ErrorDetail>>; + data: HttpResponse<Type, RequestError<TalerErrorDetail>>; timer: number; }; const [result, setResult] = useState<State>({ @@ -191,94 +188,6 @@ type LoginResult = cause: HttpError<EmptyObject>; }; -export function useCredentialsChecker() { - const { request } = useApiContext(); - //check against instance details endpoint - //while merchant backend doesn't have a login endpoint - async function requestNewLoginToken( - baseUrl: string, - token: AccessToken, - ): Promise<LoginResult> { - const data: MerchantBackend.Instances.LoginTokenRequest = { - scope: "write", - duration: { - d_us: "forever", - }, - refreshable: true, - }; - try { - const response = - await request<MerchantBackend.Instances.LoginTokenSuccessResponse>( - baseUrl, - `/private/token`, - { - method: "POST", - token, - data, - }, - ); - return { - valid: true, - token: response.data.token, - expiration: response.data.expiration, - }; - } catch (error) { - if (error instanceof RequestError) { - return { valid: false, cause: error.cause }; - } - - return { - valid: false, - cause: { - type: ErrorType.UNEXPECTED, - loading: false, - info: { - hasToken: true, - status: 0, - options: {}, - url: `/private/token`, - payload: {}, - }, - exception: error, - message: - error instanceof Error ? error.message : "unpexepected error", - }, - }; - } - } - - async function refreshLoginToken( - baseUrl: string, - token: LoginToken, - ): Promise<LoginResult> { - if ( - AbsoluteTime.isExpired( - AbsoluteTime.fromProtocolTimestamp(token.expiration), - ) - ) { - return { - valid: false, - cause: { - type: ErrorType.CLIENT, - status: HttpStatusCode.Unauthorized, - message: "login token expired, login again.", - info: { - hasToken: true, - status: 401, - options: {}, - url: `/private/token`, - payload: {}, - }, - payload: {}, - }, - }; - } - - return requestNewLoginToken(baseUrl, token.token as AccessToken); - } - return { requestNewLoginToken, refreshLoginToken }; -} - /** * * @param root the request is intended to the base URL and no the instance URL diff --git a/packages/merchant-backoffice-ui/src/hooks/bank.ts b/packages/merchant-backoffice-ui/src/hooks/bank.ts index d01b579b9..3cf9c7846 100644 --- a/packages/merchant-backoffice-ui/src/hooks/bank.ts +++ b/packages/merchant-backoffice-ui/src/hooks/bank.ts @@ -20,15 +20,15 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 import _useSWR, { SWRHook, mutate } from "swr"; +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; const useSWR = _useSWR as unknown as SWRHook; -// const MOCKED_ACCOUNTS: Record<string, MerchantBackend.BankAccounts.AccountAddDetails> = { +// const MOCKED_ACCOUNTS: Record<string, TalerMerchantApi.AccountAddDetails> = { // "hwire1": { // h_wire: "hwire1", // payto_uri: "payto://fake/iban/123", @@ -46,7 +46,7 @@ export function useBankAccountAPI(): BankAccountAPI { const { request } = useBackendInstanceRequest(); const createBankAccount = async ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ): Promise<HttpResponseOk<void>> => { // MOCKED_ACCOUNTS[data.h_wire] = data // return Promise.resolve({ ok: true, data: undefined }); @@ -60,7 +60,7 @@ export function useBankAccountAPI(): BankAccountAPI { const updateBankAccount = async ( h_wire: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ): Promise<HttpResponseOk<void>> => { // MOCKED_ACCOUNTS[h_wire].credit_facade_credentials = data.credit_facade_credentials // MOCKED_ACCOUNTS[h_wire].credit_facade_url = data.credit_facade_url @@ -94,11 +94,11 @@ export function useBankAccountAPI(): BankAccountAPI { export interface BankAccountAPI { createBankAccount: ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ) => Promise<HttpResponseOk<void>>; updateBankAccount: ( id: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ) => Promise<HttpResponseOk<void>>; deleteBankAccount: (id: string) => Promise<HttpResponseOk<void>>; } @@ -114,8 +114,8 @@ export function useInstanceBankAccounts( args?: InstanceBankAccountFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); @@ -128,14 +128,14 @@ export function useInstanceBankAccounts( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.BankAccounts.AccountsSummaryResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.AccountsSummaryResponse>, + RequestError<TalerErrorDetail> >([`/private/accounts`], fetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -179,8 +179,8 @@ export function useInstanceBankAccounts( export function useBankAccountDetails( h_wire: string, ): HttpResponse< - MerchantBackend.BankAccounts.BankAccountEntry, - MerchantBackend.ErrorDetail + TalerMerchantApi.BankAccountEntry, + TalerErrorDetail > { // return { // ok: true, @@ -192,8 +192,8 @@ export function useBankAccountDetails( const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.BankAccounts.BankAccountEntry>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.BankAccountEntry>, + RequestError<TalerErrorDetail> >([`/private/accounts/${h_wire}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.test.ts b/packages/merchant-backoffice-ui/src/hooks/instance.test.ts index a1bb3d5d4..f73f07d68 100644 --- a/packages/merchant-backoffice-ui/src/hooks/instance.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/instance.test.ts @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AccessToken, TalerMerchantApi } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; import { useAdminAPI, useBackendInstances, @@ -35,12 +35,10 @@ import { API_DELETE_INSTANCE, API_GET_CURRENT_INSTANCE, API_LIST_INSTANCES, - API_NEW_LOGIN, API_UPDATE_CURRENT_INSTANCE, API_UPDATE_CURRENT_INSTANCE_AUTH, API_UPDATE_INSTANCE_BY_ID, } from "./urls.js"; -import { AccessToken } from "@gnu-taler/taler-util"; describe("instance api interaction with details", () => { it("should evict cache when updating an instance", async () => { @@ -49,7 +47,7 @@ describe("instance api interaction with details", () => { env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "instance_name", - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -77,16 +75,16 @@ describe("instance api interaction with details", () => { env.addRequestExpectation(API_UPDATE_CURRENT_INSTANCE, { request: { name: "other_name", - } as MerchantBackend.Instances.InstanceReconfigurationMessage, + } as TalerMerchantApi.InstanceReconfigurationMessage, }); env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "other_name", - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); api.updateInstance({ name: "other_name", - } as MerchantBackend.Instances.InstanceReconfigurationMessage); + } as TalerMerchantApi.InstanceReconfigurationMessage); }, ({ query, api }) => { expect(env.assertJustExpectedRequestWereMade()).deep.eq({ @@ -110,15 +108,15 @@ describe("instance api interaction with details", () => { it("should evict cache when setting the instance's token", async () => { const env = new ApiMockEnvironment(); - env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { - response: { - name: "instance_name", - auth: { - method: "token", - // token: "not-secret", - }, - } as MerchantBackend.Instances.QueryInstancesResponse, - }); + // env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { + // response: { + // name: "instance_name", + // auth: { + // method: "token", + // // token: "not-secret", + // }, + // } as TalerMerchantApi.QueryInstancesResponse, + // }); const hookBehavior = await tests.hookBehaveLikeThis( () => { @@ -148,26 +146,26 @@ describe("instance api interaction with details", () => { request: { method: "token", token: "secret", - } as MerchantBackend.Instances.InstanceAuthConfigurationMessage, - }); - env.addRequestExpectation(API_NEW_LOGIN, { - auth: "secret", - request: { - scope: "write", - duration: { - "d_us": "forever", - }, - refreshable: true, - }, - }); + } as TalerMerchantApi.InstanceAuthConfigurationMessage, + }); + // env.addRequestExpectation(API_NEW_LOGIN, { + // auth: "secret", + // request: { + // scope: "write", + // duration: { + // "d_us": "forever", + // }, + // refreshable: true, + // }, + // }); env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "instance_name", auth: { - method: "token", + type: "token", // token: "secret", }, - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); api.setNewAccessToken(undefined, "secret" as AccessToken); }, @@ -200,10 +198,10 @@ describe("instance api interaction with details", () => { response: { name: "instance_name", auth: { - method: "token", + type: "token", // token: "not-secret", }, - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -234,15 +232,15 @@ describe("instance api interaction with details", () => { env.addRequestExpectation(API_UPDATE_CURRENT_INSTANCE_AUTH, { request: { method: "external", - } as MerchantBackend.Instances.InstanceAuthConfigurationMessage, + } as TalerMerchantApi.InstanceAuthConfigurationMessage, }); env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "instance_name", auth: { - method: "external", + type: "external", }, - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); api.clearAccessToken(undefined); @@ -332,7 +330,7 @@ describe("instance admin api interaction with listing", () => { instances: [ { name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -366,24 +364,24 @@ describe("instance admin api interaction with listing", () => { env.addRequestExpectation(API_CREATE_INSTANCE, { request: { name: "other_name", - } as MerchantBackend.Instances.InstanceConfigurationMessage, + } as TalerMerchantApi.InstanceConfigurationMessage, }); env.addRequestExpectation(API_LIST_INSTANCES, { response: { instances: [ { name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, { name: "other_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); api.createInstance({ name: "other_name", - } as MerchantBackend.Instances.InstanceConfigurationMessage); + } as TalerMerchantApi.InstanceConfigurationMessage); }, ({ query, api }) => { expect(env.assertJustExpectedRequestWereMade()).deep.eq({ @@ -419,11 +417,11 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, { id: "the_id", name: "second_instance", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -466,7 +464,7 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -543,7 +541,7 @@ describe("instance admin api interaction with listing", () => { // instances: [{ // id: 'default', // name: 'instance_name' - // } as MerchantBackend.Instances.Instance] + // } as TalerMerchantApi.Instance] // }, // }); @@ -573,11 +571,11 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, { id: "the_id", name: "second_instance", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -624,7 +622,7 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -665,7 +663,7 @@ describe("instance management api interaction with listing", () => { { id: "managed", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -700,7 +698,7 @@ describe("instance management api interaction with listing", () => { env.addRequestExpectation(API_UPDATE_INSTANCE_BY_ID("managed"), { request: { name: "other_name", - } as MerchantBackend.Instances.InstanceReconfigurationMessage, + } as TalerMerchantApi.InstanceReconfigurationMessage, }); env.addRequestExpectation(API_LIST_INSTANCES, { response: { @@ -708,14 +706,14 @@ describe("instance management api interaction with listing", () => { { id: "managed", name: "other_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); api.updateInstance({ name: "other_name", - } as MerchantBackend.Instances.InstanceConfigurationMessage); + } as TalerMerchantApi.InstanceConfigurationMessage); }, ({ query, api }) => { expect(env.assertJustExpectedRequestWereMade()).deep.eq({ diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.ts b/packages/merchant-backoffice-ui/src/hooks/instance.ts index dfe97fd61..2da82989b 100644 --- a/packages/merchant-backoffice-ui/src/hooks/instance.ts +++ b/packages/merchant-backoffice-ui/src/hooks/instance.ts @@ -16,26 +16,23 @@ import { HttpResponse, HttpResponseOk, - RequestError, - useMerchantApiContext, + RequestError } from "@gnu-taler/web-util/browser"; -import { MerchantBackend } from "../declaration.js"; import { useBackendBaseRequest, useBackendInstanceRequest, - useCredentialsChecker, useMatchMutate, } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { AccessToken, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook, useSWRConfig } from "swr"; import { useSessionContext } from "../context/session.js"; -import { AccessToken } from "@gnu-taler/taler-util"; const useSWR = _useSWR as unknown as SWRHook; interface InstanceAPI { updateInstance: ( - data: MerchantBackend.Instances.InstanceReconfigurationMessage, + data: TalerMerchantApi.InstanceReconfigurationMessage, ) => Promise<void>; deleteInstance: () => Promise<void>; clearAccessToken: (currentToken: AccessToken | undefined) => Promise<void>; @@ -50,7 +47,7 @@ export function useAdminAPI(): AdminAPI { const mutateAll = useMatchMutate(); const createInstance = async ( - instance: MerchantBackend.Instances.InstanceConfigurationMessage, + instance: TalerMerchantApi.InstanceConfigurationMessage, ): Promise<void> => { await request(`/management/instances`, { method: "POST", @@ -84,7 +81,7 @@ export function useAdminAPI(): AdminAPI { export interface AdminAPI { createInstance: ( - data: MerchantBackend.Instances.InstanceConfigurationMessage, + data: TalerMerchantApi.InstanceConfigurationMessage, ) => Promise<void>; deleteInstance: (id: string) => Promise<void>; purgeInstance: (id: string) => Promise<void>; @@ -98,10 +95,9 @@ export function useManagementAPI(instanceId: string): InstanceAPI { logOut, } = useSessionContext(); const { request } = useBackendBaseRequest(); - const { requestNewLoginToken } = useCredentialsChecker(); const updateInstance = async ( - instance: MerchantBackend.Instances.InstanceReconfigurationMessage, + instance: TalerMerchantApi.InstanceReconfigurationMessage, ): Promise<void> => { await request(`/management/instances/${instanceId}`, { method: "PATCH", @@ -166,14 +162,13 @@ export function useInstanceAPI(): InstanceAPI { } = useSessionContext(); const { request } = useBackendInstanceRequest(); - const { requestNewLoginToken } = useCredentialsChecker(); const { state, logIn, logOut } = useSessionContext(); const adminToken = state.status === "loggedIn" && state.isAdmin ? state.token : undefined; const updateInstance = async ( - instance: MerchantBackend.Instances.InstanceReconfigurationMessage, + instance: TalerMerchantApi.InstanceReconfigurationMessage, ): Promise<void> => { await request(`/private/`, { method: "PATCH", @@ -239,14 +234,14 @@ export function useInstanceAPI(): InstanceAPI { } export function useInstanceDetails(): HttpResponse< - MerchantBackend.Instances.QueryInstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.QueryInstancesResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Instances.QueryInstancesResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.QueryInstancesResponse>, + RequestError<TalerErrorDetail> >([`/private/`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -267,17 +262,17 @@ export function useInstanceDetails(): HttpResponse< type KYCStatus = | { type: "ok" } - | { type: "redirect"; status: MerchantBackend.KYC.AccountKycRedirects }; + | { type: "redirect"; status: TalerMerchantApi.AccountKycRedirects }; export function useInstanceKYCDetails(): HttpResponse< KYCStatus, - MerchantBackend.ErrorDetail + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error } = useSWR< - HttpResponseOk<MerchantBackend.KYC.AccountKycRedirects>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.AccountKycRedirects>, + RequestError<TalerErrorDetail> >([`/private/kyc`], fetcher, { refreshInterval: 60 * 1000, refreshWhenHidden: false, @@ -303,14 +298,14 @@ export function useInstanceKYCDetails(): HttpResponse< export function useManagedInstanceDetails( instanceId: string, ): HttpResponse< - MerchantBackend.Instances.QueryInstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.QueryInstancesResponse, + TalerErrorDetail > { const { request } = useBackendBaseRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Instances.QueryInstancesResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.QueryInstancesResponse>, + RequestError<TalerErrorDetail> >([`/management/instances/${instanceId}`], request, { refreshInterval: 0, refreshWhenHidden: false, @@ -329,14 +324,14 @@ export function useManagedInstanceDetails( } export function useBackendInstances(): HttpResponse< - MerchantBackend.Instances.InstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.InstancesResponse, + TalerErrorDetail > { const { request } = useBackendBaseRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Instances.InstancesResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.InstancesResponse>, + RequestError<TalerErrorDetail> >(["/management/instances"], request); if (isValidating) return { loading: true, data: data?.data }; diff --git a/packages/merchant-backoffice-ui/src/hooks/merchant.ts b/packages/merchant-backoffice-ui/src/hooks/merchant.ts index d01b579b9..47d9e5624 100644 --- a/packages/merchant-backoffice-ui/src/hooks/merchant.ts +++ b/packages/merchant-backoffice-ui/src/hooks/merchant.ts @@ -20,15 +20,15 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook, mutate } from "swr"; const useSWR = _useSWR as unknown as SWRHook; -// const MOCKED_ACCOUNTS: Record<string, MerchantBackend.BankAccounts.AccountAddDetails> = { +// const MOCKED_ACCOUNTS: Record<string, TalerMerchantApi.AccountAddDetails> = { // "hwire1": { // h_wire: "hwire1", // payto_uri: "payto://fake/iban/123", @@ -46,7 +46,7 @@ export function useBankAccountAPI(): BankAccountAPI { const { request } = useBackendInstanceRequest(); const createBankAccount = async ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ): Promise<HttpResponseOk<void>> => { // MOCKED_ACCOUNTS[data.h_wire] = data // return Promise.resolve({ ok: true, data: undefined }); @@ -60,7 +60,7 @@ export function useBankAccountAPI(): BankAccountAPI { const updateBankAccount = async ( h_wire: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ): Promise<HttpResponseOk<void>> => { // MOCKED_ACCOUNTS[h_wire].credit_facade_credentials = data.credit_facade_credentials // MOCKED_ACCOUNTS[h_wire].credit_facade_url = data.credit_facade_url @@ -94,11 +94,11 @@ export function useBankAccountAPI(): BankAccountAPI { export interface BankAccountAPI { createBankAccount: ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ) => Promise<HttpResponseOk<void>>; updateBankAccount: ( id: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ) => Promise<HttpResponseOk<void>>; deleteBankAccount: (id: string) => Promise<HttpResponseOk<void>>; } @@ -114,8 +114,8 @@ export function useInstanceBankAccounts( args?: InstanceBankAccountFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); @@ -128,14 +128,14 @@ export function useInstanceBankAccounts( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.BankAccounts.AccountsSummaryResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.AccountsSummaryResponse>, + RequestError<TalerErrorDetail> >([`/private/accounts`], fetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -179,8 +179,8 @@ export function useInstanceBankAccounts( export function useBankAccountDetails( h_wire: string, ): HttpResponse< - MerchantBackend.BankAccounts.BankAccountEntry, - MerchantBackend.ErrorDetail + TalerMerchantApi.BankAccountEntry, + TalerErrorDetail > { // return { // ok: true, @@ -192,8 +192,8 @@ export function useBankAccountDetails( const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.BankAccounts.BankAccountEntry>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.BankAccountEntry>, + RequestError<TalerErrorDetail> >([`/private/accounts/${h_wire}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/order.test.ts b/packages/merchant-backoffice-ui/src/hooks/order.test.ts index 86f53a342..08fffbcf0 100644 --- a/packages/merchant-backoffice-ui/src/hooks/order.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/order.test.ts @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AmountString, TalerMerchantApi } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; import { useInstanceOrders, useOrderAPI, useOrderDetails } from "./order.js"; import { ApiMockEnvironment } from "./testing.js"; import { @@ -40,7 +40,7 @@ describe("order api interaction with listing", () => { env.addRequestExpectation(API_LIST_ORDERS, { qparam: { delta: -20, paid: "yes" }, response: { - orders: [{ order_id: "1" }, { order_id: "2" } as MerchantBackend.Orders.OrderHistoryEntry], + orders: [{ order_id: "1" }, { order_id: "2" } as TalerMerchantApi.OrderHistoryEntry], }, }); @@ -72,7 +72,8 @@ describe("order api interaction with listing", () => { env.addRequestExpectation(API_CREATE_ORDER, { request: { - order: { amount: "ARS:12", summary: "pay me" }, + order: { amount: "ARS:12" as AmountString, summary: "pay me" }, + lock_uuids: [] }, response: { order_id: "3" }, }); @@ -116,7 +117,7 @@ describe("order api interaction with listing", () => { order_id: "1", amount: "EUR:12", refundable: true, - } as MerchantBackend.Orders.OrderHistoryEntry] }, + } as TalerMerchantApi.OrderHistoryEntry] }, }); const newDate = (d: Date) => { @@ -202,7 +203,7 @@ describe("order api interaction with listing", () => { env.addRequestExpectation(API_LIST_ORDERS, { qparam: { delta: -20, paid: "yes" }, response: { - orders: [{ order_id: "1" }, { order_id: "2" } as MerchantBackend.Orders.OrderHistoryEntry], + orders: [{ order_id: "1" }, { order_id: "2" } as TalerMerchantApi.OrderHistoryEntry], }, }); @@ -271,7 +272,7 @@ describe("order api interaction with details", () => { response: { summary: "description", refund_amount: "EUR:0", - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); const newDate = (d: Date) => { @@ -311,12 +312,12 @@ describe("order api interaction with details", () => { response: { summary: "description", refund_amount: "EUR:1", - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); api.refundOrder("1", { reason: "double pay", - refund: "EUR:1", + refund: "EUR:1" as AmountString, }); }, ({ query, api }) => { @@ -347,7 +348,7 @@ describe("order api interaction with details", () => { response: { summary: "description", refund_amount: "EUR:0", - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); const newDate = (d: Date) => { @@ -385,7 +386,7 @@ describe("order api interaction with details", () => { env.addRequestExpectation(API_GET_ORDER_BY_ID("1"), { response: { summary: undefined, - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); api.forgetOrder("1", { diff --git a/packages/merchant-backoffice-ui/src/hooks/order.ts b/packages/merchant-backoffice-ui/src/hooks/order.ts index efc7bdcbe..39bc1725b 100644 --- a/packages/merchant-backoffice-ui/src/hooks/order.ts +++ b/packages/merchant-backoffice-ui/src/hooks/order.ts @@ -20,27 +20,27 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; export interface OrderAPI { //FIXME: add OutOfStockResponse on 410 createOrder: ( - data: MerchantBackend.Orders.PostOrderRequest, - ) => Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>>; + data: TalerMerchantApi.PostOrderRequest, + ) => Promise<HttpResponseOk<TalerMerchantApi.PostOrderResponse>>; forgetOrder: ( id: string, - data: MerchantBackend.Orders.ForgetRequest, + data: TalerMerchantApi.ForgetRequest, ) => Promise<HttpResponseOk<void>>; refundOrder: ( id: string, - data: MerchantBackend.Orders.RefundRequest, - ) => Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>>; + data: TalerMerchantApi.RefundRequest, + ) => Promise<HttpResponseOk<TalerMerchantApi.MerchantRefundResponse>>; deleteOrder: (id: string) => Promise<HttpResponseOk<void>>; getPaymentURL: (id: string) => Promise<HttpResponseOk<string>>; } @@ -52,9 +52,9 @@ export function useOrderAPI(): OrderAPI { const { request } = useBackendInstanceRequest(); const createOrder = async ( - data: MerchantBackend.Orders.PostOrderRequest, - ): Promise<HttpResponseOk<MerchantBackend.Orders.PostOrderResponse>> => { - const res = await request<MerchantBackend.Orders.PostOrderResponse>( + data: TalerMerchantApi.PostOrderRequest, + ): Promise<HttpResponseOk<TalerMerchantApi.PostOrderResponse>> => { + const res = await request<TalerMerchantApi.PostOrderResponse>( `/private/orders`, { method: "POST", @@ -67,10 +67,10 @@ export function useOrderAPI(): OrderAPI { }; const refundOrder = async ( orderId: string, - data: MerchantBackend.Orders.RefundRequest, - ): Promise<HttpResponseOk<MerchantBackend.Orders.MerchantRefundResponse>> => { + data: TalerMerchantApi.RefundRequest, + ): Promise<HttpResponseOk<TalerMerchantApi.MerchantRefundResponse>> => { mutateAll(/@"\/private\/orders"@/); - const res = request<MerchantBackend.Orders.MerchantRefundResponse>( + const res = request<TalerMerchantApi.MerchantRefundResponse>( `/private/orders/${orderId}/refund`, { method: "POST", @@ -85,7 +85,7 @@ export function useOrderAPI(): OrderAPI { const forgetOrder = async ( orderId: string, - data: MerchantBackend.Orders.ForgetRequest, + data: TalerMerchantApi.ForgetRequest, ): Promise<HttpResponseOk<void>> => { mutateAll(/@"\/private\/orders"@/); const res = request<void>(`/private/orders/${orderId}/forget`, { @@ -110,7 +110,7 @@ export function useOrderAPI(): OrderAPI { const getPaymentURL = async ( orderId: string, ): Promise<HttpResponseOk<string>> => { - return request<MerchantBackend.Orders.MerchantOrderStatusResponse>( + return request<TalerMerchantApi.MerchantOrderStatusResponse>( `/private/orders/${orderId}`, { method: "GET", @@ -132,14 +132,14 @@ export function useOrderAPI(): OrderAPI { export function useOrderDetails( oderId: string, ): HttpResponse< - MerchantBackend.Orders.MerchantOrderStatusResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.MerchantOrderStatusResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Orders.MerchantOrderStatusResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.MerchantOrderStatusResponse>, + RequestError<TalerErrorDetail> >([`/private/orders/${oderId}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -165,8 +165,8 @@ export function useInstanceOrders( args?: InstanceOrderFilter, updateFilter?: (d: Date) => void, ): HttpResponsePaginated< - MerchantBackend.Orders.OrderHistory, - MerchantBackend.ErrorDetail + TalerMerchantApi.OrderHistory, + TalerErrorDetail > { const { orderFetcher } = useBackendInstanceRequest(); @@ -187,8 +187,8 @@ export function useInstanceOrders( error: beforeError, isValidating: loadingBefore, } = useSWR< - HttpResponseOk<MerchantBackend.Orders.OrderHistory>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.OrderHistory>, + RequestError<TalerErrorDetail> >( [ `/private/orders`, @@ -205,8 +205,8 @@ export function useInstanceOrders( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.Orders.OrderHistory>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.OrderHistory>, + RequestError<TalerErrorDetail> >( [ `/private/orders`, @@ -222,14 +222,14 @@ export function useInstanceOrders( //this will save last result const [lastBefore, setLastBefore] = useState< HttpResponse< - MerchantBackend.Orders.OrderHistory, - MerchantBackend.ErrorDetail + TalerMerchantApi.OrderHistory, + TalerErrorDetail > >({ loading: true }); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Orders.OrderHistory, - MerchantBackend.ErrorDetail + TalerMerchantApi.OrderHistory, + TalerErrorDetail > >({ loading: true }); useEffect(() => { diff --git a/packages/merchant-backoffice-ui/src/hooks/otp.ts b/packages/merchant-backoffice-ui/src/hooks/otp.ts index 76ece7055..4b45dcf06 100644 --- a/packages/merchant-backoffice-ui/src/hooks/otp.ts +++ b/packages/merchant-backoffice-ui/src/hooks/otp.ts @@ -20,35 +20,20 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; -const MOCKED_DEVICES: Record<string, MerchantBackend.OTP.OtpDeviceAddDetails> = { - "1": { - otp_device_description: "first device", - otp_algorithm: 1, - otp_device_id: "1", - otp_key: "123", - }, - "2": { - otp_device_description: "second device", - otp_algorithm: 0, - otp_device_id: "2", - otp_key: "456", - } -} - export function useOtpDeviceAPI(): OtpDeviceAPI { const mutateAll = useMatchMutate(); const { request } = useBackendInstanceRequest(); const createOtpDevice = async ( - data: MerchantBackend.OTP.OtpDeviceAddDetails, + data: TalerMerchantApi.OtpDeviceAddDetails, ): Promise<HttpResponseOk<void>> => { // MOCKED_DEVICES[data.otp_device_id] = data // return Promise.resolve({ ok: true, data: undefined }); @@ -62,7 +47,7 @@ export function useOtpDeviceAPI(): OtpDeviceAPI { const updateOtpDevice = async ( deviceId: string, - data: MerchantBackend.OTP.OtpDevicePatchDetails, + data: TalerMerchantApi.OtpDevicePatchDetails, ): Promise<HttpResponseOk<void>> => { // MOCKED_DEVICES[deviceId].otp_algorithm = data.otp_algorithm // MOCKED_DEVICES[deviceId].otp_ctr = data.otp_ctr @@ -98,11 +83,11 @@ export function useOtpDeviceAPI(): OtpDeviceAPI { export interface OtpDeviceAPI { createOtpDevice: ( - data: MerchantBackend.OTP.OtpDeviceAddDetails, + data: TalerMerchantApi.OtpDeviceAddDetails, ) => Promise<HttpResponseOk<void>>; updateOtpDevice: ( id: string, - data: MerchantBackend.OTP.OtpDevicePatchDetails, + data: TalerMerchantApi.OtpDevicePatchDetails, ) => Promise<HttpResponseOk<void>>; deleteOtpDevice: (id: string) => Promise<HttpResponseOk<void>>; } @@ -114,8 +99,8 @@ export function useInstanceOtpDevices( args?: InstanceOtpDeviceFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.OTP.OtpDeviceSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.OtpDeviceSummaryResponse, + TalerErrorDetail > { // return { // ok: true, @@ -139,14 +124,14 @@ export function useInstanceOtpDevices( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.OTP.OtpDeviceSummaryResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.OtpDeviceSummaryResponse>, + RequestError<TalerErrorDetail> >([`/private/otp-devices`], fetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.OTP.OtpDeviceSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.OtpDeviceSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -190,8 +175,8 @@ export function useInstanceOtpDevices( export function useOtpDeviceDetails( deviceId: string, ): HttpResponse< - MerchantBackend.OTP.OtpDeviceDetails, - MerchantBackend.ErrorDetail + TalerMerchantApi.OtpDeviceDetails, + TalerErrorDetail > { // return { // ok: true, @@ -204,8 +189,8 @@ export function useOtpDeviceDetails( const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.OTP.OtpDeviceDetails>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.OtpDeviceDetails>, + RequestError<TalerErrorDetail> >([`/private/otp-devices/${deviceId}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/product.test.ts b/packages/merchant-backoffice-ui/src/hooks/product.test.ts index fd2b83ecc..64dbd0103 100644 --- a/packages/merchant-backoffice-ui/src/hooks/product.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/product.test.ts @@ -21,7 +21,6 @@ import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; import { useInstanceProducts, useProductAPI, @@ -35,6 +34,7 @@ import { API_LIST_PRODUCTS, API_UPDATE_PRODUCT_BY_ID, } from "./urls.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; describe("product api interaction with listing", () => { it("should evict cache when creating a product", async () => { @@ -42,11 +42,11 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { - response: { price: "ARS:12" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:12" } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -70,33 +70,33 @@ describe("product api interaction with listing", () => { expect(query.loading).undefined; expect(query.ok).true; if (!query.ok) return; - expect(query.data).deep.equals([{ id: "1234", price: "ARS:12" }]); + expect(query.data).deep.equals([{ id: "1234" , price: "ARS:12" }]); env.addRequestExpectation(API_CREATE_PRODUCT, { request: { price: "ARS:23", - } as MerchantBackend.Products.ProductAddDetail, + } as TalerMerchantApi.ProductAddDetail, }); env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }, { product_id: "2345" }], + products: [{ product_id: "1234", product_serial: 1 }, { product_id: "2345", product_serial: 2 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:12", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:12", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("2345"), { response: { price: "ARS:23", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.createProduct({ @@ -140,11 +140,11 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { - response: { price: "ARS:12" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:12" } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -173,18 +173,18 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_UPDATE_PRODUCT_BY_ID("1234"), { request: { price: "ARS:13", - } as MerchantBackend.Products.ProductPatchDetail, + } as TalerMerchantApi.ProductPatchDetail, }); env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:13", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.updateProduct("1234", { @@ -218,14 +218,14 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }, { product_id: "2345" }], + products: [{ product_id: "1234" , product_serial: 1}, { product_id: "2345", product_serial: 2 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { - response: { price: "ARS:12" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:12" } as TalerMerchantApi.ProductDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("2345"), { - response: { price: "ARS:23" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:23" } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -258,14 +258,14 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:12", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.deleteProduct("2345"); }, @@ -300,7 +300,7 @@ describe("product api interaction with details", () => { env.addRequestExpectation(API_GET_PRODUCT_BY_ID("12"), { response: { description: "this is a description", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -328,13 +328,13 @@ describe("product api interaction with details", () => { env.addRequestExpectation(API_UPDATE_PRODUCT_BY_ID("12"), { request: { description: "other description", - } as MerchantBackend.Products.ProductPatchDetail, + } as TalerMerchantApi.ProductPatchDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("12"), { response: { description: "other description", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.updateProduct("12", { diff --git a/packages/merchant-backoffice-ui/src/hooks/product.ts b/packages/merchant-backoffice-ui/src/hooks/product.ts index 345ca5bf2..c0ace0d32 100644 --- a/packages/merchant-backoffice-ui/src/hooks/product.ts +++ b/packages/merchant-backoffice-ui/src/hooks/product.ts @@ -18,11 +18,11 @@ import { HttpResponseOk, RequestError, } from "@gnu-taler/web-util/browser"; -import { MerchantBackend, WithId } from "../declaration.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; const useSWR = _useSWR as unknown as SWRHook; export interface ProductAPI { @@ -30,16 +30,16 @@ export interface ProductAPI { id: string, ) => Promise<void>; createProduct: ( - data: MerchantBackend.Products.ProductAddDetail, + data: TalerMerchantApi.ProductAddDetail, ) => Promise<void>; updateProduct: ( id: string, - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ) => Promise<void>; deleteProduct: (id: string) => Promise<void>; lockProduct: ( id: string, - data: MerchantBackend.Products.LockRequest, + data: TalerMerchantApi.LockRequest, ) => Promise<void>; } @@ -50,7 +50,7 @@ export function useProductAPI(): ProductAPI { const { request } = useBackendInstanceRequest(); const createProduct = async ( - data: MerchantBackend.Products.ProductAddDetail, + data: TalerMerchantApi.ProductAddDetail, ): Promise<void> => { const res = await request(`/private/products`, { method: "POST", @@ -62,7 +62,7 @@ export function useProductAPI(): ProductAPI { const updateProduct = async ( productId: string, - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ): Promise<void> => { const r = await request(`/private/products/${productId}`, { method: "PATCH", @@ -81,7 +81,7 @@ export function useProductAPI(): ProductAPI { const lockProduct = async ( productId: string, - data: MerchantBackend.Products.LockRequest, + data: TalerMerchantApi.LockRequest, ): Promise<void> => { await request(`/private/products/${productId}/lock`, { method: "POST", @@ -105,14 +105,14 @@ export function useProductAPI(): ProductAPI { } export function useInstanceProducts(): HttpResponse< - (MerchantBackend.Products.ProductDetail & WithId)[], - MerchantBackend.ErrorDetail + (TalerMerchantApi.ProductDetail & WithId)[], + TalerErrorDetail > { const { fetcher, multiFetcher } = useBackendInstanceRequest(); const { data: list, error: listError } = useSWR< - HttpResponseOk<MerchantBackend.Products.InventorySummaryResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.InventorySummaryResponse>, + RequestError<TalerErrorDetail> >([`/private/products`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -125,8 +125,8 @@ export function useInstanceProducts(): HttpResponse< (p) => `/private/products/${p.product_id}`, ); const { data: products, error: productError } = useSWR< - HttpResponseOk<MerchantBackend.Products.ProductDetail>[], - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.ProductDetail>[], + RequestError<TalerErrorDetail> >([paths], multiFetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -154,14 +154,14 @@ export function useInstanceProducts(): HttpResponse< export function useProductDetails( productId: string, ): HttpResponse< - MerchantBackend.Products.ProductDetail, - MerchantBackend.ErrorDetail + TalerMerchantApi.ProductDetail, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Products.ProductDetail>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.ProductDetail>, + RequestError<TalerErrorDetail> >([`/private/products/${productId}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/reserve.test.ts b/packages/merchant-backoffice-ui/src/hooks/reserve.test.ts deleted file mode 100644 index 58472399f..000000000 --- a/packages/merchant-backoffice-ui/src/hooks/reserve.test.ts +++ /dev/null @@ -1,207 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2021-2024 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - 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/> - */ - -/** - * - * @author Sebastian Javier Marchano (sebasjm) - */ - -import * as tests from "@gnu-taler/web-util/testing"; -import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; -import { - useInstanceReserves, - useReservesAPI, -} from "./reserves.js"; -import { ApiMockEnvironment } from "./testing.js"; -import { - API_CREATE_RESERVE, - API_DELETE_RESERVE, - API_LIST_RESERVES -} from "./urls.js"; - -describe("reserve api interaction with listing", () => { - it("should evict cache when creating a reserve", async () => { - const env = new ApiMockEnvironment(); - - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - const hookBehavior = await tests.hookBehaveLikeThis( - () => { - const api = useReservesAPI(); - const query = useInstanceReserves(); - return { query, api }; - }, - {}, - [ - ({ query, api }) => { - expect(query.loading).true; - }, - ({ query, api }) => { - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - expect(query.data).deep.equals({ - reserves: [{ reserve_pub: "11" }], - }); - - env.addRequestExpectation(API_CREATE_RESERVE, { - request: { - initial_balance: "ARS:3333", - exchange_url: "http://url", - wire_method: "iban", - }, - response: { - reserve_pub: "22", - accounts: [], - }, - }); - - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - api.createReserve({ - initial_balance: "ARS:3333", - exchange_url: "http://url", - wire_method: "iban", - }); - }, - ({ query, api }) => { - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ - result: "ok", - }); - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - - expect(query.data).deep.equals({ - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }); - }, - ], - env.buildTestingContext(), - ); - - expect(hookBehavior).deep.eq({ result: "ok" }); - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" }); - }); - - it("should evict cache when deleting a reserve", async () => { - const env = new ApiMockEnvironment(); - - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "33", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - const hookBehavior = await tests.hookBehaveLikeThis( - () => { - const api = useReservesAPI(); - const query = useInstanceReserves(); - return { query, api }; - }, - {}, - [ - ({ query, api }) => { - expect(query.loading).true; - }, - ({ query, api }) => { - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ - result: "ok", - }); - - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - expect(query.data).deep.equals({ - reserves: [ - { reserve_pub: "11" }, - { reserve_pub: "22" }, - { reserve_pub: "33" }, - ], - }); - - env.addRequestExpectation(API_DELETE_RESERVE("11"), {}); - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "33", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - api.deleteReserve("11"); - }, - ({ query, api }) => { - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ - result: "ok", - }); - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - expect(query.data).deep.equals({ - reserves: [{ reserve_pub: "22" }, { reserve_pub: "33" }], - }); - }, - ], - env.buildTestingContext(), - ); - - expect(hookBehavior).deep.eq({ result: "ok" }); - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" }); - }); -}); diff --git a/packages/merchant-backoffice-ui/src/hooks/reserves.ts b/packages/merchant-backoffice-ui/src/hooks/reserves.ts deleted file mode 100644 index 13e4bcce8..000000000 --- a/packages/merchant-backoffice-ui/src/hooks/reserves.ts +++ /dev/null @@ -1,94 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2021-2024 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - 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/> - */ -import { - HttpResponse, - HttpResponseOk, - RequestError, -} from "@gnu-taler/web-util/browser"; -import { MerchantBackend } from "../declaration.js"; -import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; - -// FIX default import https://github.com/microsoft/TypeScript/issues/49189 -import _useSWR, { SWRHook, useSWRConfig } from "swr"; -const useSWR = _useSWR as unknown as SWRHook; - -export function useReservesAPI(): ReserveMutateAPI { - const mutateAll = useMatchMutate(); - const { mutate } = useSWRConfig(); - const { request } = useBackendInstanceRequest(); - - const createReserve = async ( - data: MerchantBackend.Rewards.ReserveCreateRequest, - ): Promise< - HttpResponseOk<MerchantBackend.Rewards.ReserveCreateConfirmation> - > => { - const res = await request<MerchantBackend.Rewards.ReserveCreateConfirmation>( - `/private/reserves`, - { - method: "POST", - data, - }, - ); - - //evict reserve list query - await mutateAll(/.*private\/reserves.*/); - - return res; - }; - - - const deleteReserve = async ( - pub: string, - ): Promise<HttpResponse<void, MerchantBackend.ErrorDetail>> => { - const res = await request<void>(`/private/reserves/${pub}`, { - method: "DELETE", - }); - - //evict reserve list query - await mutateAll(/.*private\/reserves.*/); - - return res; - }; - - return { createReserve, deleteReserve }; -} - -export interface ReserveMutateAPI { - createReserve: ( - data: MerchantBackend.Rewards.ReserveCreateRequest, - ) => Promise<HttpResponseOk<MerchantBackend.Rewards.ReserveCreateConfirmation>>; - deleteReserve: ( - id: string, - ) => Promise<HttpResponse<void, MerchantBackend.ErrorDetail>>; -} - -export function useInstanceReserves(): HttpResponse< - MerchantBackend.Rewards.RewardReserveStatus, - MerchantBackend.ErrorDetail -> { - const { fetcher } = useBackendInstanceRequest(); - - const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Rewards.RewardReserveStatus>, - RequestError<MerchantBackend.ErrorDetail> - >([`/private/reserves`], fetcher); - - if (isValidating) return { loading: true, data: data?.data }; - if (data) return data; - if (error) return error.cause; - return { loading: true }; -} - diff --git a/packages/merchant-backoffice-ui/src/hooks/templates.ts b/packages/merchant-backoffice-ui/src/hooks/templates.ts index 96671452e..cdcc418ef 100644 --- a/packages/merchant-backoffice-ui/src/hooks/templates.ts +++ b/packages/merchant-backoffice-ui/src/hooks/templates.ts @@ -20,11 +20,11 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -33,7 +33,7 @@ export function useTemplateAPI(): TemplateAPI { const { request } = useBackendInstanceRequest(); const createTemplate = async ( - data: MerchantBackend.Template.TemplateAddDetails, + data: TalerMerchantApi.TemplateAddDetails, ): Promise<HttpResponseOk<void>> => { const res = await request<void>(`/private/templates`, { method: "POST", @@ -45,7 +45,7 @@ export function useTemplateAPI(): TemplateAPI { const updateTemplate = async ( templateId: string, - data: MerchantBackend.Template.TemplatePatchDetails, + data: TalerMerchantApi.TemplatePatchDetails, ): Promise<HttpResponseOk<void>> => { const res = await request<void>(`/private/templates/${templateId}`, { method: "PATCH", @@ -67,11 +67,11 @@ export function useTemplateAPI(): TemplateAPI { const createOrderFromTemplate = async ( templateId: string, - data: MerchantBackend.Template.UsingTemplateDetails, + data: TalerMerchantApi.UsingTemplateDetails, ): Promise< - HttpResponseOk<MerchantBackend.Template.UsingTemplateResponse> + HttpResponseOk<TalerMerchantApi.UsingTemplateResponse> > => { - const res = await request<MerchantBackend.Template.UsingTemplateResponse>( + const res = await request<TalerMerchantApi.UsingTemplateResponse>( `/templates/${templateId}`, { method: "POST", @@ -101,11 +101,11 @@ export function useTemplateAPI(): TemplateAPI { export interface TemplateAPI { createTemplate: ( - data: MerchantBackend.Template.TemplateAddDetails, + data: TalerMerchantApi.TemplateAddDetails, ) => Promise<HttpResponseOk<void>>; updateTemplate: ( id: string, - data: MerchantBackend.Template.TemplatePatchDetails, + data: TalerMerchantApi.TemplatePatchDetails, ) => Promise<HttpResponseOk<void>>; testTemplateExist: ( id: string @@ -113,8 +113,8 @@ export interface TemplateAPI { deleteTemplate: (id: string) => Promise<HttpResponseOk<void>>; createOrderFromTemplate: ( id: string, - data: MerchantBackend.Template.UsingTemplateDetails, - ) => Promise<HttpResponseOk<MerchantBackend.Template.UsingTemplateResponse>>; + data: TalerMerchantApi.UsingTemplateDetails, + ) => Promise<HttpResponseOk<TalerMerchantApi.UsingTemplateResponse>>; } export interface InstanceTemplateFilter { @@ -126,8 +126,8 @@ export function useInstanceTemplates( args?: InstanceTemplateFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.Template.TemplateSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateSummaryResponse, + TalerErrorDetail > { const { templateFetcher } = useBackendInstanceRequest(); @@ -148,8 +148,8 @@ export function useInstanceTemplates( error: beforeError, isValidating: loadingBefore, } = useSWR< - HttpResponseOk<MerchantBackend.Template.TemplateSummaryResponse>, - RequestError<MerchantBackend.ErrorDetail>>( + HttpResponseOk<TalerMerchantApi.TemplateSummaryResponse>, + RequestError<TalerErrorDetail>>( [ `/private/templates`, args?.position, @@ -162,22 +162,22 @@ export function useInstanceTemplates( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.Template.TemplateSummaryResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.TemplateSummaryResponse>, + RequestError<TalerErrorDetail> >([`/private/templates`, args?.position, -totalAfter], templateFetcher); //this will save last result const [lastBefore, setLastBefore] = useState< HttpResponse< - MerchantBackend.Template.TemplateSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateSummaryResponse, + TalerErrorDetail > >({ loading: true }); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Template.TemplateSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -241,14 +241,14 @@ export function useInstanceTemplates( export function useTemplateDetails( templateId: string, ): HttpResponse< - MerchantBackend.Template.TemplateDetails, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateDetails, + TalerErrorDetail > { const { templateFetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Template.TemplateDetails>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.TemplateDetails>, + RequestError<TalerErrorDetail> >([`/private/templates/${templateId}`], templateFetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts b/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts index 2fd11f02e..ee987af7e 100644 --- a/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts @@ -19,12 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AmountString, PaytoString, TalerMerchantApi } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; -import { API_INFORM_TRANSFERS, API_LIST_TRANSFERS } from "./urls.js"; import { ApiMockEnvironment } from "./testing.js"; import { useInstanceTransfers, useTransferAPI } from "./transfer.js"; +import { API_INFORM_TRANSFERS, API_LIST_TRANSFERS } from "./urls.js"; describe("transfer api interaction with listing", () => { it("should evict cache when informing a transfer", async () => { @@ -33,7 +33,7 @@ describe("transfer api interaction with listing", () => { env.addRequestExpectation(API_LIST_TRANSFERS, { qparam: { limit: -20 }, response: { - transfers: [{ wtid: "2" } as MerchantBackend.Transfers.TransferDetails], + transfers: [{ wtid: "2" } as TalerMerchantApi.TransferDetails], }, }); @@ -83,9 +83,9 @@ describe("transfer api interaction with listing", () => { api.informTransfer({ wtid: "3", - credit_amount: "EUR:1", + credit_amount: "EUR:1" as AmountString, exchange_url: "exchange.url", - payto_uri: "payto://", + payto_uri: "payto://" as PaytoString, }); }, ({ query, api }) => { diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.ts b/packages/merchant-backoffice-ui/src/hooks/transfer.ts index 924bd202f..20062a5e2 100644 --- a/packages/merchant-backoffice-ui/src/hooks/transfer.ts +++ b/packages/merchant-backoffice-ui/src/hooks/transfer.ts @@ -20,11 +20,11 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -33,7 +33,7 @@ export function useTransferAPI(): TransferAPI { const { request } = useBackendInstanceRequest(); const informTransfer = async ( - data: MerchantBackend.Transfers.TransferInformation, + data: TalerMerchantApi.TransferInformation, ): Promise<HttpResponseOk<{}>> => { const res = await request<{}>(`/private/transfers`, { method: "POST", @@ -49,7 +49,7 @@ export function useTransferAPI(): TransferAPI { export interface TransferAPI { informTransfer: ( - data: MerchantBackend.Transfers.TransferInformation, + data: TalerMerchantApi.TransferInformation, ) => Promise<HttpResponseOk<{}>>; } @@ -63,8 +63,8 @@ export function useInstanceTransfers( args?: InstanceTransferFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.Transfers.TransferList, - MerchantBackend.ErrorDetail + TalerMerchantApi.TransferList, + TalerErrorDetail > { const { transferFetcher } = useBackendInstanceRequest(); @@ -85,8 +85,8 @@ export function useInstanceTransfers( error: beforeError, isValidating: loadingBefore, } = useSWR< - HttpResponseOk<MerchantBackend.Transfers.TransferList>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.TransferList>, + RequestError<TalerErrorDetail> >( [ `/private/transfers`, @@ -102,8 +102,8 @@ export function useInstanceTransfers( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.Transfers.TransferList>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.TransferList>, + RequestError<TalerErrorDetail> >( [ `/private/transfers`, @@ -118,14 +118,14 @@ export function useInstanceTransfers( //this will save last result const [lastBefore, setLastBefore] = useState< HttpResponse< - MerchantBackend.Transfers.TransferList, - MerchantBackend.ErrorDetail + TalerMerchantApi.TransferList, + TalerErrorDetail > >({ loading: true }); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Transfers.TransferList, - MerchantBackend.ErrorDetail + TalerMerchantApi.TransferList, + TalerErrorDetail > >({ loading: true }); useEffect(() => { diff --git a/packages/merchant-backoffice-ui/src/hooks/urls.ts b/packages/merchant-backoffice-ui/src/hooks/urls.ts index 76c117224..95e1c04f3 100644 --- a/packages/merchant-backoffice-ui/src/hooks/urls.ts +++ b/packages/merchant-backoffice-ui/src/hooks/urls.ts @@ -18,16 +18,16 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { Query } from "@gnu-taler/web-util/testing"; -import { MerchantBackend } from "../declaration.js"; //////////////////// // ORDER //////////////////// export const API_CREATE_ORDER: Query< - MerchantBackend.Orders.PostOrderRequest, - MerchantBackend.Orders.PostOrderResponse + TalerMerchantApi.PostOrderRequest, + TalerMerchantApi.PostOrderResponse > = { method: "POST", url: "http://backend/instances/default/private/orders", @@ -35,14 +35,14 @@ export const API_CREATE_ORDER: Query< export const API_GET_ORDER_BY_ID = ( id: string, -): Query<unknown, MerchantBackend.Orders.MerchantOrderStatusResponse> => ({ +): Query<unknown, TalerMerchantApi.MerchantOrderStatusResponse> => ({ method: "GET", url: `http://backend/instances/default/private/orders/${id}`, }); export const API_LIST_ORDERS: Query< unknown, - MerchantBackend.Orders.OrderHistory + TalerMerchantApi.OrderHistory > = { method: "GET", url: "http://backend/instances/default/private/orders", @@ -51,8 +51,8 @@ export const API_LIST_ORDERS: Query< export const API_REFUND_ORDER_BY_ID = ( id: string, ): Query< - MerchantBackend.Orders.RefundRequest, - MerchantBackend.Orders.MerchantRefundResponse + TalerMerchantApi.RefundRequest, + TalerMerchantApi.MerchantRefundResponse > => ({ method: "POST", url: `http://backend/instances/default/private/orders/${id}/refund`, @@ -60,14 +60,14 @@ export const API_REFUND_ORDER_BY_ID = ( export const API_FORGET_ORDER_BY_ID = ( id: string, -): Query<MerchantBackend.Orders.ForgetRequest, unknown> => ({ +): Query<TalerMerchantApi.ForgetRequest, unknown> => ({ method: "PATCH", url: `http://backend/instances/default/private/orders/${id}/forget`, }); export const API_DELETE_ORDER = ( id: string, -): Query<MerchantBackend.Orders.ForgetRequest, unknown> => ({ +): Query<TalerMerchantApi.ForgetRequest, unknown> => ({ method: "DELETE", url: `http://backend/instances/default/private/orders/${id}`, }); @@ -78,14 +78,14 @@ export const API_DELETE_ORDER = ( export const API_LIST_TRANSFERS: Query< unknown, - MerchantBackend.Transfers.TransferList + TalerMerchantApi.TransferList > = { method: "GET", url: "http://backend/instances/default/private/transfers", }; export const API_INFORM_TRANSFERS: Query< - MerchantBackend.Transfers.TransferInformation, + TalerMerchantApi.TransferInformation, {} > = { method: "POST", @@ -97,7 +97,7 @@ export const API_INFORM_TRANSFERS: Query< //////////////////// export const API_CREATE_PRODUCT: Query< - MerchantBackend.Products.ProductAddDetail, + TalerMerchantApi.ProductAddDetail, unknown > = { method: "POST", @@ -106,7 +106,7 @@ export const API_CREATE_PRODUCT: Query< export const API_LIST_PRODUCTS: Query< unknown, - MerchantBackend.Products.InventorySummaryResponse + TalerMerchantApi.InventorySummaryResponse > = { method: "GET", url: "http://backend/instances/default/private/products", @@ -114,7 +114,7 @@ export const API_LIST_PRODUCTS: Query< export const API_GET_PRODUCT_BY_ID = ( id: string, -): Query<unknown, MerchantBackend.Products.ProductDetail> => ({ +): Query<unknown, TalerMerchantApi.ProductDetail> => ({ method: "GET", url: `http://backend/instances/default/private/products/${id}`, }); @@ -122,8 +122,8 @@ export const API_GET_PRODUCT_BY_ID = ( export const API_UPDATE_PRODUCT_BY_ID = ( id: string, ): Query< - MerchantBackend.Products.ProductPatchDetail, - MerchantBackend.Products.InventorySummaryResponse + TalerMerchantApi.ProductPatchDetail, + TalerMerchantApi.InventorySummaryResponse > => ({ method: "PATCH", url: `http://backend/instances/default/private/products/${id}`, @@ -135,67 +135,11 @@ export const API_DELETE_PRODUCT = (id: string): Query<unknown, unknown> => ({ }); //////////////////// -// RESERVES -//////////////////// - -export const API_CREATE_RESERVE: Query< - MerchantBackend.Rewards.ReserveCreateRequest, - MerchantBackend.Rewards.ReserveCreateConfirmation -> = { - method: "POST", - url: "http://backend/instances/default/private/reserves", -}; -export const API_LIST_RESERVES: Query< - unknown, - MerchantBackend.Rewards.RewardReserveStatus -> = { - method: "GET", - url: "http://backend/instances/default/private/reserves", -}; - -export const API_GET_RESERVE_BY_ID = ( - pub: string, -): Query<unknown, MerchantBackend.Rewards.ReserveDetail> => ({ - method: "GET", - url: `http://backend/instances/default/private/reserves/${pub}`, -}); - -export const API_GET_REWARD_BY_ID = ( - pub: string, -): Query<unknown, MerchantBackend.Rewards.RewardDetails> => ({ - method: "GET", - url: `http://backend/instances/default/private/rewards/${pub}`, -}); - -export const API_AUTHORIZE_REWARD_FOR_RESERVE = ( - pub: string, -): Query< - MerchantBackend.Rewards.RewardCreateRequest, - MerchantBackend.Rewards.RewardCreateConfirmation -> => ({ - method: "POST", - url: `http://backend/instances/default/private/reserves/${pub}/authorize-reward`, -}); - -export const API_AUTHORIZE_REWARD: Query< - MerchantBackend.Rewards.RewardCreateRequest, - MerchantBackend.Rewards.RewardCreateConfirmation -> = { - method: "POST", - url: `http://backend/instances/default/private/rewards`, -}; - -export const API_DELETE_RESERVE = (id: string): Query<unknown, unknown> => ({ - method: "DELETE", - url: `http://backend/instances/default/private/reserves/${id}`, -}); - -//////////////////// // INSTANCE ADMIN //////////////////// export const API_CREATE_INSTANCE: Query< - MerchantBackend.Instances.InstanceConfigurationMessage, + TalerMerchantApi.InstanceConfigurationMessage, unknown > = { method: "POST", @@ -204,21 +148,21 @@ export const API_CREATE_INSTANCE: Query< export const API_GET_INSTANCE_BY_ID = ( id: string, -): Query<unknown, MerchantBackend.Instances.QueryInstancesResponse> => ({ +): Query<unknown, TalerMerchantApi.QueryInstancesResponse> => ({ method: "GET", url: `http://backend/management/instances/${id}`, }); export const API_GET_INSTANCE_KYC_BY_ID = ( id: string, -): Query<unknown, MerchantBackend.KYC.AccountKycRedirects> => ({ +): Query<unknown, TalerMerchantApi.AccountKycRedirects> => ({ method: "GET", url: `http://backend/management/instances/${id}/kyc`, }); export const API_LIST_INSTANCES: Query< unknown, - MerchantBackend.Instances.InstancesResponse + TalerMerchantApi.InstancesResponse > = { method: "GET", url: "http://backend/management/instances", @@ -227,7 +171,7 @@ export const API_LIST_INSTANCES: Query< export const API_UPDATE_INSTANCE_BY_ID = ( id: string, ): Query< - MerchantBackend.Instances.InstanceReconfigurationMessage, + TalerMerchantApi.InstanceReconfigurationMessage, unknown > => ({ method: "PATCH", @@ -237,7 +181,7 @@ export const API_UPDATE_INSTANCE_BY_ID = ( export const API_UPDATE_INSTANCE_AUTH_BY_ID = ( id: string, ): Query< - MerchantBackend.Instances.InstanceAuthConfigurationMessage, + TalerMerchantApi.InstanceAuthConfigurationMessage, unknown > => ({ method: "POST", @@ -250,24 +194,12 @@ export const API_DELETE_INSTANCE = (id: string): Query<unknown, unknown> => ({ }); //////////////////// -// AUTH -//////////////////// - -export const API_NEW_LOGIN: Query< - MerchantBackend.Instances.LoginTokenRequest, - unknown -> = ({ - method: "POST", - url: `http://backend/private/token`, -}); - -//////////////////// // INSTANCE //////////////////// export const API_GET_CURRENT_INSTANCE: Query< unknown, - MerchantBackend.Instances.QueryInstancesResponse + TalerMerchantApi.QueryInstancesResponse > = { method: "GET", url: `http://backend/instances/default/private/`, @@ -275,14 +207,14 @@ export const API_GET_CURRENT_INSTANCE: Query< export const API_GET_CURRENT_INSTANCE_KYC: Query< unknown, - MerchantBackend.KYC.AccountKycRedirects + TalerMerchantApi.AccountKycRedirects > = { method: "GET", url: `http://backend/instances/default/private/kyc`, }; export const API_UPDATE_CURRENT_INSTANCE: Query< - MerchantBackend.Instances.InstanceReconfigurationMessage, + TalerMerchantApi.InstanceReconfigurationMessage, unknown > = { method: "PATCH", @@ -290,7 +222,7 @@ export const API_UPDATE_CURRENT_INSTANCE: Query< }; export const API_UPDATE_CURRENT_INSTANCE_AUTH: Query< - MerchantBackend.Instances.InstanceAuthConfigurationMessage, + TalerMerchantApi.InstanceAuthConfigurationMessage, unknown > = { method: "POST", diff --git a/packages/merchant-backoffice-ui/src/hooks/webhooks.ts b/packages/merchant-backoffice-ui/src/hooks/webhooks.ts index 994bfdbb0..4e62a81c9 100644 --- a/packages/merchant-backoffice-ui/src/hooks/webhooks.ts +++ b/packages/merchant-backoffice-ui/src/hooks/webhooks.ts @@ -20,11 +20,11 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -33,7 +33,7 @@ export function useWebhookAPI(): WebhookAPI { const { request } = useBackendInstanceRequest(); const createWebhook = async ( - data: MerchantBackend.Webhooks.WebhookAddDetails, + data: TalerMerchantApi.WebhookAddDetails, ): Promise<HttpResponseOk<void>> => { const res = await request<void>(`/private/webhooks`, { method: "POST", @@ -45,7 +45,7 @@ export function useWebhookAPI(): WebhookAPI { const updateWebhook = async ( webhookId: string, - data: MerchantBackend.Webhooks.WebhookPatchDetails, + data: TalerMerchantApi.WebhookPatchDetails, ): Promise<HttpResponseOk<void>> => { const res = await request<void>(`/private/webhooks/${webhookId}`, { method: "PATCH", @@ -70,11 +70,11 @@ export function useWebhookAPI(): WebhookAPI { export interface WebhookAPI { createWebhook: ( - data: MerchantBackend.Webhooks.WebhookAddDetails, + data: TalerMerchantApi.WebhookAddDetails, ) => Promise<HttpResponseOk<void>>; updateWebhook: ( id: string, - data: MerchantBackend.Webhooks.WebhookPatchDetails, + data: TalerMerchantApi.WebhookPatchDetails, ) => Promise<HttpResponseOk<void>>; deleteWebhook: (id: string) => Promise<HttpResponseOk<void>>; } @@ -88,8 +88,8 @@ export function useInstanceWebhooks( args?: InstanceWebhookFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.Webhooks.WebhookSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.WebhookSummaryResponse, + TalerErrorDetail > { const { webhookFetcher } = useBackendInstanceRequest(); @@ -104,14 +104,15 @@ export function useInstanceWebhooks( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk<MerchantBackend.Webhooks.WebhookSummaryResponse>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.WebhookSummaryResponse>, + RequestError<TalerErrorDetail> + >([`/private/webhooks`, args?.position, -totalAfter], webhookFetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Webhooks.WebhookSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.WebhookSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -155,14 +156,14 @@ export function useInstanceWebhooks( export function useWebhookDetails( webhookId: string, ): HttpResponse< - MerchantBackend.Webhooks.WebhookDetails, - MerchantBackend.ErrorDetail + TalerMerchantApi.WebhookDetails, + TalerErrorDetail > { const { webhookFetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk<MerchantBackend.Webhooks.WebhookDetails>, - RequestError<MerchantBackend.ErrorDetail> + HttpResponseOk<TalerMerchantApi.WebhookDetails>, + RequestError<TalerErrorDetail> >([`/private/webhooks/${webhookId}`], webhookFetcher, { refreshInterval: 0, refreshWhenHidden: false, |