diff options
Diffstat (limited to 'lib/API.hs')
-rw-r--r-- | lib/API.hs | 34 |
1 files changed, 21 insertions, 13 deletions
@@ -1,7 +1,8 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeOperators #-} -- | The sole authorative definition of this server's API, given as a Servant-style -- Haskell type. All other descriptions of the API are generated from this one. @@ -10,30 +11,33 @@ module API (API, CompleteAPI, GtfsRealtimeAPI, RegisterJson(..), Metrics(..)) wh import Data.Map (Map) import Data.Proxy (Proxy (..)) import Data.Swagger (MimeList (MimeList), - Operation (..), + NamedSchema (..), Operation (..), PathItem (_pathItemGet), Scheme (Wss), Swagger, + SwaggerType (SwaggerObject), ToSchema (..), _swaggerPaths, - genericDeclareNamedSchema, type_, - NamedSchema(..), SwaggerType (SwaggerObject)) + genericDeclareNamedSchema, type_) import Data.Swagger.ParamSchema (ToParamSchema (..)) import Data.Text (Text) import Data.Time (Day, UTCTime) import Data.UUID (UUID) import Servant (Application, FormUrlEncoded, FromHttpApiData (parseUrlPiece), - Server, err401, err404, type (:>)) -import Servant.API (Capture, Get, JSON, NoContent, - PlainText, Post, QueryParam, Raw, - ReqBody, type (:<|>) ((:<|>))) + MimeRender (..), Server, err401, + err404, type (:>)) +import Servant.API (Capture, Get, JSON, MimeRender, + NoContent, OctetStream, PlainText, + Post, QueryParam, Raw, ReqBody, + type (:<|>) (..)) import Servant.API.WebSocket (WebSocket) import Servant.GTFS.Realtime (Proto) import Servant.Swagger (HasSwagger (..)) import Web.Internal.FormUrlEncoded (Form) import Control.Lens (At (at), (&), (?~)) -import Data.Aeson (FromJSON (..), genericParseJSON, Value) -import Data.ByteString.Lazy (ByteString) +import Data.Aeson (FromJSON (..), Value, + genericParseJSON) +import Data.ByteString (ByteString) import Data.HashMap.Strict.InsOrd (singleton) import GHC.Generics (Generic) import GTFS @@ -71,6 +75,7 @@ type API = "stations" :> Get '[JSON] (Map StationID Station) :<|> "debug" :> "pings" :> Get '[JSON] (Map Token [TrainPing]) :<|> "debug" :> "pings" :> Capture "Trip ID" TripID :> Capture "day" Day :> Get '[JSON] [TrainPing] :<|> "debug" :> "register" :> Capture "Trip ID" TripID :> Capture "day" Day :> Post '[JSON] Token + :<|> "gtfs.zip" :> Get '[OctetStream] GTFSFile :<|> "gtfs" :> GtfsRealtimeAPI -- | The API used for publishing gtfs realtime updates @@ -93,6 +98,8 @@ type CompleteAPI = data Metrics = Metrics { metricsWSGauge :: Gauge } +instance MimeRender OctetStream GTFSFile where + mimeRender p (GTFSFile bytes) = mimeRender p bytes @@ -109,3 +116,4 @@ instance HasSwagger WebSocket where } } } + |