package rest import "context" type Delegate interface { BeforeQuery(ctx context.Context, query *Query) (err error) AfterQuery(ctx context.Context, query *Query) (err error) BeforeSave(ctx context.Context, model interface{}) (err error) AfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) BeforeCreate(ctx context.Context, model interface{}) (err error) AfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) BeforeUpdate(ctx context.Context, model interface{}) (err error) AfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) BeforeDelete(ctx context.Context, model interface{}) (err error) AfterDelete(ctx context.Context, model interface{}) (err error) } type delegate struct { delegates []Delegate } func (dm *delegate) Register(d Delegate) { if dm.delegates == nil { dm.delegates = make([]Delegate, 0) } dm.delegates = append(dm.delegates, d) } func (dm *delegate) BeforeQuery(ctx context.Context, query *Query) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].BeforeQuery(ctx, query); err != nil { return } } return } func (dm *delegate) AfterQuery(ctx context.Context, query *Query) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].AfterQuery(ctx, query); err != nil { return } } return } func (dm *delegate) BeforeSave(ctx context.Context, model interface{}) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].BeforeSave(ctx, model); err != nil { return } } return } func (dm *delegate) AfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].AfterSave(ctx, model, diff); err != nil { return } } return } func (dm *delegate) BeforeCreate(ctx context.Context, model interface{}) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].BeforeCreate(ctx, model); err != nil { return } } return } func (dm *delegate) AfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].AfterCreate(ctx, model, diff); err != nil { return } } return } func (dm *delegate) BeforeUpdate(ctx context.Context, model interface{}) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].BeforeUpdate(ctx, model); err != nil { return } } return } func (dm *delegate) AfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].AfterUpdate(ctx, model, diff); err != nil { return } } return } func (dm *delegate) BeforeDelete(ctx context.Context, model interface{}) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].BeforeDelete(ctx, model); err != nil { return } } return } func (dm *delegate) AfterDelete(ctx context.Context, model interface{}) (err error) { for i := len(dm.delegates) - 1; i >= 0; i-- { if err = dm.delegates[i].AfterDelete(ctx, model); err != nil { return } } return }