Skip to content

Commit c174ab7

Browse files
authored
chore: add block user feature (#280)
1 parent b205b63 commit c174ab7

File tree

2 files changed

+152
-0
lines changed

2 files changed

+152
-0
lines changed

user.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type User struct {
4545
LastActive *time.Time `json:"last_active,omitempty"`
4646

4747
Mutes []*Mute `json:"mutes,omitempty"`
48+
BlockedUserIDs []string `json:"blocked_user_ids"`
4849
ChannelMutes []*ChannelMute `json:"channel_mutes,omitempty"`
4950
ExtraData map[string]interface{} `json:"-"`
5051
RevokeTokensIssuedBefore *time.Time `json:"revoke_tokens_issued_before,omitempty"`
@@ -112,6 +113,94 @@ func (c *Client) MuteUser(ctx context.Context, targetID, mutedBy string, options
112113
return &resp, err
113114
}
114115

116+
type BlockUsersResponse struct {
117+
Response
118+
BlockedByUserID string `json:"blocked_by_user_id"`
119+
BlockedUserID string `json:"blocked_user_id"`
120+
CreatedAt time.Time `json:"created_at"`
121+
}
122+
123+
type userBlockOptions struct {
124+
BlockedUserID string `json:"blocked_user_id"`
125+
UserID string `json:"user_id"`
126+
}
127+
128+
// BlockUser blocks targetID.
129+
func (c *Client) BlockUser(ctx context.Context, targetID, userID string) (*BlockUsersResponse, error) {
130+
switch {
131+
case targetID == "":
132+
return nil, errors.New("targetID should not be empty")
133+
case userID == "":
134+
return nil, errors.New("userID should not be empty")
135+
}
136+
137+
opts := &userBlockOptions{
138+
BlockedUserID: targetID,
139+
UserID: userID,
140+
}
141+
142+
var resp BlockUsersResponse
143+
err := c.makeRequest(ctx, http.MethodPost, "users/block", nil, opts, &resp)
144+
return &resp, err
145+
}
146+
147+
type UnblockUsersResponse struct {
148+
Response
149+
}
150+
151+
type userUnblockOptions struct {
152+
BlockedUserID string `json:"blocked_user_id"`
153+
UserID string `json:"user_id"`
154+
}
155+
156+
// UnblockUser Unblocks targetID.
157+
func (c *Client) UnblockUser(ctx context.Context, targetID, userID string) (*UnblockUsersResponse, error) {
158+
switch {
159+
case targetID == "":
160+
return nil, errors.New("targetID should not be empty")
161+
case userID == "":
162+
return nil, errors.New("userID should not be empty")
163+
}
164+
165+
opts := &userUnblockOptions{
166+
BlockedUserID: targetID,
167+
UserID: userID,
168+
}
169+
170+
var resp UnblockUsersResponse
171+
err := c.makeRequest(ctx, http.MethodPost, "users/unblock", nil, opts, &resp)
172+
return &resp, err
173+
}
174+
175+
type GetBlockedUsersResponse struct {
176+
Response
177+
BlockedUsers []*BlockedUserResponse `json:"blocks"`
178+
}
179+
180+
type BlockedUserResponse struct {
181+
BlockedByUser UsersResponse `json:"user"`
182+
BlockedByUserID string `json:"user_id"`
183+
184+
BlockedUser UsersResponse `json:"blocked_user"`
185+
BlockedUserID string `json:"blocked_user_id"`
186+
CreatedAt time.Time `json:"created_at"`
187+
}
188+
189+
// GetBlockedUser returns blocked user
190+
func (c *Client) GetBlockedUser(ctx context.Context, blockedBy string) (*GetBlockedUsersResponse, error) {
191+
switch {
192+
case blockedBy == "":
193+
return nil, errors.New("user_id should not be empty")
194+
}
195+
196+
var resp GetBlockedUsersResponse
197+
198+
params := make(url.Values)
199+
params.Set("user_id", blockedBy)
200+
err := c.makeRequest(ctx, http.MethodGet, "users/block", params, nil, &resp)
201+
return &resp, err
202+
}
203+
115204
// MuteUsers mutes all users in targetIDs.
116205
func (c *Client) MuteUsers(ctx context.Context, targetIDs []string, mutedBy string, options ...MuteOption) (*Response, error) {
117206
switch {

user_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,69 @@ func TestClient_MuteUsers(t *testing.T) {
8080
assert.NotEmpty(t, mute.Expires, "mute should have Expires")
8181
}
8282
}
83+
func TestClient_BlockUsers(t *testing.T) {
84+
c := initClient(t)
85+
ctx := context.Background()
86+
87+
blockingUser := randomUser(t, c)
88+
blockedUser := randomUser(t, c)
89+
90+
_, err := c.BlockUser(ctx, blockedUser.ID, blockingUser.ID)
91+
require.NoError(t, err, "BlockUser should not return an error")
92+
93+
resp, err := c.QueryUsers(ctx, &QueryOption{
94+
Filter: map[string]interface{}{
95+
"id": map[string]string{"$eq": blockingUser.ID},
96+
},
97+
})
98+
99+
users := resp.Users
100+
require.NoError(t, err, "QueryUsers should not return an error")
101+
require.NotEmptyf(t, users, "QueryUsers should return a user: %+v", users)
102+
require.Equal(t, len(users[0].BlockedUserIDs), 1)
103+
104+
require.Equal(t, users[0].BlockedUserIDs[0], blockedUser.ID)
105+
}
106+
func TestClient_UnblockUsersGetBlockedUsers(t *testing.T) {
107+
c := initClient(t)
108+
ctx := context.Background()
109+
110+
blockingUser := randomUser(t, c)
111+
blockedUser := randomUser(t, c)
112+
113+
_, err := c.BlockUser(ctx, blockedUser.ID, blockingUser.ID)
114+
require.NoError(t, err, "BlockUser should not return an error")
115+
116+
resp, err := c.QueryUsers(ctx, &QueryOption{
117+
Filter: map[string]interface{}{
118+
"id": map[string]string{"$eq": blockingUser.ID},
119+
},
120+
})
121+
122+
users := resp.Users
123+
require.NoError(t, err, "QueryUsers should not return an error")
124+
require.NotEmptyf(t, users, "QueryUsers should return a user: %+v", users)
125+
require.Equal(t, len(users[0].BlockedUserIDs), 1)
126+
require.Equal(t, users[0].BlockedUserIDs[0], blockedUser.ID)
127+
128+
getRes, err := c.GetBlockedUser(ctx, blockingUser.ID)
129+
require.Equal(t, 1, len(getRes.BlockedUsers))
130+
require.Equal(t, blockedUser.ID, getRes.BlockedUsers[0].BlockedUserID)
131+
132+
_, err = c.UnblockUser(ctx, blockedUser.ID, blockingUser.ID)
133+
require.NoError(t, err, "UnblockUser should not return an error")
134+
135+
resp, err = c.QueryUsers(ctx, &QueryOption{
136+
Filter: map[string]interface{}{
137+
"id": map[string]string{"$eq": blockingUser.ID},
138+
},
139+
})
140+
141+
users = resp.Users
142+
require.NoError(t, err, "QueryUsers should not return an error")
143+
require.NotEmptyf(t, users, "QueryUsers should return a user: %+v", users)
144+
require.Equal(t, 0, len(users[0].BlockedUserIDs))
145+
}
83146

84147
func TestClient_UnmuteUser(t *testing.T) {
85148
c := initClient(t)

0 commit comments

Comments
 (0)