forked from i-love-flamingo/flamingo-commerce
/
handler.go
95 lines (72 loc) · 2.68 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package placeorder
import (
"context"
"go.opencensus.io/trace"
"flamingo.me/flamingo-commerce/v3/checkout/domain/placeorder/process"
)
// Handler for handling PlaceOrder related commands
type Handler struct {
coordinator *Coordinator
}
// Inject dependencies
func (h *Handler) Inject(
c *Coordinator,
) *Handler {
h.coordinator = c
return h
}
// StartPlaceOrder handles start place order command
func (h *Handler) StartPlaceOrder(ctx context.Context, command StartPlaceOrderCommand) (*process.Context, error) {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/StartPlaceOrder")
defer span.End()
_ = h.coordinator.ClearLastProcess(ctx)
return h.coordinator.New(ctx, command.Cart, command.ReturnURL)
}
// CurrentContext returns the last saved state
func (h *Handler) CurrentContext(ctx context.Context) (*process.Context, error) {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/CurrentContext")
defer span.End()
p, err := h.coordinator.LastProcess(ctx)
if err != nil {
return nil, err
}
currentContext := p.Context()
return ¤tContext, nil
}
// ClearPlaceOrder clears the last placed order from the context store, only possible if order in final state
func (h *Handler) ClearPlaceOrder(ctx context.Context) error {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/ClearPlaceOrder")
defer span.End()
return h.coordinator.ClearLastProcess(ctx)
}
// RefreshPlaceOrder handles RefreshPlaceOrder command
func (h *Handler) RefreshPlaceOrder(ctx context.Context, _ RefreshPlaceOrderCommand) (*process.Context, error) {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/RefreshPlaceOrder")
defer span.End()
p, err := h.coordinator.LastProcess(ctx)
if err != nil {
return nil, err
}
lastPlaceOrderCtx := p.Context()
// proceed in state
h.coordinator.Run(ctx)
return &lastPlaceOrderCtx, nil
}
// RefreshPlaceOrderBlocking handles RefreshPlaceOrder blocking
func (h *Handler) RefreshPlaceOrderBlocking(ctx context.Context, _ RefreshPlaceOrderCommand) (*process.Context, error) {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/RefreshPlaceOrderBlocking")
defer span.End()
return h.coordinator.RunBlocking(ctx)
}
// HasUnfinishedProcess checks for processes not in final state
func (h *Handler) HasUnfinishedProcess(ctx context.Context) (bool, error) {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/HasUnfinishedProcess")
defer span.End()
return h.coordinator.HasUnfinishedProcess(ctx)
}
// CancelPlaceOrder handles order cancellation, is blocking
func (h *Handler) CancelPlaceOrder(ctx context.Context, _ CancelPlaceOrderCommand) error {
ctx, span := trace.StartSpan(ctx, "checkout/Handler/CancelPlaceOrder")
defer span.End()
return h.coordinator.Cancel(ctx)
}