@Summary Get groups @ID get-groups @Security CoderSessionToken @Produce json @Tags Enterprise @Param organization query string true "Organization ID or name" @Param has_member query string true "User ID or name" @Param group_ids query string true "Comma separated list of group IDs" @Success 200 {arr
(rw http.ResponseWriter, r *http.Request)
| 558 | // @Success 200 {array} codersdk.Group |
| 559 | // @Router /api/v2/groups [get] |
| 560 | func (api *API) groups(rw http.ResponseWriter, r *http.Request) { |
| 561 | ctx := r.Context() |
| 562 | |
| 563 | var filter database.GetGroupsParams |
| 564 | parser := httpapi.NewQueryParamParser() |
| 565 | // Organization selector can be an org ID or name |
| 566 | filter.OrganizationID = parser.UUIDorName(r.URL.Query(), uuid.Nil, "organization", func(orgName string) (uuid.UUID, error) { |
| 567 | org, err := api.Database.GetOrganizationByName(ctx, database.GetOrganizationByNameParams{ |
| 568 | Name: orgName, |
| 569 | Deleted: false, |
| 570 | }) |
| 571 | if err != nil { |
| 572 | return uuid.Nil, xerrors.Errorf("organization %q not found", orgName) |
| 573 | } |
| 574 | return org.ID, nil |
| 575 | }) |
| 576 | |
| 577 | // has_member selector can be a user ID or username |
| 578 | filter.HasMemberID = parser.UUIDorName(r.URL.Query(), uuid.Nil, "has_member", func(username string) (uuid.UUID, error) { |
| 579 | user, err := api.Database.GetUserByEmailOrUsername(ctx, database.GetUserByEmailOrUsernameParams{ |
| 580 | Username: username, |
| 581 | Email: "", |
| 582 | }) |
| 583 | if err != nil { |
| 584 | return uuid.Nil, xerrors.Errorf("user %q not found", username) |
| 585 | } |
| 586 | return user.ID, nil |
| 587 | }) |
| 588 | |
| 589 | filter.GroupIds = parser.UUIDs(r.URL.Query(), []uuid.UUID{}, "group_ids") |
| 590 | |
| 591 | parser.ErrorExcessParams(r.URL.Query()) |
| 592 | if len(parser.Errors) > 0 { |
| 593 | httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ |
| 594 | Message: "Query parameters have invalid values.", |
| 595 | Validations: parser.Errors, |
| 596 | }) |
| 597 | return |
| 598 | } |
| 599 | |
| 600 | groups, err := api.Database.GetGroups(ctx, filter) |
| 601 | if httpapi.Is404Error(err) { |
| 602 | httpapi.ResourceNotFound(rw) |
| 603 | return |
| 604 | } |
| 605 | if err != nil { |
| 606 | httpapi.InternalServerError(rw, err) |
| 607 | return |
| 608 | } |
| 609 | |
| 610 | resp := make([]codersdk.Group, 0, len(groups)) |
| 611 | for _, group := range groups { |
| 612 | members, err := api.Database.GetGroupMembersByGroupID(ctx, database.GetGroupMembersByGroupIDParams{ |
| 613 | GroupID: group.Group.ID, |
| 614 | IncludeSystem: false, |
| 615 | }) |
| 616 | if err != nil { |
| 617 | httpapi.InternalServerError(rw, err) |
no test coverage detected