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 }