diff --git a/callbacks/callbacks.go b/callbacks/callbacks.go index d681aef3..dfe41d17 100644 --- a/callbacks/callbacks.go +++ b/callbacks/callbacks.go @@ -50,6 +50,7 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) { queryCallback := db.Callback().Query() queryCallback.Register("gorm:query", Query) queryCallback.Register("gorm:preload", Preload) + queryCallback.Register("gorm:before_query", BeforeQuery) queryCallback.Register("gorm:after_query", AfterQuery) queryCallback.Clauses = config.QueryClauses diff --git a/callbacks/interfaces.go b/callbacks/interfaces.go index 2302470f..825519c5 100644 --- a/callbacks/interfaces.go +++ b/callbacks/interfaces.go @@ -34,6 +34,10 @@ type AfterDeleteInterface interface { AfterDelete(*gorm.DB) error } +type BeforeFindInterface interface { + BeforeFind(*gorm.DB) error +} + type AfterFindInterface interface { AfterFind(*gorm.DB) error } diff --git a/callbacks/query.go b/callbacks/query.go index c2bbf5f9..bf10c493 100644 --- a/callbacks/query.go +++ b/callbacks/query.go @@ -228,6 +228,28 @@ func Preload(db *gorm.DB) { } } +func BeforeQuery(db *gorm.DB) { + if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && db.Statement.Schema.BeforeFind { + callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { + if db.Statement.Schema.BeforeFind { + if i, ok := value.(BeforeFindInterface); ok { + called = true + db.AddError(i.BeforeFind(tx)) + } + } + + if db.Statement.Schema.BeforeFind { + if i, ok := value.(BeforeFindInterface); ok { + called = true + db.AddError(i.BeforeFind(tx)) + } + } + + return called + }) + } +} + func AfterQuery(db *gorm.DB) { if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && db.Statement.Schema.AfterFind && db.RowsAffected > 0 { callMethod(db, func(value interface{}, tx *gorm.DB) bool { diff --git a/schema/schema.go b/schema/schema.go index eca113e9..7360176e 100644 --- a/schema/schema.go +++ b/schema/schema.go @@ -36,7 +36,7 @@ type Schema struct { BeforeUpdate, AfterUpdate bool BeforeDelete, AfterDelete bool BeforeSave, AfterSave bool - AfterFind bool + BeforeFind, AfterFind bool err error initialized chan struct{} namer Namer