piekarnikgosipl/orders/order.go
2026-11-09 16:29:52 +01:00

83 lines
1.9 KiB
Go

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ł"))
}
o.id = newOrderID()
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
}
startCheckout(w, r, o)
}