package rest import ( "git.nspix.com/golang/micro/gateway/http" "gorm.io/gorm" ) const ( PositionBeforeQuery = "BeforeQuery" PositionEachColumnQuery = "EachColumnQuery" PositionAfterQuery = "AfterQuery" PositionBeforeCreate = "BeforeCreate" PositionAfterCreate = "AfterCreate" PositionBeforeUpdate = "BeforeUpdate" PositionAfterUpdate = "AfterUpdate" PositionBeforeDelete = "BeforeDelete" PositionAfterDelete = "AfterDelete" ) type ( //查询 BeforeQueryFunc func(ctx *http.Context, query *Query) (err error) EachColumnQueryFunc func(ctx *http.Context, query *Query, schema *Schema) (err error) AfterQueryFunc func(ctx *http.Context, query *Query) (err error) //创建的回调函数 BeforeCreateFunc func(ctx *http.Context, tx *gorm.DB, model interface{}) (err error) AfterCreateFunc func(ctx *http.Context, tx *gorm.DB, model interface{}, attrs []*DiffAttr) (err error) //更新的回调函数 BeforeUpdateFunc func(ctx *http.Context, tx *gorm.DB, model interface{}) (err error) AfterUpdateFunc func(ctx *http.Context, tx *gorm.DB, model interface{}, attrs []*DiffAttr) (err error) //函数的回调函数 BeforeDeleteFunc func(ctx *http.Context, tx *gorm.DB, model interface{}) (err error) AfterDeleteFunc func(ctx *http.Context, tx *gorm.DB, model interface{}) (err error) Callback struct { BeforeQueries []BeforeQueryFunc EachColumnQueries []EachColumnQueryFunc AfterQueries []AfterQueryFunc BeforeCreates []BeforeCreateFunc AfterCreates []AfterCreateFunc BeforeUpdates []BeforeUpdateFunc AfterUpdates []AfterUpdateFunc BeforeDeletes []BeforeDeleteFunc AfterDeletes []AfterDeleteFunc } ) func newCallback() *Callback { return &Callback{ BeforeQueries: make([]BeforeQueryFunc, 0), EachColumnQueries: make([]EachColumnQueryFunc, 0), AfterQueries: make([]AfterQueryFunc, 0), BeforeCreates: make([]BeforeCreateFunc, 0), AfterCreates: make([]AfterCreateFunc, 0), BeforeUpdates: make([]BeforeUpdateFunc, 0), AfterUpdates: make([]AfterUpdateFunc, 0), BeforeDeletes: make([]BeforeDeleteFunc, 0), AfterDeletes: make([]AfterDeleteFunc, 0), } } func (c *Callback) Register(position string, cb interface{}) { switch position { case PositionBeforeQuery: if v, ok := cb.(BeforeQueryFunc); ok { c.BeforeQueries = append(c.BeforeQueries, v) } case PositionEachColumnQuery: if v, ok := cb.(EachColumnQueryFunc); ok { c.EachColumnQueries = append(c.EachColumnQueries, v) } case PositionAfterQuery: if v, ok := cb.(AfterQueryFunc); ok { c.AfterQueries = append(c.AfterQueries, v) } case PositionBeforeCreate: if v, ok := cb.(BeforeCreateFunc); ok { c.BeforeCreates = append(c.BeforeCreates, v) } case PositionAfterCreate: if v, ok := cb.(AfterCreateFunc); ok { c.AfterCreates = append(c.AfterCreates, v) } case PositionBeforeUpdate: if v, ok := cb.(BeforeUpdateFunc); ok { c.BeforeUpdates = append(c.BeforeUpdates, v) } case PositionAfterUpdate: if v, ok := cb.(AfterUpdateFunc); ok { c.AfterUpdates = append(c.AfterUpdates, v) } case PositionBeforeDelete: if v, ok := cb.(BeforeDeleteFunc); ok { c.BeforeDeletes = append(c.BeforeDeletes, v) } case PositionAfterDelete: if v, ok := cb.(AfterDeleteFunc); ok { c.AfterDeletes = append(c.AfterDeletes, v) } } }