Skip to content

Commit 0d2b055

Browse files
authored
Merge pull request #74 from geniusyield/openapi3-support
Move to OpenApi 3.0
2 parents c30b532 + b501621 commit 0d2b055

File tree

12 files changed

+1373
-1345
lines changed

12 files changed

+1373
-1345
lines changed

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ This repository houses on-chain smart contracts, Haskell off-chain interaction l
1111
- [Setting up the API Server with Docker (Kupo)](#setting-up-the-API-Server-with-docker-kupo)
1212
- [Building locally from source using Docker](#building-locally-from-source-using-docker)
1313
- [Building locally from source using the Haskell Toolchain](#building-locally-from-source-using-the-haskell-toolchain)
14-
- [Swagger API documentation](#swagger-api-documentation)
14+
- [OpenApi documentation](#openapi-documentation)
1515
- [Trading Strategy Executor (Python SDK)](#trading-strategy-executor-python-sdk)
1616
- [Trading Bot API Video Tutorial](#trading-bot-api-video-tutorial)
1717
- [Contributing](#contributing)
@@ -224,9 +224,9 @@ Alternatively you could also test using `make test`. This is sending a test GET
224224
Further test requests are available in the Makefile of the strategy executor:
225225
- [Make targets sending test HTTP requests to the Bot API](https://github.com/geniusyield/strategy-executor/blob/6b5a1b1d9f117831e409989335bd48875eef4189/Makefile#L32-L57)
226226

227-
### Swagger API documentation
227+
### OpenApi documentation
228228

229-
Endpoints made available by server are specified [here](./web/swagger/api.yaml).
229+
Endpoints made available by server are specified [here](./web/openapi/api.yaml).
230230

231231
### Trading Strategy Executor (Python SDK)
232232

cabal.project

+2-18
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ package strict-containers
3535
source-repository-package
3636
type: git
3737
location: https://github.com/geniusyield/atlas
38-
tag: 1c20f2a65de8e087b495d1f3ad524d6e659167ad
39-
--sha256: sha256-mvzqgLwKHhIJdeHfUoIdapN0t2K85DoehgSkfm/ddIw=
38+
tag: 7532a439525db20346f4b205fea49f970efe0a98
39+
--sha256: sha256-UyLTCsbZVShxdhAu6fjBrILnyka3vOgBiOeNwW36xkk=
4040

4141
source-repository-package
4242
type: git
@@ -117,22 +117,6 @@ source-repository-package
117117
package cryptonite
118118
flags: -support_rdrand
119119

120-
-- Using a fork until our patches can be merged upstream
121-
122-
-- TODO: ADP-1713
123-
source-repository-package
124-
type: git
125-
location: https://github.com/biocad/servant-openapi3
126-
tag: 4165b837d3a71debd1059c3735460075840000b5
127-
--sha256: 1dngrr353kjhmwhn0b289jzqz5rf32llwcv79zcyq15ldpqpbib9
128-
129-
-- TODO: ADP-1713
130-
source-repository-package
131-
type: git
132-
location: https://github.com/paolino/openapi3
133-
tag: f22c31611c295637a3e72b341cd1c56d1d87b993
134-
--sha256: 10l7wlaz9rcr3fysi1vwg7qqa826bb7nidkpx9jy1q7ja7ddw47i
135-
136120
source-repository-package
137121
type: git
138122
location: https://github.com/input-output-hk/cardano-addresses

geniusyield-dex-api/src/GeniusYield/Api/Dex/PartialOrder.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ partialOrderInfoToIn
295295
PartialOrderInfo
296296
PartialOrderAction
297297
GYTxIn 'PlutusV2
298-
partialOrderInfoToIn a pocVersion pors oi@PartialOrderInfo {..} oa =
298+
partialOrderInfoToIn a pocVersion pors PartialOrderInfo {..} oa =
299299
let SomePORef PORef {..} = selectPor pors pocVersion
300300
in GYTxIn
301301
{ gyTxInTxOutRef = poiRef,

geniusyield-server-lib/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Revision history for geniusyield-server-lib
22

3+
## 0.6.0 -- 2024-06-10
4+
5+
* Makes a move to OpenApi 3.0 specification from earlier 2.0.
6+
37
## 0.5.1 -- 2024-06-06
48

59
* Incorporates 0.3.1.0 of `geniusyield-dex-api`.

geniusyield-server-lib/geniusyield-server-lib.cabal

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 3.6
22
name: geniusyield-server-lib
3-
version: 0.5.1
3+
version: 0.6.0
44
synopsis: GeniusYield server library
55
description: Library for GeniusYield server.
66
license: Apache-2.0
@@ -97,14 +97,15 @@ library
9797
, http-types
9898
, insert-ordered-containers
9999
, lens
100+
, openapi3
100101
, optparse-applicative
101102
, rio
102103
, servant
103104
, servant-client
104105
, servant-client-core
106+
, servant-openapi3
105107
, servant-foreign
106108
, servant-server
107-
, servant-swagger
108109
, strict
109110
, swagger2
110111
, time

geniusyield-server-lib/src/GeniusYield/Server/Api.hs

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module GeniusYield.Server.Api (
66
MainAPI,
77
mainAPI,
88
mainServer,
9-
geniusYieldAPISwagger,
9+
geniusYieldAPIOpenApi,
1010
) where
1111

1212
import Control.Lens ((?~))
@@ -15,9 +15,9 @@ import Data.Aeson qualified as Aeson
1515
import Data.Aeson.Key qualified as K
1616
import Data.Kind (Type)
1717
import Data.List (sortBy)
18+
import Data.OpenApi
1819
import Data.Strict qualified as Strict
1920
import Data.Strict.Tuple
20-
import Data.Swagger
2121
import Data.Swagger qualified as Swagger
2222
import Data.Swagger.Internal.Schema qualified as Swagger
2323
import Data.Version (showVersion)
@@ -42,14 +42,15 @@ import GeniusYield.Server.Tx (TxAPI, handleTxApi)
4242
import GeniusYield.Server.Utils
4343
import GeniusYield.TxBuilder (GYTxQueryMonad (utxosAtAddress))
4444
import GeniusYield.Types
45+
import GeniusYield.Types.OpenApi ()
4546
import PackageInfo_geniusyield_server_lib qualified as PackageInfo
4647
import RIO hiding (asks, logDebug, logInfo)
4748
import RIO.Char (toLower)
4849
import RIO.List (isPrefixOf)
4950
import RIO.Map qualified as Map
5051
import RIO.Text qualified as T
5152
import Servant
52-
import Servant.Swagger
53+
import Servant.OpenApi
5354

5455
{- $setup
5556
@@ -213,9 +214,9 @@ infixr 4 +>
213214
type family (+>) (api1 k) (api2 Type) where
214215
(+>) api1 api2 = APIKeyAuthProtect :> V0 :> api1 :> api2
215216

216-
geniusYieldAPISwagger Swagger
217-
geniusYieldAPISwagger =
218-
toSwagger geniusYieldAPI
217+
geniusYieldAPIOpenApi OpenApi
218+
geniusYieldAPIOpenApi =
219+
toOpenApi geniusYieldAPI
219220
& info
220221
. title
221222
.~ "GeniusYield DEX Server API"

geniusyield-server-lib/src/GeniusYield/Server/Dex/HistoricalPrices/Maestro.hs

+31-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import GeniusYield.Server.Ctx
2121
import GeniusYield.Server.Utils
2222
import GeniusYield.Types
2323
import Maestro.Client.V1 (pricesFromDex)
24-
import Maestro.Types.V1 (Dex, OHLCCandleInfo (..), Order, Resolution, TaggedText (TaggedText))
24+
import Maestro.Types.V1 (Dex (..), OHLCCandleInfo (..), Order (..), Resolution (..), TaggedText (TaggedText))
2525
import RIO hiding (logDebug, logInfo)
2626
import RIO.Text (unpack)
2727
import RIO.Time (Day)
@@ -94,20 +94,50 @@ newtype MaestroOrder = MaestroOrder {unMaestroOrder ∷ Order}
9494
instance Swagger.ToParamSchema MaestroOrder where
9595
toParamSchema = commonEnumParamSchemaRecipe
9696

97+
instance Swagger.ToSchema MaestroOrder where
98+
declareNamedSchema p =
99+
pure $
100+
Swagger.NamedSchema (Just "MaestroOrder") $
101+
Swagger.paramSchemaToSchema p
102+
& Swagger.example
103+
?~ toJSON (MaestroOrder Ascending)
104+
& Swagger.description
105+
?~ "Order of the results"
106+
97107
newtype MaestroResolution = MaestroResolution {unMaestroResolution Resolution}
98108
deriving stock (Show)
99109
deriving newtype (ToHttpApiData, FromHttpApiData, FromJSON, ToJSON, Enum, Bounded)
100110

101111
instance Swagger.ToParamSchema MaestroResolution where
102112
toParamSchema = commonEnumParamSchemaRecipe
103113

114+
instance Swagger.ToSchema MaestroResolution where
115+
declareNamedSchema p =
116+
pure $
117+
Swagger.NamedSchema (Just "MaestroResolution") $
118+
Swagger.paramSchemaToSchema p
119+
& Swagger.example
120+
?~ toJSON (MaestroResolution Res1m)
121+
& Swagger.description
122+
?~ "Resolution of the data"
123+
104124
newtype MaestroDex = MaestroDex {unMaestroDex Dex}
105125
deriving stock (Show)
106126
deriving newtype (ToHttpApiData, FromHttpApiData, FromJSON, ToJSON, Enum, Bounded)
107127

108128
instance Swagger.ToParamSchema MaestroDex where
109129
toParamSchema = commonEnumParamSchemaRecipe
110130

131+
instance Swagger.ToSchema MaestroDex where
132+
declareNamedSchema p =
133+
pure $
134+
Swagger.NamedSchema (Just "MaestroDex") $
135+
Swagger.paramSchemaToSchema p
136+
& Swagger.example
137+
?~ toJSON (MaestroDex GeniusYield)
138+
& Swagger.description
139+
?~ "DEX to fetch data from"
140+
111141
type MaestroPriceHistoryAPI =
112142
Summary "Get price history using Maestro."
113143
:> Description ("This endpoint internally calls Maestro's \"DEX And Pair OHLC\" endpoint. " `AppendSymbol` CommonMaestroKeyRequirementText)

geniusyield-server-lib/src/GeniusYield/Server/Dex/HistoricalPrices/TapTools/Client.hs

+11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module GeniusYield.Server.Dex.HistoricalPrices.TapTools.Client (
1010
handleTapToolsError,
1111
) where
1212

13+
import Control.Lens ((?~))
1314
import Data.Aeson (ToJSON (..))
1415
import Data.Swagger qualified as Swagger
1516
import Data.Time.Clock.POSIX
@@ -77,6 +78,16 @@ instance FromHttpApiData TapToolsInterval where
7778
instance Swagger.ToParamSchema TapToolsInterval where
7879
toParamSchema = commonEnumParamSchemaRecipe
7980

81+
instance Swagger.ToSchema TapToolsInterval where
82+
declareNamedSchema p =
83+
pure $
84+
Swagger.NamedSchema (Just "TapToolsInterval") $
85+
Swagger.paramSchemaToSchema p
86+
& Swagger.example
87+
?~ toJSON TTI1M
88+
& Swagger.description
89+
?~ "The time interval"
90+
8091
type TapToolsOHLCVPrefix Symbol
8192
type TapToolsOHLCVPrefix = "tapToolsOHLCV"
8293

geniusyield-server-lib/src/GeniusYield/Server/Orphans.hs

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ module GeniusYield.Server.Orphans () where
44

55
import Control.Lens (at, (?~))
66
import Data.HashMap.Strict.InsOrd qualified as IOHM
7-
import Data.Swagger
7+
import Data.OpenApi
88
import GeniusYield.Server.Auth (APIKeyAuthProtect, apiKeyHeaderText)
99
import RIO
1010
import Servant
1111
import Servant.Foreign
12-
import Servant.Swagger
12+
import Servant.OpenApi
1313

14-
instance HasSwagger api HasSwagger (APIKeyAuthProtect :> api) where
15-
toSwagger _ =
16-
toSwagger (Proxy Proxy api)
17-
& securityDefinitions
14+
instance HasOpenApi api HasOpenApi (APIKeyAuthProtect :> api) where
15+
toOpenApi _ =
16+
toOpenApi (Proxy Proxy api)
17+
& (components . securitySchemes)
1818
.~ SecurityDefinitions (IOHM.fromList [(apiKeyHeaderText, apiKeySecurityScheme)])
1919
& allOperations
2020
. security

geniusyield-server-lib/src/GeniusYield/Server/Run.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ runServer mfp = do
5757
logErrorS = gyLogError providers mempty
5858
logInfoS $ "GeniusYield server version: " +| showVersion PackageInfo.version |+ "\nCommit used: " +| gitHash |+ "\nOptional collateral configuration: " +|| scCollateral serverConfig ||+ "\nAddress of optional wallet: " +|| fmap Strict.snd optionalSigningKey ||+ "\nOptional stake address: " +|| scStakeAddress serverConfig ||+ ""
5959
-- BL.writeFile "web/swagger/api.json" (encodePretty geniusYieldAPISwagger)
60-
B.writeFile "web/swagger/api.yaml" (Yaml.encodePretty Yaml.defConfig geniusYieldAPISwagger)
60+
B.writeFile "web/openapi/api.yaml" (Yaml.encodePretty Yaml.defConfig geniusYieldAPIOpenApi)
6161
reqLoggerMiddleware gcpReqLogger
6262
let
6363
-- These are only meant to catch fatal exceptions, application thrown exceptions should be caught beforehand.

0 commit comments

Comments
 (0)