packages feed

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))