-- | Types for IPFS servics

module Blockfrost.Types.IPFS
  ( IPFSAdd (..)
  , IPFSPinChange (..)
  , IPFSPin (..)
  , PinState (..)
  , IPFSData (..)
  ) where

import Blockfrost.Types.Shared
import Data.Aeson
import Data.ByteString.Lazy (ByteString)
import Data.Text (Text)
import Deriving.Aeson
import Servant.API
import Servant.Docs (ToSample (..), singleSample)

-- | IPFS Add response
data IPFSAdd = IPFSAdd
  { IPFSAdd -> Text
_ipfsAddName     :: Text -- ^ Name of the file
  , IPFSAdd -> Text
_ipfsAddIpfsHash :: Text -- ^ IPFS hash of the file
  , IPFSAdd -> Quantity
_ipfsAddSize     :: Quantity -- ^ Size of the IPFS node
  }
  deriving stock (Int -> IPFSAdd -> ShowS
[IPFSAdd] -> ShowS
IPFSAdd -> String
(Int -> IPFSAdd -> ShowS)
-> (IPFSAdd -> String) -> ([IPFSAdd] -> ShowS) -> Show IPFSAdd
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IPFSAdd] -> ShowS
$cshowList :: [IPFSAdd] -> ShowS
show :: IPFSAdd -> String
$cshow :: IPFSAdd -> String
showsPrec :: Int -> IPFSAdd -> ShowS
$cshowsPrec :: Int -> IPFSAdd -> ShowS
Show, IPFSAdd -> IPFSAdd -> Bool
(IPFSAdd -> IPFSAdd -> Bool)
-> (IPFSAdd -> IPFSAdd -> Bool) -> Eq IPFSAdd
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IPFSAdd -> IPFSAdd -> Bool
$c/= :: IPFSAdd -> IPFSAdd -> Bool
== :: IPFSAdd -> IPFSAdd -> Bool
$c== :: IPFSAdd -> IPFSAdd -> Bool
Eq, (forall x. IPFSAdd -> Rep IPFSAdd x)
-> (forall x. Rep IPFSAdd x -> IPFSAdd) -> Generic IPFSAdd
forall x. Rep IPFSAdd x -> IPFSAdd
forall x. IPFSAdd -> Rep IPFSAdd x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep IPFSAdd x -> IPFSAdd
$cfrom :: forall x. IPFSAdd -> Rep IPFSAdd x
Generic)
  deriving (Value -> Parser [IPFSAdd]
Value -> Parser IPFSAdd
(Value -> Parser IPFSAdd)
-> (Value -> Parser [IPFSAdd]) -> FromJSON IPFSAdd
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [IPFSAdd]
$cparseJSONList :: Value -> Parser [IPFSAdd]
parseJSON :: Value -> Parser IPFSAdd
$cparseJSON :: Value -> Parser IPFSAdd
FromJSON, [IPFSAdd] -> Encoding
[IPFSAdd] -> Value
IPFSAdd -> Encoding
IPFSAdd -> Value
(IPFSAdd -> Value)
-> (IPFSAdd -> Encoding)
-> ([IPFSAdd] -> Value)
-> ([IPFSAdd] -> Encoding)
-> ToJSON IPFSAdd
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [IPFSAdd] -> Encoding
$ctoEncodingList :: [IPFSAdd] -> Encoding
toJSONList :: [IPFSAdd] -> Value
$ctoJSONList :: [IPFSAdd] -> Value
toEncoding :: IPFSAdd -> Encoding
$ctoEncoding :: IPFSAdd -> Encoding
toJSON :: IPFSAdd -> Value
$ctoJSON :: IPFSAdd -> Value
ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_ipfsAdd", CamelToSnake]] IPFSAdd

instance ToSample IPFSAdd where
  toSamples :: Proxy IPFSAdd -> [(Text, IPFSAdd)]
toSamples = [(Text, IPFSAdd)] -> Proxy IPFSAdd -> [(Text, IPFSAdd)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(Text, IPFSAdd)] -> Proxy IPFSAdd -> [(Text, IPFSAdd)])
-> [(Text, IPFSAdd)] -> Proxy IPFSAdd -> [(Text, IPFSAdd)]
forall a b. (a -> b) -> a -> b
$ IPFSAdd -> [(Text, IPFSAdd)]
forall a. a -> [(Text, a)]
singleSample (IPFSAdd -> [(Text, IPFSAdd)]) -> IPFSAdd -> [(Text, IPFSAdd)]
forall a b. (a -> b) -> a -> b
$
    Text -> Text -> Quantity -> IPFSAdd
