refactor code structure (#1738)
This commit is contained in:
@@ -1,19 +1,67 @@
|
||||
package v1alpha3
|
||||
|
||||
import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"kubesphere.io/kubesphere/pkg/api"
|
||||
"kubesphere.io/kubesphere/pkg/apiserver/query"
|
||||
"sort"
|
||||
)
|
||||
|
||||
type Interface interface {
|
||||
// Get retrieves a single object by its namespace and name
|
||||
Get(namespace, name string) (interface{}, error)
|
||||
Get(namespace, name string) (runtime.Object, error)
|
||||
|
||||
// List retrieves a collection of objects matches given query
|
||||
List(namespace string) ([]interface{}, error)
|
||||
|
||||
//
|
||||
Filter(item interface{}, filter query.Filter) bool
|
||||
|
||||
//
|
||||
Compare(left interface{}, right interface{}, field query.Field) bool
|
||||
List(namespace string, query *query.Query) (*api.ListResult, error)
|
||||
}
|
||||
|
||||
type CompareFunc func(runtime.Object, runtime.Object, query.Field) bool
|
||||
|
||||
type FilterFunc func(runtime.Object, query.Filter) bool
|
||||
|
||||
func DefaultList(objects []runtime.Object, query *query.Query, compareFunc CompareFunc, filterFunc FilterFunc) *api.ListResult {
|
||||
// selected matched ones
|
||||
var filtered []runtime.Object
|
||||
for _, object := range objects {
|
||||
selected := true
|
||||
for _, filter := range query.Filters {
|
||||
if !filterFunc(object, filter) {
|
||||
selected = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if selected {
|
||||
filtered = append(filtered, object)
|
||||
}
|
||||
}
|
||||
|
||||
start, end := query.Pagination.GetPaginationSettings(len(filtered))
|
||||
if !query.Pagination.IsPageAvailable(len(filtered), start) {
|
||||
return &api.ListResult{
|
||||
Items: nil,
|
||||
TotalItems: 0,
|
||||
}
|
||||
}
|
||||
|
||||
// sort by sortBy field
|
||||
sort.Slice(filtered, func(i, j int) bool {
|
||||
if !query.Ascending {
|
||||
return !compareFunc(filtered[i], filtered[j], query.SortBy)
|
||||
}
|
||||
return compareFunc(filtered[i], filtered[j], query.SortBy)
|
||||
})
|
||||
|
||||
return &api.ListResult{
|
||||
Items: objectsToInterfaces(filtered[start:end]),
|
||||
TotalItems: len(filtered),
|
||||
}
|
||||
}
|
||||
|
||||
func objectsToInterfaces(objs []runtime.Object) []interface{} {
|
||||
var res []interface{}
|
||||
for _, obj := range objs {
|
||||
res = append(res, obj)
|
||||
}
|
||||
return res
|
||||
}
|
||||
Reference in New Issue
Block a user