module CircleCI.Cache (
clearCache
, CacheCleared (..)
, module CircleCI.Common.Types
, module CircleCI.Common.Run
) where
import CircleCI.Common.URL
import CircleCI.Common.Types
import CircleCI.Common.HTTPS
import CircleCI.Common.Run
import Control.Monad ( mzero )
import Control.Monad.Except ( runExceptT )
import Control.Monad.Reader ( ask )
import Control.Monad.IO.Class ( liftIO )
import Data.Aeson
import Data.Aeson.Types
import qualified Data.Proxy as P
import Data.Text ( Text )
import Network.HTTP.Client ( Manager )
import Servant.API
import Servant.Client
clearCache :: ProjectPoint
-> CircleCIResponse CacheCleared
clearCache project = do
AccountAPIToken token <- ask
liftIO . runExceptT $ do
manager <- httpsManager
servantClearCache (userName project)
(projectName project)
(Just token)
manager
apiBaseUrl
data CacheCleared = CacheSuccessfullyCleared
| UnableToClearCache ErrorMessage
deriving (Show)
instance FromJSON CacheCleared where
parseJSON (Object o) =
o .: "status" >>= toCacheCleared
parseJSON _ = mzero
toCacheCleared :: Text -> Parser CacheCleared
toCacheCleared rawStatus = return $
if | rawStatus `elem` okMessages -> CacheSuccessfullyCleared
| otherwise -> UnableToClearCache rawStatus
where
okMessages = [ "build dependency caches deleted"
, "build caches deleted"
]
type CacheAPI = ClearCacheCall
type ClearCacheCall =
"project"
:> Capture "username" UserName
:> Capture "project" ProjectName
:> "build-cache"
:> QueryParam "circle-token" Token
:> Delete '[JSON] CacheCleared
servantClearCache :: UserName
-> ProjectName
-> Maybe Token
-> Manager
-> BaseUrl
-> ClientM CacheCleared
servantClearCache = client cacheAPI
cacheAPI :: P.Proxy CacheAPI
cacheAPI = P.Proxy