Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add GitLab system hooks #162

Merged
merged 5 commits into from
May 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 142 additions & 16 deletions gitlab/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,41 @@ var (

// GitLab hook types
const (
PushEvents Event = "Push Hook"
TagEvents Event = "Tag Push Hook"
IssuesEvents Event = "Issue Hook"
ConfidentialIssuesEvents Event = "Confidential Issue Hook"
CommentEvents Event = "Note Hook"
MergeRequestEvents Event = "Merge Request Hook"
WikiPageEvents Event = "Wiki Page Hook"
PipelineEvents Event = "Pipeline Hook"
BuildEvents Event = "Build Hook"
JobEvents Event = "Job Hook"
SystemHookEvents Event = "System Hook"

objectPush string = "push"
objectTag string = "tag_push"
objectMergeRequest string = "merge_request"
objectBuild string = "build"
PushEvents Event = "Push Hook"
TagEvents Event = "Tag Push Hook"
IssuesEvents Event = "Issue Hook"
ConfidentialIssuesEvents Event = "Confidential Issue Hook"
CommentEvents Event = "Note Hook"
MergeRequestEvents Event = "Merge Request Hook"
WikiPageEvents Event = "Wiki Page Hook"
PipelineEvents Event = "Pipeline Hook"
BuildEvents Event = "Build Hook"
JobEvents Event = "Job Hook"
SystemHookEvents Event = "System Hook"
objectPush string = "push"
objectTag string = "tag_push"
objectMergeRequest string = "merge_request"
objectBuild string = "build"
eventProjectCreate string = "project_create"
eventProjectDestroy string = "project_destroy"
eventProjectRename string = "project_rename"
eventProjectTransfer string = "project_transfer"
eventProjectUpdate string = "project_update"
eventUserAddToTeam string = "user_add_to_team"
eventUserRemoveFromTeam string = "user_remove_from_team"
eventUserUpdateForTeam string = "user_update_for_team"
eventUserCreate string = "user_create"
eventUserDestroy string = "user_destroy"
eventUserFailedLogin string = "user_failed_login"
eventUserRename string = "user_rename"
eventKeyCreate string = "key_create"
eventKeyDestroy string = "key_destroy"
eventGroupCreate string = "group_create"
eventGroupDestroy string = "group_destroy"
eventGroupRename string = "group_rename"
eventUserAddToGroup string = "user_add_to_group"
eventUserRemoveFromGroup string = "user_remove_from_group"
eventUserUpdateForGroup string = "user_update_for_group"
)

// Option is a configuration option for the webhook
Expand Down Expand Up @@ -173,6 +192,7 @@ func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{
var pl BuildEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case JobEvents:
var pl JobEventPayload
err := json.Unmarshal([]byte(payload), &pl)
Expand All @@ -190,21 +210,127 @@ func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{
if err != nil {
return nil, err
}

switch pl.ObjectKind {
case objectPush:
return eventParsing(PushEvents, events, payload)

case objectTag:
return eventParsing(TagEvents, events, payload)

case objectMergeRequest:
return eventParsing(MergeRequestEvents, events, payload)
default:
switch pl.EventName {
case objectPush:
return eventParsing(PushEvents, events, payload)

case objectTag:
return eventParsing(TagEvents, events, payload)

case objectMergeRequest:
return eventParsing(MergeRequestEvents, events, payload)

case eventProjectCreate:
var pl ProjectCreatedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventProjectDestroy:
var pl ProjectDestroyedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventProjectRename:
var pl ProjectRenamedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventProjectTransfer:
var pl ProjectTransferredEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventProjectUpdate:
var pl ProjectUpdatedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserAddToTeam:
var pl TeamMemberAddedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserRemoveFromTeam:
var pl TeamMemberRemovedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserUpdateForTeam:
var pl TeamMemberUpdatedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserCreate:
var pl UserCreatedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserDestroy:
var pl UserRemovedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserFailedLogin:
var pl UserFailedLoginEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserRename:
var pl UserRenamedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventKeyCreate:
var pl KeyAddedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventKeyDestroy:
var pl KeyRemovedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventGroupCreate:
var pl GroupCreatedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventGroupDestroy:
var pl GroupRemovedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventGroupRename:
var pl GroupRenamedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserAddToGroup:
var pl GroupMemberAddedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserRemoveFromGroup:
var pl GroupMemberRemovedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

case eventUserUpdateForGroup:
var pl GroupMemberUpdatedEventPayload
err := json.Unmarshal([]byte(payload), &pl)
return pl, err

default:
return nil, fmt.Errorf("unknown system hook event %s", gitLabEvent)
}
Expand Down
120 changes: 120 additions & 0 deletions gitlab/gitlab_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,126 @@ func TestSystemHooks(t *testing.T) {
typ: MergeRequestEventPayload{},
filename: "../testdata/gitlab/system-merge-request-event.json",
},
{
name: "ProjectCreatedEvent",
event: SystemHookEvents,
typ: ProjectCreatedEventPayload{},
filename: "../testdata/gitlab/system-project-created.json",
},
{
name: "ProjectDestroyedEvent",
event: SystemHookEvents,
typ: ProjectDestroyedEventPayload{},
filename: "../testdata/gitlab/system-project-destroyed.json",
},
{
name: "ProjectRenamedEvent",
event: SystemHookEvents,
typ: ProjectRenamedEventPayload{},
filename: "../testdata/gitlab/system-project-renamed.json",
},
{
name: "ProjectTransferredEvent",
event: SystemHookEvents,
typ: ProjectTransferredEventPayload{},
filename: "../testdata/gitlab/system-project-transferred.json",
},
{
name: "ProjectUpdatedEvent",
event: SystemHookEvents,
typ: ProjectUpdatedEventPayload{},
filename: "../testdata/gitlab/system-project-updated.json",
},
{
name: "TeamMemberAddedEvent",
event: SystemHookEvents,
typ: TeamMemberAddedEventPayload{},
filename: "../testdata/gitlab/system-team-member-added.json",
},
{
name: "TeamMemberRemovedEvent",
event: SystemHookEvents,
typ: TeamMemberRemovedEventPayload{},
filename: "../testdata/gitlab/system-team-member-removed.json",
},
{
name: "TeamMemberUpdatedEvent",
event: SystemHookEvents,
typ: TeamMemberUpdatedEventPayload{},
filename: "../testdata/gitlab/system-team-member-updated.json",
},
{
name: "UserCreatedEvent",
event: SystemHookEvents,
typ: UserCreatedEventPayload{},
filename: "../testdata/gitlab/system-user-created.json",
},
{
name: "UserRemovedEvent",
event: SystemHookEvents,
typ: UserRemovedEventPayload{},
filename: "../testdata/gitlab/system-user-removed.json",
},
{
name: "UserFailedLoginEvent",
event: SystemHookEvents,
typ: UserFailedLoginEventPayload{},
filename: "../testdata/gitlab/system-user-failed-login.json",
},
{
name: "UserRenamedEvent",
event: SystemHookEvents,
typ: UserRenamedEventPayload{},
filename: "../testdata/gitlab/system-user-renamed.json",
},
{
name: "KeyAddedEvent",
event: SystemHookEvents,
typ: KeyAddedEventPayload{},
filename: "../testdata/gitlab/system-key-added.json",
},
{
name: "KeyRemovedEvent",
event: SystemHookEvents,
typ: KeyRemovedEventPayload{},
filename: "../testdata/gitlab/system-key-removed.json",
},
{
name: "GroupCreatedEvent",
event: SystemHookEvents,
typ: GroupCreatedEventPayload{},
filename: "../testdata/gitlab/system-group-created.json",
},
{
name: "GroupRemovedEvent",
event: SystemHookEvents,
typ: GroupRemovedEventPayload{},
filename: "../testdata/gitlab/system-group-removed.json",
},
{
name: "GroupRenamedEvent",
event: SystemHookEvents,
typ: GroupRenamedEventPayload{},
filename: "../testdata/gitlab/system-group-renamed.json",
},
{
name: "GroupMemberAddedEvent",
event: SystemHookEvents,
typ: GroupMemberAddedEventPayload{},
filename: "../testdata/gitlab/system-group-member-added.json",
},
{
name: "GroupMemberRemovedEvent",
event: SystemHookEvents,
typ: GroupMemberRemovedEventPayload{},
filename: "../testdata/gitlab/system-group-member-removed.json",
},
{
name: "GroupMemberUpdatedEvent",
event: SystemHookEvents,
typ: GroupMemberUpdatedEventPayload{},
filename: "../testdata/gitlab/system-group-member-updated.json",
},
}
for _, tt := range tests {
tc := tt
Expand Down
Loading