From 3633c44893bfbd50f25b84ac353012975388332c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 20 Aug 2016 17:28:19 -0400 Subject: initial http api using servant --- HTTP.hs | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 HTTP.hs (limited to 'HTTP.hs') diff --git a/HTTP.hs b/HTTP.hs new file mode 100644 index 0000000..ac4eeab --- /dev/null +++ b/HTTP.hs @@ -0,0 +1,77 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeOperators #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +{- Copyright 2016 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +module HTTP where + +import Types +import Types.Storage +import Serialization () +import Raaz.Core.Encode +import Servant.API +import Data.Text +import Data.Aeson.Types +import GHC.Generics hiding (V1) +import qualified Data.Text.Encoding as T +import qualified Data.ByteString.Lazy as L + +-- | Keysafe's http API +type HttpAPI = + "keysafe" :> "apiversion" :> Get '[JSON] APIVersion + :<|> "keysafe" :> V1 :> "motd" :> Get '[JSON] Motd + :<|> "keysafe" :> V1 :> "proofofwork" :> "requirement" + :> Get '[JSON] (Maybe ProofOfWorkRequirement) + :<|> "keysafe" :> V1 :> "objects" :> ObjectIdent :> POWParam + :> Get '[OctetStream] StorableObject + :<|> "keysafe" :> V1 :> "objects" :> ObjectIdent :> POWParam + :> ReqBody '[OctetStream] StorableObject + :> Put '[JSON] StoreResult + :<|> "keysafe" :> V1 :> "stats" :> "countobjects" :> POWParam + :> Get '[JSON] CountResult + +newtype APIVersion = APIVersion Int + deriving (Generic) + +type V1 = "v1" + +newtype Motd = Motd Text + deriving (Generic) + +data ProofOfWorkRequirement = ProofOfWorkRequirement + { leadingZeros :: Int + , argon2Iterations :: Int + } + deriving (Generic) + +newtype ProofOfWork = ProofOfWork Text + +type POWParam = QueryParam "proofofwork" ProofOfWork + +type ObjectIdent = Capture "ident" StorableObjectIdent + +instance ToJSON APIVersion +instance FromJSON APIVersion +instance ToJSON Motd +instance FromJSON Motd +instance ToJSON ProofOfWorkRequirement +instance FromJSON ProofOfWorkRequirement + +instance FromHttpApiData ProofOfWork where + parseUrlPiece = Right . ProofOfWork + +instance FromHttpApiData StorableObjectIdent where + parseUrlPiece = Right . StorableObjectIdent . T.encodeUtf8 + +instance MimeRender OctetStream StorableObject where + mimeRender _ = L.fromStrict . toByteString + +instance MimeUnrender OctetStream StorableObject where + mimeUnrender _ = maybe (Left "object encoding error") Right + . fromByteString . L.toStrict -- cgit v1.2.3