1 {-# LANGUAGE OverloadedStrings #-}
    2 module Controller.VolumeState
    3   ( postVolumeState
    4   , deleteVolumeState
    5   ) where
    6 
    7 import Data.Maybe (fromMaybe)
    8 import Network.HTTP.Types (noContent204)
    9 import qualified Web.Route.Invertible as R
   10 
   11 import qualified Data.Aeson as Aeson
   12 import Model.Id
   13 import Model.Permission
   14 import Model.Volume
   15 import Model.VolumeState
   16 import HTTP.Path.Parser
   17 import HTTP.Form.Deform
   18 import Action.Route
   19 import Action
   20 import Controller.Form
   21 import Controller.Paths
   22 import Controller.Volume
   23 
   24 data CreateOrUpdateVolumeStateRequest = CreateOrUpdateVolumeStateRequest Aeson.Value Bool
   25 
   26 postVolumeState :: ActionRoute (Id Volume, VolumeStateKey)
   27 postVolumeState = action PUT (pathJSON >/> pathId </> "state" >/> R.parameter) $ \(vi, k) -> withAuth $ do
   28   _ <- getVolume PermissionEDIT vi
   29   s <- runForm Nothing $ do
   30     j <- deform
   31     p <- "public" .:> fromMaybe False <$> deformOptional deform
   32     let _ = CreateOrUpdateVolumeStateRequest j p
   33     return VolumeState
   34       { stateVolumeId = vi
   35       , volumeStateKey = k
   36       , volumeStatePublic = p
   37       , volumeStateValue = j
   38       }
   39   changeVolumeState s
   40   return $ emptyResponse noContent204 []
   41 
   42 deleteVolumeState :: ActionRoute (Id Volume, VolumeStateKey)
   43 deleteVolumeState = action DELETE (pathJSON >/> pathId </> "state" >/> R.parameter) $ \(vi, k) -> withAuth $ do
   44   _ <- getVolume PermissionEDIT vi
   45   r <- DeleteVolumeStateResponse <$> removeVolumeState vi k
   46   return $ okResponse [] $ (Aeson.encode . wasDeleted) r
   47 
   48 newtype DeleteVolumeStateResponse = DeleteVolumeStateResponse { wasDeleted :: Bool }