func (engine *Engine) CreateOrder(order *data.Order) error { if order.ID != 0 { return ErrNonEmptyID } if order.State == "" { order.State = data.OrderStateDraft } else if order.State != data.OrderStateDraft { return ErrNotDraft } if order.Time == 0 { order.Time = uint64(time.Now().UTC().Unix()) } else if order.Time < uint64(time.Now().UTC().Add(-PastTimeTreshold).Unix()) { return ErrIsPast } tx, err := engine.storage.Begin() if err != nil { return err } if err := tx.CreateOrder(order); err != nil { return tx.Rollback(err) } populate.Order(order) if err := tx.Commit(); err != nil { return err } return nil }
func (engine *Engine) UpdateOrder(order *data.Order) error { if order.ID == 0 { return ErrEmptyID } tx, err := engine.storage.Begin() if err != nil { return err } existingOrder := &data.Order{ ID: order.ID, } if err := tx.LoadOrder(existingOrder); err != nil { return tx.Rollback(err) } if order.Time == 0 { order.Time = existingOrder.Time } else if order.Time < uint64(time.Now().UTC().Add(-PastTimeTreshold).Unix()) { return tx.Rollback(ErrIsPast) } if order.State == "" { order.State = existingOrder.State } else if order.State != existingOrder.State { if existingOrder.State != data.OrderStateDraft { return tx.Rollback(ErrNotDraft) } switch order.State { case data.OrderStatePlaced: if len(existingOrder.Items) < 1 { return tx.Rollback(ErrOrderEmpty) } case data.OrderStateCancelled: default: return tx.Rollback(ErrUnknownState) } } if err := tx.UpdateOrder(order); err != nil { return tx.Rollback(err) } populate.Order(order) if err := tx.Commit(); err != nil { return err } return nil }