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

Commit3312c81

Browse files
authored
feat: Workspace filters case insensitive (#2646)
1 parent90815e5 commit3312c81

File tree

7 files changed

+90
-37
lines changed

7 files changed

+90
-37
lines changed

‎coderd/database/databasefake/databasefake.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,9 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
289289
iflen(params.Status)>0 {
290290
usersFilteredByStatus:=make([]database.User,0,len(users))
291291
fori,user:=rangeusers {
292-
ifslice.Contains(params.Status,user.Status) {
292+
ifslice.ContainsCompare(params.Status,user.Status,func(a,b database.UserStatus)bool {
293+
returnstrings.EqualFold(string(a),string(b))
294+
}) {
293295
usersFilteredByStatus=append(usersFilteredByStatus,users[i])
294296
}
295297
}
@@ -299,7 +301,7 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
299301
iflen(params.RbacRole)>0&&!slice.Contains(params.RbacRole,rbac.RoleMember()) {
300302
usersFilteredByRole:=make([]database.User,0,len(users))
301303
fori,user:=rangeusers {
302-
ifslice.Overlap(params.RbacRole,user.RBACRoles) {
304+
ifslice.OverlapCompare(params.RbacRole,user.RBACRoles,strings.EqualFold) {
303305
usersFilteredByRole=append(usersFilteredByRole,users[i])
304306
}
305307
}
@@ -385,25 +387,21 @@ func (q *fakeQuerier) GetWorkspaces(_ context.Context, arg database.GetWorkspace
385387
}
386388
ifarg.OwnerUsername!="" {
387389
owner,err:=q.GetUserByID(context.Background(),workspace.OwnerID)
388-
iferr==nil&&arg.OwnerUsername!=owner.Username {
390+
iferr==nil&&!strings.EqualFold(arg.OwnerUsername,owner.Username) {
389391
continue
390392
}
391393
}
392394
ifarg.TemplateName!="" {
393-
templates,err:=q.GetTemplatesWithFilter(context.Background(), database.GetTemplatesWithFilterParams{
394-
ExactName:arg.TemplateName,
395-
})
396-
// Add to later param
397-
iferr==nil {
398-
for_,t:=rangetemplates {
399-
arg.TemplateIds=append(arg.TemplateIds,t.ID)
400-
}
395+
template,err:=q.GetTemplateByID(context.Background(),workspace.TemplateID)
396+
iferr==nil&&!strings.EqualFold(arg.TemplateName,template.Name) {
397+
continue
401398
}
402399
}
403400
if!arg.Deleted&&workspace.Deleted {
404401
continue
405402
}
406-
ifarg.Name!=""&&!strings.Contains(workspace.Name,arg.Name) {
403+
404+
ifarg.Name!=""&&!strings.Contains(strings.ToLower(workspace.Name),strings.ToLower(arg.Name)) {
407405
continue
408406
}
409407
iflen(arg.TemplateIds)>0 {

‎coderd/database/queries.sql.go

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

‎coderd/database/queries/workspaces.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ WHERE
2525
-- Filter by owner_name
2626
AND CASE
2727
WHEN @owner_username ::text!='' THEN
28-
owner_id= (SELECT idFROM usersWHERE username= @owner_username)
28+
owner_id= (SELECT idFROM usersWHERElower(username)=lower(@owner_username))
2929
ELSE true
3030
END
3131
-- Filter by template_name
3232
-- There can be more than 1 template with the same name across organizations.
3333
-- Use the organization filter to restrict to 1 org if needed.
3434
AND CASE
3535
WHEN @template_name ::text!='' THEN
36-
template_id= ANY(SELECT idFROM templatesWHERE name= @template_name)
36+
template_id= ANY(SELECT idFROM templatesWHERElower(name)=lower(@template_name))
3737
ELSE true
3838
END
3939
-- Filter by template_ids
@@ -45,7 +45,7 @@ WHERE
4545
-- Filter by name, matching on substring
4646
AND CASE
4747
WHEN @name ::text!='' THEN
48-
LOWER(name)LIKE'%'||LOWER(@name)||'%'
48+
name ILIKE'%'|| @name||'%'
4949
ELSE true
5050
END
5151
;

‎coderd/util/slice/slice.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
package slice
22

3-
funcContains[Tcomparable](haystack []T,needleT)bool {
3+
funcContainsCompare[Tany](haystack []T,needleT,equalfunc(a,bT)bool)bool {
44
for_,hay:=rangehaystack {
5-
ifneedle==hay {
5+
ifequal(needle,hay) {
66
returntrue
77
}
88
}
99
returnfalse
1010
}
1111

12+
funcContains[Tcomparable](haystack []T,needleT)bool {
13+
returnContainsCompare(haystack,needle,func(a,bT)bool {
14+
returna==b
15+
})
16+
}
17+
1218
// Overlap returns if the 2 sets have any overlap (element(s) in common)
1319
funcOverlap[Tcomparable](a []T,b []T)bool {
20+
returnOverlapCompare(a,b,func(a,bT)bool {
21+
returna==b
22+
})
23+
}
24+
25+
funcOverlapCompare[Tany](a []T,b []T,equalfunc(a,bT)bool)bool {
1426
// For each element in b, if at least 1 is contained in 'a',
1527
// return true.
1628
for_,element:=rangeb {
17-
ifContains(a,element) {
29+
ifContainsCompare(a,element,equal) {
1830
returntrue
1931
}
2032
}

‎coderd/workspaces.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,7 @@ func workspaceSearchQuery(query string) (database.GetWorkspacesParams, []httpapi
959959
// No filter
960960
return database.GetWorkspacesParams{},nil
961961
}
962+
query=strings.ToLower(query)
962963
// Because we do this in 2 passes, we want to maintain quotes on the first
963964
// pass.Further splitting occurs on the second pass and quotes will be
964965
// dropped.

‎coderd/workspaces_internal_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ func TestSearchWorkspace(t *testing.T) {
2727
Name:"Owner/Name",
2828
Query:"Foo/Bar",
2929
Expected: database.GetWorkspacesParams{
30-
OwnerUsername:"Foo",
31-
Name:"Bar",
30+
OwnerUsername:"foo",
31+
Name:"bar",
3232
},
3333
},
3434
{
@@ -40,15 +40,15 @@ func TestSearchWorkspace(t *testing.T) {
4040
},
4141
{
4242
Name:"Name+Param",
43-
Query:"workspace-nametemplate:docker",
43+
Query:"workspace-nameTEMPLATE:docker",
4444
Expected: database.GetWorkspacesParams{
4545
Name:"workspace-name",
4646
TemplateName:"docker",
4747
},
4848
},
4949
{
5050
Name:"OnlyParams",
51-
Query:"name:workspace-name template:dockerowner:alice",
51+
Query:"name:workspace-name template:dockerOWNER:Alice",
5252
Expected: database.GetWorkspacesParams{
5353
Name:"workspace-name",
5454
TemplateName:"docker",

‎coderd/workspaces_test.go

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,13 @@ func TestWorkspaceFilter(t *testing.T) {
358358
user,err:=userClient.User(context.Background(),codersdk.Me)
359359
require.NoError(t,err,"fetch me")
360360

361+
ifi%3==0 {
362+
user,err=client.UpdateUserProfile(context.Background(),user.ID.String(), codersdk.UpdateUserProfileRequest{
363+
Username:strings.ToUpper(user.Username),
364+
})
365+
require.NoError(t,err,"uppercase username")
366+
}
367+
361368
org,err:=userClient.CreateOrganization(context.Background(), codersdk.CreateOrganizationRequest{
362369
Name:user.Username+"-org",
363370
})
@@ -378,16 +385,32 @@ func TestWorkspaceFilter(t *testing.T) {
378385

379386
availTemplates:=make([]codersdk.Template,0)
380387
allWorkspaces:=make([]madeWorkspace,0)
388+
upperTemplates:=make([]string,0)
381389

382390
// Create some random workspaces
383-
for_,user:=rangeusers {
391+
varcountint
392+
fori,user:=rangeusers {
384393
version:=coderdtest.CreateTemplateVersion(t,client,user.Org.ID,nil)
385394

386395
// Create a template & workspace in the user's org
387396
coderdtest.AwaitTemplateVersionJob(t,client,version.ID)
388-
template:=coderdtest.CreateTemplate(t,client,user.Org.ID,version.ID)
397+
398+
vartemplate codersdk.Template
399+
ifi%3==0 {
400+
template=coderdtest.CreateTemplate(t,client,user.Org.ID,version.ID,func(request*codersdk.CreateTemplateRequest) {
401+
request.Name=strings.ToUpper(request.Name)
402+
})
403+
upperTemplates=append(upperTemplates,template.Name)
404+
}else {
405+
template=coderdtest.CreateTemplate(t,client,user.Org.ID,version.ID)
406+
}
407+
389408
availTemplates=append(availTemplates,template)
390-
workspace:=coderdtest.CreateWorkspace(t,user.Client,template.OrganizationID,template.ID)
409+
workspace:=coderdtest.CreateWorkspace(t,user.Client,template.OrganizationID,template.ID,func(request*codersdk.CreateWorkspaceRequest) {
410+
ifcount%3==0 {
411+
request.Name=strings.ToUpper(request.Name)
412+
}
413+
})
391414
allWorkspaces=append(allWorkspaces,madeWorkspace{
392415
Workspace:workspace,
393416
Template:template,
@@ -428,19 +451,28 @@ func TestWorkspaceFilter(t *testing.T) {
428451
{
429452
Name:"Owner",
430453
Filter: codersdk.WorkspaceFilter{
431-
Owner:users[2].User.Username,
454+
Owner:strings.ToUpper(users[2].User.Username),
432455
},
433456
FilterF:func(f codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
434-
returnworkspace.Owner.Username==f.Owner
457+
returnstrings.EqualFold(workspace.Owner.Username,f.Owner)
435458
},
436459
},
437460
{
438461
Name:"TemplateName",
439462
Filter: codersdk.WorkspaceFilter{
440-
Template:allWorkspaces[5].Template.Name,
463+
Template:strings.ToUpper(allWorkspaces[5].Template.Name),
441464
},
442465
FilterF:func(f codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
443-
returnworkspace.Template.Name==f.Template
466+
returnstrings.EqualFold(workspace.Template.Name,f.Template)
467+
},
468+
},
469+
{
470+
Name:"UpperTemplateName",
471+
Filter: codersdk.WorkspaceFilter{
472+
Template:upperTemplates[0],
473+
},
474+
FilterF:func(f codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
475+
returnstrings.EqualFold(workspace.Template.Name,f.Template)
444476
},
445477
},
446478
{
@@ -450,16 +482,21 @@ func TestWorkspaceFilter(t *testing.T) {
450482
Name:"a",
451483
},
452484
FilterF:func(f codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
453-
returnstrings.Contains(workspace.Workspace.Name,f.Name)
485+
returnstrings.ContainsAny(workspace.Workspace.Name,"Aa")
454486
},
455487
},
456488
{
457489
Name:"Q-Owner/Name",
458490
Filter: codersdk.WorkspaceFilter{
459-
FilterQuery:allWorkspaces[5].Owner.Username+"/"+allWorkspaces[5].Workspace.Name,
491+
FilterQuery:allWorkspaces[5].Owner.Username+"/"+strings.ToUpper(allWorkspaces[5].Workspace.Name),
460492
},
461-
FilterF:func(_ codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
462-
returnworkspace.Workspace.ID==allWorkspaces[5].Workspace.ID
493+
FilterF:func(f codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
494+
ifstrings.EqualFold(workspace.Owner.Username,allWorkspaces[5].Owner.Username)&&
495+
strings.Contains(strings.ToLower(workspace.Workspace.Name),strings.ToLower(allWorkspaces[5].Workspace.Name)) {
496+
returntrue
497+
}
498+
499+
returnfalse
463500
},
464501
},
465502
{
@@ -470,7 +507,12 @@ func TestWorkspaceFilter(t *testing.T) {
470507
Name:allWorkspaces[3].Workspace.Name,
471508
},
472509
FilterF:func(f codersdk.WorkspaceFilter,workspacemadeWorkspace)bool {
473-
returnworkspace.Workspace.ID==allWorkspaces[3].Workspace.ID
510+
ifstrings.EqualFold(workspace.Owner.Username,f.Owner)&&
511+
strings.Contains(strings.ToLower(workspace.Workspace.Name),strings.ToLower(f.Name))&&
512+
strings.EqualFold(workspace.Template.Name,f.Template) {
513+
returntrue
514+
}
515+
returnfalse
474516
},
475517
},
476518
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp