{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
module GitLab.API.Groups where
import Control.Monad.IO.Class
import Control.Monad.IO.Unlift
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as T
import Network.HTTP.Types.Status
import GitLab.API.Members
import GitLab.API.Users
import GitLab.Types
import GitLab.WebRequests.GitLabWebCalls
groupsWithName :: (MonadUnliftIO m, MonadIO m)
=> Text
-> GitLab m [Group]
groupsWithName groupName =
filter (\group -> groupName == group_path group) <$>
gitlabWithAttrs "/groups" ("&search=" <> groupName)
addAllUsersToGroup ::
(MonadIO m)
=> Text
-> AccessLevel
-> GitLab m [Either Status Member]
addAllUsersToGroup groupName access = do
allRegisteredUsers <- allUsers
let allUserIds = map user_username allRegisteredUsers
addUsersToGroup groupName access allUserIds
addUserToGroup ::
(MonadIO m)
=> Text
-> AccessLevel
-> User
-> GitLab m (Either Status Member)
addUserToGroup groupName access usr =
addUserToGroup' groupName access (user_id usr)
addUsersToGroup ::
(MonadIO m)
=> Text
-> AccessLevel
-> [Text]
-> GitLab m [Either Status Member]
addUsersToGroup groupName access usernames = do
users <- catMaybes <$> mapM searchUser usernames
mapM (addUserToGroup' groupName access . user_id) users
addUserToGroup' ::
(MonadIO m)
=> Text
-> AccessLevel
-> Int
-> GitLab m (Either Status Member)
addUserToGroup' groupName access userId = gitlabPost addr dataBody
where
dataBody :: Text
dataBody =
"user_id=" <> T.pack (show userId) <> "&access_level=" <>
T.pack (show access)
addr = "/groups/" <> groupName <> "/members"