diff --git a/compose/rest/record.go b/compose/rest/record.go index 7b26d59e5..8e322aff1 100644 --- a/compose/rest/record.go +++ b/compose/rest/record.go @@ -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), } ) diff --git a/compose/types/chart.go b/compose/types/chart.go index eeb45825a..ecbc4c755 100644 --- a/compose/types/chart.go +++ b/compose/types/chart.go @@ -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 diff --git a/compose/types/module.go b/compose/types/module.go index 1df13d644..b42238092 100644 --- a/compose/types/module.go +++ b/compose/types/module.go @@ -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 diff --git a/compose/types/module_field.go b/compose/types/module_field.go index f4d311bfc..b0012dedd 100644 --- a/compose/types/module_field.go +++ b/compose/types/module_field.go @@ -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 } ) diff --git a/compose/types/namespace.go b/compose/types/namespace.go index 1e7239dc6..75abec92e 100644 --- a/compose/types/namespace.go +++ b/compose/types/namespace.go @@ -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 diff --git a/compose/types/page.go b/compose/types/page.go index 37922e1c3..484bca7ea 100644 --- a/compose/types/page.go +++ b/compose/types/page.go @@ -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 diff --git a/compose/types/record.go b/compose/types/record.go index 2904a8186..5a749ea55 100644 --- a/compose/types/record.go +++ b/compose/types/record.go @@ -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 diff --git a/compose/types/record_value.go b/compose/types/record_value.go index 9004aae2e..c2b388fc7 100644 --- a/compose/types/record_value.go +++ b/compose/types/record_value.go @@ -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"` } ) diff --git a/pkg/automation/command.go b/pkg/automation/command.go index b011fb89b..68e719532 100644 --- a/pkg/automation/command.go +++ b/pkg/automation/command.go @@ -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" diff --git a/pkg/filter/state.go b/pkg/filter/state.go new file mode 100644 index 000000000..64a4907df --- /dev/null +++ b/pkg/filter/state.go @@ -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}) + } +} diff --git a/pkg/ngimporter/main.go b/pkg/ngimporter/main.go index cb83d80df..f93e84c0f 100644 --- a/pkg/ngimporter/main.go +++ b/pkg/ngimporter/main.go @@ -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{ diff --git a/pkg/ngimporter/types/import_node.go b/pkg/ngimporter/types/import_node.go index fd3458083..3e96c6f99 100644 --- a/pkg/ngimporter/types/import_node.go +++ b/pkg/ngimporter/types/import_node.go @@ -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{ diff --git a/pkg/permissions/filter.go b/pkg/permissions/filter.go index 302cb722e..72084fc46 100644 --- a/pkg/permissions/filter.go +++ b/pkg/permissions/filter.go @@ -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() } ) diff --git a/pkg/rh/README.md b/pkg/rh/README.md deleted file mode 100644 index 9885923e0..000000000 --- a/pkg/rh/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# (rh) Repository Helpers - -Package name is short an abbreviated to avoid -colliding with per-service repository package names. diff --git a/pkg/rh/deleters.go b/pkg/rh/deleters.go deleted file mode 100644 index 820e3a6ff..000000000 --- a/pkg/rh/deleters.go +++ /dev/null @@ -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 -} diff --git a/pkg/rh/filter_state.go b/pkg/rh/filter_state.go deleted file mode 100644 index c3936f85e..000000000 --- a/pkg/rh/filter_state.go +++ /dev/null @@ -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}) - } -} diff --git a/pkg/rh/metrics.go b/pkg/rh/metrics.go deleted file mode 100644 index 0f9d99a73..000000000 --- a/pkg/rh/metrics.go +++ /dev/null @@ -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 -} diff --git a/pkg/rh/order.go b/pkg/rh/order.go deleted file mode 100644 index 83ed24ca3..000000000 --- a/pkg/rh/order.go +++ /dev/null @@ -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 -} diff --git a/pkg/rh/paging.go b/pkg/rh/paging.go deleted file mode 100644 index ecc49b2ad..000000000 --- a/pkg/rh/paging.go +++ /dev/null @@ -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 -} diff --git a/pkg/rh/paging_test.go b/pkg/rh/paging_test.go deleted file mode 100644 index 76d6ca465..000000000 --- a/pkg/rh/paging_test.go +++ /dev/null @@ -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) - } - }) - } -} diff --git a/pkg/rh/selectors.go b/pkg/rh/selectors.go deleted file mode 100644 index 38c0abd62..000000000 --- a/pkg/rh/selectors.go +++ /dev/null @@ -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 -} diff --git a/pkg/rh/squirrel_fn.go b/pkg/rh/squirrel_fn.go deleted file mode 100644 index 13ef45f17..000000000 --- a/pkg/rh/squirrel_fn.go +++ /dev/null @@ -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 -} diff --git a/pkg/rh/time.go b/pkg/rh/time.go deleted file mode 100644 index 9cf503223..000000000 --- a/pkg/rh/time.go +++ /dev/null @@ -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 - } -} diff --git a/pkg/rh/time_test.go b/pkg/rh/time_test.go deleted file mode 100644 index bb1904011..000000000 --- a/pkg/rh/time_test.go +++ /dev/null @@ -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) - -} diff --git a/pkg/rh/updaters.go b/pkg/rh/updaters.go deleted file mode 100644 index 4961e6940..000000000 --- a/pkg/rh/updaters.go +++ /dev/null @@ -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 -} diff --git a/store/rdbms/applications.go b/store/rdbms/applications.go index e6a89da40..f539926ee 100644 --- a/store/rdbms/applications.go +++ b/store/rdbms/applications.go @@ -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 + "%" diff --git a/store/rdbms/compose_charts.go b/store/rdbms/compose_charts.go index 92f41c191..3e3d3d1d4 100644 --- a/store/rdbms/compose_charts.go +++ b/store/rdbms/compose_charts.go @@ -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) diff --git a/store/rdbms/compose_modules.go b/store/rdbms/compose_modules.go index 7dc0495d9..42e66f888 100644 --- a/store/rdbms/compose_modules.go +++ b/store/rdbms/compose_modules.go @@ -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) diff --git a/store/rdbms/compose_modules_fields.go b/store/rdbms/compose_modules_fields.go index eff1a0a3a..1117f07b6 100644 --- a/store/rdbms/compose_modules_fields.go +++ b/store/rdbms/compose_modules_fields.go @@ -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 diff --git a/store/rdbms/compose_namespaces.go b/store/rdbms/compose_namespaces.go index d1c961f3d..2a8226c44 100644 --- a/store/rdbms/compose_namespaces.go +++ b/store/rdbms/compose_namespaces.go @@ -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) + "%" diff --git a/store/rdbms/compose_pages.go b/store/rdbms/compose_pages.go index 270aa4107..f793b815b 100644 --- a/store/rdbms/compose_pages.go +++ b/store/rdbms/compose_pages.go @@ -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) diff --git a/store/rdbms/compose_record_report_builder.go b/store/rdbms/compose_record_report_builder.go index 4db9b09c8..8d27d78db 100644 --- a/store/rdbms/compose_record_report_builder.go +++ b/store/rdbms/compose_record_report_builder.go @@ -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) diff --git a/store/rdbms/compose_record_value.go b/store/rdbms/compose_record_value.go index f12f814b6..b33bd88bd 100644 --- a/store/rdbms/compose_record_value.go +++ b/store/rdbms/compose_record_value.go @@ -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 } diff --git a/store/rdbms/compose_records.go b/store/rdbms/compose_records.go index 5ec16cd8a..7bd373432 100644 --- a/store/rdbms/compose_records.go +++ b/store/rdbms/compose_records.go @@ -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 diff --git a/store/rdbms/generic_selectors.go b/store/rdbms/generic_selectors.go index e7e3f08e2..4c728bc89 100644 --- a/store/rdbms/generic_selectors.go +++ b/store/rdbms/generic_selectors.go @@ -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 -} diff --git a/store/rdbms/roles.go b/store/rdbms/roles.go index ba3f7e8eb..146005221 100644 --- a/store/rdbms/roles.go +++ b/store/rdbms/roles.go @@ -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}) diff --git a/store/rdbms/squirrel.go b/store/rdbms/squirrel.go new file mode 100644 index 000000000..f9df5de2e --- /dev/null +++ b/store/rdbms/squirrel.go @@ -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 +} diff --git a/store/rdbms/users.go b/store/rdbms/users.go index 2a0009df8..09f67404a 100644 --- a/store/rdbms/users.go +++ b/store/rdbms/users.go @@ -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}) diff --git a/store/tests/applications_test.go b/store/tests/applications_test.go index c50d90389..ab0bb003e 100644 --- a/store/tests/applications_test.go +++ b/store/tests/applications_test.go @@ -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 diff --git a/store/tests/compose_charts_test.go b/store/tests/compose_charts_test.go index d49be57dc..a448edf3a 100644 --- a/store/tests/compose_charts_test.go +++ b/store/tests/compose_charts_test.go @@ -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 diff --git a/store/tests/compose_modules_test.go b/store/tests/compose_modules_test.go index 1801136c3..7d6ad3e55 100644 --- a/store/tests/compose_modules_test.go +++ b/store/tests/compose_modules_test.go @@ -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 diff --git a/store/tests/compose_namespaces_test.go b/store/tests/compose_namespaces_test.go index d6a04a389..508a91ddd 100644 --- a/store/tests/compose_namespaces_test.go +++ b/store/tests/compose_namespaces_test.go @@ -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 diff --git a/store/tests/compose_pages_test.go b/store/tests/compose_pages_test.go index ef3db781b..866cfb13a 100644 --- a/store/tests/compose_pages_test.go +++ b/store/tests/compose_pages_test.go @@ -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 diff --git a/store/tests/compose_records_test.go b/store/tests/compose_records_test.go index 28e80f732..8da957cd1 100644 --- a/store/tests/compose_records_test.go +++ b/store/tests/compose_records_test.go @@ -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 }) diff --git a/store/tests/credentials_test.go b/store/tests/credentials_test.go index 624fbe339..488d940d2 100644 --- a/store/tests/credentials_test.go +++ b/store/tests/credentials_test.go @@ -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) // }) diff --git a/store/tests/roles_test.go b/store/tests/roles_test.go index 67a378af9..6925b26e6 100644 --- a/store/tests/roles_test.go +++ b/store/tests/roles_test.go @@ -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) }) diff --git a/system/rest/actionlog.go b/system/rest/actionlog.go index d99bda8a5..666797e2c 100644 --- a/system/rest/actionlog.go +++ b/system/rest/actionlog.go @@ -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 { diff --git a/system/rest/application.go b/system/rest/application.go index 3b34f2645..8d3bee984 100644 --- a/system/rest/application.go +++ b/system/rest/application.go @@ -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), } ) diff --git a/system/rest/role.go b/system/rest/role.go index f15e9d833..175e799bb 100644 --- a/system/rest/role.go +++ b/system/rest/role.go @@ -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), } ) diff --git a/system/rest/user.go b/system/rest/user.go index 7e75c7991..2872225fc 100644 --- a/system/rest/user.go +++ b/system/rest/user.go @@ -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) diff --git a/system/service/application.go b/system/service/application.go index d55919042..f3e5cc7cb 100644 --- a/system/service/application.go +++ b/system/service/application.go @@ -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 }() diff --git a/system/service/user.go b/system/service/user.go index 4fc0eb7b8..421d42610 100644 --- a/system/service/user.go +++ b/system/service/user.go @@ -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 { diff --git a/system/types/applications.go b/system/types/applications.go index a3b1badf4..d1412504c 100644 --- a/system/types/applications.go +++ b/system/types/applications.go @@ -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 diff --git a/system/types/credentials.go b/system/types/credentials.go index 899c3d13c..1d4f0f1df 100644 --- a/system/types/credentials.go +++ b/system/types/credentials.go @@ -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"` } ) diff --git a/system/types/role.go b/system/types/role.go index 37d2ba28b..d430e293b 100644 --- a/system/types/role.go +++ b/system/types/role.go @@ -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 diff --git a/system/types/user.go b/system/types/user.go index a3f9d6b7f..73b579e8b 100644 --- a/system/types/user.go +++ b/system/types/user.go @@ -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 diff --git a/tests/compose/record_exec_test.go b/tests/compose/record_exec_test.go index d49ad3278..60938b1e3 100644 --- a/tests/compose/record_exec_test.go +++ b/tests/compose/record_exec_test.go @@ -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)