Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitff930ad

Browse files
authored
feat(coderd): add ability to search org members by user_id, is_system, github_user_id (#20048)
Adds the ability to search org members by query.Supported fields: `user_id`, `is_system`, `github_user_id`.
1 parent4db5158 commitff930ad

File tree

13 files changed

+202
-16
lines changed

13 files changed

+202
-16
lines changed

‎coderd/database/dbauthz/dbauthz.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,6 +1691,7 @@ func (q *querier) DeleteOrganizationMember(ctx context.Context, arg database.Del
16911691
OrganizationID:arg.OrganizationID,
16921692
UserID:arg.UserID,
16931693
IncludeSystem:false,
1694+
GithubUserID:0,
16941695
}))
16951696
iferr!=nil {
16961697
return database.OrganizationMember{},err
@@ -4694,6 +4695,7 @@ func (q *querier) UpdateMemberRoles(ctx context.Context, arg database.UpdateMemb
46944695
OrganizationID:arg.OrgID,
46954696
UserID:arg.UserID,
46964697
IncludeSystem:false,
4698+
GithubUserID:0,
46974699
}))
46984700
iferr!=nil {
46994701
return database.OrganizationMember{},err

‎coderd/database/queries.sql.go‎

Lines changed: 13 additions & 1 deletion
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/queries/organizationmembers.sql‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ WHERE
2828
WHEN @include_system::bool THEN TRUE
2929
ELSE
3030
is_system= false
31-
END;
31+
END
32+
-- Filter by github user ID. Note that this requires a join on the users table.
33+
AND CASE
34+
WHEN @github_user_id ::bigint!=0 THEN
35+
users.github_com_user_id= @github_user_id
36+
ELSE true
37+
END;
3238

3339
-- name: InsertOrganizationMember :one
3440
INSERT INTO

‎coderd/dynamicparameters/render.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ func WorkspaceOwner(ctx context.Context, db database.Store, org uuid.UUID, owner
300300
OrganizationID:org,
301301
UserID:ownerID,
302302
IncludeSystem:true,
303+
GithubUserID:0,
303304
}))
304305
iferr!=nil {
305306
returnnil,xerrors.Errorf("fetch user: %w",err)

‎coderd/httpmw/organizationparam.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ func ExtractOrganizationMember(ctx context.Context, auth func(r *http.Request, a
181181
OrganizationID:orgID,
182182
UserID:user.ID,
183183
IncludeSystem:true,
184+
GithubUserID:0,
184185
})
185186
ifhttpapi.Is404Error(err) {
186187
httpapi.ResourceNotFound(rw)

‎coderd/idpsync/role.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func (s AGPLIDPSync) SyncRoles(ctx context.Context, db database.Store, user data
9393
OrganizationID:uuid.Nil,
9494
UserID:user.ID,
9595
IncludeSystem:false,
96+
GithubUserID:0,
9697
})
9798
iferr!=nil {
9899
returnxerrors.Errorf("get organizations by user id: %w",err)

‎coderd/members.go‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/coder/coder/v2/coderd/httpapi"
1717
"github.com/coder/coder/v2/coderd/httpmw"
1818
"github.com/coder/coder/v2/coderd/rbac"
19+
"github.com/coder/coder/v2/coderd/searchquery"
1920
"github.com/coder/coder/v2/codersdk"
2021
)
2122

@@ -158,11 +159,16 @@ func (api *API) listMembers(rw http.ResponseWriter, r *http.Request) {
158159
organization=httpmw.OrganizationParam(r)
159160
)
160161

161-
members,err:=api.Database.OrganizationMembers(ctx, database.OrganizationMembersParams{
162-
OrganizationID:organization.ID,
163-
UserID:uuid.Nil,
164-
IncludeSystem:false,
165-
})
162+
params,errors:=searchquery.Members(r.URL.Query().Get("q"),organization.ID)
163+
iflen(errors)>0 {
164+
httpapi.Write(ctx,rw,http.StatusBadRequest, codersdk.Response{
165+
Message:"Invalid organization member search query.",
166+
Validations:errors,
167+
})
168+
return
169+
}
170+
171+
members,err:=api.Database.OrganizationMembers(ctx,params)
166172
ifhttpapi.Is404Error(err) {
167173
httpapi.ResourceNotFound(rw)
168174
return

‎coderd/members_test.go‎

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package coderd_test
22

33
import (
4+
"database/sql"
45
"testing"
56

67
"github.com/google/uuid"
78
"github.com/stretchr/testify/require"
89

910
"github.com/coder/coder/v2/coderd/coderdtest"
11+
"github.com/coder/coder/v2/coderd/database"
1012
"github.com/coder/coder/v2/coderd/database/db2sdk"
11-
"github.com/coder/coder/v2/coderd/rbac"
13+
"github.com/coder/coder/v2/coderd/database/dbgen"
1214
"github.com/coder/coder/v2/codersdk"
1315
"github.com/coder/coder/v2/testutil"
1416
)
@@ -52,19 +54,64 @@ func TestDeleteMember(t *testing.T) {
5254
funcTestListMembers(t*testing.T) {
5355
t.Parallel()
5456

57+
client,db:=coderdtest.NewWithDatabase(t,nil)
58+
owner:=coderdtest.CreateFirstUser(t,client)
59+
_,orgMember:=coderdtest.CreateAnotherUser(t,client,owner.OrganizationID)
60+
_,orgAdmin:=coderdtest.CreateAnotherUser(t,client,owner.OrganizationID)
61+
anotherOrg:=dbgen.Organization(t,db, database.Organization{})
62+
anotherUser:=dbgen.User(t,db, database.User{
63+
GithubComUserID: sql.NullInt64{Valid:true,Int64:12345},
64+
})
65+
_=dbgen.OrganizationMember(t,db, database.OrganizationMember{
66+
OrganizationID:anotherOrg.ID,
67+
UserID:anotherUser.ID,
68+
})
69+
5570
t.Run("OK",func(t*testing.T) {
5671
t.Parallel()
57-
owner:=coderdtest.New(t,nil)
58-
first:=coderdtest.CreateFirstUser(t,owner)
5972

60-
client,user:=coderdtest.CreateAnotherUser(t,owner,first.OrganizationID,rbac.ScopedRoleOrgAdmin(first.OrganizationID))
73+
ctx:=testutil.Context(t,testutil.WaitShort)
74+
members,err:=client.OrganizationMembers(ctx,owner.OrganizationID)
75+
require.NoError(t,err)
76+
require.Len(t,members,3)
77+
require.ElementsMatch(t,
78+
[]uuid.UUID{owner.UserID,orgMember.ID,orgAdmin.ID},
79+
db2sdk.List(members,onlyIDs))
80+
})
81+
82+
t.Run("UserID",func(t*testing.T) {
83+
t.Parallel()
84+
85+
ctx:=testutil.Context(t,testutil.WaitShort)
86+
members,err:=client.OrganizationMembers(ctx,owner.OrganizationID,codersdk.OrganizationMembersQueryOptionUserID(orgMember.ID))
87+
require.NoError(t,err)
88+
require.Len(t,members,1)
89+
require.ElementsMatch(t,
90+
[]uuid.UUID{orgMember.ID},
91+
db2sdk.List(members,onlyIDs))
92+
})
93+
94+
t.Run("IncludeSystem",func(t*testing.T) {
95+
t.Parallel()
96+
97+
ctx:=testutil.Context(t,testutil.WaitShort)
98+
members,err:=client.OrganizationMembers(ctx,owner.OrganizationID,codersdk.OrganizationMembersQueryOptionIncludeSystem())
99+
require.NoError(t,err)
100+
require.Len(t,members,4)
101+
require.ElementsMatch(t,
102+
[]uuid.UUID{owner.UserID,orgMember.ID,orgAdmin.ID,database.PrebuildsSystemUserID},
103+
db2sdk.List(members,onlyIDs))
104+
})
105+
106+
t.Run("GithubUserID",func(t*testing.T) {
107+
t.Parallel()
61108

62109
ctx:=testutil.Context(t,testutil.WaitShort)
63-
members,err:=client.OrganizationMembers(ctx,first.OrganizationID)
110+
members,err:=client.OrganizationMembers(ctx,anotherOrg.ID,codersdk.OrganizationMembersQueryOptionGithubUserID(anotherUser.GithubComUserID.Int64))
64111
require.NoError(t,err)
65-
require.Len(t,members,2)
112+
require.Len(t,members,1)
66113
require.ElementsMatch(t,
67-
[]uuid.UUID{first.UserID,user.ID},
114+
[]uuid.UUID{anotherUser.ID},
68115
db2sdk.List(members,onlyIDs))
69116
})
70117
}

‎coderd/searchquery/search.go‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,50 @@ func Users(query string) (database.GetUsersParams, []codersdk.ValidationError) {
170170
returnfilter,parser.Errors
171171
}
172172

173+
funcMembers(querystring,organizationID uuid.UUID) (database.OrganizationMembersParams, []codersdk.ValidationError) {
174+
query=strings.TrimSpace(query)
175+
ifquery=="" {
176+
return database.OrganizationMembersParams{
177+
OrganizationID:organizationID,
178+
UserID:uuid.Nil,
179+
IncludeSystem:false,
180+
GithubUserID:0,
181+
},nil
182+
}
183+
values,errors:=searchTerms(query,func(termstring,values url.Values)error {
184+
switchterm {
185+
case"user_id":
186+
values.Set("user_id","")
187+
case"github_user_id":
188+
values.Set("github_user_id","")
189+
case"include_system":
190+
values.Set("include_system","")
191+
default:
192+
returnxerrors.Errorf("invalid search term: %s",term)
193+
}
194+
returnnil
195+
})
196+
iflen(errors)>0 {
197+
return database.OrganizationMembersParams{
198+
OrganizationID:organizationID,
199+
UserID:uuid.Nil,
200+
IncludeSystem:false,
201+
GithubUserID:0,
202+
},errors
203+
}
204+
205+
parser:=httpapi.NewQueryParamParser()
206+
params:= database.OrganizationMembersParams{
207+
OrganizationID:organizationID,
208+
UserID:parser.UUID(values,uuid.Nil,"user_id"),
209+
IncludeSystem:parser.Boolean(values,false,"include_system"),
210+
GithubUserID:parser.Int64(values,0,"github_user_id"),
211+
}
212+
parser.ErrorExcessParams(values)
213+
214+
returnparams,parser.Errors
215+
}
216+
173217
funcWorkspaces(ctx context.Context,db database.Store,querystring,page codersdk.Pagination,agentInactiveDisconnectTimeout time.Duration) (database.GetWorkspacesParams, []codersdk.ValidationError) {
174218
filter:= database.GetWorkspacesParams{
175219
AgentInactiveDisconnectTimeoutSeconds:int64(agentInactiveDisconnectTimeout.Seconds()),

‎coderd/users.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,7 @@ func (api *API) userRoles(rw http.ResponseWriter, r *http.Request) {
12361236
UserID:user.ID,
12371237
OrganizationID:uuid.Nil,
12381238
IncludeSystem:false,
1239+
GithubUserID:0,
12391240
})
12401241
iferr!=nil {
12411242
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp