From d1e46236593b5b8c5019652eb0dbad8f2020e47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Kihlberg?= Date: Thu, 25 Jan 2024 19:15:25 +0100 Subject: [PATCH] lets go --- .../transaction/endpoints/collection.ts | 24 ++++++++++++++++++- packages/runtime/client/rest/src/index.ts | 18 +++++++++++--- .../lifecycle/src/generic/contracts.ts | 5 ++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/packages/runtime/client/rest/src/contract/transaction/endpoints/collection.ts b/packages/runtime/client/rest/src/contract/transaction/endpoints/collection.ts index b3e8e2d8..134e1590 100644 --- a/packages/runtime/client/rest/src/contract/transaction/endpoints/collection.ts +++ b/packages/runtime/client/rest/src/contract/transaction/endpoints/collection.ts @@ -29,7 +29,12 @@ import { TxHeader, TxHeaderGuard } from "../header.js"; import { ContractId, ContractIdGuard } from "@marlowe.io/runtime-core"; import { assertGuardEqual, proxy } from "@marlowe.io/adapter/io-ts"; import { Input } from "@marlowe.io/language-core-v1"; -import { ItemRange, Page, PageGuard } from "../../../pagination.js"; +import { + ItemRange, + ItemRangeGuard, + Page, + PageGuard, +} from "../../../pagination.js"; export type GETHeadersByRange = ( contractId: ContractId, @@ -74,6 +79,23 @@ const GetContractsRawResponse = t.type({ page: PageGuard, }); +export interface GetTransactionsForContractRequest { + contractId: ContractId; + range?: ItemRange; +} + +export const GetTransactionsForContractRequestGuard = assertGuardEqual( + proxy(), + t.intersection([ + t.type({ + contractId: ContractIdGuard, + }), + t.partial({ + range: ItemRangeGuard, + }), + ]) +); + /** * Represents the response of the {@link index.RestClient#getTransactionsForContract | Get transactions for contract } endpoint * @category GetTransactionsForContractResponse diff --git a/packages/runtime/client/rest/src/index.ts b/packages/runtime/client/rest/src/index.ts index 1134604d..c7f5bb7d 100644 --- a/packages/runtime/client/rest/src/index.ts +++ b/packages/runtime/client/rest/src/index.ts @@ -174,8 +174,7 @@ export interface RestClient { // with an AxiosError 404, we could return a nullable value or wrap the error into a custom // ContractNotFound error and specify it in the docs. getTransactionsForContract( - contractId: ContractId, - range?: ItemRange + request: Transactions.GetTransactionsForContractRequest ): Promise; /** @@ -514,7 +513,20 @@ export function mkRestClient( const { contractId, txEnvelope } = request; return Contract.submitContract(axiosInstance)(contractId, txEnvelope); }, - getTransactionsForContract(contractId, range) { + getTransactionsForContract(request) { + if (strict) { + const result = + Transactions.GetTransactionsForContractRequestGuard.decode(request); + if (result._tag === "Left") { + throw new InvalidArgumentError( + result.left, + `Invalid argument to getTransactionsForContract(${request})` + ); + } else { + const test: typeof request = result.right; + } + } + const { contractId, range } = request; return unsafeTaskEither( Transactions.getHeadersByRangeViaAxios(axiosInstance)(contractId, range) ); diff --git a/packages/runtime/lifecycle/src/generic/contracts.ts b/packages/runtime/lifecycle/src/generic/contracts.ts index 0c1fe7c7..1b1edd8b 100644 --- a/packages/runtime/lifecycle/src/generic/contracts.ts +++ b/packages/runtime/lifecycle/src/generic/contracts.ts @@ -56,8 +56,9 @@ export function mkContractLifecycle( const getInputHistory = ({ restClient }: ContractsDI) => async (contractId: ContractId): Promise => { - const transactionHeaders = - await restClient.getTransactionsForContract(contractId); + const transactionHeaders = await restClient.getTransactionsForContract({ + contractId, + }); const transactions = await Promise.all( transactionHeaders.transactions.map((txHeader) => restClient.getContractTransactionById(