forked from nyaruka/courier
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmsg.go
117 lines (93 loc) · 2.8 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
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}
}
//-----------------------------------------------------------------------------
// 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
Metadata() json.RawMessage
ResponseToID() MsgID
ResponseToExternalID() 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
EventID() int64
}