-
Notifications
You must be signed in to change notification settings - Fork 0
/
msg.go
129 lines (103 loc) · 3.03 KB
/
msg.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
121
122
123
124
125
126
127
128
129
package courier
import (
"database/sql/driver"
"encoding/json"
"errors"
"strconv"
"time"
"github.com/nyaruka/null"
"github.com/gofrs/uuid"
"github.com/nyaruka/gocommon/urns"
)
// ErrMsgNotFound is returned when trying to queue the status for a Msg that doesn't exit
var ErrMsgNotFound = errors.New("message not found")
// ErrWrongIncomingMsgStatus use do ignore the status update if the DB raise this
var ErrWrongIncomingMsgStatus = errors.New("Incoming messages can only be PENDING or HANDLED")
// MsgID is our typing of the db int type
type MsgID null.Int
// NewMsgID creates a new MsgID for the passed in int64
func NewMsgID(id int64) MsgID {
return MsgID(id)
}
// String satisfies the Stringer interface
func (i MsgID) String() string {
if i != NilMsgID {
return strconv.FormatInt(int64(i), 10)
}
return "null"
}
// MarshalJSON marshals into JSON. 0 values will become null
func (i MsgID) MarshalJSON() ([]byte, error) {
return null.Int(i).MarshalJSON()
}
// UnmarshalJSON unmarshals from JSON. null values become 0
func (i *MsgID) UnmarshalJSON(b []byte) error {
return null.UnmarshalInt(b, (*null.Int)(i))
}
// Value returns the db value, null is returned for 0
func (i MsgID) Value() (driver.Value, error) {
return null.Int(i).Value()
}
// Scan scans from the db value. null values become 0
func (i *MsgID) Scan(value interface{}) error {
return null.ScanInt(value, (*null.Int)(i))
}
// NilMsgID is our nil value for MsgID
var NilMsgID = MsgID(0)
// MsgUUID is the UUID of a message which has been received
type MsgUUID struct {
uuid.UUID
}
// NilMsgUUID is a "zero value" message UUID
var NilMsgUUID = MsgUUID{uuid.Nil}
// NewMsgUUID creates a new unique message UUID
func NewMsgUUID() MsgUUID {
u, _ := uuid.NewV4()
return MsgUUID{u}
}
// NewMsgUUIDFromString creates a new message UUID for the passed in string
func NewMsgUUIDFromString(uuidString string) MsgUUID {
uuid, _ := uuid.FromString(uuidString)
return MsgUUID{uuid}
}
type FlowReference struct {
UUID string `json:"uuid" validate:"uuid4"`
Name string `json:"name"`
}
//-----------------------------------------------------------------------------
// Msg interface
//-----------------------------------------------------------------------------
// Msg is our interface to represent an incoming or outgoing message
type Msg interface {
ID() MsgID
UUID() MsgUUID
Text() string
Attachments() []string
ExternalID() string
URN() urns.URN
URNAuth() string
ContactName() string
QuickReplies() []string
Topic() string
Metadata() json.RawMessage
ResponseToExternalID() string
IsResend() bool
Flow() *FlowReference
FlowName() string
FlowUUID() string
Channel() Channel
ReceivedOn() *time.Time
SentOn() *time.Time
HighPriority() bool
WithContactName(name string) Msg
WithReceivedOn(date time.Time) Msg
WithExternalID(id string) Msg
WithID(id MsgID) Msg
WithUUID(uuid MsgUUID) Msg
WithAttachment(url string) Msg
WithURNAuth(auth string) Msg
WithMetadata(metadata json.RawMessage) Msg
WithFlow(flow *FlowReference) Msg
EventID() int64
SessionStatus() string
}