diff options
Diffstat (limited to 'HTTP.hs')
-rw-r--r-- | HTTP.hs | 77 |
1 files changed, 77 insertions, 0 deletions
@@ -0,0 +1,77 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeOperators #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +{- Copyright 2016 Joey Hess <id@joeyh.name> + - + - 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 |