IPFSAdd
      Text
"README.md"
      Text
"QmZbHqiCxKEVX7QfijzJTkZiSi3WEVTcvANgNAWzDYgZDr"
      Quantity
125297

-- | State of the pinned object,
-- which is @Queued@ when we are retriving object.
--
-- If this is successful the state is changed to @Pinned@ or @Failed@ if not.
-- The state @Gc@ means the pinned item has been garbage collected
-- due to account being over storage quota or after it has been
-- moved to @Unpinned@ state by removing the object pin.
data PinState = Queued | Pinned | Unpinned | Failed | Gc
  deriving (PinState -> PinState -> Bool
(PinState -> PinState -> Bool)
-> (PinState -> PinState -> Bool) -> Eq PinState
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PinState -> PinState -> Bool
$c/= :: PinState -> PinState -> Bool
== :: PinState -> PinState -> Bool
$c== :: PinState -> PinState -> Bool
Eq, Int -> PinState -> ShowS
[PinState] -> ShowS
PinState -> String
(Int -> PinState -> ShowS)
-> (PinState -> String) -> ([PinState] -> ShowS) -> Show PinState
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PinState] -> ShowS
$cshowList :: [PinState] -> ShowS
show :: PinState -> String
$cshow :: PinState -> String
showsPrec :: Int -> PinState -> ShowS
$cshowsPrec :: Int -> PinState -> ShowS
Show, Eq PinState
Eq PinState
-> (PinState -> PinState -> Ordering)
-> (PinState -> PinState -> Bool)
-> (PinState -> PinState -> Bool)
-> (PinState -> PinState -> Bool)
-> (PinState -> PinState -> Bool)
-> (PinState -> PinState -> PinState)
-> (PinState -> PinState -> PinState)
-> Ord PinState
PinState -> PinState -> Bool
PinState -> PinState -> Ordering
PinState -> PinState -> PinState
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PinState -> PinState -> PinState
$cmin :: PinState -> PinState -> PinState
max :: PinState -> PinState -> PinState
$cmax :: PinState -> PinState -> PinState
>= :: PinState -> PinState -> Bool
$c>= :: PinState -> PinState -> Bool
> :: PinState -> PinState -> Bool
$c> :: PinState -> PinState -> Bool
<= :: PinState -> PinState -> Bool
$c<= :: PinState -> PinState -> Bool
< :: PinState -> PinState -> Bool
$c< :: PinState -> PinState -> Bool
compare :: PinState -> PinState -> Ordering
$ccompare :: PinState -> PinState -> Ordering
$cp1Ord :: Eq PinState
Ord, (forall x. PinState -> Rep PinState x)
-> (forall x. Rep PinState x -> PinState) -> Generic PinState
forall x. Rep PinState x -> PinState
forall x. PinState -> Rep PinState x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PinState x -> PinState
$cfrom :: forall x. PinState -> Rep PinState x
Generic)
  deriving (Value -> Parser [PinState]
Value -> Parser PinState
(Value -> Parser PinState)
-> (Value -> Parser [PinState]) -> FromJSON PinState
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [PinState]
$cparseJSONList :: Value -> Parser [PinState]
parseJSON :: Value -> Parser PinState
$cparseJSON :: Value -> Parser PinState
FromJSON, [PinState] -> Encoding
[PinState] -> Value
PinState -> Encoding
PinState -> Value
(PinState -> Value)
-> (PinState -> Encoding)
-> ([PinState] -> Value)
-> ([PinState] -> Encoding)
-> ToJSON PinState
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [PinState] -> Encoding
$ctoEncodingList :: [PinState] -> Encoding
toJSONList :: [PinState] -> Value
$ctoJSONList :: [PinState] -> Value
toEncoding :: PinState -> Encoding
$ctoEncoding :: PinState -> Encoding
toJSON :: PinState -> Value
$ctoJSON :: PinState -> Value
ToJSON)
  via CustomJSON '[ConstructorTagModifier '[ToLower]] PinState


