3
0

Ported pkg/rh to pkg/filter and removed obsolete code

This commit is contained in:
Denis Arh
2020-09-06 16:33:57 +02:00
parent f7070b4fa5
commit f64bf4673e
57 changed files with 199 additions and 774 deletions

View File

@@ -5,25 +5,23 @@ import (
"encoding/csv"
"encoding/json"
"fmt"
"github.com/cortezaproject/corteza-server/store"
"net/http"
"path"
"strconv"
"strings"
"github.com/titpetric/factory/resputil"
"github.com/cortezaproject/corteza-server/compose/decoder"
"github.com/cortezaproject/corteza-server/compose/encoder"
"github.com/cortezaproject/corteza-server/compose/rest/request"
"github.com/cortezaproject/corteza-server/compose/service"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/corredor"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/mime"
"github.com/cortezaproject/corteza-server/pkg/payload"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
systemService "github.com/cortezaproject/corteza-server/system/service"
systemTypes "github.com/cortezaproject/corteza-server/system/types"
"github.com/titpetric/factory/resputil"
"net/http"
"path"
"strconv"
"strings"
)
type (
@@ -83,7 +81,7 @@ func (ctrl *Record) List(ctx context.Context, r *request.RecordList) (interface{
rf = types.RecordFilter{
NamespaceID: r.NamespaceID,
ModuleID: r.ModuleID,
Deleted: rh.FilterState(r.Deleted),
Deleted: filter.State(r.Deleted),
}
)

View File

@@ -4,12 +4,9 @@ import (
"database/sql/driver"
"encoding/json"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/rh"
"time"
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/pkg/errors"
"time"
)
type (
@@ -47,7 +44,7 @@ type (
Handle string `json:"handle"`
Query string `json:"query"`
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -7,7 +7,6 @@ import (
"github.com/jmoiron/sqlx/types"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -31,7 +30,7 @@ type (
Handle string `json:"handle"`
Name string `json:"name"`
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -3,11 +3,10 @@ package types
import (
"database/sql/driver"
"encoding/json"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"sort"
"time"
"github.com/cortezaproject/corteza-server/pkg/permissions"
)
type (
@@ -36,7 +35,7 @@ type (
ModuleFieldFilter struct {
ModuleID []uint64
Deleted rh.FilterState
Deleted filter.State
}
)

View File

@@ -9,7 +9,6 @@ import (
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -30,7 +29,7 @@ type (
Slug string `json:"slug"`
Name string `json:"name"`
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -9,7 +9,6 @@ import (
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -60,7 +59,7 @@ type (
Handle string `json:"handle"`
Query string `json:"query"`
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -8,7 +8,6 @@ import (
"time"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -57,7 +56,7 @@ type (
// Preloaded set of additional modules that are used for record filtering
// Modules ModuleSet
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -4,10 +4,9 @@ import (
"database/sql/driver"
"encoding/json"
"fmt"
"github.com/cortezaproject/corteza-server/pkg/rh"
"time"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/pkg/errors"
"time"
)
type (
@@ -26,7 +25,7 @@ type (
RecordValueFilter struct {
RecordID []uint64
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
}
)

View File

@@ -4,7 +4,6 @@ import (
"fmt"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/pkg/cli"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/davecgh/go-spew/spew"
"github.com/spf13/cobra"
"github.com/titpetric/factory"

40
pkg/filter/state.go Normal file
View File

@@ -0,0 +1,40 @@
package filter
import (
"github.com/Masterminds/squirrel"
)
type (
// State for filtering by state,
// for example: include, exclude or return only deleted values
State uint
)
// State* constants aid with Filter*
const (
// StateExcluded do not include entries
StateExcluded State = 0
// StateInclusive include entries
StateInclusive State = 1
// StateExclusive only entries that have this state
StateExclusive State = 2
)
// squirrel.SelectBuilder
func StateCondition(q squirrel.SelectBuilder, field string, fs State) squirrel.SelectBuilder {
switch fs {
case StateExclusive:
// only null values
return q.Where(squirrel.NotEq{field: nil})
case StateInclusive:
// mo filter
return q
default:
// exclude all non-null values
return q.Where(squirrel.Eq{field: nil})
}
}

View File

@@ -11,8 +11,7 @@ package ngimporter
// "github.com/cortezaproject/corteza-server/compose/repository"
// cct "github.com/cortezaproject/corteza-server/compose/types"
// "github.com/cortezaproject/corteza-server/pkg/ngimporter/types"
// "github.com/cortezaproject/corteza-server/pkg/rh"
// "github.com/schollz/progressbar/v2"
//// "github.com/schollz/progressbar/v2"
//)
//
//type (
@@ -195,7 +194,7 @@ package ngimporter
// }
// rr, _, err := recRepo.Find(uMod, cct.RecordFilter{
// ModuleID: uMod.ID,
// Deleted: rh.FilterStateInclusive,
// Deleted: filter.StateInclusive,
// NamespaceID: ns.ID,
// Query: "sys_legacy_ref_id IS NOT NULL",
// PageFilter: rh.PageFilter{

View File

@@ -15,8 +15,7 @@ package types
// "github.com/cortezaproject/corteza-server/compose/repository"
// cv "github.com/cortezaproject/corteza-server/compose/service/values"
// "github.com/cortezaproject/corteza-server/compose/types"
// "github.com/cortezaproject/corteza-server/pkg/rh"
// "github.com/schollz/progressbar/v2"
//// "github.com/schollz/progressbar/v2"
//)
//
//type (
@@ -164,7 +163,7 @@ package types
// fl := types.RecordFilter{
// ModuleID: refModU,
// NamespaceID: n.Namespace.ID,
// Deleted: rh.FilterStateInclusive,
// Deleted: filter.StateInclusive,
// Query: fmt.Sprintf("%s='%s'", LegacyRefIDField, ref),
// PageFilter: rh.PageFilter{
// Page: 1,
@@ -196,7 +195,7 @@ package types
// // fetch all records, ordered by the ID for this module before the specified timestamp (if provided)
// f := types.RecordFilter{
// Sort: "id ASC",
// Deleted: rh.FilterStateInclusive,
// Deleted: filter.StateInclusive,
// ModuleID: n.Module.ID,
// NamespaceID: n.Namespace.ID,
// PageFilter: rh.PageFilter{

View File

@@ -2,10 +2,7 @@ package permissions
import (
"fmt"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -86,7 +83,9 @@ func (rf ResourceFilter) ToSql() (sql string, args []interface{}, err error) {
}
build = func(ss ...squirrel.Sqlizer) (sql string, args []interface{}, err error) {
return rh.SquirrelFunction("COALESCE", append(checks, ss...)...).ToSql()
return squirrel.Expr("FALSE").ToSql()
// @obsolete
//return rh.SquirrelFunction("COALESCE", append(checks, ss...)...).ToSql()
}
)

View File

@@ -1,4 +0,0 @@
# (rh) Repository Helpers
Package name is short an abbreviated to avoid
colliding with per-service repository package names.

View File

@@ -1,11 +0,0 @@
package rh
import (
"github.com/Masterminds/squirrel"
"github.com/titpetric/factory"
)
func Delete(db *factory.DB, table string, cnd squirrel.Sqlizer) error {
_, err := squirrel.ExecWith(db, squirrel.Delete(table).Where(cnd))
return err
}

View File

@@ -1,40 +0,0 @@
package rh
import (
"github.com/Masterminds/squirrel"
)
type (
// FilterState for filtering by state,
// for example: include, exclude or return only deleted values
FilterState uint
)
// FilterState* constants aid with Filter*
const (
// FilterStateExcluded do not include entries
FilterStateExcluded FilterState = 0
// FilterStateInclusive include entries
FilterStateInclusive FilterState = 1
// FilterStateExclusive only entries that have this state
FilterStateExclusive FilterState = 2
)
// squirrel.SelectBuilder
func FilterNullByState(q squirrel.SelectBuilder, field string, fs FilterState) squirrel.SelectBuilder {
switch fs {
case FilterStateExclusive:
// only null values
return q.Where(squirrel.NotEq{field: nil})
case FilterStateInclusive:
// mo filter
return q
default:
// exclude all non-null values
return q.Where(squirrel.Eq{field: nil})
}
}

View File

@@ -1,50 +0,0 @@
package rh
import (
"fmt"
"github.com/Masterminds/squirrel"
"github.com/titpetric/factory"
)
// DailyMetrics aids repositories on simple stat building queries
//
// Returns a slice of numbers (timestamp + value pairs
func DailyMetrics(db *factory.DB, q squirrel.SelectBuilder, field string) (rval []uint, err error) {
var (
aux = make([]struct {
Timestamp uint
Value uint
}, 0)
)
q = q.
Column(fmt.Sprintf("UNIX_TIMESTAMP(DATE(%s)) timestamp", field)).
Column("COUNT(*) AS value").
Where(fmt.Sprintf("%s IS NOT NULL", field)).
OrderBy("timestamp").
GroupBy("timestamp")
if err = FetchAll(db, q, &aux); err != nil {
return
}
rval = make([]uint, 2*len(aux))
for i := 0; i < len(aux); i++ {
rval[2*i], rval[2*i+1] = aux[i].Timestamp, aux[i].Value
}
return
}
// MultiDailyMetrics simplifies fetching of multiple daily metrics
func MultiDailyMetrics(db *factory.DB, q squirrel.SelectBuilder, fields []string, mm ...*[]uint) (err error) {
for m := 0; m < len(mm); m++ {
*mm[m], err = DailyMetrics(db, q, fields[m])
if err != nil {
return
}
}
return
}

View File

@@ -1,63 +0,0 @@
package rh
import (
"strings"
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/pkg/ql"
)
var (
normalizeSortColumns = strings.NewReplacer(
"createdAt",
"created_at",
"updatedAt",
"updated_at",
"deletedAt",
"deleted_at",
)
)
// NormalizeSortColumns returns sort-by columns by replacing names
// that API returns as JSON objects into internal (db) representation
func NormalizeSortColumns(sort string) string {
return normalizeSortColumns.Replace(sort)
}
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+1:]] = 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
}

View File

@@ -1,107 +0,0 @@
package rh
import "strconv"
const (
PER_PAGE_DEFAULT uint = 50
PER_PAGE_MAX = 200
PER_PAGE_MIN = 10
)
type (
// PageFilter supports page/perPage (one based) and limit/offset
// pagination.
//
// Limit/offset is prioritised over page/perPage
//
PageFilter struct {
// If limit is set to a positive number,
// paging mechanisms will use limit/offset
// Otherwise page/perPage is used
Limit uint `json:"limit,omitempty"`
Offset uint `json:"offset,omitempty"`
Page uint `json:"page,omitempty"`
PerPage uint `json:"perPage,omitempty"`
// Count is used when filter and pagination are send back
// with the response
Count uint `json:"count"`
}
paginationParams interface {
GetLimit() uint
GetOffset() uint
GetPage() uint
GetPerPage() uint
}
)
func Paging(p paginationParams) PageFilter {
return PageFilter{
Limit: p.GetLimit(),
Offset: p.GetOffset(),
Page: p.GetPage(),
PerPage: p.GetPerPage(),
}
}
// Limit creates PageFilter struct from limit and, optionally offset
func Limit(a ...uint) PageFilter {
switch len(a) {
case 1:
return PageFilter{Limit: a[0]}
case 2:
return PageFilter{Limit: a[0], Offset: a[1]}
}
return PageFilter{}
}
func (pf *PageFilter) ParsePagination(input interface{}) error {
return parsePagination(pf, input)
}
func parsePagination(pf *PageFilter, input interface{}) (err error) {
switch i := input.(type) {
case map[string]string:
conv := func(v *uint, name string) error {
if _, has := i[name]; has {
pv, err := strconv.ParseUint(i[name], 10, 32)
if err != nil {
return err
}
*v = uint(pv)
}
return nil
}
if len(i["limit"]+i["offset"]) > 0 {
if err = conv(&pf.Limit, "limit"); err != nil {
return
}
if err = conv(&pf.Offset, "offset"); err != nil {
return
}
return
}
if len(i["page"]+i["perPage"]) > 0 {
if err = conv(&pf.Page, "page"); err != nil {
return
}
if err = conv(&pf.PerPage, "perPage"); err != nil {
return
}
return
}
}
return nil
}

View File

@@ -1,73 +0,0 @@
package rh
import (
"reflect"
"testing"
"github.com/stretchr/testify/require"
)
func TestLimit(t *testing.T) {
var (
r = require.New(t)
)
r.Equal(Limit(42).Limit, uint(42))
r.Equal(Limit(0, 42).Offset, uint(42))
}
func Test_parsePagination(t *testing.T) {
var (
tests = []struct {
name string
args interface{}
pf PageFilter
wantErr bool
}{
{
"empty",
nil,
PageFilter{},
false,
},
{
"valid l/o",
map[string]string{"limit": "42", "offset": "314"},
PageFilter{Limit: 42, Offset: 314},
false,
},
{
"mixed",
map[string]string{"page": "42", "limit": "314"},
PageFilter{Limit: 314, Offset: 0},
false,
},
{
"invalid limit",
map[string]string{"limit": "abc"},
PageFilter{},
true,
},
{
"invalid page",
map[string]string{"page": "abc"},
PageFilter{},
true,
},
}
)
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var (
pf = PageFilter{}
)
if err := parsePagination(&pf, tt.args); (err != nil) != tt.wantErr {
t.Errorf("parsePagination() error = %v, wantErr %v", err, tt.wantErr)
} else if !reflect.DeepEqual(pf, tt.pf) {
t.Errorf("\n actual: %v\nexpected: %v\n", pf, tt.pf)
}
})
}
}

View File

@@ -1,92 +0,0 @@
package rh
import (
"github.com/Masterminds/squirrel"
"github.com/lann/builder"
"github.com/pkg/errors"
"github.com/titpetric/factory"
)
// FetchOne fetches single row from table
func FetchOne(db *factory.DB, q squirrel.SelectBuilder, one interface{}) (err error) {
var (
sql string
args []interface{}
)
if sql, args, err = q.ToSql(); err != nil {
return
}
if err = db.Get(one, sql, args...); err != nil {
return
}
return
}
// Count counts all rows that match conditions from given query builder
func Count(db *factory.DB, q squirrel.SelectBuilder) (count uint, err error) {
// Remove order-bys for counting
q = builder.Delete(q, "OrderBys").(squirrel.SelectBuilder)
// Replace columns
q = builder.Delete(q, "Columns").(squirrel.SelectBuilder).Column("COUNT(*)")
if sqlSelect, argsSelect, err := q.ToSql(); err != nil {
return 0, err
} else {
if err := db.Get(&count, sqlSelect, argsSelect...); err != nil {
return 0, err
}
}
return count, nil
}
// FetchPaged fetches paged rows
func FetchPaged(db *factory.DB, q squirrel.SelectBuilder, p PageFilter, set interface{}) error {
if p.Limit+p.Offset == 0 {
// When both, offset & limit are 0,
// calculate both values from page/perPage params
if p.PerPage > 0 {
p.Limit = p.PerPage
}
if p.Page < 1 {
p.Page = 1
}
p.Offset = uint((p.Page - 1) * p.PerPage)
}
if p.Limit > 0 {
q = q.Limit(uint64(p.Limit))
}
if p.Offset > 0 {
q = q.Offset(uint64(p.Offset))
}
return FetchAll(db, q, set)
}
// FetchPaged fetches paged rows
func FetchAll(db *factory.DB, q squirrel.Sqlizer, set interface{}) error {
if sqlSelect, argsSelect, err := q.ToSql(); err != nil {
return err
} else {
return db.Select(set, sqlSelect, argsSelect...)
}
}
// IsFound helps with one-row results
func IsFound(err error, valid bool, nerr error) error {
if err != nil {
return errors.WithStack(err)
} else if !valid {
return errors.WithStack(nerr)
}
return nil
}

View File

@@ -1,82 +0,0 @@
package rh
import (
"strings"
"github.com/Masterminds/squirrel"
)
type (
// Waiting for PR to be merged:
// https://github.com/Masterminds/squirrel/pull/206
//
// then we can move to squirrel.Fn(...)
squirrelFunction struct {
name string
fargs []squirrel.Sqlizer
}
)
func SquirrelFunction(name string, args ...squirrel.Sqlizer) *squirrelFunction {
return &squirrelFunction{name: name, fargs: args}
}
func (f squirrelFunction) ToSql() (sql string, args []interface{}, err error) {
var (
aSql string
aArgs []interface{}
)
sql = f.name + "("
args = make([]interface{}, 0)
for a := 0; a < len(f.fargs); a++ {
if a > 0 {
sql += ", "
}
aSql, aArgs, err = f.fargs[a].ToSql()
if err != nil {
return
}
sql += aSql
args = append(args, aArgs...)
}
sql += ")"
return
}
type (
squirrelConcatExpr struct {
parts []string
args []interface{}
err error
}
)
func SquirrelConcatExpr(args ...interface{}) squirrel.Sqlizer {
var w = new(squirrelConcatExpr)
for _, a := range args {
if w.err != nil {
break
}
switch o := a.(type) {
case string:
w.parts = append(w.parts, o)
case squirrel.Sqlizer:
p, a, err := o.ToSql()
w.parts = append(w.parts, p)
w.args = append(w.args, a...)
w.err = err
}
}
return w
}
func (w *squirrelConcatExpr) ToSql() (string, []interface{}, error) {
return strings.Join(w.parts, ""), w.args, w.err
}

View File

@@ -1,24 +0,0 @@
package rh
import (
"time"
)
var (
now = func() time.Time {
return time.Now()
}
)
// SetCurrentTimeRounded sets current time (rounded to seconds) to a given ptr
func SetCurrentTimeRounded(v interface{}) {
n := now().Truncate(time.Second)
switch t := v.(type) {
case *time.Time:
*t = n
case **time.Time:
_ = t
*t = &n
}
}

View File

@@ -1,32 +0,0 @@
package rh
import (
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestNow(t *testing.T) {
var (
r = require.New(t)
val time.Time
ptr *time.Time
inv1 int
inv2 string
)
SetCurrentTimeRounded(&val)
r.NotEmpty(val)
SetCurrentTimeRounded(&ptr)
r.NotNil(ptr)
SetCurrentTimeRounded(&inv1)
r.Empty(inv1)
SetCurrentTimeRounded(&inv2)
r.Empty(inv2)
}

View File

@@ -1,16 +0,0 @@
package rh
import (
"github.com/Masterminds/squirrel"
"github.com/titpetric/factory"
)
type (
Set map[string]interface{}
)
// UpdateColumns constructs and executes an update query
func UpdateColumns(db *factory.DB, table string, set Set, cnd squirrel.Sqlizer) error {
_, err := squirrel.ExecWith(db, squirrel.Update(table).SetMap(set).Where(cnd))
return err
}

View File

@@ -3,14 +3,14 @@ package rdbms
import (
"context"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/system/types"
)
func (s Store) convertApplicationFilter(f types.ApplicationFilter) (query squirrel.SelectBuilder, err error) {
query = s.applicationsSelectBuilder()
query = rh.FilterNullByState(query, "app.deleted_at", f.Deleted)
query = filter.StateCondition(query, "app.deleted_at", f.Deleted)
if f.Query != "" {
qs := f.Query + "%"

View File

@@ -3,14 +3,14 @@ package rdbms
import (
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"strings"
)
func (s Store) convertComposeChartFilter(f types.ChartFilter) (query squirrel.SelectBuilder, err error) {
query = s.composeChartsSelectBuilder()
query = rh.FilterNullByState(query, "cch.deleted_at", f.Deleted)
query = filter.StateCondition(query, "cch.deleted_at", f.Deleted)
if f.NamespaceID > 0 {
query = query.Where("cch.rel_namespace = ?", f.NamespaceID)

View File

@@ -3,14 +3,14 @@ package rdbms
import (
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"strings"
)
func (s Store) convertComposeModuleFilter(f types.ModuleFilter) (query squirrel.SelectBuilder, err error) {
query = s.composeModulesSelectBuilder()
query = rh.FilterNullByState(query, "cmd.deleted_at", f.Deleted)
query = filter.StateCondition(query, "cmd.deleted_at", f.Deleted)
if f.NamespaceID > 0 {
query = query.Where("cmd.rel_namespace = ?", f.NamespaceID)

View File

@@ -4,7 +4,7 @@ import (
"fmt"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
)
func (s Store) convertComposeModuleFieldFilter(f types.ModuleFieldFilter) (query squirrel.SelectBuilder, err error) {
@@ -15,7 +15,7 @@ func (s Store) convertComposeModuleFieldFilter(f types.ModuleFieldFilter) (query
return
}
query = rh.FilterNullByState(query, "cmf.deleted_at", f.Deleted)
query = filter.StateCondition(query, "cmf.deleted_at", f.Deleted)
query = query.Where(squirrel.Eq{"cmf.rel_module": f.ModuleID})
return

View File

@@ -3,14 +3,14 @@ package rdbms
import (
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"strings"
)
func (s Store) convertComposeNamespaceFilter(f types.NamespaceFilter) (query squirrel.SelectBuilder, err error) {
query = s.composeNamespacesSelectBuilder()
query = rh.FilterNullByState(query, "cns.deleted_at", f.Deleted)
query = filter.StateCondition(query, "cns.deleted_at", f.Deleted)
if f.Query != "" {
q := "%" + strings.ToLower(f.Query) + "%"

View File

@@ -4,7 +4,7 @@ import (
"context"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/store"
"strings"
)
@@ -12,7 +12,7 @@ import (
func (s Store) convertComposePageFilter(f types.PageFilter) (query squirrel.SelectBuilder, err error) {
query = s.composePagesSelectBuilder()
query = rh.FilterNullByState(query, "cpg.deleted_at", f.Deleted)
query = filter.StateCondition(query, "cpg.deleted_at", f.Deleted)
if f.NamespaceID > 0 {
query = query.Where("cpg.rel_namespace = ?", f.NamespaceID)

View File

@@ -8,7 +8,6 @@ import (
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/handle"
"github.com/cortezaproject/corteza-server/pkg/ql"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/slice"
"github.com/jmoiron/sqlx"
"strconv"
@@ -190,7 +189,7 @@ func (b *recordReportBuilder) Build() (sb squirrel.SelectBuilder, err error) {
}
// Wrap to cast func to ensure numeric output
col := squirrel.Alias(rh.SquirrelConcatExpr("CAST(", m.Expr, " AS DECIMAL(14,2))"), m.Alias)
col := squirrel.Alias(SquirrelConcatExpr("CAST(", m.Expr, " AS DECIMAL(14,2))"), m.Alias)
report = report.Column(col)
b.numerics = append(b.numerics, m.Alias)

View File

@@ -6,13 +6,13 @@ import (
"errors"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
)
func (s Store) convertComposeRecordValueFilter(_ *types.Module, f types.RecordValueFilter) (query squirrel.SelectBuilder, err error) {
// Always filter by record IDs
query = s.composeRecordValuesSelectBuilder().Where(squirrel.Eq{"crv.record_id": f.RecordID})
query = rh.FilterNullByState(query, "crv.deleted_at", f.Deleted)
query = filter.StateCondition(query, "crv.deleted_at", f.Deleted)
return query, nil
}

View File

@@ -7,7 +7,6 @@ import (
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/ql"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/slice"
"github.com/cortezaproject/corteza-server/store"
"strings"
@@ -240,7 +239,7 @@ func (s Store) convertComposeRecordFilter(m *types.Module, f types.RecordFilter)
Where("crd.rel_namespace = ?", m.NamespaceID)
// Inc/exclude deleted records according to filter settings
query = rh.FilterNullByState(query, "crd.deleted_at", f.Deleted)
query = filter.StateCondition(query, "crd.deleted_at", f.Deleted)
// Parse filters.
if f.Query != "" {
@@ -291,7 +290,7 @@ func (s Store) composeRecordPostLoadProcessor(ctx context.Context, m *types.Modu
)
rvs, _, err = s.searchComposeRecordValues(ctx, nil, types.RecordValueFilter{
RecordID: types.RecordSet(set).IDs(),
Deleted: rh.FilterStateInclusive,
Deleted: filter.StateInclusive,
})
if err != nil {
return

View File

@@ -3,7 +3,6 @@ package rdbms
import (
"context"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/lann/builder"
)
@@ -25,38 +24,3 @@ func Count(ctx context.Context, db dbLayer, q squirrel.SelectBuilder) (count uin
return count, nil
}
func calculatePaging(p rh.PageFilter) (o uint, l uint) {
o, l = p.Offset, p.Limit
if o+l == 0 {
// When both, offset & limit are 0,
// calculate both values from page/perPage params
if p.PerPage > 0 {
l = p.PerPage
}
if p.Page < 1 {
p.Page = 1
}
o = (p.Page - 1) * p.PerPage
}
return
}
// FetchPaged fetches paged rows
func ApplyPaging(q squirrel.SelectBuilder, p rh.PageFilter) squirrel.SelectBuilder {
o, l := calculatePaging(p)
if o > 0 {
q = q.Offset(uint64(o))
}
if l > 0 {
q = q.Limit(uint64(l))
}
return q
}

View File

@@ -3,15 +3,15 @@ package rdbms
import (
"context"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/system/types"
)
func (s Store) convertRoleFilter(f types.RoleFilter) (query squirrel.SelectBuilder, err error) {
query = s.rolesSelectBuilder()
query = rh.FilterNullByState(query, "rl.deleted_at", f.Deleted)
query = rh.FilterNullByState(query, "rl.archived_at", f.Archived)
query = filter.StateCondition(query, "rl.deleted_at", f.Deleted)
query = filter.StateCondition(query, "rl.archived_at", f.Archived)
if len(f.RoleID) > 0 {
query = query.Where(squirrel.Eq{"rl.ID": f.RoleID})

41
store/rdbms/squirrel.go Normal file
View File

@@ -0,0 +1,41 @@
package rdbms
import (
"strings"
"github.com/Masterminds/squirrel"
)
type (
squirrelConcatExpr struct {
parts []string
args []interface{}
err error
}
)
func SquirrelConcatExpr(args ...interface{}) squirrel.Sqlizer {
var w = new(squirrelConcatExpr)
for _, a := range args {
if w.err != nil {
break
}
switch o := a.(type) {
case string:
w.parts = append(w.parts, o)
case squirrel.Sqlizer:
p, a, err := o.ToSql()
w.parts = append(w.parts, p)
w.args = append(w.args, a...)
w.err = err
}
}
return w
}
func (w *squirrelConcatExpr) ToSql() (string, []interface{}, error) {
return strings.Join(w.parts, ""), w.args, w.err
}

View File

@@ -4,15 +4,15 @@ import (
"context"
"fmt"
"github.com/Masterminds/squirrel"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/system/types"
)
func (s Store) convertUserFilter(f types.UserFilter) (query squirrel.SelectBuilder, err error) {
query = s.usersSelectBuilder()
query = rh.FilterNullByState(query, "usr.deleted_at", f.Deleted)
query = rh.FilterNullByState(query, "usr.suspended_at", f.Suspended)
query = filter.StateCondition(query, "usr.deleted_at", f.Deleted)
query = filter.StateCondition(query, "usr.suspended_at", f.Suspended)
if len(f.UserID) > 0 {
query = query.Where(squirrel.Eq{"usr.ID": f.UserID})

View File

@@ -2,8 +2,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/cortezaproject/corteza-server/system/types"
"github.com/stretchr/testify/require"
@@ -96,12 +96,12 @@ func testApplications(t *testing.T, s store.Applications) {
req.Len(set, valid) // we've deleted one
// search for ALL
set, f, err = s.SearchApplications(ctx, types.ApplicationFilter{Deleted: rh.FilterStateInclusive})
set, f, err = s.SearchApplications(ctx, types.ApplicationFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, count) // we've deleted one
// search for deleted only
set, f, err = s.SearchApplications(ctx, types.ApplicationFilter{Deleted: rh.FilterStateExclusive})
set, f, err = s.SearchApplications(ctx, types.ApplicationFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1) // we've deleted one

View File

@@ -3,8 +3,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/stretchr/testify/require"
"testing"
@@ -106,12 +106,12 @@ func testComposeCharts(t *testing.T, s store.Storable) {
req.Len(set, valid) // we've deleted one
// search for ALL
set, f, err = s.SearchComposeCharts(ctx, types.ChartFilter{Deleted: rh.FilterStateInclusive})
set, f, err = s.SearchComposeCharts(ctx, types.ChartFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, count) // we've deleted one
// search for deleted only
set, f, err = s.SearchComposeCharts(ctx, types.ChartFilter{Deleted: rh.FilterStateExclusive})
set, f, err = s.SearchComposeCharts(ctx, types.ChartFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1) // we've deleted one

View File

@@ -3,8 +3,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/stretchr/testify/require"
"testing"
@@ -106,12 +106,12 @@ func testComposeModules(t *testing.T, s store.ComposeModules) {
req.Len(set, valid) // we've deleted one
// search for ALL
set, f, err = s.SearchComposeModules(ctx, types.ModuleFilter{Deleted: rh.FilterStateInclusive})
set, f, err = s.SearchComposeModules(ctx, types.ModuleFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, count) // we've deleted one
// search for deleted only
set, f, err = s.SearchComposeModules(ctx, types.ModuleFilter{Deleted: rh.FilterStateExclusive})
set, f, err = s.SearchComposeModules(ctx, types.ModuleFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1) // we've deleted one

View File

@@ -3,8 +3,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/stretchr/testify/require"
"testing"
@@ -103,12 +103,12 @@ func testComposeNamespaces(t *testing.T, s store.ComposeNamespaces) {
req.Len(set, valid) // we've deleted one
// search for ALL
set, f, err = s.SearchComposeNamespaces(ctx, types.NamespaceFilter{Deleted: rh.FilterStateInclusive})
set, f, err = s.SearchComposeNamespaces(ctx, types.NamespaceFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, count) // we've deleted one
// search for deleted only
set, f, err = s.SearchComposeNamespaces(ctx, types.NamespaceFilter{Deleted: rh.FilterStateExclusive})
set, f, err = s.SearchComposeNamespaces(ctx, types.NamespaceFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1) // we've deleted one

View File

@@ -3,8 +3,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/stretchr/testify/require"
"testing"
@@ -106,12 +106,12 @@ func testComposePages(t *testing.T, s store.ComposePages) {
req.Len(set, valid) // we've deleted one
// search for ALL
set, f, err = s.SearchComposePages(ctx, types.PageFilter{Deleted: rh.FilterStateInclusive})
set, f, err = s.SearchComposePages(ctx, types.PageFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, count) // we've deleted one
// search for deleted only
set, f, err = s.SearchComposePages(ctx, types.PageFilter{Deleted: rh.FilterStateExclusive})
set, f, err = s.SearchComposePages(ctx, types.PageFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1) // we've deleted one

View File

@@ -3,8 +3,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/stretchr/testify/require"
"testing"
@@ -228,12 +228,12 @@ func testComposeRecords(t *testing.T, s store.ComposeRecords) {
req.Len(set, valid) // we've deleted one
// search for ALL
set, _, err = s.SearchComposeRecords(ctx, mod, types.RecordFilter{Deleted: rh.FilterStateInclusive})
set, _, err = s.SearchComposeRecords(ctx, mod, types.RecordFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, count) // we've deleted one
// search for deleted only
set, _, err = s.SearchComposeRecords(ctx, mod, types.RecordFilter{Deleted: rh.FilterStateExclusive})
set, _, err = s.SearchComposeRecords(ctx, mod, types.RecordFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1) // we've deleted one
})

View File

@@ -3,8 +3,8 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/store"
"github.com/cortezaproject/corteza-server/pkg/rand"
"github.com/cortezaproject/corteza-server/store"
// "github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/system/types"
_ "github.com/joho/godotenv/autoload"
@@ -21,12 +21,12 @@ func testCredentials(t *testing.T, s store.Credentials) {
makeNew = func(nn ...string) *types.Credentials {
name := strings.Join(nn, "")
return &types.Credentials{
ID: id.Next(),
OwnerID: id.Next(),
Kind: "test-kind" + name,
ID: id.Next(),
OwnerID: id.Next(),
Kind: "test-kind" + name,
Credentials: name,
Label: "CredentialsCRUD" + name,
CreatedAt: time.Now(),
Label: "CredentialsCRUD" + name,
CreatedAt: time.Now(),
}
}
@@ -105,7 +105,6 @@ func testCredentials(t *testing.T, s store.Credentials) {
})
})
t.Run("search", func(t *testing.T) {
t.Run("by owner", func(t *testing.T) {
req, prefill := truncAndFill(t, 5)
@@ -131,15 +130,15 @@ func testCredentials(t *testing.T, s store.Credentials) {
// prefill[0].DeletedAt = &time
// req.NoError(s.DeleteCredentialsByID(ctx, prefill[0].ID))
// set, _, err := s.SearchCredentials(ctx, types.CredentialsFilter{Deleted: rh.FilterStateExcluded})
// set, _, err := s.SearchCredentials(ctx, types.CredentialsFilter{Deleted: filter.StateExcluded})
// req.NoError(err)
// req.Len(set, 4)
// set, _, err = s.SearchCredentials(ctx, types.CredentialsFilter{Deleted: rh.FilterStateInclusive})
// set, _, err = s.SearchCredentials(ctx, types.CredentialsFilter{Deleted: filter.StateInclusive})
// req.NoError(err)
// req.Len(set, 5)
// set, _, err = s.SearchCredentials(ctx, types.CredentialsFilter{Deleted: rh.FilterStateExclusive})
// set, _, err = s.SearchCredentials(ctx, types.CredentialsFilter{Deleted: filter.StateExclusive})
// req.NoError(err)
// req.Len(set, 1)
// })

View File

@@ -2,9 +2,9 @@ package tests
import (
"context"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/rand"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/cortezaproject/corteza-server/system/types"
_ "github.com/joho/godotenv/autoload"
@@ -107,15 +107,15 @@ func testRoles(t *testing.T, s store.Roles) {
prefill[0].DeletedAt = &(prefill[0].CreatedAt)
s.UpdateRole(ctx, prefill[0])
set, _, err := s.SearchRoles(ctx, types.RoleFilter{Deleted: rh.FilterStateExcluded})
set, _, err := s.SearchRoles(ctx, types.RoleFilter{Deleted: filter.StateExcluded})
req.NoError(err)
req.Len(set, 4)
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Deleted: rh.FilterStateInclusive})
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Deleted: filter.StateInclusive})
req.NoError(err)
req.Len(set, 5)
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Deleted: rh.FilterStateExclusive})
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Deleted: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1)
})
@@ -126,15 +126,15 @@ func testRoles(t *testing.T, s store.Roles) {
prefill[0].ArchivedAt = &(prefill[0].CreatedAt)
s.UpdateRole(ctx, prefill[0])
set, _, err := s.SearchRoles(ctx, types.RoleFilter{Archived: rh.FilterStateExcluded})
set, _, err := s.SearchRoles(ctx, types.RoleFilter{Archived: filter.StateExcluded})
req.NoError(err)
req.Len(set, 4)
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Archived: rh.FilterStateInclusive})
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Archived: filter.StateInclusive})
req.NoError(err)
req.Len(set, 5)
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Archived: rh.FilterStateExclusive})
set, _, err = s.SearchRoles(ctx, types.RoleFilter{Archived: filter.StateExclusive})
req.NoError(err)
req.Len(set, 1)
})

View File

@@ -5,7 +5,6 @@ import (
"github.com/cortezaproject/corteza-server/pkg/actionlog"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/payload"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/system/rest/request"
"github.com/cortezaproject/corteza-server/system/service"
"github.com/cortezaproject/corteza-server/system/types"
@@ -81,8 +80,8 @@ func (ctrl Actionlog) makeFilterPayload(ctx context.Context, ee []*actionlog.Act
close(c)
},
types.UserFilter{
Deleted: rh.FilterStateInclusive,
Suspended: rh.FilterStateInclusive,
Deleted: filter.StateInclusive,
Suspended: filter.StateInclusive,
},
func(u *types.User) error {
for p := range pp {

View File

@@ -6,7 +6,6 @@ import (
"github.com/titpetric/factory/resputil"
"github.com/cortezaproject/corteza-server/pkg/corredor"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/system/rest/request"
"github.com/cortezaproject/corteza-server/system/service"
"github.com/cortezaproject/corteza-server/system/service/event"
@@ -67,7 +66,7 @@ func (ctrl *Application) List(ctx context.Context, r *request.ApplicationList) (
Name: r.Name,
Query: r.Query,
Deleted: rh.FilterState(r.Deleted),
Deleted: filter.State(r.Deleted),
}
)

View File

@@ -8,7 +8,6 @@ import (
"github.com/cortezaproject/corteza-server/pkg/corredor"
"github.com/cortezaproject/corteza-server/pkg/payload"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/system/rest/request"
"github.com/cortezaproject/corteza-server/system/service"
"github.com/cortezaproject/corteza-server/system/service/event"
@@ -62,8 +61,8 @@ func (ctrl Role) List(ctx context.Context, r *request.RoleList) (interface{}, er
f = types.RoleFilter{
Query: r.Query,
Archived: rh.FilterState(r.Archived),
Deleted: rh.FilterState(r.Deleted),
Archived: filter.State(r.Archived),
Deleted: filter.State(r.Deleted),
}
)

View File

@@ -8,7 +8,6 @@ import (
"github.com/cortezaproject/corteza-server/pkg/corredor"
"github.com/cortezaproject/corteza-server/pkg/payload"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/system/rest/request"
"github.com/cortezaproject/corteza-server/system/service"
"github.com/cortezaproject/corteza-server/system/service/event"
@@ -47,8 +46,8 @@ func (ctrl User) List(ctx context.Context, r *request.UserList) (interface{}, er
Username: r.Username,
Handle: r.Handle,
Kind: r.Kind,
Suspended: rh.FilterState(r.Suspended),
Deleted: rh.FilterState(r.Deleted),
Suspended: filter.State(r.Suspended),
Deleted: filter.State(r.Deleted),
}
)
@@ -61,11 +60,11 @@ func (ctrl User) List(ctx context.Context, r *request.UserList) (interface{}, er
}
if r.IncSuspended && f.Suspended == 0 {
f.Suspended = rh.FilterStateInclusive
f.Suspended = filter.StateInclusive
}
if r.IncDeleted && f.Deleted == 0 {
f.Deleted = rh.FilterStateInclusive
f.Deleted = filter.StateInclusive
}
set, filter, err := ctrl.user.With(ctx).Find(f)

View File

@@ -3,8 +3,8 @@ package service
import (
"context"
"github.com/cortezaproject/corteza-server/pkg/actionlog"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/cortezaproject/corteza-server/system/service/event"
"github.com/cortezaproject/corteza-server/system/types"
@@ -60,13 +60,13 @@ func (svc *application) LookupByID(ctx context.Context, ID uint64) (app *types.A
return app, svc.recordAction(ctx, aaProps, ApplicationActionLookup, err)
}
func (svc *application) Search(ctx context.Context, filter types.ApplicationFilter) (aa types.ApplicationSet, f types.ApplicationFilter, err error) {
func (svc *application) Search(ctx context.Context, af types.ApplicationFilter) (aa types.ApplicationSet, f types.ApplicationFilter, err error) {
var (
aaProps = &applicationActionProps{filter: &filter}
aaProps = &applicationActionProps{filter: &af}
)
// For each fetched item, store backend will check if it is valid or not
filter.Check = func(res *types.Application) (bool, error) {
af.Check = func(res *types.Application) (bool, error) {
if !svc.ac.CanReadApplication(ctx, res) {
return false, nil
}
@@ -75,7 +75,7 @@ func (svc *application) Search(ctx context.Context, filter types.ApplicationFilt
}
err = func() error {
if filter.Deleted > rh.FilterStateExcluded {
if af.Deleted > filter.StateExcluded {
// If list with deleted applications is requested
// user must have access permissions to system (ie: is admin)
//
@@ -86,7 +86,7 @@ func (svc *application) Search(ctx context.Context, filter types.ApplicationFilt
}
}
aa, f, err = svc.store.SearchApplications(ctx, filter)
aa, f, err = svc.store.SearchApplications(ctx, af)
return err
}()

View File

@@ -6,10 +6,10 @@ import (
"github.com/cortezaproject/corteza-server/pkg/actionlog"
internalAuth "github.com/cortezaproject/corteza-server/pkg/auth"
"github.com/cortezaproject/corteza-server/pkg/eventbus"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/cortezaproject/corteza-server/pkg/handle"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/store"
"github.com/cortezaproject/corteza-server/system/service/event"
"github.com/cortezaproject/corteza-server/system/types"
@@ -423,10 +423,10 @@ func (svc user) UniqueCheck(u *types.User) (err error) {
isUnique := func(field string) bool {
f := types.UserFilter{
// If user exists and is deleted -- not a dup
Deleted: rh.FilterStateExcluded,
Deleted: filter.StateExcluded,
// If user exists and is suspended -- duplicate
Suspended: rh.FilterStateInclusive,
Suspended: filter.StateInclusive,
}
switch field {

View File

@@ -9,7 +9,6 @@ import (
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -40,7 +39,7 @@ type (
Name string `json:"name"`
Query string `json:"query"`
Deleted rh.FilterState `json:"deleted"`
Deleted filter.State `json:"deleted"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -1,11 +1,10 @@
package types
import (
"github.com/cortezaproject/corteza-server/pkg/rh"
"time"
"github.com/cortezaproject/corteza-server/pkg/filter"
"github.com/jmoiron/sqlx/types"
"golang.org/x/crypto/bcrypt"
"time"
)
type (
@@ -24,10 +23,10 @@ type (
}
CredentialsFilter struct {
OwnerID uint64 `json:"ownerID"`
Kind string `json:"kind"`
Credentials string `json:"credentials"`
Deleted rh.FilterState `json:"deleted"`
OwnerID uint64 `json:"ownerID"`
Kind string `json:"kind"`
Credentials string `json:"credentials"`
Deleted filter.State `json:"deleted"`
}
)

View File

@@ -5,7 +5,6 @@ import (
"time"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -29,8 +28,8 @@ type (
Handle string `json:"handle"`
Name string `json:"name"`
Deleted rh.FilterState `json:"deleted"`
Archived rh.FilterState `json:"archived"`
Deleted filter.State `json:"deleted"`
Archived filter.State `json:"archived"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -10,7 +10,6 @@ import (
"github.com/pkg/errors"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -50,8 +49,8 @@ type (
Handle string `json:"handle"`
Kind UserKind `json:"kind"`
Deleted rh.FilterState `json:"deleted"`
Suspended rh.FilterState `json:"suspended"`
Deleted filter.State `json:"deleted"`
Suspended filter.State `json:"suspended"`
// Check fn is called by store backend for each resource found function can
// modify the resource and return false if store should not return it

View File

@@ -3,6 +3,7 @@ package compose
import (
"encoding/json"
"fmt"
"github.com/cortezaproject/corteza-server/pkg/filter"
"net/http"
"strconv"
"testing"
@@ -12,7 +13,6 @@ import (
"github.com/cortezaproject/corteza-server/compose/rest/request"
"github.com/cortezaproject/corteza-server/compose/service"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/rh"
"github.com/cortezaproject/corteza-server/tests/helpers"
)
@@ -62,11 +62,11 @@ func TestRecordExec(t *testing.T) {
assertSort := func(expectedHandles, expectedCats string) {
// Using record service for fetching to avoid value pre-fetching etc..
sorting, _ := filter.NewSorting("position ASC")
set, _, err := service.DefaultRecord.With(h.secCtx()).Find(types.RecordFilter{
ModuleID: module.ID,
NamespaceID: module.NamespaceID,
Sort: "position ASC",
PageFilter: rh.PageFilter{},
Sorting: sorting,
})
h.a.NoError(err)