87 lines
2 KiB
Go
87 lines
2 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ł"))
|
|
}
|
|
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)
|
|
}
|