@@ -24,6 +24,8 @@ import (
24
24
"github.com/coder/coder/cryptorand"
25
25
)
26
26
27
+ type OrganizationsByUserId = map [string ][]database.Organization
28
+
27
29
// Returns whether the initial user has been created or not.
28
30
func (api * api ) firstUser (rw http.ResponseWriter , r * http.Request ) {
29
31
userCount , err := api .Database .GetUserCount (r .Context ())
@@ -145,8 +147,14 @@ func (api *api) users(rw http.ResponseWriter, r *http.Request) {
145
147
return
146
148
}
147
149
150
+ organizationsByUserId := OrganizationsByUserId {}
151
+ for _ , user := range users {
152
+ userOrganizations := getUserOrganizations (api , rw , r , user )
153
+ organizationsByUserId [user .ID .String ()] = userOrganizations
154
+ }
155
+
148
156
render .Status (r , http .StatusOK )
149
- render .JSON (rw , r , convertUsers (users ))
157
+ render .JSON (rw , r , convertUsers (users , organizationsByUserId ))
150
158
}
151
159
152
160
// Creates a new user.
@@ -213,15 +221,17 @@ func (api *api) postUser(rw http.ResponseWriter, r *http.Request) {
213
221
return
214
222
}
215
223
216
- httpapi .Write (rw , http .StatusCreated , convertUser (user ))
224
+ organizations := getUserOrganizations (api , rw , r , user )
225
+
226
+ httpapi .Write (rw , http .StatusCreated , convertUser (user , organizations ))
217
227
}
218
228
219
229
// Returns the parameterized user requested. All validation
220
230
// is completed in the middleware for this route.
221
- func (* api ) userByName (rw http.ResponseWriter , r * http.Request ) {
231
+ func (api * api ) userByName (rw http.ResponseWriter , r * http.Request ) {
222
232
user := httpmw .UserParam (r )
223
-
224
- httpapi .Write (rw , http .StatusOK , convertUser (user ))
233
+ organizations := getUserOrganizations ( api , rw , r , user )
234
+ httpapi .Write (rw , http .StatusOK , convertUser (user , organizations ))
225
235
}
226
236
227
237
func (api * api ) putUserProfile (rw http.ResponseWriter , r * http.Request ) {
@@ -278,7 +288,9 @@ func (api *api) putUserProfile(rw http.ResponseWriter, r *http.Request) {
278
288
return
279
289
}
280
290
281
- httpapi .Write (rw , http .StatusOK , convertUser (updatedUserProfile ))
291
+ organizations := getUserOrganizations (api , rw , r , user )
292
+
293
+ httpapi .Write (rw , http .StatusOK , convertUser (updatedUserProfile , organizations ))
282
294
}
283
295
284
296
func (api * api ) putUserSuspend (rw http.ResponseWriter , r * http.Request ) {
@@ -297,7 +309,9 @@ func (api *api) putUserSuspend(rw http.ResponseWriter, r *http.Request) {
297
309
return
298
310
}
299
311
300
- httpapi .Write (rw , http .StatusOK , convertUser (suspendedUser ))
312
+ organizations := getUserOrganizations (api , rw , r , user )
313
+
314
+ httpapi .Write (rw , http .StatusOK , convertUser (suspendedUser , organizations ))
301
315
}
302
316
303
317
// Returns organizations the parameterized user has access to.
@@ -626,20 +640,42 @@ func (api *api) createUser(ctx context.Context, req codersdk.CreateUserRequest)
626
640
})
627
641
}
628
642
629
- func convertUser (user database.User ) codersdk.User {
643
+ func convertUser (user database.User , organizations []database.Organization ) codersdk.User {
644
+ orgIds := make ([]uuid.UUID , 0 , len (organizations ))
645
+ for _ , o := range organizations {
646
+ orgIds = append (orgIds , o .ID )
647
+ }
648
+
630
649
return codersdk.User {
631
- ID : user .ID ,
632
- Email : user .Email ,
633
- CreatedAt : user .CreatedAt ,
634
- Username : user .Username ,
635
- Status : codersdk .UserStatus (user .Status ),
650
+ ID : user .ID ,
651
+ Email : user .Email ,
652
+ CreatedAt : user .CreatedAt ,
653
+ Username : user .Username ,
654
+ Status : codersdk .UserStatus (user .Status ),
655
+ OrganizationIds : orgIds ,
636
656
}
637
657
}
638
658
639
- func convertUsers (users []database.User ) []codersdk.User {
659
+ func convertUsers (users []database.User , organizationsByUserId OrganizationsByUserId ) []codersdk.User {
640
660
converted := make ([]codersdk.User , 0 , len (users ))
641
661
for _ , u := range users {
642
- converted = append (converted , convertUser (u ))
662
+ userOrganizations := organizationsByUserId [u .ID .String ()]
663
+ converted = append (converted , convertUser (u , userOrganizations ))
643
664
}
644
665
return converted
645
666
}
667
+
668
+ func getUserOrganizations (api * api , rw http.ResponseWriter , r * http.Request , user database.User ) []database.Organization {
669
+ organizations , err := api .Database .GetOrganizationsByUserID (r .Context (), user .ID )
670
+ if errors .Is (err , sql .ErrNoRows ) {
671
+ err = nil
672
+ organizations = []database.Organization {}
673
+ }
674
+ if err != nil {
675
+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
676
+ Message : fmt .Sprintf ("get organizations: %s" , err .Error ()),
677
+ })
678
+ return []database.Organization {}
679
+ }
680
+ return organizations
681
+ }
0 commit comments