Skip to content

Commit 917cfb9

Browse files
authored
Merge pull request #27 from irisgve/add-member-methods
Add methods for accessing member APIs
2 parents 953bcb9 + 86f5f42 commit 917cfb9

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed

member.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package sentry
2+
3+
import (
4+
"fmt"
5+
"net/url"
6+
"time"
7+
)
8+
9+
// Member is a sentry member
10+
type Member struct {
11+
Email string `json:"email,omitempty"`
12+
Expired *bool `json:"expired,omitempty"`
13+
Name *string `json:"name,omitempty"`
14+
IsPending *bool `json:"isPending,omitempty"`
15+
DateCreated *time.Time `json:"dateCreated,omitempty"`
16+
Role string `json:"role,omitempty"`
17+
ID *string `json:"id,omitempty"`
18+
RoleName *string `json:"roleName,omitempty"`
19+
Teams []string `json:"teams,omitempty"`
20+
}
21+
22+
type memberQuery struct {
23+
query string `json:"query,omitempty"`
24+
}
25+
26+
func (o *memberQuery) ToQueryString() string {
27+
query := url.Values{}
28+
query.Add("query", string(o.query))
29+
return query.Encode()
30+
}
31+
32+
// CreateMember takes an email and creates a new member
33+
func (c *Client) CreateMember(o Organization, email string) (Member, error) {
34+
var member Member
35+
memberRole := "member"
36+
memberreq := Member{
37+
Email: email,
38+
Role: memberRole,
39+
}
40+
41+
err := c.do("POST", fmt.Sprintf("organizations/%s/members", *o.Slug), &member, &memberreq)
42+
return member, err
43+
}
44+
45+
// GetMemberByEmail takes a user email and returns back the user
46+
func (c *Client) GetMemberByEmail(o Organization, memberEmail string) (Member, error) {
47+
var members []Member
48+
49+
err := c.doWithQuery("GET", fmt.Sprintf("organizations/%s/members", *o.Slug), &members, nil, &memberQuery{memberEmail})
50+
if err != nil {
51+
return Member{}, fmt.Errorf("failed to get member with error: %s", err.Error())
52+
}
53+
54+
if len(members) == 0 {
55+
return Member{}, fmt.Errorf("no member with that email found")
56+
}
57+
58+
return members[0], err
59+
}
60+
61+
// AddExistingMemberToTeam takes a member and adds them to a team
62+
func (c *Client) AddExistingMemberToTeam(o Organization, t Team, m Member) error {
63+
return c.do("POST", fmt.Sprintf("organizations/%s/members/%s/teams/%s", *o.Slug, *m.ID, *t.Slug), nil, nil)
64+
}
65+
66+
// DeleteMember takes a member and deletes from the org
67+
func (c *Client) DeleteMember(o Organization, m Member) error {
68+
return c.do("DELETE", fmt.Sprintf("organizations/%s/members/%s", *o.Slug, *m.ID), nil, nil)
69+
}
70+
71+
// MakeAdmin takes a member and makes them admin
72+
func (c *Client) MakeAdmin(o Organization, a Member) error {
73+
a.Role = "admin"
74+
75+
return c.do("PUT", fmt.Sprintf("organizations/%s/members/%s", *o.Slug, *a.ID), nil, &a)
76+
}

member_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package sentry
2+
3+
import (
4+
"testing"
5+
)
6+
7+
const testEmail = "[email protected]"
8+
9+
func createMemberHelper(t *testing.T, org Organization) (Member, func() error) {
10+
client := newTestClient(t)
11+
12+
member, err := client.CreateMember(org, testEmail)
13+
if err != nil {
14+
t.Fatal(err)
15+
}
16+
17+
return member, func() error {
18+
return client.DeleteMember(org, member)
19+
}
20+
}
21+
22+
func getMemberHelper(t *testing.T, org Organization, email string) Member {
23+
client := newTestClient(t)
24+
25+
member, err := client.GetMemberByEmail(org, testEmail)
26+
if err != nil {
27+
t.Error(err)
28+
}
29+
30+
return member
31+
}
32+
33+
func TestMemberResource(t *testing.T) {
34+
t.Parallel()
35+
36+
client := newTestClient(t)
37+
org, err := client.GetOrganization(getDefaultOrg())
38+
if err != nil {
39+
t.Fatal(err)
40+
}
41+
42+
team, cleanUpTeam := createTeamHelper(t)
43+
defer cleanUpTeam()
44+
45+
member, cleanUpMember := createMemberHelper(t, org)
46+
defer cleanUpMember()
47+
48+
t.Run("Fetch member by email returns error if non existing member", func(t *testing.T) {
49+
_, err := client.GetMemberByEmail(org, "[email protected]")
50+
if err == nil {
51+
t.Error("Should have returned error for non existing member")
52+
}
53+
})
54+
55+
t.Run("Add member to team", func(t *testing.T) {
56+
if err := client.AddExistingMemberToTeam(org, team, member); err != nil {
57+
t.Error(err)
58+
}
59+
})
60+
61+
t.Run("Make member admin", func(t *testing.T) {
62+
if err := client.MakeAdmin(org, member); err != nil {
63+
t.Error(err)
64+
}
65+
66+
member := getMemberHelper(t, org, testEmail)
67+
if member.Role != "admin" {
68+
t.Error("Member not made admin")
69+
}
70+
})
71+
}

0 commit comments

Comments
 (0)