From dff16eb61a211899ae63540c9563b74ae0e68345 Mon Sep 17 00:00:00 2001 From: Clancy Date: Thu, 9 Jul 2026 23:12:43 +0300 Subject: [PATCH] Chore: change AfterCreate hook signature to expose a slice of model instead of a single model, so it fires once per batch, not per creation, in the bulk inserts 1- change afterCreate signature from func(ctx, *Model) to func(ctx, []*Model) so single create wraps the result in a 1-element slice and CreateManyAndReturn passes the full results array, firing the hook once per batch instead of per-record --- generator/templates/model_create.gotpl | 8 +++----- generator/templates/model_structs.gotpl | 4 ++-- integration/create_many_test.go | 8 +++++--- integration/main.go | 11 ++++++----- integration/validation_test.go | 8 +++++--- integration/valk/category.go | 12 +++++------- integration/valk/categoryToPost.go | 12 +++++------- integration/valk/comment.go | 12 +++++------- integration/valk/post.go | 12 +++++------- integration/valk/profile.go | 12 +++++------- integration/valk/user.go | 12 +++++------- 11 files changed, 51 insertions(+), 60 deletions(-) diff --git a/generator/templates/model_create.gotpl b/generator/templates/model_create.gotpl index 2f940b2..0f93dfe 100644 --- a/generator/templates/model_create.gotpl +++ b/generator/templates/model_create.gotpl @@ -316,7 +316,7 @@ func (q *Queries) execute{{ .Model.Name }}Create(ctx context.Context, assignment } if q.{{ .Model.Name }}.afterCreate != nil { - if err := q.{{ .Model.Name }}.afterCreate(ctx, res); err != nil { + if err := q.{{ .Model.Name }}.afterCreate(ctx, []*{{ .Model.Name }}{res}); err != nil { return nil, err } } @@ -394,10 +394,8 @@ func (q *Queries) execute{{ .Model.Name }}CreateManyAndReturn(ctx context.Contex return nil, err } if q.{{ .Model.Name }}.afterCreate != nil { - for _, r := range results { - if err := q.{{ .Model.Name }}.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.{{ .Model.Name }}.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil diff --git a/generator/templates/model_structs.gotpl b/generator/templates/model_structs.gotpl index d9a573a..7ef1c82 100644 --- a/generator/templates/model_structs.gotpl +++ b/generator/templates/model_structs.gotpl @@ -38,7 +38,7 @@ type {{ .Model.Name }}Omit struct { type {{ .Model.Name }}Delegate struct { client *Queries beforeCreate func(context.Context, *{{ .Model.Name }}Create) error - afterCreate func(context.Context, *{{ .Model.Name }}) error + afterCreate func(context.Context, []*{{ .Model.Name }}) error afterCreateMany func(context.Context, []{{ .Model.Name }}Create, int64) error } @@ -46,7 +46,7 @@ func (d *{{ .Model.Name }}Delegate) BeforeCreate(hook func(context.Context, *{{ d.beforeCreate = hook } -func (d *{{ .Model.Name }}Delegate) AfterCreate(hook func(context.Context, *{{ .Model.Name }}) error) { +func (d *{{ .Model.Name }}Delegate) AfterCreate(hook func(context.Context, []*{{ .Model.Name }}) error) { d.afterCreate = hook } diff --git a/integration/create_many_test.go b/integration/create_many_test.go index 8d4d8c4..b1ba779 100644 --- a/integration/create_many_test.go +++ b/integration/create_many_test.go @@ -109,9 +109,11 @@ func TestCreateMany_Hooks(t *testing.T) { var afterCalled bool var gotRole valk.UserRoleType - client.User.AfterCreate(func(ctx context.Context, user *valk.User) error { + client.User.AfterCreate(func(ctx context.Context, users []*valk.User) error { afterCalled = true - gotRole = user.Role + if len(users) > 0 { + gotRole = users[0].Role + } return nil }) @@ -137,7 +139,7 @@ func TestCreateMany_Hooks(t *testing.T) { client, cleanup := setupTestDB(t) defer cleanup() - client.User.AfterCreate(func(ctx context.Context, user *valk.User) error { + client.User.AfterCreate(func(ctx context.Context, users []*valk.User) error { return fmt.Errorf("after hook rejected") }) diff --git a/integration/main.go b/integration/main.go index 3d2218b..9e3c943 100644 --- a/integration/main.go +++ b/integration/main.go @@ -32,17 +32,18 @@ func seed(db *valk.DB, ctx context.Context) *SeedData { return nil }) - db.User.AfterCreateMany(func(ctx context.Context, users []valk.UserCreate, count int64) error { + db.User.AfterCreateMany(func(ctx context.Context, usersInput []valk.UserCreate, count int64) error { var emails []string - for _, u := range users { + for _, u := range usersInput { emails = append(emails, u.Email) } fmt.Printf("AfterCreateMany: %d users created (emails: %v)\n", count, emails) return nil }) - - db.User.AfterCreate(func(ctx context.Context, user *valk.User) error { - fmt.Printf("AfterCreate: user %s (role=%s)\n", user.Email, user.Role) + db.User.AfterCreate(func(ctx context.Context, users []*valk.User) error { + for _, u := range users { + fmt.Printf("AfterCreate: user %s (role=%s)\n", u.Email, u.Role) + } return nil }) diff --git a/integration/validation_test.go b/integration/validation_test.go index 5e2170b..db43ee4 100644 --- a/integration/validation_test.go +++ b/integration/validation_test.go @@ -459,9 +459,11 @@ func TestCreate_Hooks(t *testing.T) { }) var afterCalled bool - db.User.AfterCreate(func(ctx context.Context, u *valk.User) error { - if u.Email == "hook@example.com" { - afterCalled = true + db.User.AfterCreate(func(ctx context.Context, users []*valk.User) error { + for _, u := range users { + if u.Email == "hook@example.com" { + afterCalled = true + } } return nil }) diff --git a/integration/valk/category.go b/integration/valk/category.go index 9304d6f..65291b6 100644 --- a/integration/valk/category.go +++ b/integration/valk/category.go @@ -38,7 +38,7 @@ type CategoryOmit struct { type CategoryDelegate struct { client *Queries beforeCreate func(context.Context, *CategoryCreate) error - afterCreate func(context.Context, *Category) error + afterCreate func(context.Context, []*Category) error afterCreateMany func(context.Context, []CategoryCreate, int64) error } @@ -46,7 +46,7 @@ func (d *CategoryDelegate) BeforeCreate(hook func(context.Context, *CategoryCrea d.beforeCreate = hook } -func (d *CategoryDelegate) AfterCreate(hook func(context.Context, *Category) error) { +func (d *CategoryDelegate) AfterCreate(hook func(context.Context, []*Category) error) { d.afterCreate = hook } @@ -224,7 +224,7 @@ func (q *Queries) executeCategoryCreate(ctx context.Context, assignments []Field } if q.Category.afterCreate != nil { - if err := q.Category.afterCreate(ctx, res); err != nil { + if err := q.Category.afterCreate(ctx, []*Category{res}); err != nil { return nil, err } } @@ -302,10 +302,8 @@ func (q *Queries) executeCategoryCreateManyAndReturn(ctx context.Context, record return nil, err } if q.Category.afterCreate != nil { - for _, r := range results { - if err := q.Category.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.Category.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil diff --git a/integration/valk/categoryToPost.go b/integration/valk/categoryToPost.go index a9fed6d..c2afba3 100644 --- a/integration/valk/categoryToPost.go +++ b/integration/valk/categoryToPost.go @@ -41,7 +41,7 @@ type CategoryToPostOmit struct { type CategoryToPostDelegate struct { client *Queries beforeCreate func(context.Context, *CategoryToPostCreate) error - afterCreate func(context.Context, *CategoryToPost) error + afterCreate func(context.Context, []*CategoryToPost) error afterCreateMany func(context.Context, []CategoryToPostCreate, int64) error } @@ -49,7 +49,7 @@ func (d *CategoryToPostDelegate) BeforeCreate(hook func(context.Context, *Catego d.beforeCreate = hook } -func (d *CategoryToPostDelegate) AfterCreate(hook func(context.Context, *CategoryToPost) error) { +func (d *CategoryToPostDelegate) AfterCreate(hook func(context.Context, []*CategoryToPost) error) { d.afterCreate = hook } @@ -223,7 +223,7 @@ func (q *Queries) executeCategoryToPostCreate(ctx context.Context, assignments [ } if q.CategoryToPost.afterCreate != nil { - if err := q.CategoryToPost.afterCreate(ctx, res); err != nil { + if err := q.CategoryToPost.afterCreate(ctx, []*CategoryToPost{res}); err != nil { return nil, err } } @@ -301,10 +301,8 @@ func (q *Queries) executeCategoryToPostCreateManyAndReturn(ctx context.Context, return nil, err } if q.CategoryToPost.afterCreate != nil { - for _, r := range results { - if err := q.CategoryToPost.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.CategoryToPost.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil diff --git a/integration/valk/comment.go b/integration/valk/comment.go index bdebd76..d1da5de 100644 --- a/integration/valk/comment.go +++ b/integration/valk/comment.go @@ -66,7 +66,7 @@ type CommentOmit struct { type CommentDelegate struct { client *Queries beforeCreate func(context.Context, *CommentCreate) error - afterCreate func(context.Context, *Comment) error + afterCreate func(context.Context, []*Comment) error afterCreateMany func(context.Context, []CommentCreate, int64) error } @@ -74,7 +74,7 @@ func (d *CommentDelegate) BeforeCreate(hook func(context.Context, *CommentCreate d.beforeCreate = hook } -func (d *CommentDelegate) AfterCreate(hook func(context.Context, *Comment) error) { +func (d *CommentDelegate) AfterCreate(hook func(context.Context, []*Comment) error) { d.afterCreate = hook } @@ -389,7 +389,7 @@ func (q *Queries) executeCommentCreate(ctx context.Context, assignments []FieldA } if q.Comment.afterCreate != nil { - if err := q.Comment.afterCreate(ctx, res); err != nil { + if err := q.Comment.afterCreate(ctx, []*Comment{res}); err != nil { return nil, err } } @@ -467,10 +467,8 @@ func (q *Queries) executeCommentCreateManyAndReturn(ctx context.Context, records return nil, err } if q.Comment.afterCreate != nil { - for _, r := range results { - if err := q.Comment.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.Comment.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil diff --git a/integration/valk/post.go b/integration/valk/post.go index d8f70d3..fe7440d 100644 --- a/integration/valk/post.go +++ b/integration/valk/post.go @@ -56,7 +56,7 @@ type PostOmit struct { type PostDelegate struct { client *Queries beforeCreate func(context.Context, *PostCreate) error - afterCreate func(context.Context, *Post) error + afterCreate func(context.Context, []*Post) error afterCreateMany func(context.Context, []PostCreate, int64) error } @@ -64,7 +64,7 @@ func (d *PostDelegate) BeforeCreate(hook func(context.Context, *PostCreate) erro d.beforeCreate = hook } -func (d *PostDelegate) AfterCreate(hook func(context.Context, *Post) error) { +func (d *PostDelegate) AfterCreate(hook func(context.Context, []*Post) error) { d.afterCreate = hook } @@ -316,7 +316,7 @@ func (q *Queries) executePostCreate(ctx context.Context, assignments []FieldAssi } if q.Post.afterCreate != nil { - if err := q.Post.afterCreate(ctx, res); err != nil { + if err := q.Post.afterCreate(ctx, []*Post{res}); err != nil { return nil, err } } @@ -394,10 +394,8 @@ func (q *Queries) executePostCreateManyAndReturn(ctx context.Context, records [] return nil, err } if q.Post.afterCreate != nil { - for _, r := range results { - if err := q.Post.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.Post.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil diff --git a/integration/valk/profile.go b/integration/valk/profile.go index dfad3c8..971fd58 100644 --- a/integration/valk/profile.go +++ b/integration/valk/profile.go @@ -42,7 +42,7 @@ type ProfileOmit struct { type ProfileDelegate struct { client *Queries beforeCreate func(context.Context, *ProfileCreate) error - afterCreate func(context.Context, *Profile) error + afterCreate func(context.Context, []*Profile) error afterCreateMany func(context.Context, []ProfileCreate, int64) error } @@ -50,7 +50,7 @@ func (d *ProfileDelegate) BeforeCreate(hook func(context.Context, *ProfileCreate d.beforeCreate = hook } -func (d *ProfileDelegate) AfterCreate(hook func(context.Context, *Profile) error) { +func (d *ProfileDelegate) AfterCreate(hook func(context.Context, []*Profile) error) { d.afterCreate = hook } @@ -258,7 +258,7 @@ func (q *Queries) executeProfileCreate(ctx context.Context, assignments []FieldA } if q.Profile.afterCreate != nil { - if err := q.Profile.afterCreate(ctx, res); err != nil { + if err := q.Profile.afterCreate(ctx, []*Profile{res}); err != nil { return nil, err } } @@ -336,10 +336,8 @@ func (q *Queries) executeProfileCreateManyAndReturn(ctx context.Context, records return nil, err } if q.Profile.afterCreate != nil { - for _, r := range results { - if err := q.Profile.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.Profile.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil diff --git a/integration/valk/user.go b/integration/valk/user.go index 5b9cae9..9d00def 100644 --- a/integration/valk/user.go +++ b/integration/valk/user.go @@ -70,7 +70,7 @@ type UserOmit struct { type UserDelegate struct { client *Queries beforeCreate func(context.Context, *UserCreate) error - afterCreate func(context.Context, *User) error + afterCreate func(context.Context, []*User) error afterCreateMany func(context.Context, []UserCreate, int64) error } @@ -78,7 +78,7 @@ func (d *UserDelegate) BeforeCreate(hook func(context.Context, *UserCreate) erro d.beforeCreate = hook } -func (d *UserDelegate) AfterCreate(hook func(context.Context, *User) error) { +func (d *UserDelegate) AfterCreate(hook func(context.Context, []*User) error) { d.afterCreate = hook } @@ -370,7 +370,7 @@ func (q *Queries) executeUserCreate(ctx context.Context, assignments []FieldAssi } if q.User.afterCreate != nil { - if err := q.User.afterCreate(ctx, res); err != nil { + if err := q.User.afterCreate(ctx, []*User{res}); err != nil { return nil, err } } @@ -448,10 +448,8 @@ func (q *Queries) executeUserCreateManyAndReturn(ctx context.Context, records [] return nil, err } if q.User.afterCreate != nil { - for _, r := range results { - if err := q.User.afterCreate(ctx, r); err != nil { - return nil, err - } + if err := q.User.afterCreate(ctx, results); err != nil { + return nil, err } } return results, nil