chore: support 'me' as the username for template author (#19204)

`author:me` to find my templates. Much nicer than knowing my own
username
This commit is contained in:
Steven Masley
2025-08-06 11:45:07 -05:00
committed by GitHub
parent 5b80c47e8c
commit 3024bdebcb
4 changed files with 21 additions and 6 deletions
+6 -1
View File
@@ -263,7 +263,7 @@ func Workspaces(ctx context.Context, db database.Store, query string, page coder
return filter, parser.Errors return filter, parser.Errors
} }
func Templates(ctx context.Context, db database.Store, query string) (database.GetTemplatesWithFilterParams, []codersdk.ValidationError) { func Templates(ctx context.Context, db database.Store, actorID uuid.UUID, query string) (database.GetTemplatesWithFilterParams, []codersdk.ValidationError) {
// Always lowercase for all searches. // Always lowercase for all searches.
query = strings.ToLower(query) query = strings.ToLower(query)
values, errors := searchTerms(query, func(term string, values url.Values) error { values, errors := searchTerms(query, func(term string, values url.Values) error {
@@ -288,6 +288,11 @@ func Templates(ctx context.Context, db database.Store, query string) (database.G
AuthorUsername: parser.String(values, "", "author"), AuthorUsername: parser.String(values, "", "author"),
} }
if filter.AuthorUsername == codersdk.Me {
filter.AuthorID = actorID
filter.AuthorUsername = ""
}
parser.ErrorExcessParams(values) parser.ErrorExcessParams(values)
return filter, parser.Errors return filter, parser.Errors
} }
+10 -1
View File
@@ -640,6 +640,7 @@ func TestSearchUsers(t *testing.T) {
func TestSearchTemplates(t *testing.T) { func TestSearchTemplates(t *testing.T) {
t.Parallel() t.Parallel()
userID := uuid.New()
testCases := []struct { testCases := []struct {
Name string Name string
Query string Query string
@@ -688,6 +689,14 @@ func TestSearchTemplates(t *testing.T) {
}, },
}, },
}, },
{
Name: "MyTemplates",
Query: "author:me",
Expected: database.GetTemplatesWithFilterParams{
AuthorUsername: "",
AuthorID: userID,
},
},
} }
for _, c := range testCases { for _, c := range testCases {
@@ -696,7 +705,7 @@ func TestSearchTemplates(t *testing.T) {
// Do not use a real database, this is only used for an // Do not use a real database, this is only used for an
// organization lookup. // organization lookup.
db, _ := dbtestutil.NewDB(t) db, _ := dbtestutil.NewDB(t)
values, errs := searchquery.Templates(context.Background(), db, c.Query) values, errs := searchquery.Templates(context.Background(), db, userID, c.Query)
if c.ExpectedErrorContains != "" { if c.ExpectedErrorContains != "" {
require.True(t, len(errs) > 0, "expect some errors") require.True(t, len(errs) > 0, "expect some errors")
var s strings.Builder var s strings.Builder
+2 -1
View File
@@ -544,9 +544,10 @@ func (api *API) templatesByOrganization() http.HandlerFunc {
func (api *API) fetchTemplates(mutate func(r *http.Request, arg *database.GetTemplatesWithFilterParams)) http.HandlerFunc { func (api *API) fetchTemplates(mutate func(r *http.Request, arg *database.GetTemplatesWithFilterParams)) http.HandlerFunc {
return func(rw http.ResponseWriter, r *http.Request) { return func(rw http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
key := httpmw.APIKey(r)
queryStr := r.URL.Query().Get("q") queryStr := r.URL.Query().Get("q")
filter, errs := searchquery.Templates(ctx, api.Database, queryStr) filter, errs := searchquery.Templates(ctx, api.Database, key.UserID, queryStr)
if len(errs) > 0 { if len(errs) > 0 {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
Message: "Invalid template search query.", Message: "Invalid template search query.",
+3 -3
View File
@@ -820,7 +820,7 @@ func TestTemplatesByOrganization(t *testing.T) {
client := coderdtest.New(t, nil) client := coderdtest.New(t, nil)
owner := coderdtest.CreateFirstUser(t, client) owner := coderdtest.CreateFirstUser(t, client)
adminAlpha, adminAlphaData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) adminAlpha, adminAlphaData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
adminBravo, adminBravoData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) adminBravo, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
adminCharlie, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) adminCharlie, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin())
versionA := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) versionA := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
@@ -847,8 +847,8 @@ func TestTemplatesByOrganization(t *testing.T) {
require.Equal(t, foo.ID, alpha[0].ID) require.Equal(t, foo.ID, alpha[0].ID)
// List bravo // List bravo
bravo, err := client.Templates(ctx, codersdk.TemplateFilter{ bravo, err := adminBravo.Templates(ctx, codersdk.TemplateFilter{
AuthorUsername: adminBravoData.Username, AuthorUsername: codersdk.Me,
}) })
require.NoError(t, err) require.NoError(t, err)
require.Len(t, bravo, 1) require.Len(t, bravo, 1)