Skip to content

Commit 17dcc6c

Browse files
fix(internal/hook/field): should assign updates[$set] = bson.M{} if updates[$set]` is nil
1 parent 1e873df commit 17dcc6c

File tree

2 files changed

+55
-28
lines changed

2 files changed

+55
-28
lines changed

internal/hook/field/strategy.go

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,42 +94,50 @@ func setTimeField(dest reflect.Value, timeType field.TimeType, currentTime time.
9494
}
9595

9696
func beforeUpdate(dest any, currentTime time.Time, fields []*field.Filed, _ ...any) error {
97-
updates, ok := dest.(bson.M)
98-
if !ok || updates == nil {
99-
return nil
100-
}
101-
102-
setFields, ok := updates["$set"].(bson.M)
103-
if !ok {
97+
updates, exist := dest.(bson.M)
98+
if !exist || updates == nil {
10499
return nil
105100
}
106101

107102
updatedFields := findAdditionalFields(currentTime, fields, findUpdatedFields)
103+
if len(updatedFields) > 0 {
104+
if updates["$set"] == nil {
105+
updates["$set"] = bson.M{}
106+
}
108107

109-
for k, v := range updatedFields {
110-
if _, exit := setFields[k]; !exit {
111-
setFields[k] = v
108+
setFields, ok := updates["$set"].(bson.M)
109+
if ok {
110+
for k, v := range updatedFields {
111+
if _, exit := setFields[k]; !exit {
112+
setFields[k] = v
113+
}
114+
}
112115
}
113116
}
114117

115118
return nil
116119
}
117120

118121
func beforeUpsert(dest any, currentTime time.Time, fields []*field.Filed, _ ...any) error {
119-
updates, ok := dest.(bson.M)
120-
if !ok || updates == nil {
121-
return nil
122-
}
123-
setFields, ok := updates["$set"].(bson.M)
124-
if !ok {
122+
updates, exist := dest.(bson.M)
123+
if !exist || updates == nil {
125124
return nil
126125
}
127126

128127
updatedTimes := findAdditionalFields(currentTime, fields, findUpdatedFields)
129128

130-
for k, v := range updatedTimes {
131-
if _, exit := setFields[k]; !exit {
132-
setFields[k] = v
129+
if len(updatedTimes) > 0 {
130+
if updates["$set"] == nil {
131+
updates["$set"] = bson.M{}
132+
}
133+
134+
setFields, ok := updates["$set"].(bson.M)
135+
if ok {
136+
for k, v := range updatedTimes {
137+
if _, exit := setFields[k]; !exit {
138+
setFields[k] = v
139+
}
140+
}
133141
}
134142
}
135143

internal/hook/field/strategy_test.go

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,24 @@ func Test_beforeUpdate(t *testing.T) {
235235
want: nil,
236236
},
237237
{
238-
name: "a bson.M updates without $set",
238+
name: "a bson.M updates without $set and not additional fields",
239239
updates: bson.M{},
240240
fields: []*field.Filed{},
241241
want: bson.M{},
242242
},
243+
{
244+
name: "a bson.M updates without $set",
245+
updates: bson.M{},
246+
currentTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
247+
fields: field.ParseFields(&user{}),
248+
want: bson.M{"$set": bson.M{"updated_at": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), "update_second_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).Unix(), "update_milli_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(), "update_nano_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()}},
249+
},
250+
{
251+
name: "a bson.M updates with invalid $set",
252+
updates: bson.M{"$set": "invalid"},
253+
fields: field.ParseFields(&user{}),
254+
want: bson.M{"$set": "invalid"},
255+
},
243256
{
244257
name: "a bson.M updates but not additional fields",
245258
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}},
@@ -317,11 +330,24 @@ func Test_beforeUpsert(t *testing.T) {
317330
want: nil,
318331
},
319332
{
320-
name: "a bson.M updates without $set",
333+
name: "a bson.M updates without $set and not additional fields",
321334
updates: bson.M{},
322335
fields: []*field.Filed{},
323336
want: bson.M{},
324337
},
338+
{
339+
name: "a bson.M updates without $set",
340+
updates: bson.M{},
341+
currentTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
342+
fields: field.ParseFields(&updatedUser{}),
343+
want: bson.M{"$set": bson.M{"updated_at": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), "update_second_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).Unix(), "update_milli_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(), "update_nano_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()}, "$setOnInsert": bson.M{"created_at": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), "create_second_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).Unix(), "create_milli_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(), "create_nano_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()}},
344+
},
345+
{
346+
name: "a bson.M updates with invalid $set",
347+
updates: bson.M{"$set": "invalid"},
348+
fields: []*field.Filed{},
349+
want: bson.M{"$set": "invalid"},
350+
},
325351
{
326352
name: "a bson.M updates but not additional fields",
327353
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}},
@@ -335,13 +361,6 @@ func Test_beforeUpsert(t *testing.T) {
335361
fields: field.ParseFields(&user{}),
336362
want: bson.M{"$set": bson.M{"name": "Mingyong Chen", "updated_at": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), "update_second_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).Unix(), "update_milli_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(), "update_nano_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()}, "$setOnInsert": "invalid"},
337363
},
338-
{
339-
name: "a bson.M updates with invalid $setOnInsert",
340-
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}, "$setOnInsert": "invalid"},
341-
currentTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
342-
fields: field.ParseFields(&user2{}),
343-
want: bson.M{"$set": bson.M{"name": "Mingyong Chen", "updated_at": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(), "update_second_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).Unix(), "update_milli_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(), "update_nano_time": time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixNano()}, "$setOnInsert": "invalid"},
344-
},
345364
{
346365
name: "a bson.M updates",
347366
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}},

0 commit comments

Comments
 (0)