Refactor namespace repo
This commit is contained in:
@@ -44,6 +44,12 @@
|
||||
"type": "uint",
|
||||
"required": false,
|
||||
"title": "Returned items per page (default 50)"
|
||||
},
|
||||
{
|
||||
"name": "sort",
|
||||
"type": "string",
|
||||
"required": false,
|
||||
"title": "Sort namespaces"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -44,6 +44,12 @@
|
||||
"required": false,
|
||||
"title": "Returned items per page (default 50)",
|
||||
"type": "uint"
|
||||
},
|
||||
{
|
||||
"name": "sort",
|
||||
"required": false,
|
||||
"title": "Sort namespaces",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -2,12 +2,14 @@ package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/titpetric/factory"
|
||||
"gopkg.in/Masterminds/squirrel.v1"
|
||||
|
||||
"github.com/cortezaproject/corteza-server/compose/types"
|
||||
"github.com/cortezaproject/corteza-server/pkg/rh"
|
||||
)
|
||||
|
||||
type (
|
||||
@@ -56,7 +58,7 @@ func (r namespace) columns() []string {
|
||||
|
||||
func (r namespace) query() squirrel.SelectBuilder {
|
||||
return squirrel.
|
||||
Select().
|
||||
Select(r.columns()...).
|
||||
From(r.table()).
|
||||
Where("deleted_at IS NULL")
|
||||
|
||||
@@ -69,36 +71,44 @@ func (r *namespace) With(ctx context.Context, db *factory.DB) NamespaceRepositor
|
||||
}
|
||||
|
||||
func (r *namespace) FindByID(namespaceID uint64) (*types.Namespace, error) {
|
||||
var (
|
||||
query = r.query().
|
||||
Columns(r.columns()...).
|
||||
Where("id = ?", namespaceID)
|
||||
|
||||
n = &types.Namespace{}
|
||||
)
|
||||
|
||||
return n, isFound(r.fetchOne(n, query), n.ID > 0, ErrNamespaceNotFound)
|
||||
return r.findOneBy("id", namespaceID)
|
||||
}
|
||||
|
||||
func (r *namespace) FindBySlug(slug string) (*types.Namespace, error) {
|
||||
var (
|
||||
query = r.query().
|
||||
Columns(r.columns()...).
|
||||
Where("slug = ?", slug)
|
||||
return r.findOneBy("slug", slug)
|
||||
}
|
||||
|
||||
n = &types.Namespace{}
|
||||
func (r *namespace) findOneBy(field string, value interface{}) (*types.Namespace, error) {
|
||||
var (
|
||||
ns = &types.Namespace{}
|
||||
|
||||
q = r.query().
|
||||
Where(squirrel.Eq{field: value})
|
||||
|
||||
err = rh.FetchOne(r.db(), q, ns)
|
||||
)
|
||||
|
||||
return n, isFound(r.fetchOne(n, query), n.ID > 0, ErrNamespaceNotFound)
|
||||
if err == nil && ns.ID == 0 {
|
||||
return nil, ErrNamespaceNotFound
|
||||
}
|
||||
|
||||
return ns, nil
|
||||
}
|
||||
|
||||
func (r *namespace) Find(filter types.NamespaceFilter) (set types.NamespaceSet, f types.NamespaceFilter, err error) {
|
||||
f = filter
|
||||
|
||||
if f.Sort == "" {
|
||||
f.Sort = "id ASC"
|
||||
}
|
||||
|
||||
query := r.query()
|
||||
if f.Query != "" {
|
||||
q := "%" + f.Query + "%"
|
||||
query = query.Where("name like ? OR slug like ?", q, q)
|
||||
q := "%" + strings.ToLower(f.Query) + "%"
|
||||
query = query.Where(squirrel.Or{
|
||||
squirrel.Like{"LOWER(name)": q},
|
||||
squirrel.Like{"LOWER(slug)": q},
|
||||
})
|
||||
}
|
||||
|
||||
if f.Slug != "" {
|
||||
@@ -109,19 +119,18 @@ func (r *namespace) Find(filter types.NamespaceFilter) (set types.NamespaceSet,
|
||||
query = query.Where(f.IsReadable)
|
||||
}
|
||||
|
||||
if f.Count, err = r.count(query); err != nil || f.Count == 0 {
|
||||
var orderBy []string
|
||||
if orderBy, err = rh.ParseOrder(f.Sort, r.columns()...); err != nil {
|
||||
return
|
||||
} else {
|
||||
query = query.OrderBy(orderBy...)
|
||||
}
|
||||
|
||||
if f.Count, err = rh.Count(r.db(), query); err != nil || f.Count == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if f.Page > 0 {
|
||||
query = query.Offset(uint64(f.PerPage * f.Page))
|
||||
}
|
||||
|
||||
query = query.
|
||||
Columns(r.columns()...).
|
||||
OrderBy("id ASC")
|
||||
|
||||
return set, f, r.fetchPaged(&set, query, f.Page, f.PerPage)
|
||||
return set, f, rh.FetchPaged(r.db(), query, f.Page, f.PerPage, &set)
|
||||
}
|
||||
|
||||
func (r *namespace) Create(mod *types.Namespace) (*types.Namespace, error) {
|
||||
|
||||
@@ -61,6 +61,7 @@ func (ctrl Namespace) List(ctx context.Context, r *request.NamespaceList) (inter
|
||||
Slug: r.Slug,
|
||||
PerPage: r.PerPage,
|
||||
Page: r.Page,
|
||||
Sort: r.Sort,
|
||||
}
|
||||
|
||||
set, filter, err := ctrl.namespace.With(ctx).Find(f)
|
||||
|
||||
@@ -39,6 +39,7 @@ type NamespaceList struct {
|
||||
Slug string
|
||||
Page uint
|
||||
PerPage uint
|
||||
Sort string
|
||||
}
|
||||
|
||||
func NewNamespaceList() *NamespaceList {
|
||||
@@ -52,6 +53,7 @@ func (r NamespaceList) Auditable() map[string]interface{} {
|
||||
out["slug"] = r.Slug
|
||||
out["page"] = r.Page
|
||||
out["perPage"] = r.PerPage
|
||||
out["sort"] = r.Sort
|
||||
|
||||
return out
|
||||
}
|
||||
@@ -95,6 +97,9 @@ func (r *NamespaceList) Fill(req *http.Request) (err error) {
|
||||
if val, ok := get["perPage"]; ok {
|
||||
r.PerPage = parseUint(val)
|
||||
}
|
||||
if val, ok := get["sort"]; ok {
|
||||
r.Sort = val
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -613,6 +613,7 @@ Compose module definitions
|
||||
| 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 |
|
||||
| sort | string | GET | Sort namespaces | N/A | NO |
|
||||
|
||||
## Create namespace
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package rh
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/cortezaproject/corteza-server/pkg/ql"
|
||||
)
|
||||
|
||||
func ParseOrder(order string, valid ...string) (out []string, err error) {
|
||||
var (
|
||||
// Sort parser
|
||||
sp = ql.NewParser()
|
||||
|
||||
// Sort columns
|
||||
sc ql.Columns
|
||||
|
||||
whitelist = map[string]bool{}
|
||||
)
|
||||
|
||||
for _, col := range valid {
|
||||
if i := strings.Index(col, "."); i > -1 {
|
||||
whitelist[col[i:]] = true
|
||||
}
|
||||
|
||||
whitelist[col] = true
|
||||
}
|
||||
|
||||
sp.OnIdent = func(i ql.Ident) (ql.Ident, error) {
|
||||
if !whitelist[i.Value] {
|
||||
return i, errors.Errorf("unknown order-by column %q", i.Value)
|
||||
}
|
||||
|
||||
i.Value += " "
|
||||
return i, nil
|
||||
}
|
||||
|
||||
if sc, err = sp.ParseColumns(order); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
out = sc.Strings()
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user