Skip to content

Commit d70911b

Browse files
committed
add groups endpoint with tests
1 parent eea0aee commit d70911b

File tree

5 files changed

+113
-7
lines changed

5 files changed

+113
-7
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2791,5 +2791,15 @@ func (q *fakeQuerier) GetGroupMembers(_ context.Context, groupID uuid.UUID) ([]d
27912791
}
27922792

27932793
func (q *fakeQuerier) GetGroupsByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]database.Group, error) {
2794-
panic("not implemented")
2794+
q.mutex.RLock()
2795+
defer q.mutex.RUnlock()
2796+
2797+
var groups []database.Group
2798+
for _, group := range q.groups {
2799+
if group.OrganizationID == organizationID {
2800+
groups = append(groups, group)
2801+
}
2802+
}
2803+
2804+
return groups, nil
27952805
}

coderd/database/modelmethods.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ func (TemplateVersion) RBACObject(template Template) rbac.Object {
8080
return template.RBACObject()
8181
}
8282

83+
func (g Group) RBACObject() rbac.Object {
84+
return rbac.ResourceGroup.InOrg(g.OrganizationID)
85+
}
86+
8387
func (w Workspace) RBACObject() rbac.Object {
8488
return rbac.ResourceWorkspace.InOrg(w.OrganizationID).WithOwner(w.OwnerID.String())
8589
}

coderd/groups.go

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func (api *API) postGroupByOrganization(rw http.ResponseWriter, r *http.Request)
2121
org = httpmw.OrganizationParam(r)
2222
)
2323

24-
if !api.Authorize(r, rbac.ActionCreate, rbac.ResourceGroup.InOrg(org.ID)) {
24+
if !api.Authorize(r, rbac.ActionCreate, rbac.ResourceGroup) {
2525
http.NotFound(rw, r)
2626
return
2727
}
@@ -56,7 +56,7 @@ func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
5656
group = httpmw.GroupParam(r)
5757
)
5858

59-
if !api.Authorize(r, rbac.ActionUpdate, rbac.ResourceGroup.InOrg(group.OrganizationID)) {
59+
if !api.Authorize(r, rbac.ActionUpdate, rbac.ResourceGroup) {
6060
http.NotFound(rw, r)
6161
return
6262
}
@@ -166,7 +166,7 @@ func (api *API) group(rw http.ResponseWriter, r *http.Request) {
166166
group = httpmw.GroupParam(r)
167167
)
168168

169-
if !api.Authorize(r, rbac.ActionRead, rbac.ResourceTemplate) {
169+
if !api.Authorize(r, rbac.ActionRead, rbac.ResourceGroup) {
170170
httpapi.ResourceNotFound(rw)
171171
return
172172
}
@@ -181,7 +181,45 @@ func (api *API) group(rw http.ResponseWriter, r *http.Request) {
181181
}
182182

183183
func (api *API) groups(rw http.ResponseWriter, r *http.Request) {
184+
var (
185+
ctx = r.Context()
186+
org = httpmw.OrganizationParam(r)
187+
)
188+
189+
if !api.Authorize(r, rbac.ActionRead, rbac.ResourceGroup) {
190+
httpapi.ResourceNotFound(rw)
191+
return
192+
}
193+
194+
groups, err := api.Database.GetGroupsByOrganizationID(ctx, org.ID)
195+
if err != nil && !xerrors.Is(err, sql.ErrNoRows) {
196+
httpapi.InternalServerError(rw, err)
197+
return
198+
}
199+
200+
// Filter templates based on rbac permissions
201+
// TODO: authorize filters.
202+
// groups, err = AuthorizeFilter(api.HTTPAuth, r, rbac.ActionRead, groups)
203+
// if err != nil {
204+
// httpapi.Write(rw, http.StatusInternalServerError, codersdk.Response{
205+
// Message: "Internal error fetching templates.",
206+
// Detail: err.Error(),
207+
// })
208+
// return
209+
// }
210+
211+
resp := make([]codersdk.Group, 0, len(groups))
212+
for _, group := range groups {
213+
members, err := api.Database.GetGroupMembers(ctx, group.ID)
214+
if err != nil {
215+
httpapi.InternalServerError(rw, err)
216+
return
217+
}
218+
219+
resp = append(resp, convertGroup(group, members))
220+
}
184221

222+
httpapi.Write(rw, http.StatusOK, resp)
185223
}
186224

187225
func convertGroup(g database.Group, users []database.User) codersdk.Group {

coderd/groups_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,56 @@ func TestGroup(t *testing.T) {
221221
require.Equal(t, group, ggroup)
222222
})
223223
}
224+
225+
// TODO: test auth.
226+
func TestGroups(t *testing.T) {
227+
t.Parallel()
228+
229+
t.Run("OK", func(t *testing.T) {
230+
t.Parallel()
231+
232+
client := coderdtest.New(t, nil)
233+
user := coderdtest.CreateFirstUser(t, client)
234+
_, user2 := coderdtest.CreateAnotherUserWithUser(t, client, user.OrganizationID)
235+
_, user3 := coderdtest.CreateAnotherUserWithUser(t, client, user.OrganizationID)
236+
_, user4 := coderdtest.CreateAnotherUserWithUser(t, client, user.OrganizationID)
237+
_, user5 := coderdtest.CreateAnotherUserWithUser(t, client, user.OrganizationID)
238+
239+
ctx, _ := testutil.Context(t)
240+
group1, err := client.CreateGroup(ctx, user.OrganizationID, codersdk.CreateGroupRequest{
241+
Name: "hi",
242+
})
243+
require.NoError(t, err)
244+
245+
group2, err := client.CreateGroup(ctx, user.OrganizationID, codersdk.CreateGroupRequest{
246+
Name: "hey",
247+
})
248+
require.NoError(t, err)
249+
250+
group1, err = client.PatchGroup(ctx, group1.ID, codersdk.PatchGroupRequest{
251+
AddUsers: []string{user2.ID.String(), user3.ID.String()},
252+
})
253+
require.NoError(t, err)
254+
255+
group2, err = client.PatchGroup(ctx, group2.ID, codersdk.PatchGroupRequest{
256+
AddUsers: []string{user4.ID.String(), user5.ID.String()},
257+
})
258+
require.NoError(t, err)
259+
260+
groups, err := client.GroupsByOrganization(ctx, user.OrganizationID)
261+
require.NoError(t, err)
262+
require.Contains(t, groups, group1)
263+
require.Contains(t, groups, group2)
264+
})
265+
266+
t.Run("OK", func(t *testing.T) {
267+
t.Parallel()
268+
269+
client := coderdtest.New(t, nil)
270+
user := coderdtest.CreateFirstUser(t, client)
271+
ctx, _ := testutil.Context(t)
272+
groups, err := client.GroupsByOrganization(ctx, user.OrganizationID)
273+
require.NoError(t, err)
274+
require.Len(t, groups, 0)
275+
})
276+
}

codersdk/groups.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ func (c *Client) GroupsByOrganization(ctx context.Context, orgID uuid.UUID) ([]G
4848
}
4949
defer res.Body.Close()
5050

51-
if res.StatusCode != http.StatusCreated {
51+
if res.StatusCode != http.StatusOK {
5252
return nil, readBodyAsError(res)
5353
}
54-
var resp Group
55-
return nil, json.NewDecoder(res.Body).Decode(&resp)
54+
55+
var groups []Group
56+
return groups, json.NewDecoder(res.Body).Decode(&groups)
5657
}
5758

5859
func (c *Client) Group(ctx context.Context, group uuid.UUID) (Group, error) {

0 commit comments

Comments
 (0)