diff --git a/api/purchase.go b/api/purchase.go index 79c7021237595562398768eb7f2586c55fd2c9c2..b2cfa414fbbc6fbd36411e6f0bca0b3dd35f7bf4 100644 --- a/api/purchase.go +++ b/api/purchase.go @@ -12,12 +12,12 @@ import ( ) type Purchase struct { - gorm.Model `json:"-"` - MemberNum int `json:"member" gorm:"column:member"` - Member Member `json:"-" gorm:"foreignKey:MemberNum;references:Num"` - Date time.Time `json:"date"` - Total int `json:"total"` - Products []PurchasedProduct `json:"products"` + gorm.Model + MemberNum int `json:"member" gorm:"column:member"` + Member Member `json:"-" gorm:"foreignKey:MemberNum;references:Num"` + Date time.Time `json:"date"` + Total int `json:"total"` + Products []PurchasedProduct `json:"products"` } type PurchasedProduct struct { @@ -56,9 +56,6 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) { } total := 0 for i, p := range products { - if p.ProductCode == 0 { - continue - } var product Product err = a.db.Where("code = ?", p.ProductCode).First(&product).Error if err != nil { @@ -71,6 +68,18 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) { products[i].Price = product.Price } + var member Member + err = a.db.Where("num = ?", num).Find(&member).Error + if err != nil { + log.Printf("Can't find member %d: %v", num, err) + w.WriteHeader(http.StatusBadRequest) + return + } + if member.Balance < total { + log.Printf("Member %d don't have enough money (%d-%d): %v", num, member.Balance, total, err) + w.WriteHeader(http.StatusBadRequest) + return + } err = a.db.Model(&Member{}). Where("num = ?", num). Update("balance", gorm.Expr("balance - ?", total)).Error @@ -79,6 +88,7 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) { w.WriteHeader(http.StatusBadRequest) return } + purchase := Purchase{ MemberNum: num, Date: time.Now(), @@ -114,7 +124,9 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) { func (a *api) GetPurchase(w http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) var purchase Purchase - err := a.db.Where("id = ?", vars["id"]).First(&purchase).Error + err := a.db.Where("id = ?", vars["id"]). + Preload("Products.Product"). + First(&purchase).Error if err != nil { if err.Error() == "record not found" { w.WriteHeader(http.StatusNotFound)