module EZCouch.Design where
import Prelude ()
import ClassyPrelude
import GHC.Generics
import EZCouch.Doc
import Data.Aeson
import qualified Network.HTTP.Types as HTTP
import qualified Network.HTTP.Conduit as HTTP
import EZCouch.ReadAction
import EZCouch.Action
import EZCouch.WriteAction
import EZCouch.Types
import EZCouch.Parsing
import EZCouch.Model.Design
readDesign :: (MonadAction m, Doc a) => m (Maybe (Persisted (Design a)))
readDesign = result
where
result
= (flip catch) processException
$ getAction ["_design", designName] [] ""
>>= runParser errorPersistedParser
>>= return . either (const Nothing) Just
where
designName = docType $ (undefined :: m (Maybe (Persisted (Design a))) -> a) result
processException (HTTP.StatusCodeException (HTTP.Status 404 _) _) = return Nothing
processException e = throwIO e
createOrUpdateDesign :: (MonadAction m, Doc a) => Design a -> m ()
createOrUpdateDesign design = do
design' <- readDesign
case design' of
Just (Persisted id rev design'') -> if design'' == design
then return ()
else void $ update $ Persisted id rev design
Nothing -> void $ createDesign design
createDesign :: (MonadAction m, Doc a) => Design a -> m (Persisted (Design a))
createDesign design = createWithId id design
where
id = "_design/" ++ designName design