From ef808719842f49f3a2232be2225c14bc65840f01 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Mon, 9 May 2022 15:15:23 +0200 Subject: [PATCH] [sales] Perform POST with JSON body instead of URL params --- dagger/rest/api.nim | 22 ++++++++-------------- dagger/rest/json.nim | 15 +++++++++++++++ tests/testIntegration.nim | 11 +++++++++-- 3 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 dagger/rest/json.nim diff --git a/dagger/rest/api.nim b/dagger/rest/api.nim index b7d903c3..2b292005 100644 --- a/dagger/rest/api.nim +++ b/dagger/rest/api.nim @@ -30,6 +30,8 @@ import ../blocktype import ../conf import ../contracts +import ./json + proc validate( pattern: string, value: string): int @@ -330,31 +332,23 @@ proc initRestApi*(node: DaggerNodeRef, conf: DaggerConf): RestRouter = "\nAddrs: \n" & addrs & "\nRoot Dir: " & $conf.dataDir) - router.api( - MethodGet, - "/api/dagger/v1/sales/availability") do ( - size: Option[uint64], - duration: Option[uint64], - minPrice: Option[UInt256]) -> RestApiResponse: + router.rawApi( + MethodPost, + "/api/dagger/v1/sales/availability") do () -> RestApiResponse: ## Add available storage to sell ## ## size - size of available storage in bytes ## duration - maximum time the storage should be sold for (in seconds) ## minPrice - minimum price to be paid (in amount of tokens) - without size =? size.?get(): - return RestApiResponse.error(Http400, "Missing or incorrect size") + let body = await request.getBody() - without duration =? duration.?get(): - return RestApiResponse.error(Http400, "Missing or incorrect duration") - - without minPrice =? minPrice.?get(): - return RestApiResponse.error(Http400, "Missing or incorrect minPrice") + without availability =? Availability.fromJson(body), error: + return RestApiResponse.error(Http400, error.msg) without contracts =? node.contracts: return RestApiResponse.error(Http503, "Sales unavailable") - let availability = Availability.init(size, duration, minPrice) contracts.sales.add(availability) return RestApiResponse.response(availability.id.toHex) diff --git a/dagger/rest/json.nim b/dagger/rest/json.nim new file mode 100644 index 00000000..d79390db --- /dev/null +++ b/dagger/rest/json.nim @@ -0,0 +1,15 @@ +import std/json +import std/strutils +import pkg/stew/byteutils +import pkg/questionable/results +import ../sales + +func fromHex(T: type SomeInteger, s: string): T = + strutils.fromHex[T](s) + +proc fromJson*(_: type Availability, bytes: seq[byte]): ?!Availability = + let json = ?catch parseJson(string.fromBytes(bytes)) + let size = ?catch UInt256.fromHex(json["size"].getStr) + let duration = ?catch uint64.fromHex(json["duration"].getStr) + let minPrice = ?catch uint64.fromHex(json["minPrice"].getStr) + success Availability.init(size, duration, minPrice) diff --git a/tests/testIntegration.nim b/tests/testIntegration.nim index 4674fce1..2af064c9 100644 --- a/tests/testIntegration.nim +++ b/tests/testIntegration.nim @@ -3,6 +3,7 @@ import std/os import std/streams import std/strutils import std/httpclient +import std/json import pkg/asynctest import pkg/chronos @@ -41,5 +42,11 @@ suite "Integration tests": test "node handles new storage availability": let baseurl = "http://localhost:8080/api/dagger/v1" - let url = baseurl & "/sales/availability?size=1&duration=1&minPrice=0x2A" - check client.get(url).status == "200 OK" + let url = baseurl & "/sales/availability" + let json = %*{ + "size": "0x1", + "duration": "0x2", + "minPrice": "0x3" + } + let response = client.post(url, $json) + check response.status == "200 OK"