From e44b0540f23b57f6df3a857da0fd998f116e4eb6 Mon Sep 17 00:00:00 2001 From: Haris Sudrajat Date: Tue, 12 Nov 2024 16:16:52 +0700 Subject: [PATCH 1/3] Add method for handle multi topic in single method --- codebase/factory/types/worker_type.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/codebase/factory/types/worker_type.go b/codebase/factory/types/worker_type.go index 5df7ab5..78935a1 100644 --- a/codebase/factory/types/worker_type.go +++ b/codebase/factory/types/worker_type.go @@ -26,6 +26,16 @@ type WorkerHandlerGroup struct { Handlers []WorkerHandler } +// AddMultiRoute method from WorkerHandlerGroup to handle multi topic in single method +func (m *WorkerHandlerGroup) AddMultiRoute(patternRoutes []string, mainHandlerFunc WorkerHandlerFunc, opts ...WorkerHandlerOptionFunc) { + for _, route := range patternRoutes { + if len(route) == 0 { + continue + } + m.Add(route, mainHandlerFunc, opts...) + } +} + // Add method from WorkerHandlerGroup, patternRoute can contains unique topic name, key, or task name func (m *WorkerHandlerGroup) Add(patternRoute string, mainHandlerFunc WorkerHandlerFunc, opts ...WorkerHandlerOptionFunc) { h := WorkerHandler{ From c5507627fe1653a5580a2c12731449b46bb0c33c Mon Sep 17 00:00:00 2001 From: Haris Sudrajat Date: Fri, 17 Jan 2025 15:41:20 +0700 Subject: [PATCH 2/3] dbUpdateTools: add additional property to set default update field --- candishared/database_update_tools.go | 9 +++++- candishared/database_update_tools_test.go | 34 +++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/candishared/database_update_tools.go b/candishared/database_update_tools.go index dbe433a..050dba0 100644 --- a/candishared/database_update_tools.go +++ b/candishared/database_update_tools.go @@ -84,6 +84,7 @@ type DBUpdateTools struct { KeyExtractorFunc func(structTag reflect.StructField) (res DBUpdateOptionKeyExtractorResult) FieldValueExtractor func(reflect.Value) (val any, skip bool) IgnoredFields []string + UpdatedFields []string } func (d *DBUpdateTools) parseOption(opts ...DBUpdateOptionFunc) (o partialUpdateOption) { @@ -101,7 +102,7 @@ func (d DBUpdateTools) ToMap(data any, opts ...DBUpdateOptionFunc) map[string]an dataType := candihelper.ReflectTypeUnwrapPtr(reflect.TypeOf(data)) isPartial := len(opt.updateFields) > 0 || len(opt.ignoreFields) > 0 - updateFields := make(map[string]any, 0) + updateFields := make(map[string]any) for i := 0; i < dataValue.NumField(); i++ { fieldValue := candihelper.ReflectValueUnwrapPtr(dataValue.Field(i)) fieldType := dataType.Field(i) @@ -167,6 +168,12 @@ func (d DBUpdateTools) ToMap(data any, opts ...DBUpdateOptionFunc) map[string]an if (isFieldUpdated && len(opt.updateFields) > 0) || (!isFieldIgnored && len(opt.ignoreFields) > 0) { updateFields[key] = val } + + for _, updatedKey := range d.UpdatedFields { + if updatedKey == key { + updateFields[updatedKey] = val + } + } } for _, ignored := range d.IgnoredFields { diff --git a/candishared/database_update_tools_test.go b/candishared/database_update_tools_test.go index 6097b43..9031a64 100644 --- a/candishared/database_update_tools_test.go +++ b/candishared/database_update_tools_test.go @@ -188,3 +188,37 @@ func TestDBUpdateSqlExtractorKey(t *testing.T) { assert.Equal(t, "{\"1\",\"2\",\"3\"}", updated["str_arr"]) assert.Equal(t, []byte(`123`), updated["log"]) } + +func TestDBUpdateToolsMongoUpdatedField(t *testing.T) { + type SubModel struct { + Title string `bson:"title" json:"title"` + Profile string `bson:"profile" json:"profile"` + CityAddress string `bson:"city_address"` + } + type Model struct { + ID int `bson:"db_id" json:"id"` + Name *string `bson:"db_name" json:"name"` + Address string `bson:"db_address" json:"address"` + Rel SubModel `bson:"rel" json:"rel"` + SubModel + } + + updated := DBUpdateTools{ + KeyExtractorFunc: DBUpdateMongoExtractorKey, + UpdatedFields: []string{"db_address"}, + }.ToMap( + &Model{ + ID: 1, + Name: candihelper.WrapPtr("01"), + Address: "Indonesia", + SubModel: SubModel{Title: "test", CityAddress: "Jakarta"}, + Rel: SubModel{Title: "rel sub"}}, + DBUpdateSetUpdatedFields("ID", "Name", "Title"), + ) + + assert.Equal(t, 4, len(updated)) + assert.Equal(t, 1, updated["db_id"]) + assert.Equal(t, "01", updated["db_name"]) + assert.Equal(t, "test", updated["title"]) + assert.Equal(t, "Indonesia", updated["db_address"]) +} From 9f6e100625688ed02cfd7c914365cb4dafd51d9b Mon Sep 17 00:00:00 2001 From: Haris Sudrajat Date: Mon, 20 Jan 2025 11:32:55 +0700 Subject: [PATCH 3/3] dbUpdateTools: improve set default update field --- candishared/database_update_tools.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/candishared/database_update_tools.go b/candishared/database_update_tools.go index 050dba0..3ff56d9 100644 --- a/candishared/database_update_tools.go +++ b/candishared/database_update_tools.go @@ -102,6 +102,11 @@ func (d DBUpdateTools) ToMap(data any, opts ...DBUpdateOptionFunc) map[string]an dataType := candihelper.ReflectTypeUnwrapPtr(reflect.TypeOf(data)) isPartial := len(opt.updateFields) > 0 || len(opt.ignoreFields) > 0 + defaultUpdatedFields := make(map[string]bool) + for _, fieldName := range d.UpdatedFields { + defaultUpdatedFields[fieldName] = true + } + updateFields := make(map[string]any) for i := 0; i < dataValue.NumField(); i++ { fieldValue := candihelper.ReflectValueUnwrapPtr(dataValue.Field(i)) @@ -169,10 +174,8 @@ func (d DBUpdateTools) ToMap(data any, opts ...DBUpdateOptionFunc) map[string]an updateFields[key] = val } - for _, updatedKey := range d.UpdatedFields { - if updatedKey == key { - updateFields[updatedKey] = val - } + if ok := defaultUpdatedFields[key]; ok { + updateFields[key] = val } }