Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5583b78

Browse files
committed
refactor: update query to return org IDs fby user IDs
1 parent a39ba22 commit 5583b78

File tree

5 files changed

+122
-33
lines changed

5 files changed

+122
-33
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,26 @@ func (q *fakeQuerier) GetOrganizationMemberByUserID(_ context.Context, arg datab
709709
return database.OrganizationMember{}, sql.ErrNoRows
710710
}
711711

712+
func (q *fakeQuerier) GetOrganizationIDsByMemberIDs(c context.Context, ids []uuid.UUID) ([]database.GetOrganizationIDsByMemberIDsRow, error) {
713+
q.mutex.RLock()
714+
defer q.mutex.RUnlock()
715+
716+
getOrganizationIDsByMemberIDRows := make([]database.GetOrganizationIDsByMemberIDsRow, 0, len(ids))
717+
for _, userID := range ids {
718+
userOrganizationIDs := make([]uuid.UUID, 0)
719+
for _, membership := range q.organizationMembers {
720+
if membership.UserID == userID {
721+
userOrganizationIDs = append(userOrganizationIDs, membership.OrganizationID)
722+
}
723+
}
724+
getOrganizationIDsByMemberIDRows = append(getOrganizationIDsByMemberIDRows, database.GetOrganizationIDsByMemberIDsRow{
725+
UserID: userID,
726+
OrganizationIDs: userOrganizationIDs,
727+
})
728+
}
729+
return getOrganizationIDsByMemberIDRows, sql.ErrNoRows
730+
}
731+
712732
func (q *fakeQuerier) GetProvisionerDaemons(_ context.Context) ([]database.ProvisionerDaemon, error) {
713733
q.mutex.RLock()
714734
defer q.mutex.RUnlock()

coderd/database/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/organizationmembers.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,13 @@ INSERT INTO
2020
)
2121
VALUES
2222
($1, $2, $3, $4, $5) RETURNING *;
23+
24+
-- name: GetOrganizationIDsByMemberIDs :many
25+
SELECT
26+
user_id, array_agg(organization_id) :: uuid [ ] AS "organization_IDs"
27+
FROM
28+
organization_members
29+
WHERE
30+
user_id = ANY(@ids :: uuid [ ])
31+
GROUP BY
32+
user_id;

coderd/users.go

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,31 @@ func (api *api) users(rw http.ResponseWriter, r *http.Request) {
137137
LimitOpt: int32(pageLimit),
138138
Search: searchName,
139139
})
140-
141140
if err != nil {
142141
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
143142
Message: err.Error(),
144143
})
145144
return
146145
}
147146

148-
organizationsByUserId := map[string][]database.Organization{}
147+
userIDs := make([]uuid.UUID, 0, len(users))
149148
for _, user := range users {
150-
userOrganizations := userOrganizations(api, rw, r, user)
151-
organizationsByUserId[user.ID.String()] = userOrganizations
149+
userIDs = append(userIDs, user.ID)
150+
}
151+
organizationIDsByMemberIDsRows, err := api.Database.GetOrganizationIDsByMemberIDs(r.Context(), userIDs)
152+
if err != nil {
153+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
154+
Message: err.Error(),
155+
})
156+
return
157+
}
158+
organizationIDsByUserID := map[uuid.UUID][]uuid.UUID{}
159+
for _, organizationIDsByMemberIDsRow := range organizationIDsByMemberIDsRows {
160+
organizationIDsByUserID[organizationIDsByMemberIDsRow.UserID] = organizationIDsByMemberIDsRow.OrganizationIDs
152161
}
153162

154163
render.Status(r, http.StatusOK)
155-
render.JSON(rw, r, convertUsers(users, organizationsByUserId))
164+
render.JSON(rw, r, convertUsers(users, organizationIDsByUserID))
156165
}
157166

158167
// Creates a new user.
@@ -219,17 +228,23 @@ func (api *api) postUser(rw http.ResponseWriter, r *http.Request) {
219228
return
220229
}
221230

222-
organizations := userOrganizations(api, rw, r, user)
223-
224-
httpapi.Write(rw, http.StatusCreated, convertUser(user, organizations))
231+
httpapi.Write(rw, http.StatusCreated, convertUser(user, []uuid.UUID{createUser.OrganizationID}))
225232
}
226233

