diff --git a/handler/message_created.go b/handler/message_created.go index 4bc3404..6dbe9db 100644 --- a/handler/message_created.go +++ b/handler/message_created.go @@ -147,6 +147,22 @@ func (h *BotHandler) invite(p *payload.MessageCreated) { return } + inOrg, err := h.githubClient.CheckUserInOrg(ctx, gitHubID) + if err != nil { + log.Println("failed to check user in org: ", err) + return + } + + if inOrg { + _, err := h.traqClient.PostMessage(ctx, p.Message.ChannelID, + fmt.Sprintf("GitHubユーザー %s は既に %s に所属しています", gitHubID, h.githubClient.OrgName())) + if err != nil { + log.Println("failed to post message: ", err) + } + + return + } + traQIDs = append(traQIDs, traQID) gitHubIDs = append(gitHubIDs, gitHubID) } diff --git a/handler/message_created_test.go b/handler/message_created_test.go index 43844d4..6ab4709 100644 --- a/handler/message_created_test.go +++ b/handler/message_created_test.go @@ -26,6 +26,7 @@ func TestInvite(t *testing.T) { messageID string embedded []payload.EmbeddedInfo gitHubUserExist bool + belongToOrg bool postTextFunc func(test) string postToBotChannel bool invitations []*model.Invitation @@ -122,6 +123,18 @@ https://q.trap.jp/messages/%s`, t.messageID) return "GitHubユーザー no-user は存在しません" }, }, + "すでに所属している": { + plainText: "@BOT_traP-jp /invite @ikura-hamu ikura-hamu", + messageID: messageID, + embedded: []payload.EmbeddedInfo{ + {Type: "user", Raw: "@BOT_traP-jp", ID: botUserID}, + }, + gitHubUserExist: true, + belongToOrg: true, + postTextFunc: func(test) string { + return fmt.Sprintf("GitHubユーザー ikura-hamu は既に traP-jp に所属しています") + }, + }, } for name, test := range testCases { @@ -148,6 +161,12 @@ https://q.trap.jp/messages/%s`, t.messageID) CheckUserExistFunc: func(ctx context.Context, userID string) (bool, error) { return test.gitHubUserExist, nil }, + CheckUserInOrgFunc: func(ctx context.Context, userID string) (bool, error) { + return test.belongToOrg, nil + }, + OrgNameFunc: func() string { + return "traP-jp" + }, } bh := &BotHandler{ diff --git a/service/github.go b/service/github.go index 7fc9eda..c5fac72 100644 --- a/service/github.go +++ b/service/github.go @@ -11,5 +11,6 @@ import ( type GitHub interface { SendInvitations(ctx context.Context, invitations []*model.Invitation) error CheckUserExist(ctx context.Context, userID string) (bool, error) + CheckUserInOrg(ctx context.Context, userID string) (bool, error) OrgName() string } diff --git a/service/impl/github.go b/service/impl/github.go index 2e018a6..439d3ab 100644 --- a/service/impl/github.go +++ b/service/impl/github.go @@ -97,6 +97,19 @@ func (g *GitHub) CheckUserExist(ctx context.Context, userID string) (bool, error return true, nil } +func (g *GitHub) CheckUserInOrg(ctx context.Context, userID string) (bool, error) { + _, _, err := g.cl.Organizations.GetOrgMembership(ctx, userID, g.orgName) + var gitHubErr *github.ErrorResponse + if errors.As(err, &gitHubErr) && gitHubErr.Response.StatusCode == 404 { + return false, nil + } + if err != nil { + return false, fmt.Errorf("failed to get GitHub org membership: %w", err) + } + + return true, nil +} + func (g *GitHub) OrgName() string { return g.orgName }