From 7e37b347447b6fc418f11160d439a7596b039680 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 21 Jul 2023 15:50:53 -0300 Subject: case details and missing decision encryption --- packages/aml-backoffice-ui/src/hooks/useBackend.ts | 8 +- .../aml-backoffice-ui/src/hooks/useCaseDetails.ts | 162 +++++++++++++++++++++ packages/aml-backoffice-ui/src/hooks/useCases.ts | 53 +++++++ 3 files changed, 220 insertions(+), 3 deletions(-) create mode 100644 packages/aml-backoffice-ui/src/hooks/useCaseDetails.ts (limited to 'packages/aml-backoffice-ui/src/hooks') diff --git a/packages/aml-backoffice-ui/src/hooks/useBackend.ts b/packages/aml-backoffice-ui/src/hooks/useBackend.ts index e68efb2e3..b9d66fca6 100644 --- a/packages/aml-backoffice-ui/src/hooks/useBackend.ts +++ b/packages/aml-backoffice-ui/src/hooks/useBackend.ts @@ -14,7 +14,7 @@ interface useBackendType { path: string, options?: RequestOptions, ) => Promise>; - fetcher: (endpoint: string) => Promise>; + fetcher: (args: [string, string]) => Promise>; paginatedFetcher: ( args: [string, number, number, string], ) => Promise>; @@ -35,8 +35,10 @@ export function usePublicBackend(): useBackendType { ); const fetcher = useCallback( - function fetcherImpl(endpoint: string): Promise> { - return requestHandler(baseUrl, endpoint); + function fetcherImpl([endpoint, talerAmlOfficerSignature]: [string,string]): Promise> { + return requestHandler(baseUrl, endpoint, { + talerAmlOfficerSignature + }); }, [baseUrl], ); diff --git a/packages/aml-backoffice-ui/src/hooks/useCaseDetails.ts b/packages/aml-backoffice-ui/src/hooks/useCaseDetails.ts new file mode 100644 index 000000000..980a35f21 --- /dev/null +++ b/packages/aml-backoffice-ui/src/hooks/useCaseDetails.ts @@ -0,0 +1,162 @@ + +import { + HttpResponse, + HttpResponseOk, + RequestError +} from "@gnu-taler/web-util/browser"; +import { AmlExchangeBackend } from "../types.js"; +// FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import { AccountId } from "../account.js"; +import { usePublicBackend } from "./useBackend.js"; +const useSWR = _useSWR as unknown as SWRHook; + +export function useCaseDetails( + account: AccountId, + paytoHash: string, + signature: string | undefined, +): HttpResponse< + AmlExchangeBackend.AmlDecisionDetails, + AmlExchangeBackend.AmlError +> { + const { fetcher } = usePublicBackend(); + + const { data, error } = useSWR< + HttpResponseOk, + RequestError +>( [ + `aml/${account}/decision/${(paytoHash)}`, + signature, +], +fetcher, { + refreshInterval: 0, + refreshWhenHidden: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + refreshWhenOffline: false, + errorRetryCount: 0, + errorRetryInterval: 1, + shouldRetryOnError: false, + keepPreviousData: true, + }); + + if (data) return data; + if (error) return error.cause; + return { loading: true }; +} + +const example1: AmlExchangeBackend.AmlDecisionDetails = { + aml_history: [ + { + justification: "Lack of documentation", + decider_pub: "ASDASDASD", + decision_time: { + t_s: Date.now() / 1000, + }, + new_state: 2, + new_threshold: "USD:0", + }, + { + justification: "Doing a transfer of high amount", + decider_pub: "ASDASDASD", + decision_time: { + t_s: Date.now() / 1000 - 60 * 60 * 24 * 30 * 6, + }, + new_state: 1, + new_threshold: "USD:2000", + }, + { + justification: "Account is known to the system", + decider_pub: "ASDASDASD", + decision_time: { + t_s: Date.now() / 1000 - 60 * 60 * 24 * 30 * 9, + }, + new_state: 0, + new_threshold: "USD:100", + }, + ], + kyc_attributes: [ + { + collection_time: { + t_s: Date.now() / 1000 - 60 * 60 * 24 * 30 * 8, + }, + expiration_time: { + t_s: Date.now() / 1000 - 60 * 60 * 24 * 30 * 4, + }, + provider_section: "asdasd", + attributes: { + name: "Sebastian", + }, + }, + { + collection_time: { + t_s: Date.now() / 1000 - 60 * 60 * 24 * 30 * 5, + }, + expiration_time: { + t_s: Date.now() / 1000 - 60 * 60 * 24 * 30 * 2, + }, + provider_section: "asdasd", + attributes: { + creditCard: "12312312312", + }, + }, + ], +}; + +export const exampleResponse: HttpResponse = { + ok: true, + data: example1, +} + + +export function useAmlCasesAPI(): AmlCaseAPI { + const { request } = usePublicBackend(); + const mutateAll = useMatchMutate(); + + const updateDecision = async ( + officer: AccountId, + data: AmlExchangeBackend.AmlDecision, + ): Promise> => { + const res = await request(`aml/${officer}/decision`, { + method: "POST", + data, + contentType: "json", + }); + await mutateAll(/.*aml.*/); + return res; + }; + + return { + updateDecision, + }; +} + +export interface AmlCaseAPI { + updateDecision: ( + officer: AccountId, + data: AmlExchangeBackend.AmlDecision, + ) => Promise>; +} + + +function useMatchMutate(): ( + re: RegExp, + value?: unknown, +) => Promise { + const { cache, mutate } = useSWRConfig(); + + if (!(cache instanceof Map)) { + throw new Error( + "matchMutate requires the cache provider to be a Map instance", + ); + } + + return function matchRegexMutate(re: RegExp, value?: unknown) { + const allKeys = Array.from(cache.keys()); + const keys = allKeys.filter((key) => re.test(key)); + const mutations = keys.map((key) => { + return mutate(key, value, true); + }); + return Promise.all(mutations); + }; +} diff --git a/packages/aml-backoffice-ui/src/hooks/useCases.ts b/packages/aml-backoffice-ui/src/hooks/useCases.ts index 04b7c383b..c5a0fc489 100644 --- a/packages/aml-backoffice-ui/src/hooks/useCases.ts +++ b/packages/aml-backoffice-ui/src/hooks/useCases.ts @@ -92,3 +92,56 @@ export function useCases( } return { loading: true }; } + +const example1: AmlExchangeBackend.AmlRecords = { + records: [ + { + current_state: 0, + h_payto: "QWEQWEQWEQWEWQE", + rowid: 1, + threshold: "USD 100", + }, + { + current_state: 1, + h_payto: "ASDASDASD", + rowid: 1, + threshold: "USD 100", + }, + { + current_state: 2, + h_payto: "ZXCZXCZXCXZC", + rowid: 1, + threshold: "USD 1000", + }, + { + current_state: 0, + h_payto: "QWEQWEQWEQWEWQE", + rowid: 1, + threshold: "USD 100", + }, + { + current_state: 1, + h_payto: "ASDASDASD", + rowid: 1, + threshold: "USD 100", + }, + { + current_state: 2, + h_payto: "ZXCZXCZXCXZC", + rowid: 1, + threshold: "USD 1000", + }, + ].map((e, idx) => { + e.rowid = idx; + e.threshold = `${e.threshold}${idx}`; + return e; + }), +}; + +export const exampleResponse: HttpResponsePaginated = { + ok: true, + data: example1, + loadMore: () => {}, + loadMorePrev: () => {}, +} + -- cgit v1.2.3