cookie based routes
All checks were successful
Build and Publish / BuildAndDeployAmd64 (push) Successful in 34s
Build and Publish / BuildAndDeploy (push) Successful in 2m21s

This commit is contained in:
matst80
2024-11-16 12:02:16 +01:00
parent 75796e7da1
commit d77b1edacb

View File

@@ -8,7 +8,6 @@ import (
"net/http"
"os"
"strconv"
"strings"
"time"
messages "git.tornberg.me/go-cart-actor/proto"
@@ -27,20 +26,17 @@ func NewPoolServer(pool GrainPool, pod_name string) *PoolServer {
}
}
func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
data, err := s.pool.Get(ToCartId(id))
func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request, id CartId) error {
data, err := s.pool.Get(id)
if err != nil {
return err
}
return s.WriteResult(w, data)
}
func (s *PoolServer) HandleAddSku(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleAddSku(w http.ResponseWriter, r *http.Request, id CartId) error {
sku := r.PathValue("sku")
data, err := s.pool.Process(ToCartId(id), Message{
data, err := s.pool.Process(id, Message{
Type: AddRequestType,
Content: &messages.AddRequest{Sku: sku, Quantity: 1},
})
@@ -81,14 +77,14 @@ func (s *PoolServer) WriteResult(w http.ResponseWriter, result *FrameWithPayload
return err
}
func (s *PoolServer) HandleDeleteItem(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleDeleteItem(w http.ResponseWriter, r *http.Request, id CartId) error {
itemIdString := r.PathValue("itemId")
itemId, err := strconv.Atoi(itemIdString)
if err != nil {
return err
}
data, err := s.pool.Process(ToCartId(id), Message{
data, err := s.pool.Process(id, Message{
Type: RemoveItemType,
Content: &messages.RemoveItem{Id: int64(itemId)},
})
@@ -103,14 +99,14 @@ type SetDelivery struct {
Items []int64 `json:"items"`
}
func (s *PoolServer) HandleSetDelivery(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleSetDelivery(w http.ResponseWriter, r *http.Request, id CartId) error {
delivery := SetDelivery{}
err := json.NewDecoder(r.Body).Decode(&delivery)
if err != nil {
return err
}
data, err := s.pool.Process(ToCartId(id), Message{
data, err := s.pool.Process(id, Message{
Type: SetDeliveryType,
Content: &messages.SetDelivery{
Provider: delivery.Provider,
@@ -123,8 +119,8 @@ func (s *PoolServer) HandleSetDelivery(w http.ResponseWriter, r *http.Request) e
return s.WriteResult(w, data)
}
func (s *PoolServer) HandleSetPickupPoint(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleSetPickupPoint(w http.ResponseWriter, r *http.Request, id CartId) error {
deliveryIdString := r.PathValue("deliveryId")
deliveryId, err := strconv.Atoi(deliveryIdString)
if err != nil {
@@ -135,7 +131,7 @@ func (s *PoolServer) HandleSetPickupPoint(w http.ResponseWriter, r *http.Request
if err != nil {
return err
}
reply, err := s.pool.Process(ToCartId(id), Message{
reply, err := s.pool.Process(id, Message{
Type: SetPickupPointType,
Content: &messages.SetPickupPoint{
DeliveryId: int64(deliveryId),
@@ -153,14 +149,14 @@ func (s *PoolServer) HandleSetPickupPoint(w http.ResponseWriter, r *http.Request
return s.WriteResult(w, reply)
}
func (s *PoolServer) HandleRemoveDelivery(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleRemoveDelivery(w http.ResponseWriter, r *http.Request, id CartId) error {
deliveryIdString := r.PathValue("deliveryId")
deliveryId, err := strconv.Atoi(deliveryIdString)
if err != nil {
return err
}
reply, err := s.pool.Process(ToCartId(id), Message{
reply, err := s.pool.Process(id, Message{
Type: RemoveDeliveryType,
Content: &messages.RemoveDelivery{Id: int64(deliveryId)},
})
@@ -170,15 +166,13 @@ func (s *PoolServer) HandleRemoveDelivery(w http.ResponseWriter, r *http.Request
return s.WriteResult(w, reply)
}
func (s *PoolServer) HandleQuantityChange(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleQuantityChange(w http.ResponseWriter, r *http.Request, id CartId) error {
changeQuantity := messages.ChangeQuantity{}
err := json.NewDecoder(r.Body).Decode(&changeQuantity)
if err != nil {
return err
}
reply, err := s.pool.Process(ToCartId(id), Message{
reply, err := s.pool.Process(id, Message{
Type: ChangeQuantityType,
Content: &changeQuantity,
})
@@ -188,15 +182,13 @@ func (s *PoolServer) HandleQuantityChange(w http.ResponseWriter, r *http.Request
return s.WriteResult(w, reply)
}
func (s *PoolServer) HandleAddRequest(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleAddRequest(w http.ResponseWriter, r *http.Request, id CartId) error {
addRequest := messages.AddRequest{}
err := json.NewDecoder(r.Body).Decode(&addRequest)
if err != nil {
return err
}
reply, err := s.pool.Process(ToCartId(id), Message{
reply, err := s.pool.Process(id, Message{
Type: AddRequestType,
Content: &addRequest,
})
@@ -211,10 +203,9 @@ var (
APIPassword = os.Getenv("KLARNA_API_PASSWORD")
)
func (s *PoolServer) HandleCheckout(w http.ResponseWriter, r *http.Request) error {
id := r.PathValue("id")
func (s *PoolServer) HandleCheckout(w http.ResponseWriter, r *http.Request, id CartId) error {
reply, err := s.pool.Process(ToCartId(id), Message{
reply, err := s.pool.Process(id, Message{
Type: CreateCheckoutOrderType,
Content: &messages.CreateCheckoutOrder{
Terms: "https://tornberg.me/terms",
@@ -261,12 +252,9 @@ func NewCartId() CartId {
return ToCartId(fmt.Sprintf("%d", id))
}
func (a *PoolServer) RewritePath(w http.ResponseWriter, r *http.Request) {
func CookieCartIdHandler(fn func(w http.ResponseWriter, r *http.Request, cartId CartId) error) func(w http.ResponseWriter, r *http.Request) error {
return func(w http.ResponseWriter, r *http.Request) error {
var cartId CartId
if strings.Contains(r.URL.Path, ".") {
http.NotFound(w, r)
return
}
cartIdCookie := r.CookiesNamed("cartid")
if cartIdCookie == nil || len(cartIdCookie) == 0 {
cartId = NewCartId()
@@ -279,30 +267,45 @@ func (a *PoolServer) RewritePath(w http.ResponseWriter, r *http.Request) {
} else {
cartId = ToCartId(cartIdCookie[0].Value)
}
adjustedPath := strings.Replace(r.URL.Path, "/cart", "", 1)
location := fmt.Sprintf("/cart/%s%s", cartId, strings.TrimRight(adjustedPath, "/"))
w.Header().Set("Location", location)
w.WriteHeader(http.StatusMovedPermanently)
return fn(w, r, cartId)
}
}
func CartIdHandler(fn func(w http.ResponseWriter, r *http.Request, cartId CartId) error) func(w http.ResponseWriter, r *http.Request) error {
return func(w http.ResponseWriter, r *http.Request) error {
cartId := ToCartId(r.PathValue("id"))
return fn(w, r, cartId)
}
}
func (s *PoolServer) Serve() *http.ServeMux {
mux := http.NewServeMux()
mux.HandleFunc("/", s.RewritePath)
//mux.HandleFunc("/", s.RewritePath)
mux.HandleFunc("OPTIONS /", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
w.WriteHeader(http.StatusOK)
})
mux.HandleFunc("GET /{id}", ErrorHandler(s.HandleGet))
mux.HandleFunc("GET /{id}/add/{sku}", ErrorHandler(s.HandleAddSku))
mux.HandleFunc("POST /{id}", ErrorHandler(s.HandleAddRequest))
mux.HandleFunc("DELETE /{id}/{itemId}", ErrorHandler(s.HandleDeleteItem))
mux.HandleFunc("PUT /{id}", ErrorHandler(s.HandleQuantityChange))
mux.HandleFunc("POST /{id}/delivery", ErrorHandler(s.HandleSetDelivery))
mux.HandleFunc("DELETE /{id}/delivery/{deliveryId}", ErrorHandler(s.HandleRemoveDelivery))
mux.HandleFunc("PUT /{id}/delivery/{deliveryId}/pickupPoint", ErrorHandler(s.HandleSetPickupPoint))
mux.HandleFunc("GET /{id}/checkout", ErrorHandler(s.HandleCheckout))
mux.HandleFunc("GET /{id}", ErrorHandler(CartIdHandler(s.HandleGet)))
mux.HandleFunc("GET /{id}/add/{sku}", ErrorHandler(CartIdHandler(s.HandleAddSku)))
mux.HandleFunc("POST /{id}", ErrorHandler(CartIdHandler(s.HandleAddRequest)))
mux.HandleFunc("DELETE /{id}/{itemId}", ErrorHandler(CartIdHandler(s.HandleDeleteItem)))
mux.HandleFunc("PUT /{id}", ErrorHandler(CartIdHandler(s.HandleQuantityChange)))
mux.HandleFunc("POST /{id}/delivery", ErrorHandler(CartIdHandler(s.HandleSetDelivery)))
mux.HandleFunc("DELETE /{id}/delivery/{deliveryId}", ErrorHandler(CartIdHandler(s.HandleRemoveDelivery)))
mux.HandleFunc("PUT /{id}/delivery/{deliveryId}/pickupPoint", ErrorHandler(CartIdHandler(s.HandleSetPickupPoint)))
mux.HandleFunc("GET /{id}/checkout", ErrorHandler(CartIdHandler(s.HandleCheckout)))
mux.HandleFunc("GET /", ErrorHandler(CookieCartIdHandler(s.HandleGet)))
mux.HandleFunc("GET /add/{sku}", ErrorHandler(CookieCartIdHandler(s.HandleAddSku)))
mux.HandleFunc("POST /", ErrorHandler(CookieCartIdHandler(s.HandleAddRequest)))
mux.HandleFunc("DELETE /{itemId}", ErrorHandler(CookieCartIdHandler(s.HandleDeleteItem)))
mux.HandleFunc("PUT /", ErrorHandler(CookieCartIdHandler(s.HandleQuantityChange)))
mux.HandleFunc("POST /delivery", ErrorHandler(CookieCartIdHandler(s.HandleSetDelivery)))
mux.HandleFunc("DELETE /delivery/{deliveryId}", ErrorHandler(CookieCartIdHandler(s.HandleRemoveDelivery)))
mux.HandleFunc("PUT /delivery/{deliveryId}/pickupPoint", ErrorHandler(CookieCartIdHandler(s.HandleSetPickupPoint)))
mux.HandleFunc("GET /checkout", ErrorHandler(CookieCartIdHandler(s.HandleCheckout)))
return mux
}