From f4e66b0b6026a1e832c58a5f228784f95180ae48 Mon Sep 17 00:00:00 2001 From: Seth Vargo Date: Mon, 9 Nov 2020 21:54:21 -0500 Subject: [PATCH] Add realms search --- cmd/server/assets/admin/realms/index.html | 18 +++++++++++++++- pkg/controller/admin/realms.go | 13 +++++++++++- pkg/database/realm.go | 26 +++++++++++++++++------ pkg/database/scopes.go | 13 ++++++++++++ 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/cmd/server/assets/admin/realms/index.html b/cmd/server/assets/admin/realms/index.html index 9a99694f0..7693840c2 100644 --- a/cmd/server/assets/admin/realms/index.html +++ b/cmd/server/assets/admin/realms/index.html @@ -23,8 +23,22 @@ +
+
+
+ +
+ +
+
+ +
+
+
+ {{if $realms}} - +
@@ -54,6 +68,8 @@

{{end}} + + {{template "shared/pagination" .}} diff --git a/pkg/controller/admin/realms.go b/pkg/controller/admin/realms.go index 3738476cd..01dd5f9b5 100644 --- a/pkg/controller/admin/realms.go +++ b/pkg/controller/admin/realms.go @@ -20,6 +20,7 @@ import ( "github.com/google/exposure-notifications-verification-server/pkg/controller" "github.com/google/exposure-notifications-verification-server/pkg/database" + "github.com/google/exposure-notifications-verification-server/pkg/pagination" "github.com/gorilla/mux" ) @@ -27,7 +28,15 @@ func (c *Controller) HandleRealmsIndex() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - realms, err := c.db.GetRealms() + pageParams, err := pagination.FromRequest(r) + if err != nil { + controller.InternalError(w, r, c.h, err) + return + } + + q := r.FormValue(QueryKeySearch) + + realms, paginator, err := c.db.ListRealms(pageParams, database.WithRealmSearch(q)) if err != nil { controller.InternalError(w, r, c.h, err) return @@ -36,6 +45,8 @@ func (c *Controller) HandleRealmsIndex() http.Handler { m := controller.TemplateMapFromContext(ctx) m.Title("Realms - System Admin") m["realms"] = realms + m["query"] = q + m["paginator"] = paginator c.h.RenderHTML(w, "admin/realms/index", m) }) } diff --git a/pkg/database/realm.go b/pkg/database/realm.go index 9813cfaa5..7ad167181 100644 --- a/pkg/database/realm.go +++ b/pkg/database/realm.go @@ -848,15 +848,27 @@ func (db *Database) FindRealm(id interface{}) (*Realm, error) { return &realm, nil } -func (db *Database) GetRealms() ([]*Realm, error) { +// ListRealms lists all available realms in the system. +func (db *Database) ListRealms(p *pagination.PageParams, scopes ...Scope) ([]*Realm, *pagination.Paginator, error) { var realms []*Realm - if err := db.db. - Order("name ASC"). - Find(&realms). - Error; err != nil { - return nil, err + query := db.db. + Model(&Realm{}). + Scopes(scopes...). + Order("name ASC") + + if p == nil { + p = new(pagination.PageParams) + } + + paginator, err := Paginate(query, &realms, p.Page, p.Limit) + if err != nil { + if IsNotFound(err) { + return realms, nil, nil + } + return nil, nil, err } - return realms, nil + + return realms, paginator, nil } func (r *Realm) AuditID() string { diff --git a/pkg/database/scopes.go b/pkg/database/scopes.go index 0a58f1f58..ba3bab164 100644 --- a/pkg/database/scopes.go +++ b/pkg/database/scopes.go @@ -82,3 +82,16 @@ func WithAuthorizedAppSearch(q string) Scope { return db } } + +// WithRealmSearch returns a scope that adds querying for realms by name. It's +// only applicable to functions that query Realm. +func WithRealmSearch(q string) Scope { + return func(db *gorm.DB) *gorm.DB { + q = project.TrimSpace(q) + if q != "" { + q = `%` + q + `%` + return db.Where("realms.name ILIKE ?", q) + } + return db + } +}
ID