{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module GitLab.API.Groups where
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import GitLab.API.Members
import GitLab.API.Users
import GitLab.Types
import GitLab.WebRequests.GitLabWebCalls
import Network.HTTP.Types.Status
import Network.HTTP.Types.URI
groupsWithNameOrPath ::
Text ->
GitLab (Either Status [Group])
groupsWithNameOrPath :: Text -> GitLab (Either Status [Group])
groupsWithNameOrPath Text
groupName = do
Either Status [Group]
result <- Text -> Text -> GitLab (Either Status [Group])
forall a. FromJSON a => Text -> Text -> GitLab (Either Status [a])
gitlabWithAttrs Text
"/groups" (Text
"&search=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
groupName)
case Either Status [Group]
result of
Left {} -> Either Status [Group] -> GitLab (Either Status [Group])
forall (m :: * -> *) a. Monad m => a -> m a
return Either Status [Group]
result
Right [Group]
groups ->
Either Status [Group] -> GitLab (Either Status [Group])
forall (m :: * -> *) a. Monad m => a -> m a
return
( [Group] -> Either Status [Group]
forall a b. b -> Either a b
Right
([Group] -> Either Status [Group])
-> [Group] -> Either Status [Group]
forall a b. (a -> b) -> a -> b
$(Group -> Bool) -> [Group] -> [Group]
forall a. (a -> Bool) -> [a] -> [a]
filter
( \Group
group ->
Text
groupName Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Group -> Text
group_name Group
group
Bool -> Bool -> Bool
|| Text
groupName Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Group -> Text
group_path Group
group
)
[Group]
groups
)
addAllUsersToGroup ::
Text ->
AccessLevel ->
GitLab [Either Status (Maybe Member)]
addAllUsersToGroup :: Text -> AccessLevel -> GitLab [Either Status (Maybe Member)]
addAllUsersToGroup Text
groupName AccessLevel
access = do
[User]
allRegisteredUsers <- GitLab [User]
allUsers
let allUserIds :: [Text]
allUserIds = (User -> Text) -> [User] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map User -> Text
user_username [User]
allRegisteredUsers
Text
-> AccessLevel -> [Text] -> GitLab [Either Status (Maybe Member)]
addUsersToGroup' Text
groupName AccessLevel
access [Text]
allUserIds
addUserToGroup ::
Text ->
AccessLevel ->
User ->
GitLab (Either Status (Maybe Member))
addUserToGroup :: Text
-> AccessLevel -> User -> GitLab (Either Status (Maybe Member))
addUserToGroup Text
groupName AccessLevel
access User
usr =
Text -> AccessLevel -> Int -> GitLab (Either Status (Maybe Member))
addUserToGroup' Text
groupName AccessLevel
access (User -> Int
user_id User
usr)
addUserToGroup' ::
Text ->
AccessLevel ->
Int ->
GitLab (Either Status (Maybe Member))
addUserToGroup' :: Text -> AccessLevel -> Int -> GitLab (Either Status (Maybe Member))
addUserToGroup' Text
groupName AccessLevel
access Int
usrId = do
Either Status [Group]
attempt <- Text -> GitLab (Either Status [Group])
groupsWithNameOrPath Text
groupName
case Either Status [Group]
attempt of
Left Status
httpStatus -> Either Status (Maybe Member)
-> GitLab (Either Status (Maybe Member))
forall (m :: * -> *) a. Monad m => a -> m a
return (Status -> Either Status (Maybe Member)
forall a b. a -> Either a b
Left Status
httpStatus)
Right [] -> Either Status (Maybe Member)
-> GitLab (Either Status (Maybe Member))
forall (m :: * -> *) a. Monad m => a -> m a
return (Status -> Either Status (Maybe Member)
forall a b. a -> Either a b
Left (Int -> ByteString -> Status
mkStatus Int
404 (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack String
"cannot find group"))))
Right [Group
grp] ->
Text -> Text -> GitLab (Either Status (Maybe Member))
forall b.
FromJSON b =>
Text -> Text -> GitLab (Either Status (Maybe b))
gitlabPost Text
addr Text
dataBody
where
dataBody :: Text
dataBody :: Text
dataBody =
Text
"user_id=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
usrId) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"&access_level="
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (AccessLevel -> String
forall a. Show a => a -> String
show AccessLevel
access)
addr :: Text
addr =
Text
"/groups/"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ByteString -> Text
T.decodeUtf8 (Bool -> ByteString -> ByteString
urlEncode Bool
False (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show (Group -> Int
group_id Group
grp)))))
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/members"
Right (Group
_ : [Group]
_) ->
Either Status (Maybe Member)
-> GitLab (Either Status (Maybe Member))
forall (m :: * -> *) a. Monad m => a -> m a
return (Status -> Either Status (Maybe Member)
forall a b. a -> Either a b
Left (Int -> ByteString -> Status
mkStatus Int
404 (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack String
"too many groups found"))))
addUsersToGroup ::
Text ->
AccessLevel ->
[User] ->
GitLab [Either Status (Maybe Member)]
addUsersToGroup :: Text
-> AccessLevel -> [User] -> GitLab [Either Status (Maybe Member)]
addUsersToGroup Text
groupName AccessLevel
access =
(User -> GitLab (Either Status (Maybe Member)))
-> [User] -> GitLab [Either Status (Maybe Member)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Text
-> AccessLevel -> User -> GitLab (Either Status (Maybe Member))
addUserToGroup Text
groupName AccessLevel
access)
addUsersToGroup' ::
Text ->
AccessLevel ->
[Text] ->
GitLab [Either Status (Maybe Member)]
addUsersToGroup' :: Text
-> AccessLevel -> [Text] -> GitLab [Either Status (Maybe Member)]
addUsersToGroup' Text
groupName AccessLevel
access [Text]
usernames = do
[User]
users <- [Maybe User] -> [User]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe User] -> [User])
-> ReaderT GitLabState IO [Maybe User] -> GitLab [User]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> ReaderT GitLabState IO (Maybe User))
-> [Text] -> ReaderT GitLabState IO [Maybe User]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Text -> ReaderT GitLabState IO (Maybe User)
searchUser [Text]
usernames
(User -> GitLab (Either Status (Maybe Member)))
-> [User] -> GitLab [Either Status (Maybe Member)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Text -> AccessLevel -> Int -> GitLab (Either Status (Maybe Member))
addUserToGroup' Text
groupName AccessLevel
access (Int -> GitLab (Either Status (Maybe Member)))
-> (User -> Int) -> User -> GitLab (Either Status (Maybe Member))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. User -> Int
user_id) [User]
users