From b31ef8356b1eb608e2428c013dabe0003e3c943a Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Wed, 11 May 2022 10:51:59 +0200 Subject: [PATCH] [purchasing] retrieve purchase details through REST API --- dagger/rest/api.nim | 27 +++++++++++++++++++++++++++ dagger/rest/json.nim | 17 +++++++++++++++++ tests/testIntegration.nim | 10 ++++++++++ 3 files changed, 54 insertions(+) diff --git a/dagger/rest/api.nim b/dagger/rest/api.nim index bf2dd747..7cce3729 100644 --- a/dagger/rest/api.nim +++ b/dagger/rest/api.nim @@ -21,6 +21,7 @@ import pkg/chronos import pkg/presto import pkg/libp2p import pkg/stew/base10 +import pkg/stew/byteutils import pkg/confutils import pkg/libp2p/routing_record @@ -94,6 +95,13 @@ proc decodeString(_: type UInt256, value: string): Result[UInt256, cstring] = except ValueError as e: err e.msg.cstring +proc decodeString(_: type array[32, byte], + value: string): Result[array[32, byte], cstring] = + try: + ok array[32, byte].fromHex(value) + except ValueError as e: + err e.msg.cstring + proc initRestApi*(node: DaggerNodeRef, conf: DaggerConf): RestRouter = var router = RestRouter.init(validate) router.api( @@ -310,4 +318,23 @@ proc initRestApi*(node: DaggerNodeRef, conf: DaggerConf): RestRouter = let json = %availability return RestApiResponse.response($json) + router.api( + MethodGet, + "/api/dagger/v1/storage/purchases/{id}") do ( + id: array[32, byte]) -> RestApiResponse: + + without contracts =? node.contracts: + return RestApiResponse.error(Http503, "Purchasing unavailable") + + without id =? id.tryGet.catch, error: + return RestApiResponse.error(Http400, error.msg) + + without purchase =? contracts.purchasing.getPurchase(id): + return RestApiResponse.error(Http404) + + let json = %purchase + + return RestApiResponse.response($json) + + return router diff --git a/dagger/rest/json.nim b/dagger/rest/json.nim index fad69326..8966d870 100644 --- a/dagger/rest/json.nim +++ b/dagger/rest/json.nim @@ -3,6 +3,7 @@ import std/strutils import pkg/stew/byteutils import pkg/questionable/results import ../sales +import ../purchasing type StorageRequestParams* = object @@ -22,3 +23,19 @@ proc fromJson*(_: type StorageRequestParams, let duration = ?catch UInt256.fromHex(json["duration"].getStr) let maxPrice = ?catch UInt256.fromHex(json["maxPrice"].getStr) success StorageRequestParams(duration: duration, maxPrice: maxPrice) + +func `%`*(address: Address): JsonNode = + % $address + +func `%`*(stint: StInt|StUInt): JsonNode = + %("0x" & stint.toHex) + +func `%`*(arr: openArray[byte]): JsonNode = + %("0x" & arr.toHex) + +func `%`*(purchase: Purchase): JsonNode = + %*{ + "request": %purchase.request, + "offers": %purchase.offers, + "selected": %purchase.selected + } diff --git a/tests/testIntegration.nim b/tests/testIntegration.nim index aca6f204..acfa0c75 100644 --- a/tests/testIntegration.nim +++ b/tests/testIntegration.nim @@ -68,3 +68,13 @@ suite "Integration tests": let json = %*{"duration": "0x1", "maxPrice": "0x2"} let response = client.post(url, $json) check response.status == "200 OK" + + test "node retrieves purchase status": + let cid = client.post(baseurl1 & "/upload", "some file contents").body + let request = %*{"duration": "0x1", "maxPrice": "0x2"} + let id = client.post(baseurl1 & "/storage/request/" & cid, $request).body + let response = client.get(baseurl1 & "/storage/purchases/" & id) + check response.status == "200 OK" + let json = parseJson(response.body) + check json["request"]["ask"]["duration"].getStr == "0x1" + check json["request"]["ask"]["maxPrice"].getStr == "0x2"