module GitLab.SystemHooks.Rules (ruleAddMembers, ruleAddNewUserToGroups) where
import Control.Monad
import Data.Text (Text)
import GitLab.API.Groups
import GitLab.API.Members
import GitLab.API.Projects
import GitLab.API.Users
import GitLab.SystemHooks.Types
import GitLab.Types
ruleAddNewUserToGroups ::
String ->
[Text] ->
[Text] ->
Rule
ruleAddNewUserToGroups :: String -> [Text] -> [Text] -> Rule
ruleAddNewUserToGroups String
lbl [Text]
nonRegisteredUsernames [Text]
groupNames =
String
-> (UserCreate -> GitLab Bool) -> (UserCreate -> GitLab ()) -> Rule
forall a.
SystemHook a =>
String -> (a -> GitLab Bool) -> (a -> GitLab ()) -> Rule
matchIf
String
lbl
( \event :: UserCreate
event@UserCreate {} -> do
Bool -> GitLab Bool
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (UserCreate -> Text
userCreate_username UserCreate
event Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
nonRegisteredUsernames)
)
( \event :: UserCreate
event@UserCreate {} -> do
(Text -> GitLab ()) -> [Text] -> GitLab ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_
( \Text
groupName -> do
[Group]
grps <- ListGroupsAttrs -> GitLab [Group]
groups (ListGroupsAttrs
defaultListGroupsFilters {listGroupsFilter_search = Just groupName})
case [Group]
grps of
[] -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
[Group
grp] -> do
Either (Response ByteString) (Maybe User)
result <- Int -> GitLab (Either (Response ByteString) (Maybe User))
user (UserCreate -> Int
userCreate_user_id UserCreate
event)
case Either (Response ByteString) (Maybe User)
result of
Left Response ByteString
_ -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Right Maybe User
Nothing -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Right (Just User
usr) ->
GitLabT IO (Either (Response ByteString) (Maybe Member))
-> GitLab ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (GitLabT IO (Either (Response ByteString) (Maybe Member))
-> GitLab ())
-> GitLabT IO (Either (Response ByteString) (Maybe Member))
-> GitLab ()
forall a b. (a -> b) -> a -> b
$
Group
-> AccessLevel
-> User
-> GitLabT IO (Either (Response ByteString) (Maybe Member))
addUserToGroup Group
grp AccessLevel
Reporter User
usr
(Group
_ : [Group]
_) -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
)
[Text]
groupNames
)
ruleAddMembers ::
String ->
[Text] ->
[Text] ->
Rule
ruleAddMembers :: String -> [Text] -> [Text] -> Rule
ruleAddMembers String
label [Text]
projectNames [Text]
userNames =
String
-> (ProjectCreate -> GitLab Bool)
-> (ProjectCreate -> GitLab ())
-> Rule
forall a.
SystemHook a =>
String -> (a -> GitLab Bool) -> (a -> GitLab ()) -> Rule
matchIf
String
label
( \event :: ProjectCreate
event@ProjectCreate {} -> do
Either (Response ByteString) (Maybe Project)
request <- Int -> GitLab (Either (Response ByteString) (Maybe Project))
project (ProjectCreate -> Int
projectCreate_project_id ProjectCreate
event)
case Either (Response ByteString) (Maybe Project)
request of
Left Response ByteString
_ -> Bool -> GitLab Bool
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
Right Maybe Project
Nothing -> Bool -> GitLab Bool
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
Right (Just Project
prj) ->
Bool -> GitLab Bool
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return
( Project -> Text
project_path Project
prj
Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
projectNames
)
)
( \event :: ProjectCreate
event@ProjectCreate {} -> do
(Text -> GitLab ()) -> [Text] -> GitLab ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_
( \Text
userName -> do
Maybe User
request <- Text -> GitLab (Maybe User)
searchUser Text
userName
case Maybe User
request of
Maybe User
Nothing -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just User
foundUser -> do
Either (Response ByteString) (Maybe Project)
result <- Int -> GitLab (Either (Response ByteString) (Maybe Project))
project (ProjectCreate -> Int
projectCreate_project_id ProjectCreate
event)
case Either (Response ByteString) (Maybe Project)
result of
Right (Just Project
prj) ->
GitLabT IO (Either (Response ByteString) (Maybe Member))
-> GitLab ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (GitLabT IO (Either (Response ByteString) (Maybe Member))
-> GitLab ())
-> GitLabT IO (Either (Response ByteString) (Maybe Member))
-> GitLab ()
forall a b. (a -> b) -> a -> b
$
Project
-> AccessLevel
-> User
-> GitLabT IO (Either (Response ByteString) (Maybe Member))
addMemberToProject
Project
prj
AccessLevel
Reporter
User
foundUser
Right Maybe Project
Nothing -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Left Response ByteString
_ -> () -> GitLab ()
forall a. a -> GitLabT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
)
[Text]
userNames
)