package orders import ( "crypto/rand" "encoding/hex" "errors" "fmt" "log" "net/http" "piekarnikgosipl/data" "strconv" "strings" ) type listItem struct { id string count int // count multiplied by 10 to allow for half item purchases } type order struct { id string name string phone string items []listItem } func newOrderID() string { b := make([]byte, 8) rand.Read(b) return hex.EncodeToString(b) } func parseOrder(r *http.Request) (order, error) { var o order var err error var errorList []error o.name = strings.TrimSpace(r.PostFormValue("name")) if !validName(o.name) { errorList = append(errorList, fmt.Errorf("Podaj imię i nazwisko")) } o.phone, err = parsePhone(r.PostFormValue("phone")) if err != nil { errorList = append(errorList, err) } total := 0 for _, item := range data.Swieta { count, err := parseFloat(r.PostFormValue(item.Id)) if err != nil { errorList = append(errorList, fmt.Errorf("Nieprawidłowa ilość dla: %v", item.Name)) continue } if count%10 == 5 && !item.Halveable { errorList = append(errorList, fmt.Errorf("Produktu %v nie można zamówić w ułamkowej ilości", item.Name)) continue } o.items = append(o.items, listItem{item.Id, count}) price, err := strconv.Atoi(item.Price) if err != nil { continue } total += count * price } if total < 500 { errorList = append(errorList, fmt.Errorf("Minimalna wartość zamówienia wynosi 50zł")) } return o, errors.Join(errorList...) } func OrderHandler(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, 16<<10) if err := r.ParseForm(); err != nil { writeErrors(w, r, http.StatusRequestEntityTooLarge, "Formularz jest nieprawidłowy.") return } o, err := parseOrder(r) if err != nil { log.Println("ORDER_INVALID", o, err) writeErrors(w, r, http.StatusUnprocessableEntity, errorMessages(err)...) return } o.id, err = insertPending(o) if err != nil { log.Println("ORDER_SHEETS_ERROR", err) o.id = newOrderID() } startCheckout(w, r, o) }