{-# 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