-- | IPFS Pin Add response
data IPFSPinChange = IPFSPinChange
  { IPFSPinChange -> Text
_ipfsPinChangeIpfsHash :: Text -- ^ IPFS hash of pinned object
  , IPFSPinChange -> PinState
_ipfsPinChangeState    :: PinState -- ^ State of the pin action
  }
  deriving stock (Int -> IPFSPinChange -> ShowS
[IPFSPinChange] -> ShowS
IPFSPinChange -> String
(Int -> IPFSPinChange -> ShowS)
-> (IPFSPinChange -> String)
-> ([IPFSPinChange] -> ShowS)
-> Show IPFSPinChange
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IPFSPinChange] -> ShowS
$cshowList :: [IPFSPinChange] -> ShowS
show :: IPFSPinChange -> String
$cshow :: IPFSPinChange -> String
showsPrec :: Int -> IPFSPinChange -> ShowS
$cshowsPrec :: Int -> IPFSPinChange -> ShowS
Show, IPFSPinChange -> IPFSPinChange -> Bool
(IPFSPinChange -> IPFSPinChange -> Bool)
-> (IPFSPinChange -> IPFSPinChange -> Bool) -> Eq IPFSPinChange
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IPFSPinChange -> IPFSPinChange -> Bool
$c/= :: IPFSPinChange -> IPFSPinChange -> Bool
== :: IPFSPinChange -> IPFSPinChange -> Bool
$c== :: IPFSPinChange -> IPFSPinChange -> Bool
Eq, (forall x. IPFSPinChange -> Rep IPFSPinChange x)
-> (forall x. Rep IPFSPinChange x -> IPFSPinChange)
-> Generic IPFSPinChange
forall x. Rep IPFSPinChange x -> IPFSPinChange
forall x. IPFSPinChange -> Rep IPFSPinChange x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep IPFSPinChange x -> IPFSPinChange
$cfrom :: forall x. IPFSPinChange -> Rep IPFSPinChange x
Generic)
  deriving (Value -> Parser [IPFSPinChange]
Value -> Parser IPFSPinChange
(Value -> Parser IPFSPinChange)
-> (Value -> Parser [IPFSPinChange]) -> FromJSON IPFSPinChange
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [IPFSPinChange]
$cparseJSONList :: Value -> Parser [IPFSPinChange]
parseJSON :: Value -> Parser IPFSPinChange
$cparseJSON :: Value -> Parser IPFSPinChange
FromJSON, [IPFSPinChange] -> Encoding
[IPFSPinChange] -> Value
IPFSPinChange -> Encoding
IPFSPinChange -> Value
(IPFSPinChange -> Value)
-> (IPFSPinChange -> Encoding)
-> ([IPFSPinChange] -> Value)
-> ([IPFSPinChange] -> Encoding)
-> ToJSON IPFSPinChange
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [IPFSPinChange] -> Encoding
$ctoEncodingList :: [IPFSPinChange] -> Encoding
toJSONList :: [IPFSPinChange] -> Value
$ctoJSONList :: [IPFSPinChange] -> Value
toEncoding :: IPFSPinChange -> Encoding
$ctoEncoding :: IPFSPinChange -> Encoding
toJSON :: IPFSPinChange -> Value
$ctoJSON :: IPFSPinChange -> Value
ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_ipfsPinChange", CamelToSnake]] IPFSPinChange

instance ToSample IPFSPinChange where
  toSamples :: Proxy IPFSPinChange -> [(Text, IPFSPinChange)]
toSamples = [(Text, IPFSPinChange)]
-> Proxy IPFSPinChange -> [(Text, IPFSPinChange)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(Text, IPFSPinChange)]
 -> Proxy IPFSPinChange -> [(Text, IPFSPinChange)])
-> [(Text, IPFSPinChange)]
-> Proxy IPFSPinChange
-> [(Text, IPFSPinChange)]
forall a b. (a -> b) -> a -> b
$ IPFSPinChange -> [(Text, IPFSPinChange)]
forall a. a -> [(Text, a)]
singleSample (IPFSPinChange -> [(Text, IPFSPinChange)])
-> IPFSPinChange -> [(Text, IPFSPinChange)]
forall a b. (a -> b) -> a -> b
$
    Text -> PinState -> IPFSPinChange
IPFSPinChange
      Text
"QmPojRfAXYAXV92Dof7gtSgaVuxEk64xx9CKvprqu9VwA8"
      PinState
