func getStateMachine() *transition.StateMachine { var orderStateMachine = transition.New(&Order{}) orderStateMachine.Initial("draft") orderStateMachine.State("checkout") orderStateMachine.State("paid") orderStateMachine.State("processed") orderStateMachine.State("delivered") orderStateMachine.State("cancelled") orderStateMachine.State("paid_cancelled") orderStateMachine.Event("checkout").To("checkout").From("draft") orderStateMachine.Event("pay").To("paid").From("checkout") return orderStateMachine }
transition.Transition } func (order Order) Amount() (amount float32) { for _, orderItem := range order.OrderItems { amount += orderItem.Amount() } return } func (item OrderItem) Amount() float32 { return item.Price * float32(item.Quantity) * float32(100-item.DiscountRate) / 100 } var ( OrderState = transition.New(&Order{}) ItemState = transition.New(&OrderItem{}) ) func init() { // Define Order's States OrderState.Initial("draft") OrderState.State("checkout") OrderState.State("cancelled").Enter(func(value interface{}, tx *gorm.DB) error { tx.Model(value).UpdateColumn("cancelled_at", time.Now()) return nil }) OrderState.State("paid").Enter(func(value interface{}, tx *gorm.DB) error { // freeze stock, change items's state return nil })