227234
// Returns the parameterized user requested. All validation
228235
// is completed in the middleware for this route.
229236
func (api *api) userByName(rw http.ResponseWriter, r *http.Request) {
230237
user := httpmw.UserParam(r)
231-
organizations := userOrganizations(api, rw, r, user)
232-
httpapi.Write(rw, http.StatusOK, convertUser(user, organizations))
238+
organizationIDs, err := userOrganizationIDs(api, rw, r, user)
239+
240+
if err != nil {
241+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
242+
Message: fmt.Sprintf("get organization IDs: %s", err.Error()),
243+
})
244+
return
245+
}
246+
247+
httpapi.Write(rw, http.StatusOK, convertUser(user, organizationIDs))
233248
}
234249

235250
func (api *api) putUserProfile(rw http.ResponseWriter, r *http.Request) {
@@ -286,9 +301,15 @@ func (api *api) putUserProfile(rw http.ResponseWriter, r *http.Request) {
286301
return
287302
}
288303

289-
organizations := userOrganizations(api, rw, r, user)
304+
organizationIDs, err := userOrganizationIDs(api, rw, r, user)
305+
if err != nil {
306+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
307+
Message: fmt.Sprintf("get organization IDs: %s", err.Error()),
308+
})
309+
return
310+
}
290311

291-
httpapi.Write(rw, http.StatusOK, convertUser(updatedUserProfile, organizations))
312+
httpapi.Write(rw, http.StatusOK, convertUser(updatedUserProfile, organizationIDs))
292313
}
293314

294315
func (api *api) putUserSuspend(rw http.ResponseWriter, r *http.Request) {
@@ -307,7 +328,13 @@ func (api *api) putUserSuspend(rw http.ResponseWriter, r *http.Request) {
307328
return
308329
}
309330

310-
organizations := userOrganizations(api, rw, r, user)
331+
organizations, err := userOrganizationIDs(api, rw, r, user)
332+
if err != nil {
333+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
334+
Message: fmt.Sprintf("get organization IDs: %s", err.Error()),
335+
})
336+
return
337+
}
311338

312339
httpapi.Write(rw, http.StatusOK, convertUser(suspendedUser, organizations))
313340
}
@@ -638,42 +665,34 @@ func (api *api) createUser(ctx context.Context, req codersdk.CreateUserRequest)
638665
})
639666
}
640667

641-
func convertUser(user database.User, organizations []database.Organization) codersdk.User {
642-
orgIds := make([]uuid.UUID, 0, len(organizations))
643-
for _, o := range organizations {
644-
orgIds = append(orgIds, o.ID)
645-
}
646-
668+
func convertUser(user database.User, organizationIDs []uuid.UUID) codersdk.User {
647669
return codersdk.User{
648670
ID: user.ID,
649671
Email: user.Email,
650672
CreatedAt: user.CreatedAt,
651673
Username: user.Username,
652674
Status: codersdk.UserStatus(user.Status),
653-
OrganizationIDs: orgIds,
675+
OrganizationIDs: organizationIDs,
654676
}
655677
}
656678

657-
func convertUsers(users []database.User, organizationsByUserId map[string][]database.Organization) []codersdk.User {
679+
func convertUsers(users []database.User, organizationIDsByUserID map[uuid.UUID][]uuid.UUID) []codersdk.User {
658680
converted := make([]codersdk.User, 0, len(users))
659681
for _, u := range users {
660-
userOrganizations := organizationsByUserId[u.ID.String()]
661-
converted = append(converted, convertUser(u, userOrganizations))
682+
userOrganizationIDs := organizationIDsByUserID[u.ID]
683+
converted = append(converted, convertUser(u, userOrganizationIDs))
662684
}
663685
return converted
664686
}
665687

666-
func userOrganizations(api *api, rw http.ResponseWriter, r *http.Request, user database.User) []database.Organization {
667-
organizations, err := api.Database.GetOrganizationsByUserID(r.Context(), user.ID)
668-
if errors.Is(err, sql.ErrNoRows) {
669-
err = nil
670-
organizations = []database.Organization{}
688+
func userOrganizationIDs(api *api, rw http.ResponseWriter, r *http.Request, user database.User) ([]uuid.UUID, error) {
689+
organizationIDsByMemberIDsRows, err := api.Database.GetOrganizationIDsByMemberIDs(r.Context(), []uuid.UUID{user.ID})
690+
if errors.Is(err, sql.ErrNoRows) || len(organizationIDsByMemberIDsRows) == 0 {
691+
return []uuid.UUID{}, nil
671692
}
672693
if err != nil {
673-
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
674-
Message: fmt.Sprintf("get organizations: %s", err.Error()),
675-
})
676-
return []database.Organization{}
694+
return []uuid.UUID{}, err
677695
}
678-
return organizations
696+
member := organizationIDsByMemberIDsRows[0]
697+
return member.OrganizationIDs, nil
679698
}

0 commit comments

Comments
 (0)