Queued

-- | IPFS Pin information
data IPFSPin = IPFSPin
  { IPFSPin -> POSIXTime
_ipfsPinTimeCreated :: POSIXTime -- ^ Creation time of the IPFS object on our backends
  , IPFSPin -> POSIXTime
_ipfsPinTimePinned  :: POSIXTime -- ^ Pin time of the IPFS object on our backends
  , IPFSPin -> Text
_ipfsPinIpfsHash    :: Text -- ^ IPFS hash of the pinned object
  , IPFSPin -> Quantity
_ipfsPinSize        :: Quantity -- ^ Size of the IPFS node
  , IPFSPin -> PinState
_ipfsPinState       :: PinState -- ^ State of the pinned object
  }
  deriving stock (Int -> IPFSPin -> ShowS
[IPFSPin] -> ShowS
IPFSPin -> String
(Int -> IPFSPin -> ShowS)
-> (IPFSPin -> String) -> ([IPFSPin] -> ShowS) -> Show IPFSPin
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IPFSPin] -> ShowS
$cshowList :: [IPFSPin] -> ShowS
show :: IPFSPin -> String
$cshow :: IPFSPin -> String
showsPrec :: Int -> IPFSPin -> ShowS
$cshowsPrec :: Int -> IPFSPin -> ShowS
Show, IPFSPin -> IPFSPin -> Bool
(IPFSPin -> IPFSPin -> Bool)
-> (IPFSPin -> IPFSPin -> Bool) -> Eq IPFSPin
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IPFSPin -> IPFSPin -> Bool
$c/= :: IPFSPin -> IPFSPin -> Bool
== :: IPFSPin -> IPFSPin -> Bool
$c== :: IPFSPin -> IPFSPin -> Bool
Eq, (forall x. IPFSPin -> Rep IPFSPin x)
-> (forall x. Rep IPFSPin x -> IPFSPin) -> Generic IPFSPin
forall x. Rep IPFSPin x -> IPFSPin
forall x. IPFSPin -> Rep IPFSPin x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep IPFSPin x -> IPFSPin
$cfrom :: forall x. IPFSPin -> Rep IPFSPin x
Generic)
  deriving (Value -> Parser [IPFSPin]
Value -> Parser IPFSPin
(Value -> Parser IPFSPin)
-> (Value -> Parser [IPFSPin]) -> FromJSON IPFSPin
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [IPFSPin]
$cparseJSONList :: Value -> Parser [IPFSPin]
parseJSON :: Value -> Parser IPFSPin
$cparseJSON :: Value -> Parser IPFSPin
FromJSON, [IPFSPin] -> Encoding
[IPFSPin] -> Value
IPFSPin -> Encoding
IPFSPin -> Value
(IPFSPin -> Value)
-> (IPFSPin -> Encoding)
-> ([IPFSPin] -> Value)
-> ([IPFSPin] -> Encoding)
-> ToJSON IPFSPin
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [IPFSPin] -> Encoding
$ctoEncodingList :: [IPFSPin] -> Encoding
toJSONList :: [IPFSPin] -> Value
$ctoJSONList :: [IPFSPin] -> Value
toEncoding :: IPFSPin -> Encoding
$ctoEncoding :: IPFSPin -> Encoding
toJSON :: IPFSPin -> Value
$ctoJSON :: IPFSPin -> Value
ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_ipfsPin", CamelToSnake]] IPFSPin

instance ToSample IPFSPin where
  toSamples :: Proxy IPFSPin -> [(Text, IPFSPin)]
toSamples = [(Text, IPFSPin)] -> Proxy IPFSPin -> [(Text, IPFSPin)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(Text, IPFSPin)] -> Proxy IPFSPin -> [(Text, IPFSPin)])
-> [(Text, IPFSPin)] -> Proxy IPFSPin -> [(Text, IPFSPin)]
forall a b. (a -> b) -> a -> b
$ IPFSPin -> [(Text, IPFSPin)]
forall a. a -> [(Text, a)]
singleSample (IPFSPin -> [(Text, IPFSPin)]) -> IPFSPin -> [(Text, IPFSPin)]
forall a b. (a -> b) -> a -> b
$
    IPFSPin :: POSIXTime -> POSIXTime -> Text -> Quantity -> PinState -> IPFSPin
