module Network.DigitalOcean.Services.Volume where
import Data.Aeson
import Data.Aeson.Casing
import Data.Time.Clock
import GHC.Generics
import Network.DigitalOcean.Services.Region
import Network.DigitalOcean.Types
data Volume = Volume
{ volumeId :: String
, volumeRegion :: Region
, volumeDropletIds :: [Int]
, volumeName :: String
, volumeDescription :: String
, volumeSizeGigabytes :: Double
, volumeCreatedAt :: UTCTime
} deriving (Show, Generic)
instance FromJSON (Response [Volume]) where
parseJSON (Object v) =
fmap Response $ parseJSON =<< (v .: "volumes")
instance FromJSON (Response Volume) where
parseJSON (Object v) =
fmap Response $ parseJSON =<< (v .: "volume")
instance FromJSON Volume where
parseJSON = genericParseJSON $ aesonPrefix snakeCase
data VolumePayload = VolumePayload
{ volumepayloadSizeGigabytes :: Int
, volumepayloadName :: String
, volumepayloadDescripton :: String
, volumepayloadRegion :: String
, volumepayloadSnapshotId :: String
} deriving (Show, Generic)
instance ToJSON VolumePayload where
toJSON = genericToJSON $ aesonPrefix snakeCase
instance Payload VolumePayload
type VolumeName = String
data VolumeAction =
Attach VolumeId DropletId (Maybe RegionSlug)
| Detach VolumeId DropletId (Maybe RegionSlug)
| ResizeVolume VolumeId Int (Maybe RegionSlug)
| AttachByName VolumeName DropletId (Maybe RegionSlug)
| DetachByName VolumeName DropletId (Maybe RegionSlug)
instance Payload VolumeAction where
instance ToJSON VolumeAction where
toJSON (Attach _ dropletId region) =
object [ "droplet_id".= dropletId
, "region" .= region
, "type" .= ("attach" :: String)
]
toJSON (Detach _ dropletId region) =
object [ "droplet_id" .= dropletId
, "region" .= region
, "type" .= ("detach" :: String)
]
toJSON (ResizeVolume _ size region) =
object [ "size" .= size
, "region" .= region
, "type" .= ("resize" :: String)
]
toJSON (AttachByName volumeName dropletId region) =
object [ "droplet_id" .= dropletId
, "region" .= region
, "volume_name".= volumeName
, "type" .= ("attach" :: String)
]
toJSON (DetachByName volumeName dropletId region) =
object [ "droplet_id" .= dropletId
, "region" .= region
, "volume_name".= volumeName
, "type" .= ("detach" :: String)
]