This repository has been archived by the owner on Mar 28, 2023. It is now read-only.
/
purchase_record.go
120 lines (104 loc) · 5.23 KB
/
purchase_record.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package repo
import (
"time"
"github.com/OpenBazaar/openbazaar-go/pb"
)
var (
BuyerDisputeTimeout_firstInterval = time.Duration(15*24) * time.Hour
BuyerDisputeTimeout_secondInterval = time.Duration(40*24) * time.Hour
BuyerDisputeTimeout_thirdInterval = time.Duration(44*24) * time.Hour
BuyerDisputeTimeout_lastInterval = time.Duration(45*24) * time.Hour
BuyerDisputeTimeout_totalDuration = time.Duration(DisputeOptionTimeoutHours) * time.Hour
BuyerDisputeExpiry_firstInterval = time.Duration(15*24) * time.Hour
BuyerDisputeExpiry_secondInterval = time.Duration(40*24) * time.Hour
BuyerDisputeExpiry_lastInterval = time.Duration(44*24) * time.Hour
BuyerDisputeExpiry_totalDuration = time.Duration(DisputeTotalDurationHours) * time.Hour
)
// PurchaseRecord represents a one-to-one relationship with records
// in the SQL datastore
type PurchaseRecord struct {
Contract *pb.RicardianContract
DisputedAt time.Time
OrderID string
OrderState pb.OrderState
Timestamp time.Time
LastDisputeTimeoutNotifiedAt time.Time
LastDisputeExpiryNotifiedAt time.Time
}
// IsDisputeable returns whether the Purchase is in a state that it can be disputed with a
// third-party moderator
func (r *PurchaseRecord) IsDisputeable() bool {
if r.IsModeratedContract() {
switch r.OrderState {
case pb.OrderState_PENDING, pb.OrderState_AWAITING_FULFILLMENT, pb.OrderState_FULFILLED:
return true
}
}
return false
}
// IsModeratedContract returns whether the contract includes a third-party moderator
func (r *PurchaseRecord) IsModeratedContract() bool {
return r.Contract != nil && r.Contract.BuyerOrder != nil && r.Contract.BuyerOrder.Payment != nil && r.Contract.BuyerOrder.Payment.Method == pb.Order_Payment_MODERATED
}
// BuildBuyerDisputeTimeoutFirstNotification returns a Notification with ExpiresIn set for the First Interval
func (r *PurchaseRecord) BuildBuyerDisputeTimeoutFirstNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeTimeout(BuyerDisputeTimeout_firstInterval, createdAt)
}
// BuildBuyerDisputeTimeoutSecondNotification returns a Notification with ExpiresIn set for the Second Interval
func (r *PurchaseRecord) BuildBuyerDisputeTimeoutSecondNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeTimeout(BuyerDisputeTimeout_secondInterval, createdAt)
}
// BuildBuyerDisputeTimeoutThirdNotification returns a Notification with ExpiresIn set for the Third Interval
func (r *PurchaseRecord) BuildBuyerDisputeTimeoutThirdNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeTimeout(BuyerDisputeTimeout_thirdInterval, createdAt)
}
// BuildBuyerDisputeTimeoutLastNotification returns a Notification with ExpiresIn set for the Last Interval
func (r *PurchaseRecord) BuildBuyerDisputeTimeoutLastNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeTimeout(BuyerDisputeTimeout_lastInterval, createdAt)
}
func (r *PurchaseRecord) buildBuyerDisputeTimeout(interval time.Duration, createdAt time.Time) *Notification {
timeRemaining := BuyerDisputeTimeout_totalDuration - interval
notification := &BuyerDisputeTimeout{
ID: NewNotificationID(),
ExpiresIn: uint(timeRemaining.Seconds()),
OrderID: r.OrderID,
Thumbnail: Thumbnail{},
Type: NotifierTypeBuyerDisputeTimeout,
}
if len(r.Contract.VendorListings) > 0 && len(r.Contract.VendorListings[0].Item.Images) > 0 {
notification.Thumbnail = Thumbnail{
Tiny: r.Contract.VendorListings[0].Item.Images[0].Tiny,
Small: r.Contract.VendorListings[0].Item.Images[0].Small,
}
}
return NewNotification(notification, createdAt, false)
}
// BuildBuyerDisputeExpiryFirstNotification returns a Notification with ExpiresIn set for the First Interval
func (r *PurchaseRecord) BuildBuyerDisputeExpiryFirstNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeExpiry(BuyerDisputeExpiry_firstInterval, createdAt)
}
// BuildBuyerDisputeExpirySecondNotification returns a Notification with ExpiresIn set for the Second Interval
func (r *PurchaseRecord) BuildBuyerDisputeExpirySecondNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeExpiry(BuyerDisputeExpiry_secondInterval, createdAt)
}
// BuildBuyerDisputeExpiryLastNotification returns a Notification with ExpiresIn set for the Last Interval
func (r *PurchaseRecord) BuildBuyerDisputeExpiryLastNotification(createdAt time.Time) *Notification {
return r.buildBuyerDisputeExpiry(BuyerDisputeExpiry_lastInterval, createdAt)
}
func (r *PurchaseRecord) buildBuyerDisputeExpiry(interval time.Duration, createdAt time.Time) *Notification {
timeRemaining := BuyerDisputeExpiry_lastInterval + (time.Duration(24) * time.Hour) - interval
notification := &BuyerDisputeExpiry{
ID: NewNotificationID(),
ExpiresIn: uint(timeRemaining.Seconds()),
OrderID: r.OrderID,
Thumbnail: Thumbnail{},
Type: NotifierTypeBuyerDisputeExpiry,
}
if len(r.Contract.VendorListings) > 0 && len(r.Contract.VendorListings[0].Item.Images) > 0 {
notification.Thumbnail = Thumbnail{
Tiny: r.Contract.VendorListings[0].Item.Images[0].Tiny,
Small: r.Contract.VendorListings[0].Item.Images[0].Small,
}
}
return NewNotification(notification, createdAt, false)
}