IPFSPin
      { _ipfsPinTimeCreated :: POSIXTime
_ipfsPinTimeCreated = POSIXTime
1615551024
      , _ipfsPinTimePinned :: POSIXTime
_ipfsPinTimePinned = POSIXTime
1615551024
      , _ipfsPinIpfsHash :: Text
_ipfsPinIpfsHash = Text
"QmdVMnULrY95mth2XkwjxDtMHvzuzmvUPTotKE1tgqKbCx"
      , _ipfsPinSize :: Quantity
_ipfsPinSize = Quantity
1615551024
      , _ipfsPinState :: PinState
_ipfsPinState = PinState
Pinned
      }

newtype IPFSData = IPFSData ByteString
  deriving (Int -> IPFSData -> ShowS
[IPFSData] -> ShowS
IPFSData -> String
(Int -> IPFSData -> ShowS)
-> (IPFSData -> String) -> ([IPFSData] -> ShowS) -> Show IPFSData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IPFSData] -> ShowS
$cshowList :: [IPFSData] -> ShowS
show :: IPFSData -> String
$cshow :: IPFSData -> String
showsPrec :: Int -> IPFSData -> ShowS
$cshowsPrec :: Int -> IPFSData -> ShowS
Show, IPFSData -> IPFSData -> Bool
(IPFSData -> IPFSData -> Bool)
-> (IPFSData -> IPFSData -> Bool) -> Eq IPFSData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IPFSData -> IPFSData -> Bool
$c/= :: IPFSData -> IPFSData -> Bool
== :: IPFSData -> IPFSData -> Bool
$c== :: IPFSData -> IPFSData -> Bool
Eq, (forall x. IPFSData -> Rep IPFSData x)
-> (forall x. Rep IPFSData x -> IPFSData) -> Generic IPFSData
forall x. Rep IPFSData x -> IPFSData
forall x. IPFSData -> Rep IPFSData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep IPFSData x -> IPFSData
$cfrom :: forall x. IPFSData -> Rep IPFSData x
Generic)

instance ToSample IPFSData where
  toSamples :: Proxy IPFSData -> [(Text, IPFSData)]
toSamples = [(Text, IPFSData)] -> Proxy IPFSData -> [(Text, IPFSData)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(Text, IPFSData)] -> Proxy IPFSData -> [(Text, IPFSData)])
-> [(Text, IPFSData)] -> Proxy IPFSData -> [(Text, IPFSData)]
forall a b. (a -> b) -> a -> b
$ IPFSData -> [(Text, IPFSData)]
forall a. a -> [(Text, a)]
singleSample (IPFSData -> [(Text, IPFSData)]) -> IPFSData -> [(Text, IPFSData)]
forall a b. (a -> b) -> a -> b
$ ByteString -> IPFSData
IPFSData ByteString
"sample ipfs bytestring"

instance MimeRender OctetStream IPFSData where
  mimeRender :: Proxy OctetStream -> IPFSData -> ByteString
mimeRender Proxy OctetStream
_ (IPFSData ByteString
cs) = ByteString
cs

instance MimeUnrender OctetStream IPFSData where
  mimeUnrender :: Proxy OctetStream -> ByteString -> Either String IPFSData
mimeUnrender Proxy OctetStream
_ ByteString
lbs = IPFSData -> Either String IPFSData
forall (f :: * -> *) a. Applicative f => a -> f a
pure (IPFSData -> Either String IPFSData)
-> IPFSData -> Either String IPFSData
forall a b. (a -> b) -> a -> b
$ ByteString -> IPFSData
IPFSData ByteString
lbs

instance MimeRender PlainText IPFSData where
  mimeRender :: Proxy PlainText -> IPFSData -> ByteString
mimeRender Proxy PlainText
_ (IPFSData ByteString
cs) = ByteString
cs

instance MimeUnrender PlainText IPFSData where
  mimeUnrender :: Proxy PlainText -> ByteString -> Either String IPFSData
mimeUnrender Proxy PlainText
_ ByteString
lbs = IPFSData -> Either String IPFSData
forall (f :: * -> *) a. Applicative f => a -> f a
pure (IPFSData -> Either String IPFSData)
-> IPFSData -> Either String IPFSData
forall a b. (a -> b) -> a -> b
$ ByteString -> IPFSData
IPFSData ByteString
lbs