From 29b06ef197cd1aa5e9491a8898562d77eeed4d69 Mon Sep 17 00:00:00 2001 From: agungdwiprasetyo Date: Wed, 10 May 2023 21:16:22 +0700 Subject: [PATCH] generator & db: add db update tools for partial --- candishared/database_update_tools.go | 109 ++++++++++++++++++++++ candishared/database_update_tools_test.go | 45 +++++++++ cmd/candi/template_domain.go | 8 +- cmd/candi/template_repository.go | 43 +++++++-- cmd/candi/template_usecase.go | 9 +- go.mod | 12 +-- go.sum | 24 ++--- init.go | 2 +- middleware/cache.go | 2 +- 9 files changed, 218 insertions(+), 36 deletions(-) create mode 100644 candishared/database_update_tools.go create mode 100644 candishared/database_update_tools_test.go diff --git a/candishared/database_update_tools.go b/candishared/database_update_tools.go new file mode 100644 index 00000000..c1ce14fb --- /dev/null +++ b/candishared/database_update_tools.go @@ -0,0 +1,109 @@ +package candishared + +import ( + "reflect" + "strings" +) + +type partialUpdateOption struct { + updateFields map[string]struct{} + ignoreFields map[string]struct{} +} + +// DBUpdateOptionFunc option func +type DBUpdateOptionFunc func(*partialUpdateOption) + +// DBUpdateSetUpdatedFields option func +func DBUpdateSetUpdatedFields(fields ...string) DBUpdateOptionFunc { + return func(o *partialUpdateOption) { + o.updateFields = make(map[string]struct{}) + for _, field := range fields { + o.updateFields[field] = struct{}{} + } + } +} + +// DBUpdateSetIgnoredFields option func +func DBUpdateSetIgnoredFields(fields ...string) DBUpdateOptionFunc { + return func(o *partialUpdateOption) { + o.ignoreFields = make(map[string]struct{}) + for _, field := range fields { + o.ignoreFields[field] = struct{}{} + } + } +} + +// DBUpdateGORMExtractorKey struct tag key extractor for gorm model +func DBUpdateGORMExtractorKey(structTag reflect.StructTag) string { + return strings.Split(strings.TrimPrefix(structTag.Get("gorm"), "column:"), ";")[0] +} + +// DBUpdateMongoExtractorKey struct tag key extractor for mongo model +func DBUpdateMongoExtractorKey(structTag reflect.StructTag) string { + return strings.TrimSuffix(structTag.Get("bson"), ",omitempty") +} + +// DBUpdateTools for construct selected field to update +type DBUpdateTools struct { + KeyExtractorFunc func(structTag reflect.StructTag) string + IgnoredFields []string +} + +// ToMap method +func (d DBUpdateTools) ToMap(data interface{}, opts ...DBUpdateOptionFunc) map[string]interface{} { + var ( + o partialUpdateOption + updateFields = make(map[string]interface{}, 0) + ) + + for _, opt := range opts { + opt(&o) + } + + dataValue := reflect.ValueOf(data) + dataType := reflect.TypeOf(data) + if dataValue.Kind() == reflect.Ptr { + dataValue = dataValue.Elem() + dataType = dataType.Elem() + } + isPartial := len(o.updateFields) > 0 || len(o.ignoreFields) > 0 + + for i := 0; i < dataValue.NumField(); i++ { + fieldValue := dataValue.Field(i) + + fieldType := dataType.Field(i) + if fieldType.Anonymous { + for k, v := range d.ToMap(fieldValue.Interface(), opts...) { + updateFields[k] = v + } + continue + } + + key := strings.TrimSuffix(fieldType.Tag.Get("json"), ",omitempty") + if d.KeyExtractorFunc != nil { + key = d.KeyExtractorFunc(fieldType.Tag) + } + + val := fieldValue.Interface() + if fieldValue.Kind() == reflect.Pointer { + val = fieldValue.Elem().Interface() + } + + if !isPartial { + updateFields[key] = val + continue + } + + _, isFieldUpdated := o.updateFields[fieldType.Name] + _, isFieldIgnored := o.ignoreFields[fieldType.Name] + if (isFieldUpdated && len(o.updateFields) > 0) || (!isFieldIgnored && len(o.ignoreFields) > 0) { + updateFields[key] = val + } + } + + for _, ignored := range d.IgnoredFields { + delete(updateFields, ignored) + } + + return updateFields +} diff --git a/candishared/database_update_tools_test.go b/candishared/database_update_tools_test.go new file mode 100644 index 00000000..240d072f --- /dev/null +++ b/candishared/database_update_tools_test.go @@ -0,0 +1,45 @@ +package candishared + +import ( + "testing" + + "github.com/golangid/candi/candihelper" + "github.com/stretchr/testify/assert" +) + +func TestDBUpdateTools(t *testing.T) { + + type SubModel struct { + Title string `gorm:"column:title" json:"title"` + Profile string `gorm:"column:profile" json:"profile"` + } + + type Model struct { + ID int `gorm:"column:db_id;" json:"id"` + Name *string `gorm:"column:db_name;" json:"name"` + Address string `gorm:"column:db_address" json:"address"` + SubModel + } + + updated := DBUpdateTools{KeyExtractorFunc: DBUpdateGORMExtractorKey}.ToMap( + &Model{ID: 1, Name: candihelper.ToStringPtr("01"), Address: "street", SubModel: SubModel{Title: "test"}}, + DBUpdateSetUpdatedFields("ID", "Name", "Title"), + ) + assert.Equal(t, 3, len(updated)) + assert.Equal(t, 1, updated["db_id"]) + assert.Equal(t, "01", updated["db_name"]) + assert.Equal(t, "test", updated["title"]) + + updated = DBUpdateTools{}.ToMap( + Model{ID: 1, Name: candihelper.ToStringPtr("01"), Address: "street", SubModel: SubModel{Title: "test"}}, + DBUpdateSetIgnoredFields("ID", "Name", "Title"), + ) + assert.Equal(t, 2, len(updated)) + assert.Equal(t, "street", updated["address"]) + + updated = DBUpdateTools{}.ToMap( + Model{ID: 1, Name: candihelper.ToStringPtr("01"), Address: "street", SubModel: SubModel{Title: "test"}}, + ) + assert.Equal(t, 5, len(updated)) + assert.Equal(t, "street", updated["address"]) +} diff --git a/cmd/candi/template_domain.go b/cmd/candi/template_domain.go index 56ccb7c5..d42e83a7 100644 --- a/cmd/candi/template_domain.go +++ b/cmd/candi/template_domain.go @@ -11,10 +11,10 @@ import ( // {{upper (camel .ModuleName)}} model type {{upper (camel .ModuleName)}} struct { - ID {{if and .MongoDeps (not .SQLDeps)}}primitive.ObjectID{{else}}int{{end}} ` + "`" + `{{if .SQLUseGORM}}gorm:"column:id;primary_key" {{end}}` + `{{if .MongoDeps}}bson:"_id" {{end}}` + `json:"id"` + "`" + ` - Field string ` + "`" + `{{if .SQLUseGORM}}gorm:"column:field;type:varchar(255)" {{end}}` + `{{if .MongoDeps}}bson:"field" {{end}}` + `json:"field"` + "`" + ` - CreatedAt time.Time ` + "`" + `{{if .SQLUseGORM}}gorm:"column:created_at" {{end}}` + `{{if .MongoDeps}}bson:"created_at" {{end}}` + `json:"created_at"` + "`" + ` - UpdatedAt time.Time ` + "`" + `{{if .SQLUseGORM}}gorm:"column:updated_at" {{end}}` + `{{if .MongoDeps}}bson:"updated_at" {{end}}` + `json:"updated_at"` + "`" + ` + ID {{if and .MongoDeps (not .SQLDeps)}}primitive.ObjectID{{else}}int{{end}} ` + "`" + `{{if .SQLUseGORM}}gorm:"column:id;primary_key" {{else}}sql:"id" {{end}}` + `{{if .MongoDeps}}bson:"_id" {{end}}` + `json:"id"` + "`" + ` + Field string ` + "`" + `{{if .SQLUseGORM}}gorm:"column:field;type:varchar(255)" {{else}}sql:"field" {{end}}` + `{{if .MongoDeps}}bson:"field" {{end}}` + `json:"field"` + "`" + ` + CreatedAt time.Time ` + "`" + `{{if .SQLUseGORM}}gorm:"column:created_at" {{else}}sql:"created_at" {{end}}` + `{{if .MongoDeps}}bson:"created_at" {{end}}` + `json:"created_at"` + "`" + ` + UpdatedAt time.Time ` + "`" + `{{if .SQLUseGORM}}gorm:"column:updated_at" {{else}}sql:"updated_at" {{end}}` + `{{if .MongoDeps}}bson:"updated_at" {{end}}` + `json:"updated_at"` + "`" + ` } {{if .SQLUseGORM}} // TableName return table name of {{upper (camel .ModuleName)}} model diff --git a/cmd/candi/template_repository.go b/cmd/candi/template_repository.go index 013bfa55..fe8149b7 100644 --- a/cmd/candi/template_repository.go +++ b/cmd/candi/template_repository.go @@ -332,6 +332,8 @@ import ( "{{$.PackagePrefix}}/internal/modules/{{cleanPathModule .ModuleName}}/domain" shareddomain "{{$.PackagePrefix}}/pkg/shared/domain" + + "{{.LibraryName}}/candishared" ) // {{upper (camel .ModuleName)}}Repository abstract interface @@ -339,7 +341,7 @@ type {{upper (camel .ModuleName)}}Repository interface { FetchAll(ctx context.Context, filter *domain.Filter{{upper (camel .ModuleName)}}) ([]shareddomain.{{upper (camel .ModuleName)}}, error) Count(ctx context.Context, filter *domain.Filter{{upper (camel .ModuleName)}}) int Find(ctx context.Context, filter *domain.Filter{{upper (camel .ModuleName)}}) (shareddomain.{{upper (camel .ModuleName)}}, error) - Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}) error + Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}, updateOptions ...candishared.DBUpdateOptionFunc) error Delete(ctx context.Context, filter *domain.Filter{{upper (camel .ModuleName)}}) (err error) } ` @@ -361,12 +363,14 @@ import ( shareddomain "{{$.PackagePrefix}}/pkg/shared/domain" "{{.LibraryName}}/candihelper" + "{{.LibraryName}}/candishared" "{{.LibraryName}}/tracer" ) type {{camel .ModuleName}}RepoMongo struct { readDB, writeDB *mongo.Database collection string + updateTools *candishared.DBUpdateTools } // New{{upper (camel .ModuleName)}}RepoMongo mongo repo constructor @@ -375,6 +379,10 @@ func New{{upper (camel .ModuleName)}}RepoMongo(readDB, writeDB *mongo.Database) readDB: readDB, writeDB: writeDB, collection: shareddomain.{{upper (camel .ModuleName)}}{}.CollectionName(), + updateTools: &candishared.DBUpdateTools{ + KeyExtractorFunc: candishared.DBUpdateMongoExtractorKey, + IgnoredFields: []string{"_id"}, + }, } } @@ -433,17 +441,20 @@ func (r *{{camel .ModuleName}}RepoMongo) Count(ctx context.Context, filter *doma return int(count) } -func (r *{{camel .ModuleName}}RepoMongo) Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}) (err error) { +func (r *{{camel .ModuleName}}RepoMongo) Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}, updateOptions ...candishared.DBUpdateOptionFunc) (err error) { trace, ctx := tracer.StartTraceWithContext(ctx, "{{upper (camel .ModuleName)}}RepoMongo:Save") defer func() { trace.Finish(tracer.FinishWithError(err)) }() - tracer.Log(ctx, "data", data) data.UpdatedAt = time.Now() if data.ID{{if and .MongoDeps (not .SQLDeps)}}.IsZero(){{else}} == 0{{end}} { data.ID = {{if and .MongoDeps (not .SQLDeps)}}primitive.NewObjectID(){{else}}r.Count(ctx, &domain.Filter{{upper (camel .ModuleName)}}{}) + 1{{end}} data.CreatedAt = time.Now() _, err = r.writeDB.Collection(r.collection).InsertOne(ctx, data) + trace.Log("data", data) + } else { + updated := bson.M(r.updateTools.ToMap(data, updateOptions...)) + trace.Log("updated", updated) opt := options.UpdateOptions{ Upsert: candihelper.ToBoolPtr(true), } @@ -452,10 +463,11 @@ func (r *{{camel .ModuleName}}RepoMongo) Save(ctx context.Context, data *sharedd "_id": data.ID, }, bson.M{ - "$set": data, + "$set": updated, }, &opt) } + trace.SetTag("id", data.ID.Hex()) return } @@ -534,7 +546,7 @@ func (r *{{camel .ModuleName}}RepoArango) Count(ctx context.Context, filter *dom return total } -func (r *{{camel .ModuleName}}RepoArango) Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}) (err error) { +func (r *{{camel .ModuleName}}RepoArango) Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}, updateOptions ...candishared.DBUpdateOptionFunc) (err error) { trace, ctx := tracer.StartTraceWithContext(ctx, "{{upper (camel .ModuleName)}}RepoArango:Save") defer func() { trace.Finish(tracer.FinishWithError(err)) }() tracer.Log(ctx, "data", data) @@ -576,12 +588,16 @@ import ( type {{camel .ModuleName}}RepoSQL struct { readDB, writeDB *{{if .SQLUseGORM}}gorm{{else}}sql{{end}}.DB + updateTools *candishared.DBUpdateTools } // New{{upper (camel .ModuleName)}}RepoSQL mongo repo constructor func New{{upper (camel .ModuleName)}}RepoSQL(readDB, writeDB *{{if .SQLUseGORM}}gorm{{else}}sql{{end}}.DB) {{upper (camel .ModuleName)}}Repository { return &{{camel .ModuleName}}RepoSQL{ - readDB, writeDB, + readDB: readDB, writeDB: writeDB, + updateTools: &candishared.DBUpdateTools{ + {{if .SQLUseGORM}}KeyExtractorFunc: candishared.DBUpdateGORMExtractorKey, {{end}}IgnoredFields: []string{"id"}, + }, } } @@ -652,7 +668,7 @@ func (r *{{camel .ModuleName}}RepoSQL) Find(ctx context.Context, filter *domain. {{end}}return } -func (r *{{camel .ModuleName}}RepoSQL) Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}) (err error) { +func (r *{{camel .ModuleName}}RepoSQL) Save(ctx context.Context, data *shareddomain.{{upper (camel .ModuleName)}}, updateOptions ...candishared.DBUpdateOptionFunc) (err error) { trace, ctx := tracer.StartTraceWithContext(ctx, "{{upper (camel .ModuleName)}}RepoSQL:Save") defer func() { trace.Finish(tracer.FinishWithError(err)) }() @@ -667,7 +683,7 @@ func (r *{{camel .ModuleName}}RepoSQL) Save(ctx context.Context, data *shareddom if data.ID == 0 { err = {{ if .IsMonorepo }}global{{end}}shared.SetSpanToGorm(ctx, db).Create(data).Error } else { - err = {{ if .IsMonorepo }}global{{end}}shared.SetSpanToGorm(ctx, db).Save(data).Error + err = {{ if .IsMonorepo }}global{{end}}shared.SetSpanToGorm(ctx, db).Model(data).Updates(r.updateTools.ToMap(data, updateOptions...)).Error } {{else}}var query string var args []interface{} @@ -680,8 +696,15 @@ func (r *{{camel .ModuleName}}RepoSQL) Save(ctx context.Context, data *shareddom query = "INSERT INTO {{snake .ModuleName}}s (field, created_at, updated_at) VALUES ({{if eq .SQLDriver "postgres"}}$1,$2,$3{{else}}?,?,?{{end}})" args = []interface{}{data.Field, data.CreatedAt, data.UpdatedAt} } else { - query = "UPDATE {{snake .ModuleName}}s SET field={{if eq .SQLDriver "postgres"}}$1{{else}}?{{end}}, created_at={{if eq .SQLDriver "postgres"}}$2{{else}}?{{end}}, updated_at={{if eq .SQLDriver "postgres"}}$3{{else}}?{{end}} WHERE id={{if eq .SQLDriver "postgres"}}$4{{else}}?{{end}}" - args = []interface{}{data.Field, data.CreatedAt, data.UpdatedAt, data.ID} + var updatedFields []string{{if eq .SQLDriver "postgres"}} + i := 1{{end}} + for field, val := range r.updateTools.ToMap(data, updateOptions...) { + args = append(args, val) + updatedFields = append(updatedFields, {{if eq .SQLDriver "postgres"}}fmt.Sprintf("%s=$%d", field, i)) + i++{{else}}fmt.Sprintf("%s=?", field)){{end}} + } + query = fmt.Sprintf("UPDATE {{snake .ModuleName}}s SET %s WHERE id={{if eq .SQLDriver "postgres"}}$%d", strings.Join(updatedFields, ", "), i){{else}}?", strings.Join(updatedFields, ", ")){{end}} + args = append(args, data.ID) } trace.Log("query", query) trace.Log("args", args) diff --git a/cmd/candi/template_usecase.go b/cmd/candi/template_usecase.go index 92c33192..a7751fe9 100644 --- a/cmd/candi/template_usecase.go +++ b/cmd/candi/template_usecase.go @@ -338,6 +338,8 @@ import ( "context" "{{$.PackagePrefix}}/internal/modules/{{cleanPathModule .ModuleName}}/domain" + {{if .SQLDeps}} + "{{.LibraryName}}/candishared"{{end}} "{{.LibraryName}}/tracer" ) @@ -351,8 +353,11 @@ func (uc *{{camel .ModuleName}}UsecaseImpl) Update{{upper (camel .ModuleName)}}( return err } existing.Field = data.Field - err = uc.repo{{if .SQLDeps}}SQL{{else if .MongoDeps}}Mongo{{else if .ArangoDeps}}Arango{{end}}.{{upper (camel .ModuleName)}}Repo().Save(ctx, &existing){{end}} - return + {{if .SQLDeps}}err = uc.repoSQL.WithTransaction(ctx, func(ctx context.Context) error { + return uc.repoSQL.{{upper (camel .ModuleName)}}Repo().Save(ctx, &existing, candishared.DBUpdateSetUpdatedFields("Field")) + }){{else}} + err = uc.repo{{if .MongoDeps}}Mongo{{else if .ArangoDeps}}Arango{{end}}.{{upper (camel .ModuleName)}}Repo().Save(ctx, &existing){{end}} + return{{end}} } ` diff --git a/go.mod b/go.mod index 82ac0c1c..5993d2ea 100644 --- a/go.mod +++ b/go.mod @@ -50,12 +50,12 @@ require ( github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/gokrb5/v8 v8.4.3 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/klauspost/compress v1.16.0 // indirect + github.com/klauspost/compress v1.16.4 // indirect github.com/kr/text v0.2.0 // indirect github.com/labstack/gommon v0.4.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mattn/go-colorable v0.1.11 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -73,11 +73,11 @@ require ( github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/net v0.8.0 // indirect + golang.org/x/crypto v0.8.0 // indirect + golang.org/x/net v0.9.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5ea90342..c87faf27 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,8 @@ github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpR github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= -github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= +github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -112,8 +112,8 @@ github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/goveralls v0.0.6/go.mod h1:h8b4ow6FxSPMQHF6o2ve3qsclnffZjYTNEKmLesRwqw= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= @@ -197,8 +197,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -222,8 +222,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -242,9 +242,9 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -252,8 +252,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/init.go b/init.go index c67a926a..a1feefa7 100644 --- a/init.go +++ b/init.go @@ -2,5 +2,5 @@ package candi const ( // Version of this library - Version = "v1.14.6" + Version = "v1.14.7" ) diff --git a/middleware/cache.go b/middleware/cache.go index ce5a1983..bdb79daa 100644 --- a/middleware/cache.go +++ b/middleware/cache.go @@ -93,7 +93,7 @@ func (m *Middleware) HTTPCache(next http.Handler) http.Handler { next.ServeHTTP(respWriter, req) - if respWriter.StatusCode() <= http.StatusBadRequest { + if respWriter.StatusCode() < http.StatusBadRequest { m.cache.Set(ctx, cacheKey, candihelper.ToBytes( cacheData{ Body: resBody.Bytes(),