Documentation ¶
Index ¶
- Constants
- Variables
- func ApplyEvent(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, session *Session, ...) error
- func ApplyPostEventHooks(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, org *OrgAssets, ...) error
- func ApplyPreEventHooks(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, org *OrgAssets, ...) error
- func AssertContactMessagesPresent(t *testing.T, db *sqlx.DB, contactIDs []flows.ContactID, extraWhere string)
- func AssertContactRunsPresent(t *testing.T, db *sqlx.DB, contactIDs []flows.ContactID, flowID FlowID, ...)
- func AssertContactSessionsPresent(t *testing.T, db *sqlx.DB, contactIDs []flows.ContactID, extraWhere string)
- func BulkSQL(ctx context.Context, label string, tx *sqlx.Tx, sql string, vs []interface{}) error
- func LoadContacts(ctx context.Context, db *sqlx.DB, session flows.SessionAssets, org *OrgAssets, ...) ([]*flows.Contact, error)
- func MarkEventsFired(ctx context.Context, tx *sqlx.Tx, fires []*EventFire, fired time.Time) error
- func MarkMessagesPending(ctx context.Context, tx *sqlx.Tx, msgs []*Msg) error
- func MarkMessagesQueued(ctx context.Context, tx *sqlx.Tx, msgs []*Msg) error
- func RegisterEventHandler(eventType string, handler EventHandler)
- type Campaign
- type CampaignEvent
- func (e *CampaignEvent) Campaign() *Campaign
- func (e *CampaignEvent) DeliveryHour() int
- func (e *CampaignEvent) ID() CampaignEventID
- func (e *CampaignEvent) Offset() int
- func (e *CampaignEvent) RelativeToID() FieldID
- func (e *CampaignEvent) RelativeToKey() string
- func (e *CampaignEvent) ScheduleForTime(tz *time.Location, now time.Time, start time.Time) (*time.Time, error)
- func (e *CampaignEvent) UUID() CampaignEventUUID
- func (e *CampaignEvent) Unit() OffsetUnit
- func (e *CampaignEvent) UnmarshalJSON(data []byte) error
- type CampaignEventID
- type CampaignEventUUID
- type CampaignID
- type CampaignUUID
- type Channel
- func (c *Channel) Address() string
- func (c *Channel) Country() string
- func (c *Channel) ID() ChannelID
- func (c *Channel) MatchPrefixes() []string
- func (c *Channel) Name() string
- func (c *Channel) Parent() *assets.ChannelReference
- func (c *Channel) Roles() []assets.ChannelRole
- func (c *Channel) Schemes() []string
- func (c *Channel) TPS() int
- func (c *Channel) Type() ChannelType
- func (c *Channel) UUID() assets.ChannelUUID
- type ChannelID
- type ChannelType
- type ConnectionID
- type ContactID
- type ContactURNID
- type EventCommitHook
- type EventFire
- type EventHandler
- type ExitType
- type Field
- type FieldID
- type FieldUUID
- type FieldValue
- type FireID
- type Flow
- type FlowID
- type FlowRun
- type Group
- type GroupID
- type Label
- type LabelID
- type Location
- type Msg
- type MsgDirection
- type MsgStatus
- type MsgType
- type MsgVisibility
- type OffsetUnit
- type Org
- func (o *Org) DateFormat() utils.DateFormat
- func (o *Org) Extension(name string) json.RawMessage
- func (o *Org) ID() OrgID
- func (o *Org) Languages() utils.LanguageList
- func (o *Org) MarshalJSON() ([]byte, error)
- func (o *Org) Now() time.Time
- func (o *Org) RedactionPolicy() utils.RedactionPolicy
- func (o *Org) TimeFormat() utils.TimeFormat
- func (o *Org) Timezone() *time.Location
- type OrgAssets
- func (a *OrgAssets) CampaignByGroupID(groupID GroupID) []*Campaign
- func (a *OrgAssets) CampaignEventsByFieldID(fieldID FieldID) []*CampaignEvent
- func (a *OrgAssets) Campaigns() []*Campaign
- func (a *OrgAssets) ChannelByID(channelID ChannelID) *Channel
- func (a *OrgAssets) ChannelByUUID(channelUUID assets.ChannelUUID) *Channel
- func (a *OrgAssets) Channels() ([]assets.Channel, error)
- func (a *OrgAssets) Env() utils.Environment
- func (a *OrgAssets) FieldByKey(key string) *Field
- func (a *OrgAssets) FieldByUUID(fieldUUID FieldUUID) *Field
- func (a *OrgAssets) Fields() ([]assets.Field, error)
- func (a *OrgAssets) Flow(flowUUID assets.FlowUUID) (assets.Flow, error)
- func (a *OrgAssets) GroupByID(groupID GroupID) *Group
- func (a *OrgAssets) GroupByUUID(groupUUID assets.GroupUUID) *Group
- func (a *OrgAssets) Groups() ([]assets.Group, error)
- func (a *OrgAssets) Labels() ([]assets.Label, error)
- func (a *OrgAssets) Locations() ([]assets.LocationHierarchy, error)
- func (a *OrgAssets) OrgID() OrgID
- func (a *OrgAssets) Resthooks() ([]assets.Resthook, error)
- type OrgID
- type Resthook
- type ResthookID
- type Session
- func (s *Session) AddPostCommitEvent(hook EventCommitHook, event interface{})
- func (s *Session) AddPreCommitEvent(hook EventCommitHook, event interface{})
- func (s *Session) Contact() *flows.Contact
- func (s *Session) ContactUUID() flows.ContactUUID
- func (s *Session) Org() *OrgAssets
- func (s *Session) Runs() []*FlowRun
- type SessionCommitHook
- type SessionID
- type SessionStatus
- type Step
- type Topup
- type TopupID
Constants ¶
const ( // OffsetMinute means our offset is in minutes OffsetMinute = OffsetUnit("M") // OffsetHour means our offset is in hours OffsetHour = OffsetUnit("H") // OffsetDay means our offset is in days OffsetDay = OffsetUnit("D") // OffsetWeek means our offset is in weeks OffsetWeek = OffsetUnit("W") // NilDeliveryHour is our constant for not having a set delivery hour NilDeliveryHour = -1 )
const ( DirectionIn = MsgDirection("I") DirectionOut = MsgDirection("O") )
const ( VisibilityVisible = MsgVisibility("V") VisibilityArchived = MsgVisibility("A") VisibilityDeleted = MsgVisibility("D") )
const ( TypeInbox = MsgType("I") TypeFlow = MsgType("F") TypeIVR = MsgType("V") TypeUSSD = MsgType("U") )
const ( MsgStatusInitializing = MsgStatus("I") MsgStatusPending = MsgStatus("P") MsgStatusQueued = MsgStatus("Q") MsgStatusWired = MsgStatus("W") MsgStatusSent = MsgStatus("S") MsgStatusHandled = MsgStatus("H") MsgStatusErrored = MsgStatus("E") MsgStatusFailed = MsgStatus("F") MsgStatusResent = MsgStatus("R") )
const ( SessionStatusActive = "A" SessionStatusCompleted = "C" SessionStatusErrored = "E" SessionStatusWaiting = "W" )
const ChannelTypeAndroid = ChannelType("A")
const InsertMsgSQL = `` /* 565-byte string literal not displayed */
Variables ¶
var ( ExitInterrupted = null.NewString("I", true) ExitCompleted = null.NewString("C", true) ExitExpired = null.NewString("E", true) )
var NilTopupID = TopupID(null.NewInt(0, false))
NilTopupID is our nil value for topup id
Functions ¶
func ApplyEvent ¶
func ApplyEvent(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, session *Session, e flows.Event) error
ApplyEvent applies the passed in event, IE, creates the db objects required etc..
func ApplyPostEventHooks ¶ added in v0.0.17
func ApplyPostEventHooks(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, org *OrgAssets, sessions []*Session) error
ApplyPostEventHooks runs through all the post event hooks for the passed in sessions and applies their events
func ApplyPreEventHooks ¶ added in v0.0.17
func ApplyPreEventHooks(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, org *OrgAssets, sessions []*Session) error
ApplyPreEventHooks runs through all the pre event hooks for the passed in sessions and applies their events
func AssertContactMessagesPresent ¶ added in v0.0.11
func AssertContactRunsPresent ¶ added in v0.0.11
func AssertContactSessionsPresent ¶ added in v0.0.11
func LoadContacts ¶ added in v0.0.5
func LoadContacts(ctx context.Context, db *sqlx.DB, session flows.SessionAssets, org *OrgAssets, ids []flows.ContactID) ([]*flows.Contact, error)
LoadContacts loads a set of contacts for the passed in ids
func MarkEventsFired ¶ added in v0.0.19
MarkEventsFired sets the fired date on all the passed in event fires and updates the associated rows in the database
func MarkMessagesPending ¶ added in v0.0.5
MarkMessagesPending marks the passed in messages as pending
func MarkMessagesQueued ¶ added in v0.0.2
MarkMessagesQueued marks the passed in messages as queued
func RegisterEventHandler ¶ added in v0.0.17
func RegisterEventHandler(eventType string, handler EventHandler)
RegisterEventHandler registers the passed in handler as being interested in the passed in type
Types ¶
type Campaign ¶ added in v0.0.17
type Campaign struct {
// contains filtered or unexported fields
}
Campaign is our struct for a campaign and all its events
func (*Campaign) Events ¶ added in v0.0.17
func (c *Campaign) Events() []*CampaignEvent
Events returns the list of events for this campaign
func (*Campaign) GroupID ¶ added in v0.0.17
GroupID returns the id of the group this campaign works against
func (*Campaign) GroupUUID ¶ added in v0.0.17
GroupUUID returns the uuid of the group this campaign works against
func (*Campaign) ID ¶ added in v0.0.17
func (c *Campaign) ID() CampaignID
ID return the database id of this campaign
func (*Campaign) UUID ¶ added in v0.0.17
func (c *Campaign) UUID() CampaignUUID
UUID returns the UUID of this campaign
type CampaignEvent ¶ added in v0.0.17
type CampaignEvent struct {
// contains filtered or unexported fields
}
CampaignEvent is our struct for an individual campaign event
func (*CampaignEvent) Campaign ¶ added in v0.0.17
func (e *CampaignEvent) Campaign() *Campaign
Campaign returns the campaign this event is part of
func (*CampaignEvent) DeliveryHour ¶ added in v0.0.17
func (e *CampaignEvent) DeliveryHour() int
DeliveryHour returns the hour this event should send at, if any
func (*CampaignEvent) ID ¶ added in v0.0.17
func (e *CampaignEvent) ID() CampaignEventID
ID returns the database id for this campaign event
func (*CampaignEvent) Offset ¶ added in v0.0.17
func (e *CampaignEvent) Offset() int
Offset returns the offset for thi campaign event
func (*CampaignEvent) RelativeToID ¶ added in v0.0.17
func (e *CampaignEvent) RelativeToID() FieldID
RelativeToID returns the ID of the field this event is relative to
func (*CampaignEvent) RelativeToKey ¶ added in v0.0.17
func (e *CampaignEvent) RelativeToKey() string
RelativeToKey returns the key of the field this event is relative to
func (*CampaignEvent) ScheduleForTime ¶ added in v0.0.17
func (e *CampaignEvent) ScheduleForTime(tz *time.Location, now time.Time, start time.Time) (*time.Time, error)
ScheduleForTime calculates the next fire (if any) for the passed in contact for this CampaignEvent
func (*CampaignEvent) UUID ¶ added in v0.0.17
func (e *CampaignEvent) UUID() CampaignEventUUID
UUID returns the UUID of this campaign event
func (*CampaignEvent) Unit ¶ added in v0.0.17
func (e *CampaignEvent) Unit() OffsetUnit
Unit returns the unit for this campaign event
func (*CampaignEvent) UnmarshalJSON ¶ added in v0.0.17
func (e *CampaignEvent) UnmarshalJSON(data []byte) error
UnmarshalJSON is our unmarshaller for json data
type CampaignEventID ¶ added in v0.0.17
type CampaignEventID int
CampaignEventID is our type for campaign event ids
type CampaignEventUUID ¶ added in v0.0.17
CampaignEventUUID is our type for campaign event UUIDs
type CampaignUUID ¶ added in v0.0.17
CampaignUUID is our type for campaign UUIDs
type Channel ¶ added in v0.0.5
type Channel struct {
// contains filtered or unexported fields
}
Channel is the mailroom struct that represents channels
func (*Channel) MatchPrefixes ¶ added in v0.0.5
MatchPrefixes returns the prefixes we should also match when determining channel affinity
func (*Channel) Parent ¶ added in v0.0.5
func (c *Channel) Parent() *assets.ChannelReference
Parent returns the UUID of the parent channel to this channel
func (*Channel) Roles ¶ added in v0.0.5
func (c *Channel) Roles() []assets.ChannelRole
Roles returns the roles this channel supports
func (*Channel) TPS ¶ added in v0.0.5
TPS returns the max number of transactions per second this channel supports
func (*Channel) Type ¶ added in v0.0.5
func (c *Channel) Type() ChannelType
Type returns the channel type for this channel
func (*Channel) UUID ¶ added in v0.0.5
func (c *Channel) UUID() assets.ChannelUUID
UUID returns the UUID of this channel
type ChannelType ¶ added in v0.0.5
type ChannelType string
type ConnectionID ¶
type ContactURNID ¶
type ContactURNID int
type EventCommitHook ¶ added in v0.0.19
type EventCommitHook interface {
Apply(context.Context, *sqlx.Tx, *redis.Pool, *OrgAssets, map[*Session][]interface{}) error
}
EventCommitHook defines a callback that will accept a certain type of events across session, either before or after committing
type EventFire ¶ added in v0.0.19
type EventFire struct { FireID FireID `db:"fire_id"` EventID CampaignEventID `db:"event_id"` ContactID flows.ContactID `db:"contact_id"` Scheduled time.Time `db:"scheduled"` Fired *time.Time `db:"fired"` }
EventFire represents a single campaign event fire for an event and contact
type EventHandler ¶ added in v0.0.17
EventHandler defines a call for handling events that occur in a flow
type Field ¶ added in v0.0.5
type Field struct {
// contains filtered or unexported fields
}
Field is our mailroom type for contact field types
type FieldValue ¶ added in v0.0.17
type FieldValue struct { Text types.XText `json:"text"` Datetime *types.XDateTime `json:"datetime,omitempty"` Number *types.XNumber `json:"number,omitempty"` State flows.LocationPath `json:"state,omitempty"` District flows.LocationPath `json:"district,omitempty"` Ward flows.LocationPath `json:"ward,omitempty"` }
FieldValue is our utility struct for the value of a field
type Flow ¶ added in v0.0.5
type Flow struct {
// contains filtered or unexported fields
}
Flow is the mailroom type for a flow
func (*Flow) Definition ¶ added in v0.0.5
func (f *Flow) Definition() json.RawMessage
Definition returns the definition for this flow
type FlowRun ¶
type FlowRun struct { ID FlowID `db:"id"` UUID flows.RunUUID `db:"uuid"` IsActive bool `db:"is_active"` CreatedOn time.Time `db:"created_on"` ModifiedOn time.Time `db:"modified_on"` ExitedOn *time.Time `db:"exited_on"` ExitType null.String `db:"exit_type"` ExpiresOn *time.Time `db:"expires_on"` TimeoutOn *time.Time `db:"timeout_on"` Responded bool `db:"responded"` // TODO: should this be a complex object that can read / write iself to the DB as JSON? Results string `db:"results"` // TODO: should this be a complex object that can read / write iself to the DB as JSON? Path string `db:"path"` // TODO: should this be a complex object that can read / write iself to the DB as JSON? Events string `db:"events"` CurrentNodeUUID flows.NodeUUID `db:"current_node_uuid"` ContactID flows.ContactID `db:"contact_id"` FlowID FlowID `db:"flow_id"` OrgID OrgID `db:"org_id"` ParentID null.Int `db:"parent_id"` SessionID SessionID `db:"session_id"` StartID null.Int `db:"start_id"` // contains filtered or unexported fields }
FlowRun is the mailroom type for a FlowRun
type Group ¶ added in v0.0.5
type Group struct {
// contains filtered or unexported fields
}
Group is our mailroom type for contact groups
type Label ¶ added in v0.0.5
type Label struct {
// contains filtered or unexported fields
}
Label is our mailroom type for message labels
type Location ¶ added in v0.0.5
type Location struct { Name_ string `json:"name"` Aliases_ []string `json:"aliases"` Children_ []*Location `json:"children"` // contains filtered or unexported fields }
Location is our mailroom type for administrative locations TODO: convert to something less jank when we have real location constructors
type Msg ¶
type Msg struct { ID flows.MsgID `db:"id" json:"id"` UUID flows.MsgUUID `db:"uuid" json:"uuid"` Text string `db:"text" json:"text"` HighPriority bool `db:"high_priority" json:"high_priority"` CreatedOn time.Time `db:"created_on" json:"created_on"` ModifiedOn time.Time `db:"modified_on" json:"modified_on"` SentOn time.Time `db:"sent_on" json:"sent_on"` QueuedOn time.Time `db:"queued_on" json:"queued_on"` Direction MsgDirection `db:"direction" json:"direction"` Status MsgStatus `db:"status" json:"status"` Visibility MsgVisibility `db:"visibility" json:"visibility"` MsgType MsgType `db:"msg_type"` MsgCount int `db:"msg_count" json:"tps_cost"` ErrorCount int `db:"error_count" json:"error_count"` NextAttempt time.Time `db:"next_attempt" json:"next_attempt"` ExternalID null.String `db:"external_id" json:"external_id"` Attachments pq.StringArray `db:"attachments" json:"attachments"` Metadata null.String `db:"metadata" json:"metadata"` ChannelID ChannelID `db:"channel_id" json:"channel_id"` ChannelUUID assets.ChannelUUID ` json:"channel_uuid"` ConnectionID ConnectionID `db:"connection_id"` ContactID flows.ContactID `db:"contact_id" json:"contact_id"` ContactURNID ContactURNID `db:"contact_urn_id" json:"contact_urn_id"` URN urns.URN ` json:"urn"` URNAuth string ` json:"urn_auth,omitempty"` OrgID OrgID `db:"org_id" json:"org_id"` TopUpID TopupID `db:"topup_id"` // contains filtered or unexported fields }
Msg is our type for mailroom messages
func NewOutgoingMsg ¶ added in v0.0.17
func NewOutgoingMsg(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, orgID OrgID, channel *Channel, contactID flows.ContactID, m *flows.MsgOut, createdOn time.Time) (*Msg, error)
NewOutgoingMsg creates an outgoing message for the passed in flow message. Note that this message is created in a queued state!
type MsgDirection ¶
type MsgDirection string
type MsgVisibility ¶
type MsgVisibility string
type OffsetUnit ¶ added in v0.0.17
type OffsetUnit string
OffsetUnit defines what time unit our offset is in
type Org ¶ added in v0.0.5
type Org struct {
// contains filtered or unexported fields
}
Org is mailroom's type for RapidPro orgs. It also implements the utils.Environment interface for GoFlow
func (*Org) DateFormat ¶ added in v0.0.5
func (o *Org) DateFormat() utils.DateFormat
DateFormat returns the date format for this org
func (*Org) Extension ¶ added in v0.0.5
func (o *Org) Extension(name string) json.RawMessage
Extension returns the extension for this org
func (*Org) Languages ¶ added in v0.0.5
func (o *Org) Languages() utils.LanguageList
Languages returns the list of supported languages for this org
func (*Org) MarshalJSON ¶ added in v0.0.22
MarshalJSON is our custom marshaller so that our inner env get output
func (*Org) RedactionPolicy ¶ added in v0.0.5
func (o *Org) RedactionPolicy() utils.RedactionPolicy
RedactionPolicy returns the redaction policy (are we anonymous) for this org
func (*Org) TimeFormat ¶ added in v0.0.5
func (o *Org) TimeFormat() utils.TimeFormat
TimeFormat returns the time format for this org
type OrgAssets ¶
type OrgAssets struct {
// contains filtered or unexported fields
}
func GetOrgAssets ¶ added in v0.0.5
GetOrgAssets creates or gets org assets for the passed in org
func (*OrgAssets) CampaignByGroupID ¶ added in v0.0.17
func (*OrgAssets) CampaignEventsByFieldID ¶ added in v0.0.17
func (a *OrgAssets) CampaignEventsByFieldID(fieldID FieldID) []*CampaignEvent
func (*OrgAssets) ChannelByID ¶ added in v0.0.5
func (*OrgAssets) ChannelByUUID ¶ added in v0.0.5
func (a *OrgAssets) ChannelByUUID(channelUUID assets.ChannelUUID) *Channel
func (*OrgAssets) Env ¶ added in v0.0.5
func (a *OrgAssets) Env() utils.Environment
func (*OrgAssets) FieldByKey ¶ added in v0.0.17
func (*OrgAssets) FieldByUUID ¶ added in v0.0.5
func (*OrgAssets) GroupByUUID ¶ added in v0.0.5
type Resthook ¶ added in v0.0.5
type Resthook struct {
// contains filtered or unexported fields
}
Resthook is the mailroom type for resthooks
func (*Resthook) ID ¶ added in v0.0.5
func (r *Resthook) ID() ResthookID
ID returns the ID of this resthook
func (*Resthook) Subscribers ¶ added in v0.0.5
Subscribers returns the subscribers for this resthook
type ResthookID ¶ added in v0.0.5
type ResthookID int64
ResthookID is our type for the database id of a resthook
type Session ¶
type Session struct { ID SessionID `db:"id"` Status SessionStatus `db:"status"` Responded bool `db:"responded"` Output string `db:"output"` ContactID flows.ContactID `db:"contact_id"` OrgID OrgID `db:"org_id"` CreatedOn time.Time // contains filtered or unexported fields }
Session is the mailroom type for a FlowSession
func NewSession ¶ added in v0.0.17
NewSession a session objects from the passed in flow session. It does NOT commit said session to the database.
func WriteSessions ¶ added in v0.0.10
func WriteSessions(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, org *OrgAssets, ss []flows.Session, hook SessionCommitHook) ([]*Session, error)
WriteSessions writes the passed in session to our database, writes any runs that need to be created as well as appying any events created in the session
func (*Session) AddPostCommitEvent ¶ added in v0.0.17
func (s *Session) AddPostCommitEvent(hook EventCommitHook, event interface{})
AddPostCommitEvent adds a new event to be handled by a post commit hook
func (*Session) AddPreCommitEvent ¶ added in v0.0.17
func (s *Session) AddPreCommitEvent(hook EventCommitHook, event interface{})
AddPreCommitEvent adds a new event to be handled by a pre commit hook
func (*Session) ContactUUID ¶ added in v0.0.17
func (s *Session) ContactUUID() flows.ContactUUID
ContactUUID returns the UUID of our contact
type SessionCommitHook ¶ added in v0.0.19
type SessionStatus ¶
type SessionStatus string
type Step ¶
type Step struct { UUID flows.StepUUID `json:"uuid"` NodeUUID flows.NodeUUID `json:"node_uuid"` ArrivedOn time.Time `json:"arrived_on"` ExitUUID flows.ExitUUID `json:"exit_uuid,omitempty"` }
Step represents a single step in a run, this struct is used for serialization to the steps