Skip to content

Commit b231111

Browse files
authored
fix: mongox tag not effect in default time fields (#88)
1 parent e9cb132 commit b231111

File tree

4 files changed

+129
-6
lines changed

4 files changed

+129
-6
lines changed

field/field.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,19 @@ func ParseFields[T any](doc T) []*Filed {
8484

8585
fd.MongoField = getMongoField(bsonTag, structField.Name)
8686

87-
if structField.Name == CreatedAt {
87+
tag := structField.Tag.Get("mongox")
88+
if len(tag) > 0 {
89+
parseTag(tag, fd)
90+
} else if structField.Name == CreatedAt {
8891
parseDefaultTimeType(structField, fd, func(timeType TimeType) {
8992
fd.AutoCreateTime = timeType
9093
})
9194
} else if structField.Name == UpdatedAt {
9295
parseDefaultTimeType(structField, fd, func(timeType TimeType) {
9396
fd.AutoUpdateTime = timeType
9497
})
95-
} else {
96-
tag := structField.Tag.Get("mongox")
97-
if tag != "" {
98-
parseTag(tag, fd)
99-
}
10098
}
99+
101100
fields = append(fields, fd)
102101
}
103102

field/field_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,48 @@ func TestParseFields(t *testing.T) {
260260
},
261261
},
262262
},
263+
{
264+
name: "mongox and bson tag for default time field with a value in unix seconds.",
265+
doc: struct {
266+
CreatedAt int64 `mongox:"autoCreateTime" bson:"created_at"`
267+
UpdatedAt int `bson:"updated_at"`
268+
}{},
269+
want: []*Filed{
270+
{
271+
Name: "CreatedAt",
272+
MongoField: "created_at",
273+
FieldType: reflect.TypeOf(int64(0)),
274+
AutoCreateTime: UnixSecond,
275+
},
276+
{
277+
Name: "UpdatedAt",
278+
MongoField: "updated_at",
279+
FieldType: reflect.TypeOf(0),
280+
AutoUpdateTime: UnixSecond,
281+
},
282+
},
283+
},
284+
{
285+
name: "mongox and bson tag for default time field with a value in unix milli seconds.",
286+
doc: struct {
287+
CreatedAt int64 `bson:"created_at" mongox:"autoCreateTime:milli"`
288+
UpdatedAt int `bson:"updated_at"`
289+
}{},
290+
want: []*Filed{
291+
{
292+
Name: "CreatedAt",
293+
MongoField: "created_at",
294+
FieldType: reflect.TypeOf(int64(0)),
295+
AutoCreateTime: UnixMillisecond,
296+
},
297+
{
298+
Name: "UpdatedAt",
299+
MongoField: "updated_at",
300+
FieldType: reflect.TypeOf(0),
301+
AutoUpdateTime: UnixSecond,
302+
},
303+
},
304+
},
263305
{
264306
name: "invalid type 4 default time field",
265307
doc: struct {

internal/hook/field/field_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ type user struct {
5959
InvalidTimeTagField time.Time `bson:"invalid_time_tag_field" mongox:"autoCreateTime:time"`
6060
}
6161

62+
// user2: mongox auto time tag milli in created_at and updated_at
63+
type user2 struct {
64+
ID bson.ObjectID `bson:"_id,omitempty" mongox:"autoID"`
65+
CreatedAt int64 `bson:"created_at" mongox:"autoCreateTime:milli"`
66+
UpdatedAt int64 `bson:"updated_at" mongox:"autoUpdateTime:milli"`
67+
DeletedAt int64 `bson:"deleted_at,omitempty"`
68+
Name string `bson:"name"`
69+
CreateSecondTime int64 `bson:"create_second_time" mongox:"autoCreateTime"`
70+
UpdateSecondTime int64 `bson:"update_second_time" mongox:"autoUpdateTime:second"`
71+
CreateMilliTime int64 `bson:"create_milli_time" mongox:"autoCreateTime:milli"`
72+
UpdateMilliTime int64 `bson:"update_milli_time" mongox:"autoUpdateTime:milli"`
73+
CreateNanoTime int64 `bson:"create_nano_time" mongox:"autoCreateTime:nano"`
74+
UpdateNanoTime int64 `bson:"update_nano_time" mongox:"autoUpdateTime:nano"`
75+
InvalidTimeTagField time.Time `bson:"invalid_time_tag_field" mongox:"autoCreateTime:time"`
76+
}
77+
6278
type updatedUser struct {
6379
CreatedAt time.Time `bson:"created_at"`
6480
UpdatedAt time.Time `bson:"updated_at"`

internal/hook/field/strategy_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,51 @@ func TestBeforeInsert(t *testing.T) {
9595
require.NotEqual(t, u.CreateSecondTime, u.UpdateSecondTime)
9696
},
9797
},
98+
{
99+
name: "not inlined struct in user2",
100+
doc: reflect.ValueOf(&user2{}).Elem(),
101+
currentTime: time.Now(),
102+
fields: field.ParseFields(&user2{}),
103+
wantErr: nil,
104+
validateFunc: func(t *testing.T, v any) {
105+
u, ok := v.(user2)
106+
require.True(t, ok)
107+
require.NotZero(t, u.ID)
108+
require.NotZero(t, u.CreatedAt)
109+
require.NotZero(t, u.UpdatedAt)
110+
require.NotZero(t, u.CreateSecondTime)
111+
require.NotZero(t, u.CreateMilliTime)
112+
require.NotZero(t, u.CreateNanoTime)
113+
require.NotZero(t, u.UpdateSecondTime)
114+
require.NotZero(t, u.UpdateMilliTime)
115+
require.NotZero(t, u.UpdateNanoTime)
116+
},
117+
},
118+
{
119+
name: "not inlined struct with CreatedAt and UpdateSecondTime in user2",
120+
doc: reflect.ValueOf(&user2{
121+
CreatedAt: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli(),
122+
UpdateSecondTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).Unix(),
123+
}).Elem(),
124+
currentTime: time.Now(),
125+
fields: field.ParseFields(&user2{}),
126+
wantErr: nil,
127+
validateFunc: func(t *testing.T, v any) {
128+
u, ok := v.(user2)
129+
require.True(t, ok)
130+
require.NotZero(t, u.ID)
131+
require.NotZero(t, u.CreatedAt)
132+
require.NotZero(t, u.UpdatedAt)
133+
require.NotEqual(t, u.CreatedAt, u.UpdatedAt)
134+
require.NotZero(t, u.CreateSecondTime)
135+
require.NotZero(t, u.CreateMilliTime)
136+
require.NotZero(t, u.CreateNanoTime)
137+
require.NotZero(t, u.UpdateSecondTime)
138+
require.NotZero(t, u.UpdateMilliTime)
139+
require.NotZero(t, u.UpdateNanoTime)
140+
require.NotEqual(t, u.CreateSecondTime, u.UpdateSecondTime)
141+
},
142+
},
98143
{
99144
name: "inlined struct",
100145
doc: reflect.ValueOf(&inlinedUser{}).Elem(),
@@ -215,6 +260,20 @@ func Test_beforeUpdate(t *testing.T) {
215260
fields: field.ParseFields(&user{}),
216261
want: bson.M{"$set": bson.M{"name": "Mingyong Chen", "updated_at": time.Date(2025, 1, 2, 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()}},
217262
},
263+
{
264+
name: "a bson.M updates and additional fields",
265+
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}},
266+
currentTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
267+
fields: field.ParseFields(&user2{}),
268+
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()}},
269+
},
270+
{
271+
name: "a bson.M updates with updateTime and additional fields",
272+
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen", "updated_at": time.Date(2025, 1, 2, 0, 0, 0, 0, time.UTC)}},
273+
currentTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC),
274+
fields: field.ParseFields(&user2{}),
275+
want: bson.M{"$set": bson.M{"name": "Mingyong Chen", "updated_at": time.Date(2025, 1, 2, 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()}},
276+
},
218277
{
219278
name: "a bson.M updates and additional-inlined fields",
220279
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}},
@@ -276,6 +335,13 @@ func Test_beforeUpsert(t *testing.T) {
276335
fields: field.ParseFields(&user{}),
277336
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"},
278337
},
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+
},
279345
{
280346
name: "a bson.M updates",
281347
updates: bson.M{"$set": bson.M{"name": "Mingyong Chen"}},

0 commit comments

Comments
 (0)