module ReviewBoard.Api (
module ReviewBoard.Core,
module ReviewBoard.Browser,
userList,
groupList,
groupStar,
groupUnstar,
reviewRequest,
reviewRequestByChangenum,
reviewRequestNew,
reviewRequestDelete,
reviewRequestSet,
reviewRequestSetField,
reviewRequestSaveDraft,
reviewRequestDiscardDraft,
reviewRequestStar,
reviewRequestUnstar,
reviewRequestDiffNew,
reviewRequestScreenshotNew,
reviewRequestListAll,
reviewRequestListToGroup,
reviewRequestListToUser,
reviewRequestListFromUser,
reviewAll,
reviewSaveDraft,
reviewDeleteDraft,
reviewPublishDraft,
repositoryList,
RRField(..),
execRBAction,
rbPostRequest,
rbGetRequest
) where
import ReviewBoard.Core
import ReviewBoard.Browser
import Network.URI
import Network.HTTP
import qualified Network.Browser as NB
import Data.Maybe
import Control.Monad.Error
import Control.Monad.State
userList :: Maybe String -> RBAction RBResponse
userList (Just u) = rbGetRequest "users" [("query", u)]
userList Nothing = rbGetRequest "users" []
groupList :: Maybe String -> RBAction RBResponse
groupList (Just g) = rbGetRequest "groups" [("query", g)]
groupList Nothing = rbGetRequest "groups" []
groupStar :: String -> RBAction RBResponse
groupStar g = rbGetRequest (concat ["groups/", g, "/star"]) []
groupUnstar :: String -> RBAction RBResponse
groupUnstar g = rbGetRequest (concat ["groups/", g, "/unstar"]) []
reviewRequestNew :: String -> Maybe String -> RBAction RBResponse
reviewRequestNew p (Just u) = rbPostRequest "reviewrequests/new" [("repository_path", p), ("submit_as", u)]
reviewRequestNew p Nothing = rbPostRequest "reviewrequests/new" [("repository_path", p)]
reviewRequestDelete :: Integer -> RBAction RBResponse
reviewRequestDelete id = rbPostRequest ("reviewrequests/" ++ show id ++ "/delete") []
reviewRequest :: Integer -> RBAction RBResponse
reviewRequest id = rbPostRequest ("reviewrequests/" ++ show id ) []
reviewRequestByChangenum :: Integer -> Integer -> RBAction RBResponse
reviewRequestByChangenum rId cId = rbPostRequest (concat["reviewrequests/repository/", show rId, "/changenum/", show cId]) []
reviewRequestSaveDraft :: Integer -> RBAction RBResponse
reviewRequestSaveDraft id = rbPostRequest ("reviewrequests/" ++ show id ++ "/draft/save") []
reviewRequestDiscardDraft :: Integer -> RBAction RBResponse
reviewRequestDiscardDraft id = rbPostRequest ("reviewrequests/" ++ show id ++ "/draft/discard") []
reviewRequestSet :: Integer -> [(RRField, String)] -> RBAction RBResponse
reviewRequestSet id fs = rbPostRequest (concat ["reviewrequests/", show id, "/draft/set/"]) (map (\(f, v) -> (show f, v)) fs)
reviewRequestSetField :: Integer -> RRField -> String -> RBAction RBResponse
reviewRequestSetField id f v = rbPostRequest (concat ["reviewrequests/", show id, "/draft/set/", show f]) [("value", v)]
reviewRequestStar :: Integer -> RBAction RBResponse
reviewRequestStar id = rbGetRequest (concat ["reviewrequests/", show id, "/star"]) []
reviewRequestUnstar :: Integer -> RBAction RBResponse
reviewRequestUnstar id = rbGetRequest (concat ["reviewrequests/", show id, "/unstar"]) []
reviewRequestDiffNew :: Integer -> String -> FilePath -> RBAction RBResponse
reviewRequestDiffNew id bd fp = do
uri <- mkURI $ concat ["reviewrequests/", show id, "/diff/new"]
let form = Form POST uri [fileUpload "path" fp "text/plain", textField "basedir" bd]
runRequest form return
reviewRequestScreenshotNew :: Integer -> FilePath -> RBAction RBResponse
reviewRequestScreenshotNew id fp = do
uri <- mkURI $ concat ["reviewrequests/", show id, "/screenshot/new"]
let form = Form POST uri [fileUpload "path" fp ((contentType . extension) fp)]
runRequest form return
where
extension = reverse . takeWhile (/= '.') . reverse
contentType "png" = "image/png"
contentType "gif" = "image/gif"
contentType "jpg" = "image/jpeg"
contentType "jpeg" = "image/jpeg"
contentType _ = "text/plain"
reviewRequestListAll :: Maybe String -> RBAction RBResponse
reviewRequestListAll (Just s) = rbGetRequest "reviewrequests/all" [(show STATUS, s)]
reviewRequestListAll Nothing = rbGetRequest "reviewrequests/all" []
reviewRequestListToGroup :: String -> Maybe String -> RBAction RBResponse
reviewRequestListToGroup g (Just s) = rbGetRequest ("reviewrequests/to/group/" ++ g) [(show STATUS, s)]
reviewRequestListToGroup g Nothing = rbGetRequest ("reviewrequests/to/group/" ++ g) []
reviewRequestListToUser :: String -> Bool -> Maybe String -> RBAction RBResponse
reviewRequestListToUser u True (Just s) = rbGetRequest ("reviewrequests/to/user/" ++ u ++ "/directly") [(show STATUS, s)]
reviewRequestListToUser u True Nothing = rbGetRequest ("reviewrequests/to/user/" ++ u ++ "/directly") []
reviewRequestListToUser u False (Just s) = rbGetRequest ("reviewrequests/to/user/" ++ u) [(show STATUS, s)]
reviewRequestListToUser u False Nothing = rbGetRequest ("reviewrequests/to/user/" ++ u) []
reviewRequestListFromUser :: String -> Maybe String -> RBAction RBResponse
reviewRequestListFromUser u (Just s) = rbGetRequest ("reviewrequests/from/user/" ++ u) [(show STATUS, s)]
reviewRequestListFromUser u Nothing = rbGetRequest ("reviewrequests/from/user/" ++ u) []
reviewAll :: Integer -> RBAction RBResponse
reviewAll id = rbGetRequest ("reviewrequests/" ++ show id ++ "/reviews") []
reviewPublishDraft :: Integer -> RBAction RBResponse
reviewPublishDraft id = rbPostRequest ("reviewrequests/" ++ show id ++ "/reviews/draft/publish") [("shipit", "False")]
reviewSaveDraft :: Integer -> RBAction RBResponse
reviewSaveDraft id = rbPostRequest ("reviewrequests/" ++ show id ++ "/reviews/draft/save") []
reviewDeleteDraft :: Integer -> RBAction RBResponse
reviewDeleteDraft id = rbPostRequest ("reviewrequests/" ++ show id ++ "/reviews/draft/delete") []
repositoryList :: RBAction RBResponse
repositoryList = rbGetRequest "repositories" []
data RRField
= STATUS
| PUBLIC
| SUMMARY
| DESCRIPTION
| TESTING_DONE
| BUGS_CLOSED
| BRANCH
| TARGET_GROUPS
| TARGET_PEOPLE
deriving (Eq, Enum, Bounded)
rrFieldMap :: [(RRField, String)]
rrFieldMap =
[ (STATUS, "status")
, (PUBLIC, "public")
, (SUMMARY, "summary")
, (DESCRIPTION, "description")
, (TESTING_DONE, "testing_done")
, (BUGS_CLOSED, "bugs_closed")
, (BRANCH, "branch")
, (TARGET_GROUPS, "target_groups")
, (TARGET_PEOPLE, "target_people") ]
instance Show RRField where
show = fromJust . flip lookup rrFieldMap
execRBAction :: String -> String -> String -> (RBAction a) -> IO a
execRBAction url user password action = do
r <- runRBAction url user password action
either error return $ fst r
rbPostRequest :: String -> [(String, String)] -> RBAction RBResponse
rbPostRequest = rbRequest POST
rbGetRequest :: String -> [(String, String)] -> RBAction RBResponse
rbGetRequest = rbRequest GET
rbRequest :: RequestMethod -> String -> [(String, String)] -> RBAction RBResponse
rbRequest rm apiUrl attrs = do
uri <- mkURI apiUrl
let form = Form rm uri (map (\(n, v) -> textField n v) attrs)
runRequest form return