From e2959d4fe5c043db4fda5650311e7c4eb3144748 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 21 Apr 2022 10:12:16 +0200 Subject: [PATCH] [sales] Add REST API for sales availability --- dagger/rest/api.nim | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/dagger/rest/api.nim b/dagger/rest/api.nim index f3442cdd..652c478c 100644 --- a/dagger/rest/api.nim +++ b/dagger/rest/api.nim @@ -28,6 +28,7 @@ import pkg/libp2p/routing_record import ../node import ../blocktype import ../conf +import ../contracts proc validate( pattern: string, @@ -85,6 +86,12 @@ proc decodeString(T: type bool, value: string): Result[T, cstring] = proc encodeString(value: bool): Result[string, cstring] = ok($value) +proc decodeString(_: type UInt256, value: string): Result[UInt256, cstring] = + try: + ok UInt256.fromHex(value) + except ValueError as e: + err e.msg.cstring + proc initRestApi*(node: DaggerNodeRef, conf: DaggerConf): RestRouter = var router = RestRouter.init(validate) router.api( @@ -323,4 +330,32 @@ proc initRestApi*(node: DaggerNodeRef, conf: DaggerConf): RestRouter = "\nAddrs: \n" & addrs & "\nRoot Dir: " & $conf.dataDir) + router.api( + MethodPost, + "/api/dagger/v1/sales/availability") do ( + size: Option[uint64], + duration: Option[uint64], + minPrice: Option[UInt256]) -> 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") + + 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 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) + return router