octohat-0.1.4: src-demo/Web/GitHub/CLI/Actions.hs
module Web.GitHub.CLI.Actions
( findTeamsInOrganization
, addUserToTeamInOrganization
, deleteUserFromTeamInOrganization
, findMembersInTeam) where
import Web.GitHub.CLI.Messages
import Network.Octohat.Members (teamsForOrganization, deleteMemberFromTeam)
import Network.Octohat
import Network.Octohat.Types
import qualified Data.Text as T
import Data.Yaml as Y
import Data.List (find)
import Data.ByteString.UTF8 (toString)
import System.IO (hPutStrLn, stderr)
import System.Exit (ExitCode(..), exitWith)
findTeamsInOrganization :: OrganizationName -> IO ()
findTeamsInOrganization nameOfOrg = do
teamListing <- runGitHub $ teamsForOrganization nameOfOrg
case teamListing of
Left status -> errorHandler $ commandMessage status
Right teams -> putStrLn (toString $ Y.encode teams)
addUserToTeamInOrganization :: String -> OrganizationName -> TeamName -> IO ()
addUserToTeamInOrganization nameOfUser nameOfOrg nameOfTeam = do
addResult <- runGitHub $ addUserToTeam (T.pack nameOfUser) nameOfOrg nameOfTeam
case addResult of
Left status -> errorHandler $ commandMessage status
Right Pending -> putStrLn "User invited to join team"
Right Active -> putStrLn "User added to team"
deleteUserFromTeamInOrganization :: String -> OrganizationName -> TeamName -> IO ()
deleteUserFromTeamInOrganization nameOfUser nameOfOrg nameOfTeam = do
teamListing <- runGitHub $ teamsForOrganization nameOfOrg
case teamListing of
Left status -> errorHandler $ commandMessage status
Right [] -> errorHandler "No teams found on this organization"
Right teams -> getTheTeamAndDeleteUser nameOfUser nameOfTeam teams
findMembersInTeam :: OrganizationName -> TeamName -> IO ()
findMembersInTeam nameOfOrg nameOfTeam = do
memberListing <- runGitHub $ membersOfTeamInOrganization nameOfOrg nameOfTeam
case memberListing of
Left status -> errorHandler $ commandMessage status
Right members -> putStrLn (toString $ Y.encode members)
errorHandler :: String -> IO ()
errorHandler message = hPutStrLn stderr message >> exitWith (ExitFailure 1)
getTheTeamAndDeleteUser :: String -> TeamName -> [Team] -> IO ()
getTheTeamAndDeleteUser nameOfUser nameOfTeam teams =
case (getTeam teams) of
Nothing -> errorHandler "There's no such team in that organization"
Just team -> do
result <- runGitHub $ deleteMemberFromTeam (T.pack nameOfUser) (teamId team)
case result of
Left status -> errorHandler $ commandMessage status
Right NotDeleted -> errorHandler "The user could not be deleted from the team"
Right Deleted -> putStrLn "The user was succesfully deleted from the team"
where getTeam = find (\t -> (teamName t) == (unTeamName nameOfTeam))