Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
ffffe4bf24
|
|||
413bf3c848
|
9
ginext/jsonFilter.go
Normal file
9
ginext/jsonFilter.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package ginext
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
var jsonFilterKey = "goext.jsonfilter"
|
||||
|
||||
func SetJSONFilter(g *gin.Context, filter string) {
|
||||
g.Set(jsonFilterKey, filter)
|
||||
}
|
@@ -15,7 +15,7 @@ type jsonHTTPResponse struct {
|
||||
|
||||
func (j jsonHTTPResponse) jsonRenderer(g *gin.Context) json.GoJsonRender {
|
||||
var f *string
|
||||
if jsonfilter := g.GetString("goext.jsonfilter"); jsonfilter != "" {
|
||||
if jsonfilter := g.GetString(jsonFilterKey); jsonfilter != "" {
|
||||
f = &jsonfilter
|
||||
}
|
||||
return json.GoJsonRender{Data: j.data, NilSafeSlices: true, NilSafeMaps: true, Filter: f}
|
||||
|
@@ -57,7 +57,7 @@ func (w *GinRoutesWrapper) Use(middleware ...gin.HandlerFunc) *GinRoutesWrapper
|
||||
}
|
||||
|
||||
func (w *GinRoutesWrapper) WithJSONFilter(filter string) *GinRoutesWrapper {
|
||||
return w.Use(func(g *gin.Context) { g.Set("goext.jsonfilter", filter) })
|
||||
return w.Use(func(g *gin.Context) { g.Set(jsonFilterKey, filter) })
|
||||
}
|
||||
|
||||
func (w *GinRoutesWrapper) GET(relativePath string) *GinRouteBuilder {
|
||||
@@ -112,7 +112,7 @@ func (w *GinRouteBuilder) Use(middleware ...gin.HandlerFunc) *GinRouteBuilder {
|
||||
}
|
||||
|
||||
func (w *GinRouteBuilder) WithJSONFilter(filter string) *GinRouteBuilder {
|
||||
return w.Use(func(g *gin.Context) { g.Set("goext.jsonfilter", filter) })
|
||||
return w.Use(func(g *gin.Context) { g.Set(jsonFilterKey, filter) })
|
||||
}
|
||||
|
||||
func (w *GinRouteBuilder) Handle(handler WHandlerFunc) {
|
||||
|
4
go.mod
4
go.mod
@@ -21,8 +21,8 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic v1.11.9 // indirect
|
||||
github.com/bytedance/sonic/loader v0.1.1 // indirect
|
||||
github.com/bytedance/sonic v1.12.0 // indirect
|
||||
github.com/bytedance/sonic/loader v0.2.0 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
|
||||
github.com/chenzhuoyu/iasm v0.9.1 // indirect
|
||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||
|
4
go.sum
4
go.sum
@@ -24,9 +24,13 @@ github.com/bytedance/sonic v1.11.8 h1:Zw/j1KfiS+OYTi9lyB3bb0CFxPJVkM17k1wyDG32LR
|
||||
github.com/bytedance/sonic v1.11.8/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
|
||||
github.com/bytedance/sonic v1.11.9 h1:LFHENlIY/SLzDWverzdOvgMztTxcfcF+cqNsz9pK5zg=
|
||||
github.com/bytedance/sonic v1.11.9/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
|
||||
github.com/bytedance/sonic v1.12.0 h1:YGPgxF9xzaCNvd/ZKdQ28yRovhfMFZQjuk6fKBzZ3ls=
|
||||
github.com/bytedance/sonic v1.12.0/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
|
||||
github.com/bytedance/sonic/loader v0.1.0/go.mod h1:UmRT+IRTGKz/DAkzcEGzyVqQFJ7H9BqwBO3pm9H/+HY=
|
||||
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
|
||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
|
||||
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
|
||||
|
@@ -1,5 +1,5 @@
|
||||
package goext
|
||||
|
||||
const GoextVersion = "0.0.490"
|
||||
const GoextVersion = "0.0.492"
|
||||
|
||||
const GoextVersionTimestamp = "2024-07-27T23:44:18+0200"
|
||||
const GoextVersionTimestamp = "2024-08-02T16:19:21+0200"
|
||||
|
@@ -788,7 +788,7 @@ FieldLoop:
|
||||
|
||||
if f.omitEmpty && isEmptyValue(fv) {
|
||||
continue
|
||||
} else if opts.filter != nil && len(f.jsonfilter) > 0 && !f.jsonfilter.Contains(*opts.filter) {
|
||||
} else if opts.filter != nil && !matchesJSONFilter(f.jsonfilter, *opts.filter) {
|
||||
continue
|
||||
}
|
||||
e.WriteByte(next)
|
||||
@@ -808,6 +808,26 @@ FieldLoop:
|
||||
}
|
||||
}
|
||||
|
||||
func matchesJSONFilter(filter jsonfilter, value string) bool {
|
||||
if len(filter) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
if len(filter) == 1 && filter[0] == "-" {
|
||||
return false
|
||||
}
|
||||
|
||||
if filter.Contains(value) {
|
||||
return true
|
||||
}
|
||||
|
||||
if filter.Contains("*") {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func newStructEncoder(t reflect.Type, tagkey string) encoderFunc {
|
||||
se := structEncoder{fields: cachedTypeFields(t, tagkey)}
|
||||
return se.encode
|
||||
|
@@ -60,12 +60,18 @@ func (c *Coll[TData]) Paginate(ctx context.Context, filter pag.MongoFilter, page
|
||||
return nil, pag.Pagination{}, exerr.Wrap(err, "failed to all-decode entities").Build()
|
||||
}
|
||||
|
||||
var tcRes totalCountResult
|
||||
|
||||
if limit == nil {
|
||||
// optimization, limit==nil, so we query all entities anyway, just use the array length
|
||||
tcRes.Count = len(entities)
|
||||
} else {
|
||||
|
||||
cursorTotalCount, err := c.coll.Aggregate(ctx, pipelineTotalCount)
|
||||
if err != nil {
|
||||
return nil, pag.Pagination{}, exerr.Wrap(err, "mongo-aggregation failed").Any("pipeline", pipelineTotalCount).Str("collection", c.Name()).Build()
|
||||
}
|
||||
|
||||
var tcRes totalCountResult
|
||||
if cursorTotalCount.Next(ctx) {
|
||||
err = cursorTotalCount.Decode(&tcRes)
|
||||
if err != nil {
|
||||
@@ -75,6 +81,8 @@ func (c *Coll[TData]) Paginate(ctx context.Context, filter pag.MongoFilter, page
|
||||
tcRes.Count = 0 // no entries in DB
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
paginationObj := pag.Pagination{
|
||||
Page: page,
|
||||
Limit: langext.Coalesce(limit, tcRes.Count),
|
||||
|
Reference in New Issue
Block a user