diff --git a/api/compose/spec.json b/api/compose/spec.json index 28f17cf8f..6729ef0d0 100644 --- a/api/compose/spec.json +++ b/api/compose/spec.json @@ -27,6 +27,12 @@ "required": false, "title": "Search query" }, + { + "type": "string", + "name": "slug", + "required": false, + "title": "Search by namespace slug" + }, { "name": "page", "type": "uint", diff --git a/api/compose/spec/namespace.json b/api/compose/spec/namespace.json index 93bdf68cf..5ea7c1c86 100644 --- a/api/compose/spec/namespace.json +++ b/api/compose/spec/namespace.json @@ -27,6 +27,12 @@ "title": "Search query", "type": "string" }, + { + "name": "slug", + "required": false, + "title": "Search by namespace slug", + "type": "string" + }, { "name": "page", "required": false, diff --git a/compose/internal/repository/namespace.go b/compose/internal/repository/namespace.go index 7eb3b3ee0..dfddf8971 100644 --- a/compose/internal/repository/namespace.go +++ b/compose/internal/repository/namespace.go @@ -86,6 +86,10 @@ func (r *namespace) Find(filter types.NamespaceFilter) (set types.NamespaceSet, query = query.Where("name like ? OR slug like ?", q, q) } + if f.Slug != "" { + query = query.Where("LOWER(slug) = LOWER(?)", f.Slug) + } + if f.Count, err = r.count(query); err != nil || f.Count == 0 { return } diff --git a/compose/rest/namespace.go b/compose/rest/namespace.go index 79a0a7a8f..4d20da5ae 100644 --- a/compose/rest/namespace.go +++ b/compose/rest/namespace.go @@ -58,6 +58,7 @@ func (Namespace) New() *Namespace { func (ctrl Namespace) List(ctx context.Context, r *request.NamespaceList) (interface{}, error) { f := types.NamespaceFilter{ Query: r.Query, + Slug: r.Slug, PerPage: r.PerPage, Page: r.Page, } diff --git a/compose/rest/request/namespace.go b/compose/rest/request/namespace.go index 62b3e417f..4fa48c965 100644 --- a/compose/rest/request/namespace.go +++ b/compose/rest/request/namespace.go @@ -36,6 +36,7 @@ var _ = multipart.FileHeader{} // Namespace list request parameters type NamespaceList struct { Query string + Slug string Page uint PerPage uint } @@ -48,6 +49,7 @@ func (r NamespaceList) Auditable() map[string]interface{} { var out = map[string]interface{}{} out["query"] = r.Query + out["slug"] = r.Slug out["page"] = r.Page out["perPage"] = r.PerPage @@ -84,6 +86,9 @@ func (r *NamespaceList) Fill(req *http.Request) (err error) { if val, ok := get["query"]; ok { r.Query = val } + if val, ok := get["slug"]; ok { + r.Slug = val + } if val, ok := get["page"]; ok { r.Page = parseUint(val) } diff --git a/compose/types/namespace.go b/compose/types/namespace.go index b08c61df8..dc30e5a48 100644 --- a/compose/types/namespace.go +++ b/compose/types/namespace.go @@ -22,6 +22,7 @@ type ( NamespaceFilter struct { Query string `json:"query"` + Slug string `json:"slug"` Page uint `json:"page"` PerPage uint `json:"perPage"` Sort string `json:"sort"` diff --git a/docs/compose/README.md b/docs/compose/README.md index ac455d0a9..549b87d90 100644 --- a/docs/compose/README.md +++ b/docs/compose/README.md @@ -604,6 +604,7 @@ Compose module definitions | Parameter | Type | Method | Description | Default | Required? | | --------- | ---- | ------ | ----------- | ------- | --------- | | query | string | GET | Search query | N/A | NO | +| slug | string | GET | Search by namespace slug | N/A | NO | | page | uint | GET | Page number (0 based) | N/A | NO | | perPage | uint | GET | Returned items per page (default 50) | N/A | NO |