From e5c747d907e2693d3c6a4ed519f91aea65d05978 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 21 Jul 2020 16:33:06 -0500 Subject: [PATCH 01/56] Add loop protection by passing session history to new flow action triggers --- go.mod | 2 +- go.sum | 4 ++-- hooks/session_triggered.go | 3 ++- ivr/ivr.go | 2 +- models/starts.go | 25 ++++++++++++++++++------- runner/runner.go | 2 +- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 1f3704e3d..739058e05 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.95.1 + github.com/nyaruka/goflow v0.95.2-0.20200721212909-4d88cabc1333 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index 7ff223348..9ea4c3111 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.95.1 h1:FmYlZH4+mM+5Xft1BxUG97TIWx4eDqZk0Dbnh86Qqs4= -github.com/nyaruka/goflow v0.95.1/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.95.2-0.20200721212909-4d88cabc1333 h1:wkm5p5WXMWXzt7J5nLM6ivwttREo/KUgovaDJxgagEE= +github.com/nyaruka/goflow v0.95.2-0.20200721212909-4d88cabc1333/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/hooks/session_triggered.go b/hooks/session_triggered.go index 8ad351709..057339ebf 100644 --- a/hooks/session_triggered.go +++ b/hooks/session_triggered.go @@ -97,7 +97,8 @@ func (h *InsertStartHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool WithURNs(event.URNs). WithQuery(event.ContactQuery). WithCreateContact(event.CreateContact). - WithParentSummary(event.RunSummary) + WithParentSummary(event.RunSummary). + WithSessionHistory(event.History) starts = append(starts, start) diff --git a/ivr/ivr.go b/ivr/ivr.go index 5626fa649..81338a936 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -359,7 +359,7 @@ func StartIVRFlow( var trigger flows.Trigger if len(start.ParentSummary()) > 0 { trigger = triggers.NewBuilder(oa.Env(), flowRef, contact). - FlowAction(start.ParentSummary()). + FlowAction(start.SessionHistory(), start.ParentSummary()). WithConnection(channel.ChannelReference(), urn). Build() } else { diff --git a/models/starts.go b/models/starts.go index 7944aaf5a..ac8b59264 100644 --- a/models/starts.go +++ b/models/starts.go @@ -7,6 +7,7 @@ import ( "github.com/jmoiron/sqlx" "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/null" "github.com/pkg/errors" @@ -91,8 +92,9 @@ type FlowStartBatch struct { FlowType FlowType `json:"flow_type"` ContactIDs []ContactID `json:"contact_ids"` - ParentSummary null.JSON `json:"parent_summary,omitempty"` - Extra null.JSON `json:"extra,omitempty"` + ParentSummary null.JSON `json:"parent_summary,omitempty"` + SessionHistory *flows.SessionHistory `json:"session_history,omitempty"` + Extra null.JSON `json:"extra,omitempty"` RestartParticipants RestartParticipants `json:"restart_participants"` IncludeActive IncludeActive `json:"include_active"` @@ -113,8 +115,9 @@ func (b *FlowStartBatch) IncludeActive() IncludeActive { return b.b. func (b *FlowStartBatch) IsLast() bool { return b.b.IsLast } func (b *FlowStartBatch) TotalContacts() int { return b.b.TotalContacts } -func (b *FlowStartBatch) ParentSummary() json.RawMessage { return json.RawMessage(b.b.ParentSummary) } -func (b *FlowStartBatch) Extra() json.RawMessage { return json.RawMessage(b.b.Extra) } +func (b *FlowStartBatch) ParentSummary() json.RawMessage { return json.RawMessage(b.b.ParentSummary) } +func (b *FlowStartBatch) SessionHistory() *flows.SessionHistory { return b.b.SessionHistory } +func (b *FlowStartBatch) Extra() json.RawMessage { return json.RawMessage(b.b.Extra) } func (b *FlowStartBatch) MarshalJSON() ([]byte, error) { return json.Marshal(b.b) } func (b *FlowStartBatch) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, &b.b) } @@ -139,8 +142,9 @@ type FlowStart struct { RestartParticipants RestartParticipants `json:"restart_participants" db:"restart_participants"` IncludeActive IncludeActive `json:"include_active" db:"include_active"` - Extra null.JSON `json:"extra,omitempty" db:"extra"` - ParentSummary null.JSON `json:"parent_summary,omitempty" db:"parent_summary"` + Extra null.JSON `json:"extra,omitempty" db:"extra"` + ParentSummary null.JSON `json:"parent_summary,omitempty" db:"parent_summary"` + SessionHistory *flows.SessionHistory `json:"session_history,omitempty"` CreatedBy string `json:"created_by"` } @@ -190,6 +194,12 @@ func (s *FlowStart) WithParentSummary(sum json.RawMessage) *FlowStart { return s } +func (s *FlowStart) SessionHistory() *flows.SessionHistory { return s.s.SessionHistory } +func (s *FlowStart) WithSessionHistory(history *flows.SessionHistory) *FlowStart { + s.s.SessionHistory = history + return s +} + func (s *FlowStart) Extra() json.RawMessage { return json.RawMessage(s.s.Extra) } func (s *FlowStart) WithExtra(extra json.RawMessage) *FlowStart { s.s.Extra = null.JSON(extra) @@ -202,7 +212,7 @@ func (s *FlowStart) UnmarshalJSON(data []byte) error { return json.Unmarshal(dat // GetFlowStartAttributes gets the basic attributes for the passed in start id, this includes ONLY its id, uuid, flow_id and extra func GetFlowStartAttributes(ctx context.Context, db Queryer, startID StartID) (*FlowStart, error) { start := &FlowStart{} - err := db.GetContext(ctx, &start.s, `SELECT id, uuid, flow_id, extra, parent_summary FROM flows_flowstart WHERE id = $1`, startID) + err := db.GetContext(ctx, &start.s, `SELECT id, uuid, flow_id, extra, parent_summary, session_history FROM flows_flowstart WHERE id = $1`, startID) if err != nil { return nil, errors.Wrapf(err, "unable to load start attributes for id: %d", startID) } @@ -320,6 +330,7 @@ func (s *FlowStart) CreateBatch(contactIDs []ContactID, last bool, totalContacts b.b.RestartParticipants = s.RestartParticipants() b.b.IncludeActive = s.IncludeActive() b.b.ParentSummary = null.JSON(s.ParentSummary()) + b.b.SessionHistory = s.SessionHistory() b.b.Extra = null.JSON(s.Extra()) b.b.IsLast = last b.b.TotalContacts = totalContacts diff --git a/runner/runner.go b/runner/runner.go index 571ffb836..8f3ad07e5 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -186,7 +186,7 @@ func StartFlowBatch( // this will build our trigger for each contact started triggerBuilder := func(contact *flows.Contact) flows.Trigger { if batch.ParentSummary() != nil { - tb := triggers.NewBuilder(oa.Env(), flow.FlowReference(), contact).FlowAction(batch.ParentSummary()) + tb := triggers.NewBuilder(oa.Env(), flow.FlowReference(), contact).FlowAction(batch.SessionHistory(), batch.ParentSummary()) if batchStart { tb = tb.AsBatch() } From c51d802ec9b69979d2be3d2f5602fa7f2b735ec6 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 23 Jul 2020 13:45:11 -0500 Subject: [PATCH 02/56] Add session_history as JSON field to flows_flowstart --- hooks/session_triggered.go | 8 +++++++- ivr/ivr.go | 11 ++++++++++- mailroom_test.dump | Bin 1841272 -> 1841366 bytes models/starts.go | 27 +++++++++++++-------------- runner/runner.go | 11 ++++++++++- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/hooks/session_triggered.go b/hooks/session_triggered.go index 057339ebf..f79dde8fe 100644 --- a/hooks/session_triggered.go +++ b/hooks/session_triggered.go @@ -7,6 +7,7 @@ import ( "github.com/jmoiron/sqlx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/events" + "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/pkg/errors" @@ -90,6 +91,11 @@ func (h *InsertStartHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool return errors.Wrapf(err, "error loading contacts by reference") } + historyJSON, err := jsonx.Marshal(event.History) + if err != nil { + return err + } + // create our start start := models.NewFlowStart(oa.OrgID(), models.StartTypeFlowAction, flow.FlowType(), flow.ID(), models.DoRestartParticipants, models.DoIncludeActive). WithGroupIDs(groupIDs). @@ -98,7 +104,7 @@ func (h *InsertStartHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool WithQuery(event.ContactQuery). WithCreateContact(event.CreateContact). WithParentSummary(event.RunSummary). - WithSessionHistory(event.History) + WithSessionHistory(historyJSON) starts = append(starts, start) diff --git a/ivr/ivr.go b/ivr/ivr.go index 81338a936..63f4cf364 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -19,6 +19,7 @@ import ( "github.com/nyaruka/goflow/flows/resumes" "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/httputils" @@ -353,13 +354,21 @@ func StartIVRFlow( } } + var history *flows.SessionHistory + if len(start.SessionHistory()) > 0 { + err := jsonx.Unmarshal(start.SessionHistory(), history) + if err != nil { + return errors.Wrap(err, "unable to read JSON from flow start history") + } + } + // our builder for the triggers that will be created for contacts flowRef := assets.NewFlowReference(flow.UUID(), flow.Name()) var trigger flows.Trigger if len(start.ParentSummary()) > 0 { trigger = triggers.NewBuilder(oa.Env(), flowRef, contact). - FlowAction(start.SessionHistory(), start.ParentSummary()). + FlowAction(history, start.ParentSummary()). WithConnection(channel.ChannelReference(), urn). Build() } else { diff --git a/mailroom_test.dump b/mailroom_test.dump index 6035262fb00ce4050e9c2cfe7d4cb702f2dc549f..a7195e342ce76db83a4e63410eadbb7113f497e0 100644 GIT binary patch delta 64045 zcmZsEcYIVu_xIj=clYjwlHNNIdXn9}TdAQVH8c^V1VjX-ir4@NSdbowW|SIi6cvIC zj3`3DMv-DeAEm_dSP&uD8|3}YotaI1elLII!<{qr%$YN%&i+v~>+J4Xxy5~Y4lGuh zSga03Q7rh^n*C|P{=~6A$!l`+V-1TH|8=_yf|dk3{#R1I=v3nFdyXm&BNXtuJpMrW z?&$dPk?Oln8^CwZyl=vc@-5}5B?G&nzaTMS4QGu6 zS0MaY=OK|P1j84*UXaTUhAf>}$5{_#hrjRsr>qomg)j9AMZVnOc71=BO+p^aDApv$ zl~~^19TgtbKVM=bWLW$Rba_x(_?bcJkrrM{J}aK}R7UulVlC3GFMMriC{oGKXR>8P zv+$@9lOn|dOIOymCM_-e^~hO~w!!e2(U-)&gnYs9pfNq=o`pi;btT^kM7mwB@UltI z37FgE4*REWZp1O;c6q|*?|GH?;&Z!<@Wy)&IXG_JF0Un>4VLo0p28*q=)}3UlEx>FuanqiF}2^2iJ|YnI!6SyIq#N^6GUNr1Ky> zD%`*FRal^=RLi}cG?;z;2zCA~cVaHDYbTfYjp z*JFg=c;}hOm%Dt+vBYQR9~Bex8vgJj$Eg^=Yj`cmq-d-yft0+i>EV)-t$96n0GnNQ zTI1c|D-d3PCYQHz2VEgc5{aF!r-m3chK-z(ol(P znPN)|-~DBK+1M~FxuQJ1y!A(z;#Yln4~Ez83m1OVlXEdIBg8l|bTNNNu8$5iYu9l~vpfXK0reo^rW}Q=iw(2*mAl34M&?x6h@;yezRmY}i)rH;Bnz73~^&0S}Jx@c2cv`3oVuI0)2+djV43#l@!{&jj~0Sf{?OU zX)bNrUI{5CoA7{5lpatsNaaMUlUyxObn?*K*o+nV${0Z?o=}Jl)r^d4q!iF1ml7{K z^mr`IScj>k+M_h4i#R5R%|e}n2la_x-P ziW5R%5PN1aOpjp%>8uV)a^%xbS9elI%FetYOFD5MRC57N4!N`Ky+&*k&cp(B*R9O`rV19bb%iaYY@BP%}v>HalRiRLW~ zZ^%z$M=Li+KD}hZr&c%mtLdcM?MfCsJ5K2+N(0y-oaEaBYw}0-hj=odhCyZKAS3bPUmocD-F$B0oJIdg>143x1UvJ|kesX6$iM8%F{?bC=SE z^GyJJmX;Dgs(!IGCaxJE<-rS-cshK#GJ(&=>+=UdV}}bJdF01=N(}vFrqZ6z1|T1C zpVJCS@dE7f)Y*y`zg4~;}xfGLe$$5kVWXnTJJBsQvxRz*X7jKjZau>Xc9luGEfHOit5?A-V@j1qr08*6 z#e*MHz7y?03|*H*))&C3jAiZO>D8r5niw^J&SRH@o=kS_^?Tfw9CGcP+T5HU0TP;% z;`3?}DV(KrCef>uDpAoLva}-a$JtvnK#6^|GMUSDUO%MB9JY^#*T{*QeU)95ePypz zs!UM~bzPQLtggFUX~lOssT@6tWdv~c?$$EN*^Npxt$I?akq84*tbIyp!I{G;qO_GQ zg1&w0lo_&G&>&UcXc^?3s>YFxW0YJ{`lae5<2PU@(=>G=ag7B{voeaZo8_K|e3p2U z`<0qRKi;Semz{+S>fWr#o80d*=%OvkUeU%6{+dRH+~G(fHQ#}Qk9}4VQiI`lyXmUu z6`}cn--PJ6txAa?3qPJC&21(}SA@Y3ElI zLw4ac(1rUZdm>%EM;RsN>-V~8?Ou5S7=93PESWIGo8{Xov0b7sz%NZz-p z>7?c@C7Qf?NEs#OjLn;MO-mrNs&Ns7s+A5BRRJH)@0M$7JS{t{+%0Dk^kF8fl+?bZ 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 0 { + err := jsonx.Unmarshal(batch.SessionHistory(), history) + if err != nil { + return nil, errors.Wrap(err, "unable to read JSON from flow start history") + } + } + // whether engine allows some functions is based on whether there is more than one contact being started batchStart := batch.TotalContacts() > 1 // this will build our trigger for each contact started triggerBuilder := func(contact *flows.Contact) flows.Trigger { if batch.ParentSummary() != nil { - tb := triggers.NewBuilder(oa.Env(), flow.FlowReference(), contact).FlowAction(batch.SessionHistory(), batch.ParentSummary()) + tb := triggers.NewBuilder(oa.Env(), flow.FlowReference(), contact).FlowAction(history, batch.ParentSummary()) if batchStart { tb = tb.AsBatch() } From e702a312ff310fe007d52e242b968996ce4a671c Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 23 Jul 2020 13:50:27 -0500 Subject: [PATCH 03/56] Update to latest goflow v0.96.0 --- go.mod | 2 +- go.sum | 4 ++-- hooks/session_triggered_test.go | 16 +++++++++++----- ivr/ivr.go | 3 +-- models/starts.go | 12 ++++++++++-- models/starts_test.go | 17 +++++++++++++++++ runner/runner.go | 3 +-- 7 files changed, 43 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 739058e05..9f091dee2 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.95.2-0.20200721212909-4d88cabc1333 + github.com/nyaruka/goflow v0.96.0 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index 9ea4c3111..018246a57 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.95.2-0.20200721212909-4d88cabc1333 h1:wkm5p5WXMWXzt7J5nLM6ivwttREo/KUgovaDJxgagEE= -github.com/nyaruka/goflow v0.95.2-0.20200721212909-4d88cabc1333/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.96.0 h1:98EV94Tof+YAxJdORIbYXFtMKNTNsttTGHfNHaqDWXI= +github.com/nyaruka/goflow v0.96.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/hooks/session_triggered_test.go b/hooks/session_triggered_test.go index 1e6deddf7..8dc571186 100644 --- a/hooks/session_triggered_test.go +++ b/hooks/session_triggered_test.go @@ -4,14 +4,16 @@ import ( "encoding/json" "testing" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/actions" + "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/nyaruka/mailroom/testsuite" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/stretchr/testify/assert" ) @@ -36,6 +38,9 @@ func TestSessionTriggered(t *testing.T) { UUID: models.TestersGroupUUID, } + uuids.SetGenerator(uuids.NewSeededGenerator(1234567)) + defer uuids.SetGenerator(uuids.DefaultGenerator) + tcs := []HookTestCase{ { Actions: ContactActionMap{ @@ -50,7 +55,7 @@ func TestSessionTriggered(t *testing.T) { Count: 1, }, { - SQL: "select count(*) from flows_flowstart where org_id = 1 AND start_type = 'F' AND flow_id = $1 AND status = 'P' AND parent_summary IS NOT NULL;", + SQL: "select count(*) from flows_flowstart where org_id = 1 AND start_type = 'F' AND flow_id = $1 AND status = 'P' AND parent_summary IS NOT NULL AND session_history IS NOT NULL;", Args: []interface{}{models.SingleMessageFlowID}, Count: 1, }, @@ -73,10 +78,11 @@ func TestSessionTriggered(t *testing.T) { start := models.FlowStart{} err = json.Unmarshal(task.Task, &start) assert.NoError(t, err) - assert.Equal(t, start.CreateContact(), true) + assert.True(t, start.CreateContact()) assert.Equal(t, []models.ContactID{models.GeorgeID}, start.ContactIDs()) assert.Equal(t, []models.GroupID{models.TestersGroupID}, start.GroupIDs()) - assert.Equal(t, start.FlowID(), simpleFlow.ID()) + assert.Equal(t, simpleFlow.ID(), start.FlowID()) + assert.JSONEq(t, `{"parent_uuid":"36284611-ea19-4f1f-8611-9bc48e206654", "ancestors":1, "ancestors_since_input":1}`, string(start.SessionHistory())) return nil }, }, diff --git a/ivr/ivr.go b/ivr/ivr.go index 63f4cf364..c7fa11ffc 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -19,7 +19,6 @@ import ( "github.com/nyaruka/goflow/flows/resumes" "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/httputils" @@ -356,7 +355,7 @@ func StartIVRFlow( var history *flows.SessionHistory if len(start.SessionHistory()) > 0 { - err := jsonx.Unmarshal(start.SessionHistory(), history) + history, err = models.ReadSessionHistory(start.SessionHistory()) if err != nil { return errors.Wrap(err, "unable to read JSON from flow start history") } diff --git a/models/starts.go b/models/starts.go index 543d61e48..4353a6f02 100644 --- a/models/starts.go +++ b/models/starts.go @@ -7,6 +7,8 @@ import ( "github.com/jmoiron/sqlx" "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/null" "github.com/pkg/errors" @@ -299,8 +301,8 @@ func InsertFlowStarts(ctx context.Context, db Queryer, starts []*FlowStart) erro const insertStartSQL = ` INSERT INTO - flows_flowstart(uuid, org_id, flow_id, start_type, created_on, modified_on, restart_participants, include_active, query, status, extra, parent_summary) - VALUES(:uuid, :org_id, :flow_id, :start_type, NOW(), NOW(), :restart_participants, :include_active, :query, 'P', :extra, :parent_summary) + flows_flowstart(uuid, org_id, flow_id, start_type, created_on, modified_on, restart_participants, include_active, query, status, extra, parent_summary, session_history) + VALUES(:uuid, :org_id, :flow_id, :start_type, NOW(), NOW(), :restart_participants, :include_active, :query, 'P', :extra, :parent_summary, :session_history) RETURNING id ` @@ -356,3 +358,9 @@ func (i StartID) Value() (driver.Value, error) { func (i *StartID) Scan(value interface{}) error { return null.ScanInt(value, (*null.Int)(i)) } + +// ReadSessionHistory reads a session history from the given JSON +func ReadSessionHistory(data []byte) (*flows.SessionHistory, error) { + h := &flows.SessionHistory{} + return h, jsonx.Unmarshal(data, h) +} diff --git a/models/starts_test.go b/models/starts_test.go index 8327b39f6..21527acac 100644 --- a/models/starts_test.go +++ b/models/starts_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "testing" + "github.com/nyaruka/goflow/flows" "github.com/nyaruka/mailroom/models" "github.com/stretchr/testify/assert" ) @@ -21,6 +22,8 @@ func TestStarts(t *testing.T) { "query": null, "restart_participants": true, "include_active": true, + "parent_summary": {"uuid": "b65b1a22-db6d-4f5a-9b3d-7302368a82e6"}, + "session_history": {"parent_uuid": "532a3899-492f-4ffe-aed7-e75ad524efab", "ancestors": 3, "ancestors_since_input": 1}, "extra": {"foo": "bar"} }`) @@ -35,6 +38,9 @@ func TestStarts(t *testing.T) { assert.Equal(t, "", start.Query()) assert.Equal(t, models.DoRestartParticipants, start.RestartParticipants()) assert.Equal(t, models.DoIncludeActive, start.IncludeActive()) + + assert.Equal(t, json.RawMessage(`{"uuid": "b65b1a22-db6d-4f5a-9b3d-7302368a82e6"}`), start.ParentSummary()) + assert.Equal(t, json.RawMessage(`{"parent_uuid": "532a3899-492f-4ffe-aed7-e75ad524efab", "ancestors": 3, "ancestors_since_input": 1}`), start.SessionHistory()) assert.Equal(t, json.RawMessage(`{"foo": "bar"}`), start.Extra()) batch := start.CreateBatch([]models.ContactID{4567, 5678}, false, 3) @@ -47,4 +53,15 @@ func TestStarts(t *testing.T) { assert.Equal(t, "rowan@nyaruka.com", batch.CreatedBy()) assert.False(t, batch.IsLast()) assert.Equal(t, 3, batch.TotalContacts()) + + assert.Equal(t, json.RawMessage(`{"uuid": "b65b1a22-db6d-4f5a-9b3d-7302368a82e6"}`), batch.ParentSummary()) + assert.Equal(t, json.RawMessage(`{"parent_uuid": "532a3899-492f-4ffe-aed7-e75ad524efab", "ancestors": 3, "ancestors_since_input": 1}`), batch.SessionHistory()) + assert.Equal(t, json.RawMessage(`{"foo": "bar"}`), batch.Extra()) + + history, err := models.ReadSessionHistory(batch.SessionHistory()) + assert.NoError(t, err) + assert.Equal(t, flows.SessionUUID("532a3899-492f-4ffe-aed7-e75ad524efab"), history.ParentUUID) + + history, err = models.ReadSessionHistory([]byte(`{`)) + assert.EqualError(t, err, "unexpected end of JSON input") } diff --git a/runner/runner.go b/runner/runner.go index 636672052..746fe1633 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -10,7 +10,6 @@ import ( "github.com/nyaruka/goflow/excellent/types" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/triggers" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/librato" "github.com/nyaruka/mailroom/goflow" "github.com/nyaruka/mailroom/locker" @@ -183,7 +182,7 @@ func StartFlowBatch( var history *flows.SessionHistory if len(batch.SessionHistory()) > 0 { - err := jsonx.Unmarshal(batch.SessionHistory(), history) + history, err = models.ReadSessionHistory(batch.SessionHistory()) if err != nil { return nil, errors.Wrap(err, "unable to read JSON from flow start history") } From 1d6c99ad6f291c85fe8aac10967c1a184274c7e1 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 23 Jul 2020 17:13:24 -0500 Subject: [PATCH 04/56] Wrap error message --- hooks/session_triggered.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/session_triggered.go b/hooks/session_triggered.go index f79dde8fe..0bb42bbb7 100644 --- a/hooks/session_triggered.go +++ b/hooks/session_triggered.go @@ -93,7 +93,7 @@ func (h *InsertStartHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool historyJSON, err := jsonx.Marshal(event.History) if err != nil { - return err + return errors.Wrapf(err, "error marshaling session history") } // create our start From b0fb19a1c8b7905466ade9badc69fcbc50a46c9a Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 24 Jul 2020 09:31:14 -0500 Subject: [PATCH 05/56] Update CHANGELOG.md for v5.7.1 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d155d3d9..26bab7596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v5.7.1 +---------- + * Update to latest goflow v0.96.0 + * Add loop protection by passing session history to new flow action triggers + v5.7.0 ---------- * Set user and origin on manual triggers From 6e69b6f369b66766844685c41f2f6ddc5e72d748 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 24 Jul 2020 10:38:53 -0500 Subject: [PATCH 06/56] Reorganize test --- models/contacts_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/models/contacts_test.go b/models/contacts_test.go index dbde3ce89..b89591612 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -313,9 +313,14 @@ func TestCreateContact(t *testing.T) { assert.NoError(t, err, "%d: error creating contact", i) assert.Equal(t, tc.ContactID, id, "%d: mismatch in contact id", i) } +} + +func TestStopContact(t *testing.T) { + ctx := testsuite.CTX() + db := testsuite.DB() // stop kathy - err = StopContact(ctx, db, Org1, CathyID) + err := StopContact(ctx, db, Org1, CathyID) assert.NoError(t, err) // verify she's only in the stopped group From 5da72e040de34c1c4ac1f9a5bdb26b3ba5cc5156 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 27 Jul 2020 13:53:22 -0500 Subject: [PATCH 07/56] Update to latest goflow v0.97.0 --- go.mod | 2 +- go.sum | 4 ++-- goflow/modifiers.go | 2 +- hooks/contact_status_changed_test.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 9f091dee2..7494a48e0 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.96.0 + github.com/nyaruka/goflow v0.97.0 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index 018246a57..d62ccd6b1 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.96.0 h1:98EV94Tof+YAxJdORIbYXFtMKNTNsttTGHfNHaqDWXI= -github.com/nyaruka/goflow v0.96.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.97.0 h1:S2WwcwZY7mEjXmSEOwb2eHWI88KrQd7jB6ueFQD8ohI= +github.com/nyaruka/goflow v0.97.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/goflow/modifiers.go b/goflow/modifiers.go index 69cac2275..7194c873d 100644 --- a/goflow/modifiers.go +++ b/goflow/modifiers.go @@ -5,7 +5,7 @@ import ( "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/flows/actions/modifiers" + "github.com/nyaruka/goflow/flows/modifiers" "github.com/pkg/errors" ) diff --git a/hooks/contact_status_changed_test.go b/hooks/contact_status_changed_test.go index f56156b44..ad97c3b11 100644 --- a/hooks/contact_status_changed_test.go +++ b/hooks/contact_status_changed_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/flows/actions/modifiers" + "github.com/nyaruka/goflow/flows/modifiers" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" ) From 2d0fbf32152b6015d4433bfcf55a6a5baf9195e5 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 27 Jul 2020 15:21:09 -0500 Subject: [PATCH 08/56] Render rich errors with code and extra field --- web/contact/testdata/parse_query.json | 19 ++++++++++++++++++- web/errors.go | 27 +++++++++++++++++++++++++++ web/server.go | 13 ++----------- 3 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 web/errors.go diff --git a/web/contact/testdata/parse_query.json b/web/contact/testdata/parse_query.json index 48cd71ee7..8d9f9b18f 100644 --- a/web/contact/testdata/parse_query.json +++ b/web/contact/testdata/parse_query.json @@ -10,7 +10,24 @@ } }, { - "label": "invalid body", + "label": "query that is syntactically invalid", + "method": "POST", + "path": "/mr/contact/parse_query", + "body": { + "org_id": 1, + "query": "$" + }, + "status": 400, + "response": { + "error": "mismatched input '$' expecting {'(', TEXT, STRING}", + "code": "query_unexpected_token", + "extra": { + "token": "$" + } + } + }, + { + "label": "query with invalid property", "method": "POST", "path": "/mr/contact/parse_query", "body": { diff --git a/web/errors.go b/web/errors.go new file mode 100644 index 000000000..a5bce23a6 --- /dev/null +++ b/web/errors.go @@ -0,0 +1,27 @@ +package web + +import ( + "github.com/nyaruka/goflow/utils" + + "github.com/pkg/errors" +) + +// ErrorResponse is the type for our error responses +type ErrorResponse struct { + Error string `json:"error"` + Code string `json:"code,omitempty"` + Extra map[string]string `json:"extra,omitempty"` +} + +// NewErrorResponse creates a new error response from the passed in error +func NewErrorResponse(err error) *ErrorResponse { + rich, isRich := errors.Cause(err).(utils.RichError) + if isRich { + return &ErrorResponse{ + Error: rich.Error(), + Code: rich.Code(), + Extra: rich.Extra(), + } + } + return &ErrorResponse{Error: err.Error()} +} diff --git a/web/server.go b/web/server.go index aba325c1c..2e00e6608 100644 --- a/web/server.go +++ b/web/server.go @@ -131,7 +131,8 @@ func (s *Server) WrapJSONHandler(handler JSONHandler) http.HandlerFunc { if serr != nil { logrus.WithError(err).WithField("http_request", r).Error("error serializing handler response") w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(`{"error": "error serializing handler response"}`)) + serialized, _ := json.Marshal(errors.New("error serializing handler response")) + w.Write(serialized) return } @@ -220,13 +221,3 @@ type Server struct { httpServer *http.Server } - -// ErrorResponse is the type for our error responses, it just contains a single error field -type ErrorResponse struct { - Error string `json:"error"` -} - -// NewErrorResponse creates a new error response from the passed in errro -func NewErrorResponse(err error) *ErrorResponse { - return &ErrorResponse{err.Error()} -} From 11d952f338ae84e80f1e07a41147a1d7179b057b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 27 Jul 2020 15:42:17 -0500 Subject: [PATCH 09/56] Coverage --- web/errors_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 web/errors_test.go diff --git a/web/errors_test.go b/web/errors_test.go new file mode 100644 index 000000000..3644d43ed --- /dev/null +++ b/web/errors_test.go @@ -0,0 +1,29 @@ +package web_test + +import ( + "testing" + + "github.com/nyaruka/goflow/contactql" + "github.com/nyaruka/goflow/utils/jsonx" + "github.com/nyaruka/mailroom/web" + + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" +) + +func TestErrorResponse(t *testing.T) { + er1 := web.NewErrorResponse(errors.New("I'm an error!")) + assert.Equal(t, "I'm an error!", er1.Error) + + er1JSON, err := jsonx.Marshal(er1) + assert.NoError(t, err) + assert.JSONEq(t, `{"error": "I'm an error!"}`, string(er1JSON)) + + er2 := web.NewErrorResponse(contactql.NewQueryError("I'm a rich error!", "foo_code", map[string]string{"foo": "123"})) + assert.Equal(t, "I'm a rich error!", er2.Error) + assert.Equal(t, "foo_code", er2.Code) + + er2JSON, err := jsonx.Marshal(er2) + assert.NoError(t, err) + assert.JSONEq(t, `{"error": "I'm a rich error!", "code": "foo_code", "extra": {"foo": "123"}}`, string(er2JSON)) +} From ff7eb03947c65399fc48a083a90d7ec39762fda0 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 28 Jul 2020 15:10:57 -0500 Subject: [PATCH 10/56] Update to latest gofloe v0.98.0 --- go.mod | 2 +- go.sum | 4 ++-- models/contacts.go | 4 ++-- web/contact/contact.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 7494a48e0..0e626d9e9 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.97.0 + github.com/nyaruka/goflow v0.98.0 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index d62ccd6b1..b28a7043f 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.97.0 h1:S2WwcwZY7mEjXmSEOwb2eHWI88KrQd7jB6ueFQD8ohI= -github.com/nyaruka/goflow v0.97.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.98.0 h1:qM3NNuG0XeAIIdrzJr+3pg92vD7TVEqO5UFu1K345oM= +github.com/nyaruka/goflow v0.98.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/models/contacts.go b/models/contacts.go index f7b565b33..7d697f685 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -220,7 +220,7 @@ func ContactIDsForQueryPage(ctx context.Context, client *elastic.Client, org *Or } if query != "" { - parsed, err = contactql.ParseQuery(query, env.RedactionPolicy(), env.DefaultCountry(), org.SessionAssets()) + parsed, err = contactql.ParseQuery(env, query, org.SessionAssets()) if err != nil { return nil, nil, 0, errors.Wrapf(err, "error parsing query: %s", query) } @@ -282,7 +282,7 @@ func ContactIDsForQuery(ctx context.Context, client *elastic.Client, org *OrgAss } // turn into elastic query - parsed, err := contactql.ParseQuery(query, env.RedactionPolicy(), env.DefaultCountry(), org.SessionAssets()) + parsed, err := contactql.ParseQuery(env, query, org.SessionAssets()) if err != nil { return nil, errors.Wrapf(err, "error parsing query: %s", query) } diff --git a/web/contact/contact.go b/web/contact/contact.go index ac707ba0a..7e2ed9fc4 100644 --- a/web/contact/contact.go +++ b/web/contact/contact.go @@ -177,7 +177,7 @@ func handleParseQuery(ctx context.Context, s *web.Server, r *http.Request) (inte } env := oa.Env() - parsed, err := contactql.ParseQuery(request.Query, env.RedactionPolicy(), env.DefaultCountry(), oa.SessionAssets()) + parsed, err := contactql.ParseQuery(env, request.Query, oa.SessionAssets()) if err != nil { isQueryError, qerr := contactql.IsQueryError(err) From f54d63e54c408e2cadfa9ef207911092ec772d0e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 28 Jul 2020 15:17:52 -0500 Subject: [PATCH 11/56] Fix tests --- web/contact/testdata/parse_query.json | 8 ++++++-- web/errors_test.go | 13 +++++++++---- web/server.go | 3 +-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/web/contact/testdata/parse_query.json b/web/contact/testdata/parse_query.json index 8d9f9b18f..19b5aed1d 100644 --- a/web/contact/testdata/parse_query.json +++ b/web/contact/testdata/parse_query.json @@ -20,7 +20,7 @@ "status": 400, "response": { "error": "mismatched input '$' expecting {'(', TEXT, STRING}", - "code": "query_unexpected_token", + "code": "unexpected_token", "extra": { "token": "$" } @@ -36,7 +36,11 @@ }, "status": 400, "response": { - "error": "can't resolve 'birthday' to attribute, scheme or field" + "error": "can't resolve 'birthday' to attribute, scheme or field", + "code": "unknown_property", + "extra": { + "property": "birthday" + } } }, { diff --git a/web/errors_test.go b/web/errors_test.go index 3644d43ed..34f469c7e 100644 --- a/web/errors_test.go +++ b/web/errors_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/nyaruka/goflow/contactql" + "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/mailroom/web" @@ -12,6 +13,7 @@ import ( ) func TestErrorResponse(t *testing.T) { + // create a simple error er1 := web.NewErrorResponse(errors.New("I'm an error!")) assert.Equal(t, "I'm an error!", er1.Error) @@ -19,11 +21,14 @@ func TestErrorResponse(t *testing.T) { assert.NoError(t, err) assert.JSONEq(t, `{"error": "I'm an error!"}`, string(er1JSON)) - er2 := web.NewErrorResponse(contactql.NewQueryError("I'm a rich error!", "foo_code", map[string]string{"foo": "123"})) - assert.Equal(t, "I'm a rich error!", er2.Error) - assert.Equal(t, "foo_code", er2.Code) + // create a rich error + _, err = contactql.ParseQuery(envs.NewBuilder().Build(), "$$", nil) + + er2 := web.NewErrorResponse(err) + assert.Equal(t, "mismatched input '$' expecting {'(', TEXT, STRING}", er2.Error) + assert.Equal(t, "unexpected_token", er2.Code) er2JSON, err := jsonx.Marshal(er2) assert.NoError(t, err) - assert.JSONEq(t, `{"error": "I'm a rich error!", "code": "foo_code", "extra": {"foo": "123"}}`, string(er2JSON)) + assert.JSONEq(t, `{"error": "mismatched input '$' expecting {'(', TEXT, STRING}", "code": "unexpected_token", "extra": {"token": "$"}}`, string(er2JSON)) } diff --git a/web/server.go b/web/server.go index 2e00e6608..43a28ceec 100644 --- a/web/server.go +++ b/web/server.go @@ -131,8 +131,7 @@ func (s *Server) WrapJSONHandler(handler JSONHandler) http.HandlerFunc { if serr != nil { logrus.WithError(err).WithField("http_request", r).Error("error serializing handler response") w.WriteHeader(http.StatusInternalServerError) - serialized, _ := json.Marshal(errors.New("error serializing handler response")) - w.Write(serialized) + w.Write([]byte(`{"error": "error serializing handler response"}`)) return } From 0f6d81ad5923dd2fda3f62166b76d70611b124c3 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 29 Jul 2020 14:57:14 -0500 Subject: [PATCH 12/56] Update CHANGELOG.md for v5.7.2 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26bab7596..2888631fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v5.7.2 +---------- + * Update to latest goflow v0.98.0 + * Render rich errors with code and extra field + v5.7.1 ---------- * Update to latest goflow v0.96.0 From 2c918788266af32df34e3a98343fac68e1286a8b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 30 Jul 2020 13:59:18 -0500 Subject: [PATCH 13/56] Update to goflow v0.99.0 --- go.mod | 2 +- go.sum | 4 ++-- models/contacts.go | 22 ++++++---------------- web/contact/contact.go | 5 +---- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 0e626d9e9..4e600b128 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.98.0 + github.com/nyaruka/goflow v0.99.0 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index b28a7043f..3f7541de7 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.98.0 h1:qM3NNuG0XeAIIdrzJr+3pg92vD7TVEqO5UFu1K345oM= -github.com/nyaruka/goflow v0.98.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.99.0 h1:OP1L/4GD5Ek9ZfxOJPu1Qus1Ym3ol4fxwYkiDBPh5Js= +github.com/nyaruka/goflow v0.99.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/models/contacts.go b/models/contacts.go index 7d697f685..e26c79058 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -183,7 +183,7 @@ func ContactIDsFromReferences(ctx context.Context, tx Queryer, org *OrgAssets, r } // BuildElasticQuery turns the passed in contact ql query into an elastic query -func BuildElasticQuery(org *OrgAssets, group assets.GroupUUID, query *contactql.ContactQuery) (elastic.Query, error) { +func BuildElasticQuery(org *OrgAssets, group assets.GroupUUID, query *contactql.ContactQuery) elastic.Query { // filter by org and active contacts eq := elastic.NewBoolQuery().Must( elastic.NewTermQuery("org_id", org.OrgID()), @@ -197,15 +197,11 @@ func BuildElasticQuery(org *OrgAssets, group assets.GroupUUID, query *contactql. // and by our query if present if query != nil { - q, err := es.ToElasticQuery(org.Env(), org.SessionAssets(), query) - if err != nil { - return nil, errors.Wrapf(err, "error converting contactql to elastic query: %s", query) - } - + q := es.ToElasticQuery(org.Env(), query) eq = eq.Must(q) } - return eq, nil + return eq } // ContactIDsForQueryPage returns the ids of the contacts for the passed in query page @@ -226,12 +222,9 @@ func ContactIDsForQueryPage(ctx context.Context, client *elastic.Client, org *Or } } - eq, err := BuildElasticQuery(org, group, parsed) - if err != nil { - return nil, nil, 0, errors.Wrapf(err, "error parsing query: %s", query) - } + eq := BuildElasticQuery(org, group, parsed) - fieldSort, err := es.ToElasticFieldSort(org.SessionAssets(), sort) + fieldSort, err := es.ToElasticFieldSort(sort, org.SessionAssets()) if err != nil { return nil, nil, 0, errors.Wrapf(err, "error parsing sort") } @@ -287,10 +280,7 @@ func ContactIDsForQuery(ctx context.Context, client *elastic.Client, org *OrgAss return nil, errors.Wrapf(err, "error parsing query: %s", query) } - eq, err := BuildElasticQuery(org, "", parsed) - if err != nil { - return nil, errors.Wrapf(err, "error converting contactql to elastic query: %s", query) - } + eq := BuildElasticQuery(org, "", parsed) // only include unblocked and unstopped contacts eq = elastic.NewBoolQuery().Must( diff --git a/web/contact/contact.go b/web/contact/contact.go index 7e2ed9fc4..3a4b817a3 100644 --- a/web/contact/contact.go +++ b/web/contact/contact.go @@ -203,10 +203,7 @@ func handleParseQuery(ctx context.Context, s *web.Server, r *http.Request) (inte allowAsGroup = metadata.AllowAsGroup } - eq, err := models.BuildElasticQuery(oa, request.GroupUUID, parsed) - if err != nil { - return nil, http.StatusInternalServerError, err - } + eq := models.BuildElasticQuery(oa, request.GroupUUID, parsed) eqj, err := eq.Source() if err != nil { return nil, http.StatusInternalServerError, err From b5d7820790832164ccf6fabfd2a7ee0d4d1cd8d7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 30 Jul 2020 14:11:15 -0500 Subject: [PATCH 14/56] Update CHANGELOG.md for v5.7.3 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2888631fd..4ea86c0ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.3 +---------- + * Update to goflow v0.99.0 + v5.7.2 ---------- * Update to latest goflow v0.98.0 From 7de58bbd7067695a9b2c46a7a4ec3cddc60e217d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 30 Jul 2020 14:34:47 -0500 Subject: [PATCH 15/56] Refresh groups as well as fields for contact query parsing --- web/contact/contact.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/contact/contact.go b/web/contact/contact.go index 3a4b817a3..133c69125 100644 --- a/web/contact/contact.go +++ b/web/contact/contact.go @@ -79,7 +79,7 @@ func handleSearch(ctx context.Context, s *web.Server, r *http.Request) (interfac } // grab our org assets - oa, err := models.GetOrgAssetsWithRefresh(s.CTX, s.DB, request.OrgID, models.RefreshFields) + oa, err := models.GetOrgAssetsWithRefresh(s.CTX, s.DB, request.OrgID, models.RefreshFields|models.RefreshGroups) if err != nil { return nil, http.StatusInternalServerError, errors.Wrapf(err, "unable to load org assets") } @@ -171,7 +171,7 @@ func handleParseQuery(ctx context.Context, s *web.Server, r *http.Request) (inte } // grab our org assets - oa, err := models.GetOrgAssetsWithRefresh(s.CTX, s.DB, request.OrgID, models.RefreshFields) + oa, err := models.GetOrgAssetsWithRefresh(s.CTX, s.DB, request.OrgID, models.RefreshFields|models.RefreshGroups) if err != nil { return nil, http.StatusInternalServerError, errors.Wrapf(err, "unable to load org assets") } From bf213f7870f9e4082c3f8384c68d7827998c07c5 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 31 Jul 2020 13:58:22 -0500 Subject: [PATCH 16/56] Fail outgoing messages for suspended orgs --- courier/courier.go | 4 +- courier/courier_test.go | 168 ++++++++++++++++++++++++++++++++++++++++ hooks/msg_created.go | 2 +- models/msgs.go | 17 ++-- models/msgs_test.go | 149 ++++++++++++++++++----------------- 5 files changed, 262 insertions(+), 78 deletions(-) create mode 100644 courier/courier_test.go diff --git a/courier/courier.go b/courier/courier.go index dc242bdf7..ac700f376 100644 --- a/courier/courier.go +++ b/courier/courier.go @@ -52,8 +52,8 @@ func QueueMessages(rc redis.Conn, msgs []*models.Msg) error { } for _, msg := range msgs { - // no channel, continue - if msg.ChannelUUID() == "" { + // ignore any message without a channel or already marked as failed (maybe org is suspended) + if msg.ChannelUUID() == "" || msg.Status() == models.MsgStatusFailed { continue } diff --git a/courier/courier_test.go b/courier/courier_test.go new file mode 100644 index 000000000..8a0d05661 --- /dev/null +++ b/courier/courier_test.go @@ -0,0 +1,168 @@ +package courier_test + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/goflow/assets" + "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/mailroom/courier" + "github.com/nyaruka/mailroom/models" + "github.com/nyaruka/mailroom/testsuite" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type msgSpec struct { + ChannelUUID assets.ChannelUUID + Text string + ContactID models.ContactID + URN urns.URN + URNID models.URNID + Failed bool +} + +func createMsg(t *testing.T, m msgSpec) *models.Msg { + ctx := testsuite.CTX() + db := testsuite.DB() + db.MustExec(`UPDATE orgs_org SET is_suspended = $1 WHERE id = $2`, m.Failed, models.Org1) + + oa, err := models.GetOrgAssetsWithRefresh(ctx, db, models.Org1, models.RefreshOrg) + require.NoError(t, err) + + channel := oa.ChannelByUUID(m.ChannelUUID) + + flowMsg := flows.NewMsgOut(m.URN, channel.ChannelReference(), m.Text, nil, nil, nil, flows.NilMsgTopic) + msg, err := models.NewOutgoingMsg(oa.Org(), channel, m.ContactID, flowMsg, time.Now()) + require.NoError(t, err) + return msg +} + +func TestQueueMessages(t *testing.T) { + db := testsuite.DB() + rc := testsuite.RC() + testsuite.Reset() + models.FlushCache() + + // convert the Twitter channel to be an Android channel + db.MustExec(`UPDATE channels_channel SET name = 'Android', channel_type = 'A' WHERE id = $1`, models.TwitterChannelID) + androidChannelUUID := models.TwitterChannelUUID + + tests := []struct { + Description string + Msgs []msgSpec + QueueSizes map[string]int + }{ + { + Description: "2 queueable messages", + Msgs: []msgSpec{ + { + ChannelUUID: models.TwilioChannelUUID, + Text: "normal msg 1", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + }, + { + ChannelUUID: models.TwilioChannelUUID, + Text: "normal msg 2", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + }, + }, + QueueSizes: map[string]int{ + "msgs:74729f45-7f29-4868-9dc4-90e491e3c7d8|10/0": 2, + }, + }, + { + Description: "1 queueable message and 1 failed", + Msgs: []msgSpec{ + { + ChannelUUID: models.TwilioChannelUUID, + Text: "normal msg 1", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + Failed: true, + }, + { + ChannelUUID: models.TwilioChannelUUID, + Text: "normal msg 1", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + }, + }, + QueueSizes: map[string]int{ + "msgs:74729f45-7f29-4868-9dc4-90e491e3c7d8|10/0": 1, + }, + }, + { + Description: "1 queueable message and 1 Android", + Msgs: []msgSpec{ + { + ChannelUUID: androidChannelUUID, + Text: "normal msg 1", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + }, + { + ChannelUUID: models.TwilioChannelUUID, + Text: "normal msg 1", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + }, + }, + QueueSizes: map[string]int{ + "msgs:74729f45-7f29-4868-9dc4-90e491e3c7d8|10/0": 1, + }, + }, + { + Description: "0 messages", + Msgs: []msgSpec{}, + QueueSizes: map[string]int{ + "msgs:74729f45-7f29-4868-9dc4-90e491e3c7d8|10/0": 0, + }, + }, + } + + for _, tc := range tests { + msgs := make([]*models.Msg, len(tc.Msgs)) + for i := range tc.Msgs { + msgs[i] = createMsg(t, tc.Msgs[i]) + } + + rc.Do("FLUSHDB") + courier.QueueMessages(rc, msgs) + + for queueKey, size := range tc.QueueSizes { + if size == 0 { + result, err := rc.Do("ZCARD", queueKey) + require.NoError(t, err) + assert.Equal(t, size, int(result.(int64))) + } else { + result, err := rc.Do("ZPOPMAX", queueKey) + require.NoError(t, err) + + results := result.([]interface{}) + assert.Equal(t, 2, len(results)) // result is (item, score) + + batchJSON := results[0].([]byte) + var batch []map[string]interface{} + err = json.Unmarshal(batchJSON, &batch) + require.NoError(t, err) + + assert.Equal(t, size, len(batch)) + } + } + } + + testsuite.Reset() +} diff --git a/hooks/msg_created.go b/hooks/msg_created.go index 79fffc653..a758f372a 100644 --- a/hooks/msg_created.go +++ b/hooks/msg_created.go @@ -215,7 +215,7 @@ func handleMsgCreated(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *mode } } - msg, err := models.NewOutgoingMsg(oa.OrgID(), channel, scene.ContactID(), event.Msg, event.CreatedOn()) + msg, err := models.NewOutgoingMsg(oa.Org(), channel, scene.ContactID(), event.Msg, event.CreatedOn()) if err != nil { return errors.Wrapf(err, "error creating outgoing message to %s", event.Msg.URN()) } diff --git a/models/msgs.go b/models/msgs.go index 7d1f3e149..0adc2c957 100644 --- a/models/msgs.go +++ b/models/msgs.go @@ -281,21 +281,26 @@ func NewOutgoingIVR(orgID OrgID, conn *ChannelConnection, out *flows.MsgOut, cre return msg, nil } -// NewOutgoingMsg creates an outgoing message for the passed in flow message. Note that this message is created in a queued state! -func NewOutgoingMsg(orgID OrgID, channel *Channel, contactID ContactID, out *flows.MsgOut, createdOn time.Time) (*Msg, error) { +// NewOutgoingMsg creates an outgoing message for the passed in flow message. +func NewOutgoingMsg(org *Org, channel *Channel, contactID ContactID, out *flows.MsgOut, createdOn time.Time) (*Msg, error) { msg := &Msg{} - m := &msg.m + // we fail messages for suspended orgs right away + status := MsgStatusQueued + if org.Suspended() { + status = MsgStatusFailed + } + m.UUID = out.UUID() m.Text = out.Text() m.HighPriority = false m.Direction = DirectionOut - m.Status = MsgStatusQueued + m.Status = status m.Visibility = VisibilityVisible m.MsgType = TypeFlow m.ContactID = contactID - m.OrgID = orgID + m.OrgID = org.ID() m.TopupID = NilTopupID m.CreatedOn = createdOn @@ -878,7 +883,7 @@ func CreateBroadcastMessages(ctx context.Context, db Queryer, rp *redis.Pool, oa // create our outgoing message out := flows.NewMsgOut(urn, channel.ChannelReference(), text, t.Attachments, t.QuickReplies, nil, flows.NilMsgTopic) - msg, err := NewOutgoingMsg(oa.OrgID(), channel, c.ID(), out, time.Now()) + msg, err := NewOutgoingMsg(oa.Org(), channel, c.ID(), out, time.Now()) msg.SetBroadcastID(bcast.BroadcastID()) if err != nil { return nil, errors.Wrapf(err, "error creating outgoing message") diff --git a/models/msgs_test.go b/models/msgs_test.go index 07d596a4f..5856f1925 100644 --- a/models/msgs_test.go +++ b/models/msgs_test.go @@ -1,4 +1,4 @@ -package models +package models_test import ( "fmt" @@ -10,116 +10,127 @@ import ( "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/config" + "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -func TestMsgs(t *testing.T) { +func TestOutgoingMsgs(t *testing.T) { ctx := testsuite.CTX() db := testsuite.DB() - orgID := OrgID(1) - channels, err := loadChannels(ctx, db, orgID) - assert.NoError(t, err) - - channel := channels[0].(*Channel) - chanUUID := channels[0].UUID() - tcs := []struct { - ChannelUUID assets.ChannelUUID - Channel *Channel - Text string - ContactID ContactID - URN urns.URN - ContactURNID URNID - Attachments []utils.Attachment - QuickReplies []string - Topic flows.MsgTopic + ChannelUUID assets.ChannelUUID + Text string + ContactID models.ContactID + URN urns.URN + URNID models.URNID + Attachments []utils.Attachment + QuickReplies []string + Topic flows.MsgTopic + SuspendedOrg bool + + ExpectedStatus models.MsgStatus ExpectedMetadata map[string]interface{} ExpectedMsgCount int - HasErr bool + HasError bool }{ { - chanUUID, channel, - "missing urn id", - CathyID, - urns.URN("tel:+250700000001"), - URNID(0), - nil, - nil, - flows.NilMsgTopic, - map[string]interface{}{}, - 1, - true, + ChannelUUID: "74729f45-7f29-4868-9dc4-90e491e3c7d8", + Text: "missing urn id", + ContactID: models.CathyID, + URN: urns.URN("tel:+250700000001"), + URNID: models.URNID(0), + ExpectedStatus: models.MsgStatusQueued, + ExpectedMetadata: map[string]interface{}{}, + ExpectedMsgCount: 1, + HasError: true, }, { - chanUUID, - channel, - "test outgoing", - CathyID, - urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", CathyURNID)), - CathyURNID, - nil, - []string{"yes", "no"}, - flows.MsgTopicPurchase, - map[string]interface{}{ + ChannelUUID: "74729f45-7f29-4868-9dc4-90e491e3c7d8", + Text: "test outgoing", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + QuickReplies: []string{"yes", "no"}, + Topic: flows.MsgTopicPurchase, + ExpectedStatus: models.MsgStatusQueued, + ExpectedMetadata: map[string]interface{}{ "quick_replies": []string{"yes", "no"}, "topic": "purchase", }, - 1, - false, + ExpectedMsgCount: 1, }, { - chanUUID, - channel, - "test outgoing", - CathyID, - urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", CathyURNID)), - CathyURNID, - []utils.Attachment{utils.Attachment("image/jpeg:https://dl-foo.com/image.jpg")}, - nil, - flows.NilMsgTopic, - map[string]interface{}{}, - 2, - false}, + ChannelUUID: "74729f45-7f29-4868-9dc4-90e491e3c7d8", + Text: "test outgoing", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + Attachments: []utils.Attachment{utils.Attachment("image/jpeg:https://dl-foo.com/image.jpg")}, + ExpectedStatus: models.MsgStatusQueued, + ExpectedMetadata: map[string]interface{}{}, + ExpectedMsgCount: 2, + }, + { + ChannelUUID: "74729f45-7f29-4868-9dc4-90e491e3c7d8", + Text: "suspended org", + ContactID: models.CathyID, + URN: urns.URN(fmt.Sprintf("tel:+250700000001?id=%d", models.CathyURNID)), + URNID: models.CathyURNID, + SuspendedOrg: true, + ExpectedStatus: models.MsgStatusFailed, + ExpectedMetadata: map[string]interface{}{}, + ExpectedMsgCount: 1, + }, } now := time.Now() - time.Sleep(time.Millisecond * 10) for _, tc := range tcs { tx, err := db.BeginTxx(ctx, nil) - assert.NoError(t, err) + require.NoError(t, err) + + db.MustExec(`UPDATE orgs_org SET is_suspended = $1 WHERE id = $2`, tc.SuspendedOrg, models.Org1) + + oa, err := models.GetOrgAssetsWithRefresh(ctx, db, models.Org1, models.RefreshOrg) + require.NoError(t, err) + + channel := oa.ChannelByUUID(tc.ChannelUUID) flowMsg := flows.NewMsgOut(tc.URN, assets.NewChannelReference(tc.ChannelUUID, "Test Channel"), tc.Text, tc.Attachments, tc.QuickReplies, nil, tc.Topic) - msg, err := NewOutgoingMsg(orgID, tc.Channel, tc.ContactID, flowMsg, now) + msg, err := models.NewOutgoingMsg(oa.Org(), channel, tc.ContactID, flowMsg, now) + + if tc.HasError { + assert.Error(t, err) + } else { + assert.NoError(t, err) - if err == nil { - assert.False(t, tc.HasErr) - err = InsertMessages(ctx, tx, []*Msg{msg}) + err = models.InsertMessages(ctx, tx, []*models.Msg{msg}) assert.NoError(t, err) - assert.Equal(t, orgID, msg.OrgID()) + assert.Equal(t, oa.OrgID(), msg.OrgID()) assert.Equal(t, tc.Text, msg.Text()) assert.Equal(t, tc.ContactID, msg.ContactID()) - assert.Equal(t, tc.Channel, msg.Channel()) + assert.Equal(t, channel, msg.Channel()) assert.Equal(t, tc.ChannelUUID, msg.ChannelUUID()) assert.Equal(t, tc.URN, msg.URN()) - if tc.ContactURNID != NilURNID { - assert.Equal(t, tc.ContactURNID, *msg.ContactURNID()) + if tc.URNID != models.NilURNID { + assert.Equal(t, tc.URNID, *msg.ContactURNID()) } else { assert.Nil(t, msg.ContactURNID()) } + + assert.Equal(t, tc.ExpectedStatus, msg.Status()) assert.Equal(t, tc.ExpectedMetadata, msg.Metadata()) assert.Equal(t, tc.ExpectedMsgCount, msg.MsgCount()) assert.Equal(t, now, msg.CreatedOn()) assert.True(t, msg.ID() > 0) assert.True(t, msg.QueuedOn().After(now)) assert.True(t, msg.ModifiedOn().After(now)) - } else { - if !tc.HasErr { - assert.Fail(t, "unexpected error: %s", err.Error()) - } } + tx.Rollback() } } @@ -140,6 +151,6 @@ func TestNormalizeAttachment(t *testing.T) { } for _, tc := range tcs { - assert.Equal(t, tc.normalized, string(NormalizeAttachment(utils.Attachment(tc.raw)))) + assert.Equal(t, tc.normalized, string(models.NormalizeAttachment(utils.Attachment(tc.raw)))) } } From de69f5e920171f4182d711fc9c55c55ef8cf2fdd Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 31 Jul 2020 16:11:20 -0500 Subject: [PATCH 17/56] Update CHANGELOG.md for v5.7.4 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ea86c0ac..2838e2039 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v5.7.4 +---------- + * Fail outgoing messages for suspended orgs + * Refresh groups as well as fields for contact query parsing + v5.7.3 ---------- * Update to goflow v0.99.0 From 40b435996ec086d039bee8f6c20cec3031c4e20f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 3 Aug 2020 13:49:43 -0500 Subject: [PATCH 18/56] Update last_seen_on when we receive a message from a contact --- hooks/contact_groups_changed.go | 4 +- hooks/contact_modified.go | 43 ++++++++++++++++---- hooks/contact_urns_changed.go | 2 +- hooks/hooks_test.go | 8 +++- hooks/msg_received.go | 33 +++++++++------- hooks/msg_received_test.go | 68 ++++++++++++++++++++++++++++++++ mailroom_test.dump | Bin 1841366 -> 1838733 bytes models/contacts.go | 6 +++ models/contacts_test.go | 22 ++++++++++- tasks/handler/worker.go | 17 +++++++- 10 files changed, 174 insertions(+), 29 deletions(-) create mode 100644 hooks/msg_received_test.go diff --git a/hooks/contact_groups_changed.go b/hooks/contact_groups_changed.go index 77784fb05..f26ac3bb8 100644 --- a/hooks/contact_groups_changed.go +++ b/hooks/contact_groups_changed.go @@ -100,7 +100,7 @@ func handleContactGroupsChanged(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool // add our add event scene.AppendToEventPreCommitHook(commitGroupChangesHook, hookEvent) scene.AppendToEventPreCommitHook(updateCampaignEventsHook, hookEvent) - scene.AppendToEventPreCommitHook(contactModifiedHook, scene.Contact().ID()) + scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{}) } // add each of our groups @@ -123,7 +123,7 @@ func handleContactGroupsChanged(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool scene.AppendToEventPreCommitHook(commitGroupChangesHook, hookEvent) scene.AppendToEventPreCommitHook(updateCampaignEventsHook, hookEvent) - scene.AppendToEventPreCommitHook(contactModifiedHook, scene.Contact().ID()) + scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{}) } return nil diff --git a/hooks/contact_modified.go b/hooks/contact_modified.go index 9f1b651de..2be2cb9a6 100644 --- a/hooks/contact_modified.go +++ b/hooks/contact_modified.go @@ -3,9 +3,10 @@ package hooks import ( "context" + "github.com/nyaruka/mailroom/models" + "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" - "github.com/nyaruka/mailroom/models" "github.com/pkg/errors" ) @@ -14,17 +15,43 @@ type ContactModifiedHook struct{} var contactModifiedHook = &ContactModifiedHook{} +type modifiedEvent struct { + InputReceived bool +} + // Apply squashes and updates modified_on on all the contacts passed in func (h *ContactModifiedHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *models.OrgAssets, scenes map[*models.Scene][]interface{}) error { - // our list of contact ids - contactIDs := make([]models.ContactID, 0, len(scenes)) - for scene := range scenes { - contactIDs = append(contactIDs, scene.ContactID()) + // our lists of contact ids + contactIDsWithInput := make([]models.ContactID, 0, len(scenes)) + contactIDsWithoutInput := make([]models.ContactID, 0, len(scenes)) + + for scene, opts := range scenes { + hasInput := false + for _, o := range opts { + if o.(modifiedEvent).InputReceived { + hasInput = true + break + } + } + + if hasInput { + contactIDsWithInput = append(contactIDsWithInput, scene.ContactID()) + } else { + contactIDsWithoutInput = append(contactIDsWithoutInput, scene.ContactID()) + } } - err := models.UpdateContactModifiedOn(ctx, tx, contactIDs) - if err != nil { - return errors.Wrapf(err, "error updating modified_on on contacts") + if len(contactIDsWithInput) > 0 { + err := models.UpdateContactLastSeenOn(ctx, tx, contactIDsWithInput) + if err != nil { + return errors.Wrapf(err, "error updating last_seen_on on contacts") + } + } + if len(contactIDsWithoutInput) > 0 { + err := models.UpdateContactModifiedOn(ctx, tx, contactIDsWithoutInput) + if err != nil { + return errors.Wrapf(err, "error updating modified_on on contacts") + } } return nil diff --git a/hooks/contact_urns_changed.go b/hooks/contact_urns_changed.go index 59ddf4bbc..89d8c7f1e 100644 --- a/hooks/contact_urns_changed.go +++ b/hooks/contact_urns_changed.go @@ -55,7 +55,7 @@ func handleContactURNsChanged(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, // add our callback scene.AppendToEventPreCommitHook(commitURNChangesHook, change) - scene.AppendToEventPreCommitHook(contactModifiedHook, scene.Contact().ID()) + scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{}) return nil } diff --git a/hooks/hooks_test.go b/hooks/hooks_test.go index 0100f2f41..0a3a77f63 100644 --- a/hooks/hooks_test.go +++ b/hooks/hooks_test.go @@ -36,6 +36,7 @@ type modifyResult struct { } type HookTestCase struct { + FlowType flows.FlowType Actions ContactActionMap Msgs ContactMsgMap Modifiers ContactModifierMap @@ -134,12 +135,17 @@ func createTestFlow(t *testing.T, uuid assets.FlowUUID, tc HookTestCase) flows.F nodes := []flows.Node{entry} nodes = append(nodes, exitNodes...) + flowType := tc.FlowType + if flowType == "" { + flowType = flows.FlowTypeMessaging + } + // we have our nodes, lets create our flow flow, err := definition.NewFlow( uuid, "Test Flow", envs.Language("eng"), - flows.FlowTypeMessaging, + flowType, 1, 300, definition.NewLocalization(), diff --git a/hooks/msg_received.go b/hooks/msg_received.go index 1b91e4453..827bf5e23 100644 --- a/hooks/msg_received.go +++ b/hooks/msg_received.go @@ -3,11 +3,12 @@ package hooks import ( "context" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/events" "github.com/nyaruka/mailroom/models" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/sirupsen/logrus" ) @@ -19,21 +20,23 @@ func init() { func handleMsgReceived(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *models.OrgAssets, scene *models.Scene, e flows.Event) error { event := e.(*events.MsgReceivedEvent) - // we only care about msg received events when dealing with surveyor flows - if scene.Session().SessionType() != models.SurveyorFlow { - return nil - } + // for surveyor sessions we need to actually create the message + if scene.Session().SessionType() == models.SurveyorFlow { + logrus.WithFields(logrus.Fields{ + "contact_uuid": scene.ContactUUID(), + "session_id": scene.SessionID(), + "text": event.Msg.Text(), + "urn": event.Msg.URN(), + }).Debug("msg received event") - logrus.WithFields(logrus.Fields{ - "contact_uuid": scene.ContactUUID(), - "session_id": scene.SessionID(), - "text": event.Msg.Text(), - "urn": event.Msg.URN(), - }).Debug("msg received event") + msg := models.NewIncomingMsg(oa.OrgID(), nil, scene.ContactID(), &event.Msg, event.CreatedOn()) + + // we'll commit this message with all the others + scene.AppendToEventPreCommitHook(commitMessagesHook, msg) + } - msg := models.NewIncomingMsg(oa.OrgID(), nil, scene.ContactID(), &event.Msg, event.CreatedOn()) + // update the contact's last seen date and modified on + scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{InputReceived: true}) - // we'll commit this message with all the others - scene.AppendToEventPreCommitHook(commitMessagesHook, msg) return nil } diff --git a/hooks/msg_received_test.go b/hooks/msg_received_test.go new file mode 100644 index 000000000..f38cd3b0e --- /dev/null +++ b/hooks/msg_received_test.go @@ -0,0 +1,68 @@ +package hooks + +import ( + "testing" + "time" + + "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/flows/actions" + "github.com/nyaruka/goflow/utils/uuids" + "github.com/nyaruka/mailroom/models" + "github.com/nyaruka/mailroom/testsuite" +) + +func TestMsgReceived(t *testing.T) { + testsuite.Reset() + db := testsuite.DB() + + now := time.Now() + + tcs := []HookTestCase{ + { + Actions: ContactActionMap{ + models.CathyID: []flows.Action{ + actions.NewSendMsg(newActionUUID(), "Hello World", nil, nil, false), + }, + models.GeorgeID: []flows.Action{ + actions.NewSendMsg(newActionUUID(), "Hello world", nil, nil, false), + }, + }, + Msgs: ContactMsgMap{ + models.CathyID: createIncomingMsg(db, models.Org1, models.CathyID, models.CathyURN, models.CathyURNID, "start"), + }, + SQLAssertions: []SQLAssertion{ + { + SQL: "SELECT COUNT(*) FROM contacts_contact WHERE id = $1 AND last_seen_on > $2", + Args: []interface{}{models.CathyID, now}, + Count: 1, + }, + { + SQL: "SELECT COUNT(*) FROM contacts_contact WHERE id = $1 AND last_seen_on IS NULL", + Args: []interface{}{models.GeorgeID}, + Count: 1, + }, + }, + }, + { + FlowType: flows.FlowTypeMessagingOffline, + Actions: ContactActionMap{ + models.BobID: []flows.Action{ + actions.NewSendMsg(newActionUUID(), "Hello World", nil, nil, false), + }, + }, + Msgs: ContactMsgMap{ + models.BobID: flows.NewMsgIn(flows.MsgUUID(uuids.New()), urns.NilURN, nil, "Hi offline", nil), + }, + SQLAssertions: []SQLAssertion{ + { + SQL: "SELECT COUNT(*) FROM msgs_msg WHERE contact_id = $1 AND direction = 'I'", + Args: []interface{}{models.BobID}, + Count: 1, + }, + }, + }, + } + + RunHookTestCases(t, tcs) +} diff --git a/mailroom_test.dump b/mailroom_test.dump index a7195e342ce76db83a4e63410eadbb7113f497e0..fbdc24971bb7685384378e5f62aa7a87da3e7788 100644 GIT binary patch delta 92556 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 YBnl`e9?wF@R(}roQs%4YGwPS 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 F{|9A2G?M@T delta 95078 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

{<_M2)3sCJj%Z` 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%0D1glZe?s@z{?Nu}H=u^&fz=zdoS< z`Opy8;)dz}tnP3we2(kI8x>G(IZ9}lcQ`4k!Zm1YCsRtU$aMZICE7>lQwW&V?^ag% zGFjo>{Nuap8kvf#&K4VO^x*@4)N#i&F5XtGI~t+>Nbq;r(5srn2q${kp$})27jHwm z{4>N)NG{w4_mh#5eY3VmC&Vm*^;oj%@UVwO#GO6dKYhl1hC;QDu1E;_+xWohhN=U3K*B5VjaO|Q zOimMQv7Ab^#iGucMeXrIMw`?fB~lb5#f)+?2xp7Ii5cj}KSFT5Nu0F4pUVDYk8Xc1 ztyvFD91n@eQu7nO_uqgD|K1N%6OWm;(POJCNJiTr5pT3IMYjZ*%CfvXKKR9xPs4G63_NuFg4?E%Bs^{g)WV1z z7HBtju_#`&P<6dCCj;F?hAPWV0resVuec)%+ttSX3r|!K2qcZyPBoJCR4i%Tlm_?X zwH$FRT-;y5(8IOJHww=*MJ0m4P-$X;-b7{)!j;tW+_LEx@q@H5{VuDw5r$;=PKCHm1Efqv7Td?6;JvB?+C8+?+i3#m+V*$$0uh~XRtV51`L{u1|;5BZRP z=9;@jcXfOr92p~u)Y=>K%~qTp~)z!=gc@O)*lZ=U9KK9BZJnxR19cx1Tx z9~t@F>)*qgiWx~I5~a>rD0-bs-i#1iY7`DZ<3u)(02cK4P)%X SW%>`uFH9tCNKIyvTmJ(@eK!06 diff --git a/models/contacts.go b/models/contacts.go index e26c79058..259918dfe 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -1067,6 +1067,12 @@ func UpdateContactModifiedOn(ctx context.Context, tx Queryer, contactIDs []Conta return err } +// UpdateContactLastSeenOn updates last seen on (and modified on) on the passed in contact +func UpdateContactLastSeenOn(ctx context.Context, tx Queryer, contactIDs []ContactID) error { + _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = NOW(), modified_on = NOW() WHERE id = ANY($1)`, pq.Array(contactIDs)) + return err +} + // UpdateContactURNs updates the contact urns in our database to match the passed in changes func UpdateContactURNs(ctx context.Context, tx Queryer, org *OrgAssets, changes []*ContactURNsChanged) error { // keep track of all our inserts diff --git a/models/contacts_test.go b/models/contacts_test.go index b89591612..9be9553da 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -3,6 +3,7 @@ package models import ( "fmt" "testing" + "time" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/flows" @@ -330,6 +331,26 @@ func TestStopContact(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_stopped = TRUE AND is_active = TRUE and is_blocked = FALSE`, []interface{}{CathyID}, 1) } +func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { + ctx := testsuite.CTX() + db := testsuite.DB() + testsuite.Reset() + + t0 := time.Now() + + err := UpdateContactModifiedOn(ctx, db, []ContactID{CathyID}) + assert.NoError(t, err) + + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on IS NULL`, []interface{}{t0}, 1) + + t1 := time.Now() + + err = UpdateContactLastSeenOn(ctx, db, []ContactID{CathyID}) + assert.NoError(t, err) + + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on > $1`, []interface{}{t1}, 1) +} + func TestUpdateContactModifiedBy(t *testing.T) { ctx := testsuite.CTX() db := testsuite.DB() @@ -349,7 +370,6 @@ func TestUpdateContactModifiedBy(t *testing.T) { assert.NoError(t, err) testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND modified_by_id = $2`, []interface{}{CathyID, UserID(1)}, 1) - } func TestUpdateContactStatus(t *testing.T) { diff --git a/tasks/handler/worker.go b/tasks/handler/worker.go index de811aa94..9d4bc59ce 100644 --- a/tasks/handler/worker.go +++ b/tasks/handler/worker.go @@ -631,10 +631,25 @@ func handleMsgEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, event *Msg return nil } - err = models.UpdateMessage(ctx, db, event.MsgID, models.MsgStatusHandled, models.VisibilityVisible, models.TypeInbox, topupID) + // this message didn't trigger and new sessions or resume any existing ones, so handle as inbox + err = handleAsInbox(ctx, db, modelContact.ID(), event.MsgID, topupID) + if err != nil { + return errors.Wrapf(err, "error handling inbox message") + } + return nil +} + +func handleAsInbox(ctx context.Context, db *sqlx.DB, contactID models.ContactID, msgID flows.MsgID, topupID models.TopupID) error { + err := models.UpdateMessage(ctx, db, msgID, models.MsgStatusHandled, models.VisibilityVisible, models.TypeInbox, topupID) if err != nil { return errors.Wrapf(err, "error marking message as handled") } + + err = models.UpdateContactLastSeenOn(ctx, db, []models.ContactID{contactID}) + if err != nil { + return errors.Wrapf(err, "error updating contact last_seen_on and modified_on") + } + return nil } From 5a4f7d68cb9064d9554668d23d8ac0810227a273 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 4 Aug 2020 17:04:26 -0500 Subject: [PATCH 19/56] Update last_seen_on when handling certain channel events --- models/channel_event.go | 2 +- models/contacts.go | 22 ++++++++++++++---- models/contacts_test.go | 19 ++++++++++++++- tasks/handler/handler_test.go | 44 +++++++++++++++++++++-------------- tasks/handler/worker.go | 17 ++++++++++++-- 5 files changed, 79 insertions(+), 25 deletions(-) diff --git a/models/channel_event.go b/models/channel_event.go index dbb86240f..27b9aae27 100644 --- a/models/channel_event.go +++ b/models/channel_event.go @@ -14,7 +14,7 @@ type ChannelEventID int64 const ( NewConversationEventType = ChannelEventType("new_conversation") - WelcomeMessateEventType = ChannelEventType("welcome_message") + WelcomeMessageEventType = ChannelEventType("welcome_message") ReferralEventType = ChannelEventType("referral") MOMissEventType = ChannelEventType("mo_miss") MOCallEventType = ChannelEventType("mo_call") diff --git a/models/contacts.go b/models/contacts.go index 259918dfe..6d03f0f44 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -17,6 +17,7 @@ import ( "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/excellent/types" "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/utils/dates" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/null" "github.com/olivere/elastic" @@ -78,8 +79,9 @@ func LoadContacts(ctx context.Context, db Queryer, org *OrgAssets, ids []Contact language: e.Language, isStopped: e.IsStopped, isBlocked: e.IsBlocked, - modifiedOn: e.ModifiedOn, createdOn: e.CreatedOn, + modifiedOn: e.ModifiedOn, + lastSeenOn: e.LastSeenOn, } // load our real groups @@ -383,8 +385,9 @@ type Contact struct { fields map[string]*flows.Value groups []*Group urns []urns.URN - modifiedOn time.Time createdOn time.Time + modifiedOn time.Time + lastSeenOn *time.Time } func (c *Contact) ID() ContactID { return c.id } @@ -396,8 +399,9 @@ func (c *Contact) IsBlocked() bool { return c.isBlocked } func (c *Contact) Fields() map[string]*flows.Value { return c.fields } func (c *Contact) Groups() []*Group { return c.groups } func (c *Contact) URNs() []urns.URN { return c.urns } -func (c *Contact) ModifiedOn() time.Time { return c.modifiedOn } func (c *Contact) CreatedOn() time.Time { return c.createdOn } +func (c *Contact) ModifiedOn() time.Time { return c.modifiedOn } +func (c *Contact) LastSeenOn() *time.Time { return c.lastSeenOn } func (c *Contact) Status() flows.ContactStatus { if c.isBlocked { @@ -468,8 +472,9 @@ type contactEnvelope struct { Fields map[assets.FieldUUID]*fieldValueEnvelope `json:"fields"` GroupIDs []GroupID `json:"group_ids"` URNs []ContactURN `json:"urns"` - ModifiedOn time.Time `json:"modified_on"` CreatedOn time.Time `json:"created_on"` + ModifiedOn time.Time `json:"modified_on"` + LastSeenOn *time.Time `json:"last_seen_on"` } const selectContactSQL = ` @@ -484,6 +489,7 @@ SELECT ROW_TO_JSON(r) FROM (SELECT is_active, created_on, modified_on, + last_seen_on, fields, g.groups AS group_ids, u.urns AS urns @@ -921,6 +927,14 @@ WHERE id = $1 ` +// UpdateLastSeenOn updates the last seen on for the contact +func (c *Contact) UpdateLastSeenOn(ctx context.Context, tx Queryer) error { + t := dates.Now() + c.lastSeenOn = &t + c.modifiedOn = t + return UpdateContactLastSeenOn(ctx, tx, []ContactID{c.id}) +} + // UpdatePreferredURN updates the URNs for the contact (if needbe) to have the passed in URN as top priority // with the passed in channel as the preferred channel func (c *Contact) UpdatePreferredURN(ctx context.Context, tx Queryer, org *OrgAssets, urnID URNID, channel *Channel) error { diff --git a/models/contacts_test.go b/models/contacts_test.go index 9be9553da..4c4d52aae 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -12,6 +12,7 @@ import ( "github.com/olivere/elastic" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestElasticContacts(t *testing.T) { @@ -336,9 +337,12 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { db := testsuite.DB() testsuite.Reset() + oa, err := GetOrgAssets(ctx, db, Org1) + require.NoError(t, err) + t0 := time.Now() - err := UpdateContactModifiedOn(ctx, db, []ContactID{CathyID}) + err = UpdateContactModifiedOn(ctx, db, []ContactID{CathyID}) assert.NoError(t, err) testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on IS NULL`, []interface{}{t0}, 1) @@ -349,6 +353,19 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { assert.NoError(t, err) testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on > $1`, []interface{}{t1}, 1) + + cathy, err := LoadContact(ctx, db, oa, CathyID) + require.NoError(t, err) + assert.NotNil(t, cathy.LastSeenOn()) + + t2 := *cathy.LastSeenOn() + + err = cathy.UpdateLastSeenOn(ctx, db) + require.NoError(t, err) + + t3 := *cathy.LastSeenOn() + + assert.True(t, t3.After(t2)) } func TestUpdateContactModifiedBy(t *testing.T) { diff --git a/tasks/handler/handler_test.go b/tasks/handler/handler_test.go index f7fe77620..0306a4dba 100644 --- a/tasks/handler/handler_test.go +++ b/tasks/handler/handler_test.go @@ -252,25 +252,27 @@ func TestChannelEvents(t *testing.T) { models.CathyID) tcs := []struct { - EventType models.ChannelEventType - ContactID models.ContactID - URNID models.URNID - OrgID models.OrgID - ChannelID models.ChannelID - Extra map[string]interface{} - Response string + EventType models.ChannelEventType + ContactID models.ContactID + URNID models.URNID + OrgID models.OrgID + ChannelID models.ChannelID + Extra map[string]interface{} + Response string + UpdateLastSeen bool }{ - {NewConversationEventType, models.CathyID, models.CathyURNID, models.Org1, models.TwitterChannelID, nil, "What is your favorite color?"}, - {NewConversationEventType, models.CathyID, models.CathyURNID, models.Org1, models.NexmoChannelID, nil, ""}, - {WelcomeMessageEventType, models.CathyID, models.CathyURNID, models.Org1, models.NexmoChannelID, nil, ""}, - {ReferralEventType, models.CathyID, models.CathyURNID, models.Org1, models.TwitterChannelID, nil, ""}, - {ReferralEventType, models.CathyID, models.CathyURNID, models.Org1, models.NexmoChannelID, nil, "Pick a number between 1-10."}, + {NewConversationEventType, models.CathyID, models.CathyURNID, models.Org1, models.TwitterChannelID, nil, "What is your favorite color?", true}, + {NewConversationEventType, models.CathyID, models.CathyURNID, models.Org1, models.NexmoChannelID, nil, "", true}, + {WelcomeMessageEventType, models.CathyID, models.CathyURNID, models.Org1, models.NexmoChannelID, nil, "", false}, + {ReferralEventType, models.CathyID, models.CathyURNID, models.Org1, models.TwitterChannelID, nil, "", true}, + {ReferralEventType, models.CathyID, models.CathyURNID, models.Org1, models.NexmoChannelID, nil, "Pick a number between 1-10.", true}, } models.FlushCache() last := time.Now() for i, tc := range tcs { + start := time.Now() event := models.NewChannelEvent(tc.EventType, tc.OrgID, tc.ChannelID, tc.ContactID, tc.URNID, tc.Extra, false) eventJSON, err := json.Marshal(event) assert.NoError(t, err) @@ -291,13 +293,21 @@ func TestChannelEvents(t *testing.T) { assert.NoError(t, err, "%d: error when handling event", i) // if we are meant to have a response - var text string - err = db.Get(&text, `SELECT text FROM msgs_msg WHERE contact_id = $1 AND contact_urn_id = $2 AND created_on > $3 ORDER BY id DESC LIMIT 1`, tc.ContactID, tc.URNID, last) - if err != nil { - logrus.WithError(err).Error("error making query") + if tc.Response != "" { + var text string + err = db.Get(&text, `SELECT text FROM msgs_msg WHERE contact_id = $1 AND contact_urn_id = $2 AND created_on > $3 ORDER BY id DESC LIMIT 1`, tc.ContactID, tc.URNID, last) + assert.NoError(t, err) + assert.Equal(t, tc.Response, text, "%d: response: '%s' is not '%s'", i, text, tc.Response) } - assert.Equal(t, tc.Response, text, "%d: response: '%s' is not '%s'", i, text, tc.Response) + last = time.Now() + + if tc.UpdateLastSeen { + var lastSeen time.Time + err = db.Get(&lastSeen, `SELECT last_seen_on FROM contacts_contact WHERE id = $1`, tc.ContactID) + assert.NoError(t, err) + assert.True(t, lastSeen.After(start)) + } } } diff --git a/tasks/handler/worker.go b/tasks/handler/worker.go index 9d4bc59ce..1c8249acf 100644 --- a/tasks/handler/worker.go +++ b/tasks/handler/worker.go @@ -320,29 +320,42 @@ func HandleChannelEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, eventT modelContact := contacts[0] - // do we have associated trigger? + // do we have associated trigger and should this event count as contact being seen? var trigger *models.Trigger + updateLastSeen := false + switch eventType { case models.NewConversationEventType: trigger = models.FindMatchingNewConversationTrigger(oa, channel) + updateLastSeen = true case models.ReferralEventType: trigger = models.FindMatchingReferralTrigger(oa, channel, event.ExtraValue("referrer_id")) + updateLastSeen = true case models.MOMissEventType: trigger = models.FindMatchingMissedCallTrigger(oa) + updateLastSeen = true case models.MOCallEventType: trigger = models.FindMatchingMOCallTrigger(oa, modelContact) + updateLastSeen = true - case models.WelcomeMessateEventType: + case models.WelcomeMessageEventType: trigger = nil default: return nil, errors.Errorf("unknown channel event type: %s", eventType) } + if updateLastSeen { + err = modelContact.UpdateLastSeenOn(ctx, db) + if err != nil { + return nil, errors.Wrap(err, "error updating contact last_seen_on") + } + } + // make sure this URN is our highest priority (this is usually a noop) err = modelContact.UpdatePreferredURN(ctx, db, oa, event.URNID(), channel) if err != nil { From 4ee8e9d8607c0284902946f03b6dcc5dfa864e98 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 5 Aug 2020 11:05:22 -0500 Subject: [PATCH 20/56] Include other events --- models/channel_event.go | 13 +++++++++++++ models/contacts.go | 9 --------- models/contacts_test.go | 9 --------- tasks/handler/worker.go | 21 ++++++++------------- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/models/channel_event.go b/models/channel_event.go index 27b9aae27..fc4af8d1b 100644 --- a/models/channel_event.go +++ b/models/channel_event.go @@ -12,14 +12,27 @@ import ( type ChannelEventType string type ChannelEventID int64 +// channel event types const ( NewConversationEventType = ChannelEventType("new_conversation") WelcomeMessageEventType = ChannelEventType("welcome_message") ReferralEventType = ChannelEventType("referral") + MTMissEventType = ChannelEventType("mt_miss") + MTCallEventType = ChannelEventType("mt_call") MOMissEventType = ChannelEventType("mo_miss") MOCallEventType = ChannelEventType("mo_call") + StopContactEventType = ChannelEventType("stop_contact") ) +// ContactSeenEvents are those which count as the contact having been seen +var ContactSeenEvents = map[ChannelEventType]bool{ + NewConversationEventType: true, + ReferralEventType: true, + MOMissEventType: true, + MOCallEventType: true, + StopContactEventType: true, +} + // ChannelEvent represents an event that occurred associated with a channel, such as a referral, missed call, etc.. type ChannelEvent struct { e struct { diff --git a/models/contacts.go b/models/contacts.go index 6d03f0f44..2f3c4d23a 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -17,7 +17,6 @@ import ( "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/excellent/types" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/utils/dates" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/null" "github.com/olivere/elastic" @@ -927,14 +926,6 @@ WHERE id = $1 ` -// UpdateLastSeenOn updates the last seen on for the contact -func (c *Contact) UpdateLastSeenOn(ctx context.Context, tx Queryer) error { - t := dates.Now() - c.lastSeenOn = &t - c.modifiedOn = t - return UpdateContactLastSeenOn(ctx, tx, []ContactID{c.id}) -} - // UpdatePreferredURN updates the URNs for the contact (if needbe) to have the passed in URN as top priority // with the passed in channel as the preferred channel func (c *Contact) UpdatePreferredURN(ctx context.Context, tx Queryer, org *OrgAssets, urnID URNID, channel *Channel) error { diff --git a/models/contacts_test.go b/models/contacts_test.go index 4c4d52aae..744e0bd1a 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -357,15 +357,6 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { cathy, err := LoadContact(ctx, db, oa, CathyID) require.NoError(t, err) assert.NotNil(t, cathy.LastSeenOn()) - - t2 := *cathy.LastSeenOn() - - err = cathy.UpdateLastSeenOn(ctx, db) - require.NoError(t, err) - - t3 := *cathy.LastSeenOn() - - assert.True(t, t3.After(t2)) } func TestUpdateContactModifiedBy(t *testing.T) { diff --git a/tasks/handler/worker.go b/tasks/handler/worker.go index 1c8249acf..2e790afd3 100644 --- a/tasks/handler/worker.go +++ b/tasks/handler/worker.go @@ -307,6 +307,13 @@ func HandleChannelEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, eventT return nil, nil } + if models.ContactSeenEvents[eventType] { + err = models.UpdateContactLastSeenOn(ctx, db, []models.ContactID{event.ContactID()}) + if err != nil { + return nil, errors.Wrap(err, "error updating contact last_seen_on") + } + } + // load our contact contacts, err := models.LoadContacts(ctx, db, oa, []models.ContactID{event.ContactID()}) if err != nil { @@ -320,27 +327,22 @@ func HandleChannelEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, eventT modelContact := contacts[0] - // do we have associated trigger and should this event count as contact being seen? + // do we have associated trigger? var trigger *models.Trigger - updateLastSeen := false switch eventType { case models.NewConversationEventType: trigger = models.FindMatchingNewConversationTrigger(oa, channel) - updateLastSeen = true case models.ReferralEventType: trigger = models.FindMatchingReferralTrigger(oa, channel, event.ExtraValue("referrer_id")) - updateLastSeen = true case models.MOMissEventType: trigger = models.FindMatchingMissedCallTrigger(oa) - updateLastSeen = true case models.MOCallEventType: trigger = models.FindMatchingMOCallTrigger(oa, modelContact) - updateLastSeen = true case models.WelcomeMessageEventType: trigger = nil @@ -349,13 +351,6 @@ func HandleChannelEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, eventT return nil, errors.Errorf("unknown channel event type: %s", eventType) } - if updateLastSeen { - err = modelContact.UpdateLastSeenOn(ctx, db) - if err != nil { - return nil, errors.Wrap(err, "error updating contact last_seen_on") - } - } - // make sure this URN is our highest priority (this is usually a noop) err = modelContact.UpdatePreferredURN(ctx, db, oa, event.URNID(), channel) if err != nil { From d470a5eca6c27d184ce9ceb17ad8623410fc166d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 5 Aug 2020 16:25:01 -0500 Subject: [PATCH 21/56] Last seen should be set as event times not db time --- hooks/contact_groups_changed.go | 4 ++-- hooks/contact_last_seen.go | 31 ++++++++++++++++++++++++++ hooks/contact_modified.go | 39 ++++++--------------------------- hooks/contact_urns_changed.go | 2 +- hooks/msg_received.go | 4 ++-- models/channel_event.go | 31 +++++++++++++------------- models/contacts.go | 10 +++++++-- models/contacts_test.go | 21 +++++++++++++++--- tasks/handler/handler_test.go | 8 +++---- tasks/handler/worker.go | 36 +++++++++++++++++++----------- 10 files changed, 111 insertions(+), 75 deletions(-) create mode 100644 hooks/contact_last_seen.go diff --git a/hooks/contact_groups_changed.go b/hooks/contact_groups_changed.go index f26ac3bb8..6bf95185b 100644 --- a/hooks/contact_groups_changed.go +++ b/hooks/contact_groups_changed.go @@ -100,7 +100,7 @@ func handleContactGroupsChanged(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool // add our add event scene.AppendToEventPreCommitHook(commitGroupChangesHook, hookEvent) scene.AppendToEventPreCommitHook(updateCampaignEventsHook, hookEvent) - scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{}) + scene.AppendToEventPreCommitHook(contactModifiedHook, scene.ContactID()) } // add each of our groups @@ -123,7 +123,7 @@ func handleContactGroupsChanged(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool scene.AppendToEventPreCommitHook(commitGroupChangesHook, hookEvent) scene.AppendToEventPreCommitHook(updateCampaignEventsHook, hookEvent) - scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{}) + scene.AppendToEventPreCommitHook(contactModifiedHook, scene.ContactID()) } return nil diff --git a/hooks/contact_last_seen.go b/hooks/contact_last_seen.go new file mode 100644 index 000000000..b980c05af --- /dev/null +++ b/hooks/contact_last_seen.go @@ -0,0 +1,31 @@ +package hooks + +import ( + "context" + "time" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" + "github.com/nyaruka/mailroom/models" + "github.com/pkg/errors" +) + +// ContactLastSeenHook is our hook for contact changes that require an update to last_seen_on +type ContactLastSeenHook struct{} + +var contactLastSeenHook = &ContactLastSeenHook{} + +// Apply squashes and updates modified_on on all the contacts passed in +func (h *ContactLastSeenHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *models.OrgAssets, scenes map[*models.Scene][]interface{}) error { + + for scene, evts := range scenes { + lastSeenOn := evts[len(evts)-1].(time.Time) + + err := models.UpdateContactLastSeenOn(ctx, tx, scene.ContactID(), lastSeenOn) + if err != nil { + return errors.Wrapf(err, "error updating last_seen_on on contacts") + } + } + + return nil +} diff --git a/hooks/contact_modified.go b/hooks/contact_modified.go index 2be2cb9a6..299d1d43d 100644 --- a/hooks/contact_modified.go +++ b/hooks/contact_modified.go @@ -15,43 +15,18 @@ type ContactModifiedHook struct{} var contactModifiedHook = &ContactModifiedHook{} -type modifiedEvent struct { - InputReceived bool -} - // Apply squashes and updates modified_on on all the contacts passed in func (h *ContactModifiedHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *models.OrgAssets, scenes map[*models.Scene][]interface{}) error { // our lists of contact ids - contactIDsWithInput := make([]models.ContactID, 0, len(scenes)) - contactIDsWithoutInput := make([]models.ContactID, 0, len(scenes)) - - for scene, opts := range scenes { - hasInput := false - for _, o := range opts { - if o.(modifiedEvent).InputReceived { - hasInput = true - break - } - } - - if hasInput { - contactIDsWithInput = append(contactIDsWithInput, scene.ContactID()) - } else { - contactIDsWithoutInput = append(contactIDsWithoutInput, scene.ContactID()) - } - } + contactIDs := make([]models.ContactID, 0, len(scenes)) - if len(contactIDsWithInput) > 0 { - err := models.UpdateContactLastSeenOn(ctx, tx, contactIDsWithInput) - if err != nil { - return errors.Wrapf(err, "error updating last_seen_on on contacts") - } + for scene := range scenes { + contactIDs = append(contactIDs, scene.ContactID()) } - if len(contactIDsWithoutInput) > 0 { - err := models.UpdateContactModifiedOn(ctx, tx, contactIDsWithoutInput) - if err != nil { - return errors.Wrapf(err, "error updating modified_on on contacts") - } + + err := models.UpdateContactModifiedOn(ctx, tx, contactIDs) + if err != nil { + return errors.Wrapf(err, "error updating modified_on on contacts") } return nil diff --git a/hooks/contact_urns_changed.go b/hooks/contact_urns_changed.go index 89d8c7f1e..80ea40d49 100644 --- a/hooks/contact_urns_changed.go +++ b/hooks/contact_urns_changed.go @@ -55,7 +55,7 @@ func handleContactURNsChanged(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, // add our callback scene.AppendToEventPreCommitHook(commitURNChangesHook, change) - scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{}) + scene.AppendToEventPreCommitHook(contactModifiedHook, scene.ContactID()) return nil } diff --git a/hooks/msg_received.go b/hooks/msg_received.go index 827bf5e23..ebfd5b98c 100644 --- a/hooks/msg_received.go +++ b/hooks/msg_received.go @@ -35,8 +35,8 @@ func handleMsgReceived(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *mod scene.AppendToEventPreCommitHook(commitMessagesHook, msg) } - // update the contact's last seen date and modified on - scene.AppendToEventPreCommitHook(contactModifiedHook, modifiedEvent{InputReceived: true}) + // update the contact's last seen date + scene.AppendToEventPreCommitHook(contactLastSeenHook, event.CreatedOn()) return nil } diff --git a/models/channel_event.go b/models/channel_event.go index fc4af8d1b..2997c49c8 100644 --- a/models/channel_event.go +++ b/models/channel_event.go @@ -36,29 +36,30 @@ var ContactSeenEvents = map[ChannelEventType]bool{ // ChannelEvent represents an event that occurred associated with a channel, such as a referral, missed call, etc.. type ChannelEvent struct { e struct { - ID ChannelEventID `json:"id" db:"id"` - EventType ChannelEventType `json:"event_type" db:"event_type"` - OrgID OrgID `json:"org_id" db:"org_id"` - ChannelID ChannelID `json:"channel_id" db:"channel_id"` - ContactID ContactID `json:"contact_id" db:"contact_id"` - URNID URNID `json:"urn_id" db:"contact_urn_id"` - Extra null.Map `json:"extra" db:"extra"` + ID ChannelEventID `json:"id" db:"id"` + EventType ChannelEventType `json:"event_type" db:"event_type"` + OrgID OrgID `json:"org_id" db:"org_id"` + ChannelID ChannelID `json:"channel_id" db:"channel_id"` + ContactID ContactID `json:"contact_id" db:"contact_id"` + URNID URNID `json:"urn_id" db:"contact_urn_id"` + Extra null.Map `json:"extra" db:"extra"` + OccurredOn time.Time `json:"occurred_on" db:"occurred_on"` // only in JSON representation NewContact bool `json:"new_contact"` // only in DB representation - CreatedOn time.Time `db:"created_on"` - OccurredOn time.Time `db:"occurred_on"` + CreatedOn time.Time `db:"created_on"` } } -func (e *ChannelEvent) ID() ChannelEventID { return e.e.ID } -func (e *ChannelEvent) ContactID() ContactID { return e.e.ContactID } -func (e *ChannelEvent) URNID() URNID { return e.e.URNID } -func (e *ChannelEvent) OrgID() OrgID { return e.e.OrgID } -func (e *ChannelEvent) ChannelID() ChannelID { return e.e.ChannelID } -func (e *ChannelEvent) IsNewContact() bool { return e.e.NewContact } +func (e *ChannelEvent) ID() ChannelEventID { return e.e.ID } +func (e *ChannelEvent) ContactID() ContactID { return e.e.ContactID } +func (e *ChannelEvent) URNID() URNID { return e.e.URNID } +func (e *ChannelEvent) OrgID() OrgID { return e.e.OrgID } +func (e *ChannelEvent) ChannelID() ChannelID { return e.e.ChannelID } +func (e *ChannelEvent) IsNewContact() bool { return e.e.NewContact } +func (e *ChannelEvent) OccurredOn() time.Time { return e.e.OccurredOn } func (e *ChannelEvent) Extra() map[string]interface{} { return e.e.Extra.Map() diff --git a/models/contacts.go b/models/contacts.go index 2f3c4d23a..8d35893aa 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -926,6 +926,12 @@ WHERE id = $1 ` +// UpdateLastSeenOn updates last seen on (and modified on) +func (c *Contact) UpdateLastSeenOn(ctx context.Context, tx Queryer, lastSeenOn time.Time) error { + c.lastSeenOn = &lastSeenOn + return UpdateContactLastSeenOn(ctx, tx, c.id, lastSeenOn) +} + // UpdatePreferredURN updates the URNs for the contact (if needbe) to have the passed in URN as top priority // with the passed in channel as the preferred channel func (c *Contact) UpdatePreferredURN(ctx context.Context, tx Queryer, org *OrgAssets, urnID URNID, channel *Channel) error { @@ -1073,8 +1079,8 @@ func UpdateContactModifiedOn(ctx context.Context, tx Queryer, contactIDs []Conta } // UpdateContactLastSeenOn updates last seen on (and modified on) on the passed in contact -func UpdateContactLastSeenOn(ctx context.Context, tx Queryer, contactIDs []ContactID) error { - _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = NOW(), modified_on = NOW() WHERE id = ANY($1)`, pq.Array(contactIDs)) +func UpdateContactLastSeenOn(ctx context.Context, tx Queryer, contactID ContactID, lastSeenOn time.Time) error { + _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = $2, modified_on = NOW() WHERE id = $1`, contactID, lastSeenOn) return err } diff --git a/models/contacts_test.go b/models/contacts_test.go index 744e0bd1a..ce1d8bd43 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -347,16 +347,31 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on IS NULL`, []interface{}{t0}, 1) - t1 := time.Now() + t1 := time.Now().Truncate(time.Millisecond) - err = UpdateContactLastSeenOn(ctx, db, []ContactID{CathyID}) + err = UpdateContactLastSeenOn(ctx, db, CathyID, t1) assert.NoError(t, err) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on > $1`, []interface{}{t1}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on = $1`, []interface{}{t1}, 1) cathy, err := LoadContact(ctx, db, oa, CathyID) require.NoError(t, err) assert.NotNil(t, cathy.LastSeenOn()) + assert.True(t, t1.Equal(*cathy.LastSeenOn())) + assert.True(t, cathy.ModifiedOn().After(t1)) + + t2 := time.Now().Truncate(time.Millisecond) + + // can update directly from the contact object + err = cathy.UpdateLastSeenOn(ctx, db, t2) + require.NoError(t, err) + assert.True(t, t2.Equal(*cathy.LastSeenOn())) + + // and that also updates the database + cathy, err = LoadContact(ctx, db, oa, CathyID) + require.NoError(t, err) + assert.True(t, t2.Equal(*cathy.LastSeenOn())) + assert.True(t, cathy.ModifiedOn().After(t2)) } func TestUpdateContactModifiedBy(t *testing.T) { diff --git a/tasks/handler/handler_test.go b/tasks/handler/handler_test.go index 0306a4dba..fd10be6ba 100644 --- a/tasks/handler/handler_test.go +++ b/tasks/handler/handler_test.go @@ -270,9 +270,9 @@ func TestChannelEvents(t *testing.T) { models.FlushCache() - last := time.Now() for i, tc := range tcs { start := time.Now() + event := models.NewChannelEvent(tc.EventType, tc.OrgID, tc.ChannelID, tc.ContactID, tc.URNID, tc.Extra, false) eventJSON, err := json.Marshal(event) assert.NoError(t, err) @@ -295,18 +295,16 @@ func TestChannelEvents(t *testing.T) { // if we are meant to have a response if tc.Response != "" { var text string - err = db.Get(&text, `SELECT text FROM msgs_msg WHERE contact_id = $1 AND contact_urn_id = $2 AND created_on > $3 ORDER BY id DESC LIMIT 1`, tc.ContactID, tc.URNID, last) + err = db.Get(&text, `SELECT text FROM msgs_msg WHERE contact_id = $1 AND contact_urn_id = $2 AND created_on > $3 ORDER BY id DESC LIMIT 1`, tc.ContactID, tc.URNID, start) assert.NoError(t, err) assert.Equal(t, tc.Response, text, "%d: response: '%s' is not '%s'", i, text, tc.Response) } - last = time.Now() - if tc.UpdateLastSeen { var lastSeen time.Time err = db.Get(&lastSeen, `SELECT last_seen_on FROM contacts_contact WHERE id = $1`, tc.ContactID) assert.NoError(t, err) - assert.True(t, lastSeen.After(start)) + assert.True(t, lastSeen.Equal(start) || lastSeen.After(start), "%d: expected last seen to be updated", i) } } } diff --git a/tasks/handler/worker.go b/tasks/handler/worker.go index 2e790afd3..0650bb789 100644 --- a/tasks/handler/worker.go +++ b/tasks/handler/worker.go @@ -307,13 +307,6 @@ func HandleChannelEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, eventT return nil, nil } - if models.ContactSeenEvents[eventType] { - err = models.UpdateContactLastSeenOn(ctx, db, []models.ContactID{event.ContactID()}) - if err != nil { - return nil, errors.Wrap(err, "error updating contact last_seen_on") - } - } - // load our contact contacts, err := models.LoadContacts(ctx, db, oa, []models.ContactID{event.ContactID()}) if err != nil { @@ -327,6 +320,13 @@ func HandleChannelEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, eventT modelContact := contacts[0] + if models.ContactSeenEvents[eventType] { + err = modelContact.UpdateLastSeenOn(ctx, db, event.OccurredOn()) + if err != nil { + return nil, errors.Wrap(err, "error updating contact last_seen_on") + } + } + // do we have associated trigger? var trigger *models.Trigger @@ -457,11 +457,19 @@ func handleStopEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, event *St if err != nil { return errors.Wrapf(err, "unable to start transaction for stopping contact") } + err = models.StopContact(ctx, tx, event.OrgID, event.ContactID) if err != nil { tx.Rollback() return err } + + err = models.UpdateContactLastSeenOn(ctx, tx, event.ContactID, event.OccurredOn) + if err != nil { + tx.Rollback() + return err + } + err = tx.Commit() if err != nil { return errors.Wrapf(err, "unable to commit for contact stop") @@ -640,22 +648,22 @@ func handleMsgEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, event *Msg } // this message didn't trigger and new sessions or resume any existing ones, so handle as inbox - err = handleAsInbox(ctx, db, modelContact.ID(), event.MsgID, topupID) + err = handleAsInbox(ctx, db, modelContact.ID(), event.MsgID, topupID, event.CreatedOn) if err != nil { return errors.Wrapf(err, "error handling inbox message") } return nil } -func handleAsInbox(ctx context.Context, db *sqlx.DB, contactID models.ContactID, msgID flows.MsgID, topupID models.TopupID) error { +func handleAsInbox(ctx context.Context, db *sqlx.DB, contactID models.ContactID, msgID flows.MsgID, topupID models.TopupID, createdOn time.Time) error { err := models.UpdateMessage(ctx, db, msgID, models.MsgStatusHandled, models.VisibilityVisible, models.TypeInbox, topupID) if err != nil { return errors.Wrapf(err, "error marking message as handled") } - err = models.UpdateContactLastSeenOn(ctx, db, []models.ContactID{contactID}) + err = models.UpdateContactLastSeenOn(ctx, db, contactID, createdOn) if err != nil { - return errors.Wrapf(err, "error updating contact last_seen_on and modified_on") + return errors.Wrapf(err, "error updating contact last_seen_on") } return nil @@ -685,11 +693,13 @@ type MsgEvent struct { Text string `json:"text"` Attachments []utils.Attachment `json:"attachments"` NewContact bool `json:"new_contact"` + CreatedOn time.Time `json:"created_on"` } type StopEvent struct { - ContactID models.ContactID `json:"contact_id"` - OrgID models.OrgID `json:"org_id"` + ContactID models.ContactID `json:"contact_id"` + OrgID models.OrgID `json:"org_id"` + OccurredOn time.Time `json:"occurred_on"` } // NewTimeoutEvent creates a new event task for the passed in timeout event From d868e11015e76cec65ffdeee253634ca8ba6f716 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 5 Aug 2020 17:18:44 -0500 Subject: [PATCH 22/56] Prevent accidently overwriting last_seen_on with older value --- models/contacts.go | 2 +- models/contacts_test.go | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/models/contacts.go b/models/contacts.go index 8d35893aa..cfea6f3a1 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -1080,7 +1080,7 @@ func UpdateContactModifiedOn(ctx context.Context, tx Queryer, contactIDs []Conta // UpdateContactLastSeenOn updates last seen on (and modified on) on the passed in contact func UpdateContactLastSeenOn(ctx context.Context, tx Queryer, contactID ContactID, lastSeenOn time.Time) error { - _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = $2, modified_on = NOW() WHERE id = $1`, contactID, lastSeenOn) + _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = $2, modified_on = NOW() WHERE id = $1 AND last_seen_on IS NULL OR last_seen_on < $2`, contactID, lastSeenOn) return err } diff --git a/models/contacts_test.go b/models/contacts_test.go index ce1d8bd43..0906a3091 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -348,6 +348,7 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE modified_on > $1 AND last_seen_on IS NULL`, []interface{}{t0}, 1) t1 := time.Now().Truncate(time.Millisecond) + time.Sleep(time.Millisecond * 5) err = UpdateContactLastSeenOn(ctx, db, CathyID, t1) assert.NoError(t, err) @@ -361,6 +362,7 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { assert.True(t, cathy.ModifiedOn().After(t1)) t2 := time.Now().Truncate(time.Millisecond) + time.Sleep(time.Millisecond * 5) // can update directly from the contact object err = cathy.UpdateLastSeenOn(ctx, db, t2) @@ -372,6 +374,14 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { require.NoError(t, err) assert.True(t, t2.Equal(*cathy.LastSeenOn())) assert.True(t, cathy.ModifiedOn().After(t2)) + + // can't accidently overwrite a newer date + err = cathy.UpdateLastSeenOn(ctx, db, time.Date(2010, 1, 1, 12, 0, 0, 0, time.UTC)) + require.NoError(t, err) + + cathy, err = LoadContact(ctx, db, oa, CathyID) + require.NoError(t, err) + assert.True(t, t2.Equal(*cathy.LastSeenOn())) } func TestUpdateContactModifiedBy(t *testing.T) { From b5d06ba057138316f122bdcd350594407e931227 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 6 Aug 2020 10:02:28 -0500 Subject: [PATCH 23/56] Coverage --- models/channel_event_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/models/channel_event_test.go b/models/channel_event_test.go index a1029f7fe..d8962b2ca 100644 --- a/models/channel_event_test.go +++ b/models/channel_event_test.go @@ -3,6 +3,7 @@ package models import ( "encoding/json" "testing" + "time" "github.com/nyaruka/mailroom/testsuite" "github.com/stretchr/testify/assert" @@ -12,12 +13,15 @@ func TestChannelEvents(t *testing.T) { ctx := testsuite.CTX() db := testsuite.DB() + start := time.Now() + // no extra e := NewChannelEvent(MOMissEventType, Org1, TwilioChannelID, CathyID, CathyURNID, nil, false) err := e.Insert(ctx, db) assert.NoError(t, err) assert.NotZero(t, e.ID()) assert.Equal(t, e.Extra(), map[string]interface{}{}) + assert.True(t, e.OccurredOn().After(start)) // with extra e2 := NewChannelEvent(MOMissEventType, Org1, TwilioChannelID, CathyID, CathyURNID, map[string]interface{}{"referral_id": "foobar"}, false) @@ -33,4 +37,5 @@ func TestChannelEvents(t *testing.T) { err = json.Unmarshal(asJSON, e3) assert.NoError(t, err) assert.Equal(t, e2.Extra(), e3.Extra()) + assert.True(t, e.OccurredOn().After(start)) } From 8f1524d9a1e7c75b30dcd4764e466e7ee5df7676 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 6 Aug 2020 10:26:57 -0500 Subject: [PATCH 24/56] Update CHANGELOG.md for v5.7.5 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2838e2039..c3f50bbf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v5.7.5 +---------- + * Update last_seen_on when handling certain channel events + * Update last_seen_on when we receive a message from a contact + v5.7.4 ---------- * Fail outgoing messages for suspended orgs From a8163008004a7ccccaa41fbb7a61eac521d81477 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 6 Aug 2020 10:53:39 -0500 Subject: [PATCH 25/56] Tweak test --- tasks/handler/handler_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/handler/handler_test.go b/tasks/handler/handler_test.go index fd10be6ba..4821c56ce 100644 --- a/tasks/handler/handler_test.go +++ b/tasks/handler/handler_test.go @@ -272,6 +272,7 @@ func TestChannelEvents(t *testing.T) { for i, tc := range tcs { start := time.Now() + time.Sleep(time.Millisecond * 5) event := models.NewChannelEvent(tc.EventType, tc.OrgID, tc.ChannelID, tc.ContactID, tc.URNID, tc.Extra, false) eventJSON, err := json.Marshal(event) From 56e96c3a64bb10633a1c8577cddb43469d9f3f77 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 6 Aug 2020 11:27:32 -0500 Subject: [PATCH 26/56] Remove protection for overwriting last_seen_on with older values --- models/contacts.go | 2 +- models/contacts_test.go | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/models/contacts.go b/models/contacts.go index cfea6f3a1..8d35893aa 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -1080,7 +1080,7 @@ func UpdateContactModifiedOn(ctx context.Context, tx Queryer, contactIDs []Conta // UpdateContactLastSeenOn updates last seen on (and modified on) on the passed in contact func UpdateContactLastSeenOn(ctx context.Context, tx Queryer, contactID ContactID, lastSeenOn time.Time) error { - _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = $2, modified_on = NOW() WHERE id = $1 AND last_seen_on IS NULL OR last_seen_on < $2`, contactID, lastSeenOn) + _, err := tx.ExecContext(ctx, `UPDATE contacts_contact SET last_seen_on = $2, modified_on = NOW() WHERE id = $1`, contactID, lastSeenOn) return err } diff --git a/models/contacts_test.go b/models/contacts_test.go index 0906a3091..aba1f53a4 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -374,14 +374,6 @@ func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { require.NoError(t, err) assert.True(t, t2.Equal(*cathy.LastSeenOn())) assert.True(t, cathy.ModifiedOn().After(t2)) - - // can't accidently overwrite a newer date - err = cathy.UpdateLastSeenOn(ctx, db, time.Date(2010, 1, 1, 12, 0, 0, 0, time.UTC)) - require.NoError(t, err) - - cathy, err = LoadContact(ctx, db, oa, CathyID) - require.NoError(t, err) - assert.True(t, t2.Equal(*cathy.LastSeenOn())) } func TestUpdateContactModifiedBy(t *testing.T) { From 14f5c259609bf5cf69d1cf8bf3c56eb98bea695c Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 6 Aug 2020 11:43:03 -0500 Subject: [PATCH 27/56] Update CHANGELOG.md for v5.7.6 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3f50bbf6..661e63503 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.6 +---------- + * Remove protection for overwriting last_seen_on with older values + v5.7.5 ---------- * Update last_seen_on when handling certain channel events From 533f99d1088a3dcd29f48a9c36b2cfaaec2323c2 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 11 Aug 2020 16:54:47 -0500 Subject: [PATCH 28/56] Update to latest goflow v0.100.0 --- go.mod | 2 +- go.sum | 4 ++-- models/contacts.go | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4e600b128..0bb756c70 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.99.0 + github.com/nyaruka/goflow v0.100.0 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index 3f7541de7..ede101324 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.99.0 h1:OP1L/4GD5Ek9ZfxOJPu1Qus1Ym3ol4fxwYkiDBPh5Js= -github.com/nyaruka/goflow v0.99.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.100.0 h1:9Ih2vpGxlYpJFNSXhHR75mtw3Kz65O11KstztlEkW0I= +github.com/nyaruka/goflow v0.100.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/models/contacts.go b/models/contacts.go index 8d35893aa..ba93b49e5 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -340,6 +340,7 @@ func (c *Contact) FlowContact(org *OrgAssets) (*flows.Contact, error) { c.Status(), org.Env().Timezone(), c.createdOn, + c.lastSeenOn, c.urns, groups, c.fields, From 241ffded0b6aa8f5ca196c695003165ff56a6211 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 11 Aug 2020 16:56:12 -0500 Subject: [PATCH 29/56] Update CHANGELOG.md for v5.7.7 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 661e63503..02b5cb9d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.7 +---------- + * Update to latest goflow v0.100.0 + v5.7.6 ---------- * Remove protection for overwriting last_seen_on with older values From 6e840f28773bb2c63c8aaddde82c5812713183de Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 12 Aug 2020 15:12:10 -0500 Subject: [PATCH 30/56] Recalculate event fires for campaign events based on last_seen_on in session handling --- hooks/campaigns.go | 4 ++++ hooks/campaigns_test.go | 16 +++++++++++++--- hooks/contact_last_seen.go | 8 +++++--- hooks/msg_received.go | 3 ++- mailroom_test.dump | Bin 1838733 -> 1841664 bytes models/assets.go | 14 ++++++++++---- models/campaigns.go | 28 ++++++++++++++++++++-------- models/fields.go | 33 ++++++++++++++++++++++----------- models/test_constants.go | 7 ++++--- 9 files changed, 80 insertions(+), 33 deletions(-) diff --git a/hooks/campaigns.go b/hooks/campaigns.go index 35cb0fc79..225d0e724 100644 --- a/hooks/campaigns.go +++ b/hooks/campaigns.go @@ -52,6 +52,10 @@ func (h *UpdateCampaignEventsHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *r continue } fieldChanges[field.ID()] = true + + case *events.MsgReceivedEvent: + field := oa.FieldByKey(models.LastSeenOnKey) + fieldChanges[field.ID()] = true } } diff --git a/hooks/campaigns_test.go b/hooks/campaigns_test.go index e8bf87f91..634a8696b 100644 --- a/hooks/campaigns_test.go +++ b/hooks/campaigns_test.go @@ -17,13 +17,20 @@ func TestCampaigns(t *testing.T) { doctors := assets.NewGroupReference(models.DoctorsGroupUUID, "Doctors") joined := assets.NewFieldReference("joined", "Joined") - // insert an event on our campaign that is based on created on + // insert an event on our campaign that is based on created_on testsuite.DB().MustExec( `INSERT INTO campaigns_campaignevent(is_active, created_on, modified_on, uuid, "offset", unit, event_type, delivery_hour, campaign_id, created_by_id, modified_by_id, flow_id, relative_to_id, start_mode) VALUES(TRUE, NOW(), NOW(), $1, 1000, 'W', 'F', -1, $2, 1, 1, $3, $4, 'I')`, uuids.New(), models.DoctorRemindersCampaignID, models.FavoritesFlowID, models.CreatedOnFieldID) + // insert an event on our campaign that is based on last_seen_on + testsuite.DB().MustExec( + `INSERT INTO campaigns_campaignevent(is_active, created_on, modified_on, uuid, "offset", unit, event_type, delivery_hour, + campaign_id, created_by_id, modified_by_id, flow_id, relative_to_id, start_mode) + VALUES(TRUE, NOW(), NOW(), $1, 2, 'D', 'F', -1, $2, 1, 1, $3, $4, 'I')`, + uuids.New(), models.DoctorRemindersCampaignID, models.FavoritesFlowID, models.LastSeenOnFieldID) + // init their values testsuite.DB().MustExec( `update contacts_contact set fields = fields - '8c1c1256-78d6-4a5b-9f1c-1761d5728251' @@ -35,7 +42,10 @@ func TestCampaigns(t *testing.T) { WHERE id = $1`, models.BobID) tcs := []HookTestCase{ - HookTestCase{ + { + Msgs: ContactMsgMap{ + models.CathyID: flows.NewMsgIn(flows.MsgUUID(uuids.New()), models.CathyURN, nil, "Hi there", nil), + }, Actions: ContactActionMap{ models.CathyID: []flows.Action{ actions.NewRemoveContactGroups(newActionUUID(), []*assets.GroupReference{doctors}, false), @@ -58,7 +68,7 @@ func TestCampaigns(t *testing.T) { { SQL: `select count(*) FROM campaigns_eventfire WHERE contact_id = $1`, Args: []interface{}{models.CathyID}, - Count: 1, + Count: 2, }, { SQL: `select count(*) FROM campaigns_eventfire WHERE contact_id = $1`, diff --git a/hooks/contact_last_seen.go b/hooks/contact_last_seen.go index b980c05af..e92362ea1 100644 --- a/hooks/contact_last_seen.go +++ b/hooks/contact_last_seen.go @@ -2,11 +2,12 @@ package hooks import ( "context" - "time" + + "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/mailroom/models" "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" - "github.com/nyaruka/mailroom/models" "github.com/pkg/errors" ) @@ -19,7 +20,8 @@ var contactLastSeenHook = &ContactLastSeenHook{} func (h *ContactLastSeenHook) Apply(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *models.OrgAssets, scenes map[*models.Scene][]interface{}) error { for scene, evts := range scenes { - lastSeenOn := evts[len(evts)-1].(time.Time) + lastEvent := evts[len(evts)-1].(flows.Event) + lastSeenOn := lastEvent.CreatedOn() err := models.UpdateContactLastSeenOn(ctx, tx, scene.ContactID(), lastSeenOn) if err != nil { diff --git a/hooks/msg_received.go b/hooks/msg_received.go index ebfd5b98c..c4d1c1862 100644 --- a/hooks/msg_received.go +++ b/hooks/msg_received.go @@ -36,7 +36,8 @@ func handleMsgReceived(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *mod } // update the contact's last seen date - scene.AppendToEventPreCommitHook(contactLastSeenHook, event.CreatedOn()) + scene.AppendToEventPreCommitHook(contactLastSeenHook, event) + scene.AppendToEventPreCommitHook(updateCampaignEventsHook, event) return nil } diff --git a/mailroom_test.dump b/mailroom_test.dump index fbdc24971bb7685384378e5f62aa7a87da3e7788..26cd512995de4a62ce1932642075bc4443b7db6e 100644 GIT binary patch delta 94563 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
Gje;kD@TQ7@L+~8 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 delta 91957 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
k;uV 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�}|8LRa8m+f75t)a|Z2v)9|lABoLt~A(yIt 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 Xss4A33i#Bjf};+O1~?l3g8csgO$FXu diff --git a/models/assets.go b/models/assets.go index cb999e291..86c55e4c4 100644 --- a/models/assets.go +++ b/models/assets.go @@ -130,13 +130,19 @@ func NewOrgAssets(ctx context.Context, db *sqlx.DB, orgID OrgID, prev *OrgAssets } if prev == nil || refresh&RefreshFields > 0 { - oa.fields, err = loadFields(ctx, db, orgID) + userFields, systemFields, err := loadFields(ctx, db, orgID) if err != nil { return nil, errors.Wrapf(err, "error loading field assets for org %d", orgID) } - oa.fieldsByUUID = make(map[assets.FieldUUID]*Field) - oa.fieldsByKey = make(map[string]*Field) - for _, f := range oa.fields { + oa.fields = userFields + oa.fieldsByUUID = make(map[assets.FieldUUID]*Field, len(userFields)+len(systemFields)) + oa.fieldsByKey = make(map[string]*Field, len(userFields)+len(systemFields)) + for _, f := range userFields { + field := f.(*Field) + oa.fieldsByUUID[field.UUID()] = field + oa.fieldsByKey[field.Key()] = field + } + for _, f := range systemFields { field := f.(*Field) oa.fieldsByUUID[field.UUID()] = field oa.fieldsByKey[field.Key()] = field diff --git a/models/campaigns.go b/models/campaigns.go index f53033853..c043b1b7f 100644 --- a/models/campaigns.go +++ b/models/campaigns.go @@ -37,9 +37,12 @@ type OffsetUnit string type StartMode string const ( - // CreatedOnKey + // CreatedOnKey is key of created on system field CreatedOnKey = "created_on" + // LastSeenOnKey is key of last seen on system field + LastSeenOnKey = "last_seen_on" + // OffsetMinute means our offset is in minutes OffsetMinute = OffsetUnit("M") @@ -126,12 +129,15 @@ func (e *CampaignEvent) QualifiesByGroup(contact *flows.Contact) bool { // QualifiesByField returns whether the passed in contact qualifies for this event by group membership func (e *CampaignEvent) QualifiesByField(contact *flows.Contact) bool { - if e.RelativeToKey() == CreatedOnKey { + switch e.RelativeToKey() { + case CreatedOnKey: return true + case LastSeenOnKey: + return contact.LastSeenOn() != nil + default: + value := contact.Fields()[e.RelativeToKey()] + return value != nil } - - value := contact.Fields()[e.RelativeToKey()] - return value != nil } // ScheduleForContact calculates the next fire ( if any) for the passed in contact @@ -143,10 +149,16 @@ func (e *CampaignEvent) ScheduleForContact(tz *time.Location, now time.Time, con var start time.Time - // created on is a special case - if e.RelativeToKey() == CreatedOnKey { + switch e.RelativeToKey() { + case CreatedOnKey: start = contact.CreatedOn() - } else { + case LastSeenOnKey: + value := contact.LastSeenOn() + if value == nil { + return nil, nil + } + start = *value + default: // everything else is just a normal field value := contact.Fields()[e.RelativeToKey()] diff --git a/models/fields.go b/models/fields.go index 6544ee497..1f1b199b2 100644 --- a/models/fields.go +++ b/models/fields.go @@ -21,6 +21,7 @@ type Field struct { Key string `json:"key"` Name string `json:"name"` FieldType assets.FieldType `json:"field_type"` + System bool `json:"is_system"` } } @@ -39,29 +40,39 @@ func (f *Field) Name() string { return f.f.Name } // Type returns the value type for this field func (f *Field) Type() assets.FieldType { return f.f.FieldType } +// System returns whether this is a system field +func (f *Field) System() bool { return f.f.System } + // loadFields loads the assets for the passed in db -func loadFields(ctx context.Context, db sqlx.Queryer, orgID OrgID) ([]assets.Field, error) { +func loadFields(ctx context.Context, db sqlx.Queryer, orgID OrgID) ([]assets.Field, []assets.Field, error) { start := time.Now() rows, err := db.Queryx(selectFieldsSQL, orgID) if err != nil { - return nil, errors.Wrapf(err, "error querying fields for org: %d", orgID) + return nil, nil, errors.Wrapf(err, "error querying fields for org: %d", orgID) } defer rows.Close() - fields := make([]assets.Field, 0, 10) + userFields := make([]assets.Field, 0, 10) + systemFields := make([]assets.Field, 0, 10) + for rows.Next() { field := &Field{} err = readJSONRow(rows, &field.f) if err != nil { - return nil, errors.Wrap(err, "error reading field") + return nil, nil, errors.Wrap(err, "error reading field") + } + + if field.System() { + systemFields = append(systemFields, field) + } else { + userFields = append(userFields, field) } - fields = append(fields, field) } - logrus.WithField("elapsed", time.Since(start)).WithField("org_id", orgID).WithField("count", len(fields)).Debug("loaded contact fields") + logrus.WithField("elapsed", time.Since(start)).WithField("org_id", orgID).WithField("count", len(userFields)).Debug("loaded contact fields") - return fields, nil + return userFields, systemFields, nil } const selectFieldsSQL = ` @@ -77,13 +88,13 @@ SELECT ROW_TO_JSON(f) FROM (SELECT WHEN 'S' THEN 'state' WHEN 'I' THEN 'district' WHEN 'W' THEN 'ward' - END) as field_type -FROM + END) as field_type, + field_type = 'S' as is_system +FROM contacts_contactfield WHERE org_id = $1 AND - is_active = TRUE AND - field_type = 'U' + is_active = TRUE ORDER BY key ASC ) f; diff --git a/models/test_constants.go b/models/test_constants.go index 5ba6e1eda..4285f0207 100644 --- a/models/test_constants.go +++ b/models/test_constants.go @@ -88,14 +88,15 @@ var AllContactsGroupUUID = assets.GroupUUID("bc268217-9ffa-49e0-883e-e4e09c252a5 var TestersGroupID = GroupID(10001) var TestersGroupUUID = assets.GroupUUID("5e9d8fab-5e7e-4f51-b533-261af5dea70d") +var CreatedOnFieldID = FieldID(3) +var LastSeenOnFieldID = FieldID(5) + var AgeFieldUUID = assets.FieldUUID("903f51da-2717-47c7-a0d3-f2f32877013d") var GenderFieldUUID = assets.FieldUUID("3a5891e4-756e-4dc9-8e12-b7a766168824") -var JoinedFieldID = FieldID(7) +var JoinedFieldID = FieldID(8) var JoinedFieldUUID = assets.FieldUUID("d83aae24-4bbf-49d0-ab85-6bfd201eac6d") -var CreatedOnFieldID = FieldID(3) - var ReportingLabelID = LabelID(10000) var ReportingLabelUUID = assets.LabelUUID("ebc4dedc-91c4-4ed4-9dd6-daa05ea82698") From d9a62c927e9de6dc190c9d42ca7bd24f95dd7722 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 12 Aug 2020 16:13:54 -0500 Subject: [PATCH 31/56] Handle potential campaign event changes from handling inbox message --- hooks/msg_received.go | 2 +- models/events.go | 56 ++++++++++++++++++++++++++++++++++++++--- models/fields_test.go | 33 ++++++++++++++++++------ tasks/handler/worker.go | 17 ++++++++----- web/contact/contact.go | 50 +++++------------------------------- 5 files changed, 97 insertions(+), 61 deletions(-) diff --git a/hooks/msg_received.go b/hooks/msg_received.go index c4d1c1862..b87de4b16 100644 --- a/hooks/msg_received.go +++ b/hooks/msg_received.go @@ -21,7 +21,7 @@ func handleMsgReceived(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, oa *mod event := e.(*events.MsgReceivedEvent) // for surveyor sessions we need to actually create the message - if scene.Session().SessionType() == models.SurveyorFlow { + if scene.Session() != nil && scene.Session().SessionType() == models.SurveyorFlow { logrus.WithFields(logrus.Fields{ "contact_uuid": scene.ContactUUID(), "session_id": scene.SessionID(), diff --git a/models/events.go b/models/events.go index e3375c0cd..3ebb71a48 100644 --- a/models/events.go +++ b/models/events.go @@ -55,9 +55,6 @@ func (s *Scene) ContactUUID() flows.ContactUUID { return s.contact.UUID() } // Session returns the session for this scene if any func (s *Scene) Session() *Session { - if s.session == nil { - panic("attempt to retrieve session on scene without one") - } return s.session } @@ -184,3 +181,56 @@ func ApplyEventPostCommitHooks(ctx context.Context, tx *sqlx.Tx, rp *redis.Pool, return nil } + +// HandleAndCommitEvents takes a set of contacts and events, handles the events and applies any hooks, and commits everything +func HandleAndCommitEvents(ctx context.Context, db *sqlx.DB, rp *redis.Pool, oa *OrgAssets, contactEvents map[*flows.Contact][]flows.Event) error { + // create scenes for each contact + scenes := make([]*Scene, 0, len(contactEvents)) + for contact := range contactEvents { + scene := NewSceneForContact(contact) + scenes = append(scenes, scene) + } + + // ok, commit all our events + tx, err := db.BeginTxx(ctx, nil) + if err != nil { + return errors.Wrapf(err, "error beginning transaction") + } + + // apply our events + for _, scene := range scenes { + err := HandleEvents(ctx, tx, rp, oa, scene, contactEvents[scene.Contact()]) + if err != nil { + return errors.Wrapf(err, "error applying events") + } + } + + // gather all our pre commit events, group them by hook and apply them + err = ApplyEventPreCommitHooks(ctx, tx, rp, oa, scenes) + if err != nil { + return errors.Wrapf(err, "error applying pre commit hooks") + } + + // commit our transaction + err = tx.Commit() + if err != nil { + return errors.Wrapf(err, "error committing pre commit hooks") + } + + tx, err = db.BeginTxx(ctx, nil) + if err != nil { + return errors.Wrapf(err, "error beginning transaction for post commit") + } + + // then apply our post commit hooks + err = ApplyEventPostCommitHooks(ctx, tx, rp, oa, scenes) + if err != nil { + return errors.Wrapf(err, "error applying post commit hooks") + } + + err = tx.Commit() + if err != nil { + return errors.Wrapf(err, "error committing post commit hooks") + } + return nil +} diff --git a/models/fields_test.go b/models/fields_test.go index 07b31ab4b..4595aa417 100644 --- a/models/fields_test.go +++ b/models/fields_test.go @@ -12,10 +12,10 @@ func TestFields(t *testing.T) { ctx := testsuite.CTX() db := testsuite.DB() - fields, err := loadFields(ctx, db, 1) + userFields, systemFields, err := loadFields(ctx, db, 1) assert.NoError(t, err) - tcs := []struct { + expectedUserFields := []struct { Key string Name string ValueType assets.FieldType @@ -28,10 +28,29 @@ func TestFields(t *testing.T) { {"ward", "Ward", assets.FieldTypeWard}, } - assert.Equal(t, 6, len(fields)) - for i, tc := range tcs { - assert.Equal(t, tc.Key, fields[i].Key()) - assert.Equal(t, tc.Name, fields[i].Name()) - assert.Equal(t, tc.ValueType, fields[i].Type()) + assert.Equal(t, len(expectedUserFields), len(userFields)) + for i, tc := range expectedUserFields { + assert.Equal(t, tc.Key, userFields[i].Key()) + assert.Equal(t, tc.Name, userFields[i].Name()) + assert.Equal(t, tc.ValueType, userFields[i].Type()) + } + + expectedSystemFields := []struct { + Key string + Name string + ValueType assets.FieldType + }{ + {"created_on", "Created On", assets.FieldTypeDatetime}, + {"id", "ID", assets.FieldTypeNumber}, + {"language", "Language", assets.FieldTypeText}, + {"last_seen_on", "Last Seen On", assets.FieldTypeDatetime}, + {"name", "Name", assets.FieldTypeText}, + } + + assert.Equal(t, len(expectedSystemFields), len(systemFields)) + for i, tc := range expectedSystemFields { + assert.Equal(t, tc.Key, systemFields[i].Key()) + assert.Equal(t, tc.Name, systemFields[i].Name()) + assert.Equal(t, tc.ValueType, systemFields[i].Type()) } } diff --git a/tasks/handler/worker.go b/tasks/handler/worker.go index 0650bb789..c022d5b3f 100644 --- a/tasks/handler/worker.go +++ b/tasks/handler/worker.go @@ -11,6 +11,7 @@ import ( "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/excellent/types" "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/flows/events" "github.com/nyaruka/goflow/flows/resumes" "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/goflow/utils" @@ -648,22 +649,26 @@ func handleMsgEvent(ctx context.Context, db *sqlx.DB, rp *redis.Pool, event *Msg } // this message didn't trigger and new sessions or resume any existing ones, so handle as inbox - err = handleAsInbox(ctx, db, modelContact.ID(), event.MsgID, topupID, event.CreatedOn) + err = handleAsInbox(ctx, db, rp, oa, contact, msgIn, topupID) if err != nil { return errors.Wrapf(err, "error handling inbox message") } return nil } -func handleAsInbox(ctx context.Context, db *sqlx.DB, contactID models.ContactID, msgID flows.MsgID, topupID models.TopupID, createdOn time.Time) error { - err := models.UpdateMessage(ctx, db, msgID, models.MsgStatusHandled, models.VisibilityVisible, models.TypeInbox, topupID) +func handleAsInbox(ctx context.Context, db *sqlx.DB, rp *redis.Pool, oa *models.OrgAssets, contact *flows.Contact, msg *flows.MsgIn, topupID models.TopupID) error { + msgEvent := events.NewMsgReceived(msg) + contact.SetLastSeenOn(msgEvent.CreatedOn()) + contactEvents := map[*flows.Contact][]flows.Event{contact: {msgEvent}} + + err := models.HandleAndCommitEvents(ctx, db, rp, oa, contactEvents) if err != nil { - return errors.Wrapf(err, "error marking message as handled") + return errors.Wrap(err, "error handling inbox message events") } - err = models.UpdateContactLastSeenOn(ctx, db, contactID, createdOn) + err = models.UpdateMessage(ctx, db, msg.ID(), models.MsgStatusHandled, models.VisibilityVisible, models.TypeInbox, topupID) if err != nil { - return errors.Wrapf(err, "error updating contact last_seen_on") + return errors.Wrapf(err, "error marking message as handled") } return nil diff --git a/web/contact/contact.go b/web/contact/contact.go index 133c69125..5b3ee550b 100644 --- a/web/contact/contact.go +++ b/web/contact/contact.go @@ -301,8 +301,9 @@ func handleModify(ctx context.Context, s *web.Server, r *http.Request) (interfac // create an environment instance with location support env := flows.NewEnvironment(oa.Env(), oa.SessionAssets().Locations()) - // create scenes for our contacts - scenes := make([]*models.Scene, 0, len(contacts)) + // gather up events for our contacts + contactEvents := make(map[*flows.Contact][]flows.Event, len(contacts)) + for _, contact := range contacts { flowContact, err := contact.FlowContact(oa) if err != nil { @@ -314,57 +315,18 @@ func handleModify(ctx context.Context, s *web.Server, r *http.Request) (interfac Events: make([]flows.Event, 0, len(mods)), } - scene := models.NewSceneForContact(flowContact) - // apply our modifiers for _, mod := range mods { mod.Apply(env, oa.SessionAssets(), flowContact, func(e flows.Event) { result.Events = append(result.Events, e) }) } results[contact.ID()] = result - scenes = append(scenes, scene) - } - - // ok, commit all our events - tx, err := s.DB.BeginTxx(ctx, nil) - if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error starting transaction") - } - - // apply our events - for _, scene := range scenes { - err := models.HandleEvents(ctx, tx, s.RP, oa, scene, results[scene.ContactID()].Events) - if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error applying events") - } - } - - // gather all our pre commit events, group them by hook and apply them - err = models.ApplyEventPreCommitHooks(ctx, tx, s.RP, oa, scenes) - if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error applying pre commit hooks") - } - - // commit our transaction - err = tx.Commit() - if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error committing pre commit hooks") + contactEvents[flowContact] = result.Events } - tx, err = s.DB.BeginTxx(ctx, nil) + err = models.HandleAndCommitEvents(ctx, s.DB, s.RP, oa, contactEvents) if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error starting transaction for post commit") - } - - // then apply our post commit hooks - err = models.ApplyEventPostCommitHooks(ctx, tx, s.RP, oa, scenes) - if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error applying pre commit hooks") - } - - err = tx.Commit() - if err != nil { - return nil, http.StatusInternalServerError, errors.Wrapf(err, "error committing pre commit hooks") + return nil, http.StatusInternalServerError, err } return results, http.StatusOK, nil From 3a8f2ebe889bb417c74977b880d078c3847b9167 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 09:47:52 -0500 Subject: [PATCH 32/56] Fix comments --- models/events.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/models/events.go b/models/events.go index 3ebb71a48..3ddb1c23e 100644 --- a/models/events.go +++ b/models/events.go @@ -191,13 +191,13 @@ func HandleAndCommitEvents(ctx context.Context, db *sqlx.DB, rp *redis.Pool, oa scenes = append(scenes, scene) } - // ok, commit all our events + // begin the transaction for handling and pre-commit hooks tx, err := db.BeginTxx(ctx, nil) if err != nil { return errors.Wrapf(err, "error beginning transaction") } - // apply our events + // handle the events to create the hooks on each scene for _, scene := range scenes { err := HandleEvents(ctx, tx, rp, oa, scene, contactEvents[scene.Contact()]) if err != nil { @@ -211,25 +211,25 @@ func HandleAndCommitEvents(ctx context.Context, db *sqlx.DB, rp *redis.Pool, oa return errors.Wrapf(err, "error applying pre commit hooks") } - // commit our transaction - err = tx.Commit() - if err != nil { + // commit the transaction + if err := tx.Commit(); err != nil { return errors.Wrapf(err, "error committing pre commit hooks") } + // begin the transaction for post-commit hooks tx, err = db.BeginTxx(ctx, nil) if err != nil { return errors.Wrapf(err, "error beginning transaction for post commit") } - // then apply our post commit hooks + // apply the post commit hooks err = ApplyEventPostCommitHooks(ctx, tx, rp, oa, scenes) if err != nil { return errors.Wrapf(err, "error applying post commit hooks") } - err = tx.Commit() - if err != nil { + // commit the transaction + if err := tx.Commit(); err != nil { return errors.Wrapf(err, "error committing post commit hooks") } return nil From d785b6d3a8fe5eddb762ffe43e722ff11778649e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 10:13:05 -0500 Subject: [PATCH 33/56] Update CHANGELOG.md for v5.7.8 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02b5cb9d6..afdc4e651 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.8 +---------- + * Recalculate event fires for campaign events based on last_seen_on + v5.7.7 ---------- * Update to latest goflow v0.100.0 From b88d0ef29913bf0ca85a93e0667652ccc7ed6008 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 11:56:53 -0500 Subject: [PATCH 34/56] Bundle localized goflow docs in release --- .github/workflows/ci.yml | 8 ++++---- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c030223d9..2d3baaaa9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,11 +57,11 @@ jobs: uses: actions/checkout@v1 - name: Fetch GoFlow docs - # for now just grab en_US/ docs and bundle as docs/ + # for backward compatibility, English docs are copied to root of docs directory run: | - GOFLOW_VERSION=$(grep goflow go.mod | cut -d" " -f2) - curl https://codeload.github.com/nyaruka/goflow/tar.gz/$GOFLOW_VERSION | tar --wildcards --strip=2 -zx "*/docs/en_US/*" - mv en_US docs + GOFLOW_VERSION=$(grep goflow go.mod | cut -d" " -f2 | cut -c2-) + curl https://codeload.github.com/nyaruka/goflow/tar.gz/v$GOFLOW_VERSION | tar --wildcards --strip=1 -zx "goflow-${GOFLOW_VERSION}/docs/*" + cp ./docs/en-us/*.* docs/ - name: Install Go uses: actions/setup-go@v1 diff --git a/go.mod b/go.mod index 0bb756c70..c278ef48d 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.100.0 + github.com/nyaruka/goflow v0.101.1 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index ede101324..498905ef8 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.100.0 h1:9Ih2vpGxlYpJFNSXhHR75mtw3Kz65O11KstztlEkW0I= -github.com/nyaruka/goflow v0.100.0/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.101.1 h1:ebC9TFVCs6Z6uyzz7HchroDVBHkyYT0vr3qP2QrbdKw= +github.com/nyaruka/goflow v0.101.1/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= From 134b4ca18aedb63f7339d7ced8872835a6633c51 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 15:21:36 -0500 Subject: [PATCH 35/56] Update to goflow v0.101.2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c278ef48d..77163c25c 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.101.1 + github.com/nyaruka/goflow v0.101.2 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index 498905ef8..287d2a026 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.101.1 h1:ebC9TFVCs6Z6uyzz7HchroDVBHkyYT0vr3qP2QrbdKw= -github.com/nyaruka/goflow v0.101.1/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/goflow v0.101.2 h1:Z5Qg6hsNHwFrlFDyXA2Xgw97Gfx96HgwRhwd8QyPGB4= +github.com/nyaruka/goflow v0.101.2/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= From 962be78ecaf937ac391fe66b8a8a0af98a57947d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 15:22:54 -0500 Subject: [PATCH 36/56] Update CHANGELOG.md for v5.7.9 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afdc4e651..0c27da28e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v5.7.9 +---------- + * Update to goflow v0.101.2 + * Bundle localized goflow docs in release + v5.7.8 ---------- * Recalculate event fires for campaign events based on last_seen_on From e915549a8e8a9ce1d3148b93b0b14e28832e5302 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 16:56:13 -0500 Subject: [PATCH 37/56] Tweak goreleaser config to include subdirectories inside docs folder --- goreleaser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goreleaser.yml b/goreleaser.yml index d4f42d28a..63c28e3e9 100644 --- a/goreleaser.yml +++ b/goreleaser.yml @@ -11,4 +11,4 @@ archives: - files: - LICENSE - README.md - - docs/* + - docs/**/* From fbbdc3cdff577e4b08190d2d5cc2ae16b77452cb Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 13 Aug 2020 16:57:54 -0500 Subject: [PATCH 38/56] Update CHANGELOG.md for v5.7.10 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c27da28e..506b44f4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.10 +---------- + * Tweak goreleaser config to include subdirectories inside docs folder + v5.7.9 ---------- * Update to goflow v0.101.2 From b54a8adbe477c381afe5e1dda8aee18832f99948 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 12 Aug 2020 12:38:50 -0500 Subject: [PATCH 39/56] Convert IVR code to use goflow's httpx package --- httputils/httputils.go | 96 ---------------------------------------- ivr/ivr.go | 50 +++++++-------------- ivr/nexmo/nexmo.go | 56 ++++++++++------------- ivr/nexmo/nexmo_test.go | 3 +- ivr/twiml/twiml.go | 62 +++++++++++--------------- models/channel_logs.go | 50 ++++++++++++++++++--- tasks/ivr/worker_test.go | 11 ++--- 7 files changed, 119 insertions(+), 209 deletions(-) delete mode 100644 httputils/httputils.go diff --git a/httputils/httputils.go b/httputils/httputils.go deleted file mode 100644 index 4c41fb50a..000000000 --- a/httputils/httputils.go +++ /dev/null @@ -1,96 +0,0 @@ -package httputils - -import ( - "net/http" - "net/http/httputil" - "time" - - "github.com/pkg/errors" -) - -// RoundTrip represents a single request / response round trip created by our transport. In the -// case of connection errors, the status code will be set to 499 and the response body will -// contain more information about the error encountered -type RoundTrip struct { - Method string - URL string - RequestBody []byte - Status int - ResponseBody []byte - StartedOn time.Time - Elapsed time.Duration -} - -// LoggingTransport is a transport which keeps track of all requests and responses -type LoggingTransport struct { - tripper http.RoundTripper - RoundTrips []*RoundTrip -} - -// RoundTrip satisfier the roundtripper interface in http to allow for capturing -// requests and responses of the parent http client. -func (t *LoggingTransport) RoundTrip(request *http.Request) (*http.Response, error) { - rt := &RoundTrip{ - StartedOn: time.Now(), - Method: request.Method, - URL: request.URL.String(), - } - - requestBody, err := httputil.DumpRequestOut(request, true) - if err != nil { - return nil, err - } - rt.RequestBody = requestBody - t.RoundTrips = append(t.RoundTrips, rt) - - response, err := t.tripper.RoundTrip(request) - rt.Elapsed = time.Since(rt.StartedOn) - - if err != nil { - err = errors.Wrapf(err, "error making http request") - rt.Status = 444 - rt.ResponseBody = []byte(err.Error()) - return response, err - } - - defer response.Body.Close() - - responseBody, err := httputil.DumpResponse(response, true) - if err != nil { - err = errors.Wrapf(err, "error dumping http response") - rt.Status = 444 - rt.ResponseBody = []byte(err.Error()) - return response, err - } - rt.ResponseBody = responseBody - rt.Status = response.StatusCode - - return response, err -} - -// NewLoggingTransport creates a new logging transport -func NewLoggingTransport(tripper http.RoundTripper) *LoggingTransport { - return &LoggingTransport{ - tripper: tripper, - } -} - -// UserAgentTransport just injects a custom user agent on the request before sending it out -type UserAgentTransport struct { - tripper http.RoundTripper - agent string -} - -// RoundTrip just injects our custom user agent, passing the request down the chain -func (t *UserAgentTransport) RoundTrip(request *http.Request) (*http.Response, error) { - request.Header.Set("User-Agent", t.agent) - return t.tripper.RoundTrip(request) -} - -// NewUserAgentTransport creates a new transport that injects a user agent in all requests -func NewUserAgentTransport(tripper http.RoundTripper, agent string) *UserAgentTransport { - return &UserAgentTransport{ - tripper: tripper, - agent: agent, - } -} diff --git a/ivr/ivr.go b/ivr/ivr.go index c7fa11ffc..11c55e76f 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -19,9 +19,9 @@ import ( "github.com/nyaruka/goflow/flows/resumes" "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/config" - "github.com/nyaruka/mailroom/httputils" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/runner" "github.com/nyaruka/mailroom/s3utils" @@ -56,7 +56,7 @@ var CallEndedError = fmt.Errorf("call ended") var constructors = make(map[models.ChannelType]ClientConstructor) // ClientConstructor defines our signature for creating a new IVR client from a channel -type ClientConstructor func(c *models.Channel) (Client, error) +type ClientConstructor func(*http.Client, *models.Channel) (Client, error) // RegisterClientType registers the passed in channel type with the passed in constructor func RegisterClientType(channelType models.ChannelType, constructor ClientConstructor) { @@ -70,14 +70,14 @@ func GetClient(channel *models.Channel) (Client, error) { return nil, errors.Errorf("no ivr client for channel type: %s", channel.Type()) } - return constructor(channel) + return constructor(http.DefaultClient, channel) } // Client defines the interface IVR clients must satisfy type Client interface { - RequestCall(client *http.Client, number urns.URN, handleURL string, statusURL string) (CallID, error) + RequestCall(number urns.URN, handleURL string, statusURL string) (CallID, *httpx.Trace, error) - HangupCall(client *http.Client, externalID string) error + HangupCall(externalID string) (*httpx.Trace, error) WriteSessionResponse(session *models.Session, number urns.URN, resumeURL string, req *http.Request, w http.ResponseWriter) error @@ -123,27 +123,19 @@ func HangupCall(ctx context.Context, config *config.Config, db *sqlx.DB, conn *m return errors.Wrapf(err, "unable to create ivr client") } - // we create our own HTTP client with our own transport so we can log the request and set our user agent - logger := httputils.NewLoggingTransport(http.DefaultTransport) - client := &http.Client{Transport: httputils.NewUserAgentTransport(logger, userAgent+config.Version)} - // try to request our call hangup - err = c.HangupCall(client, conn.ExternalID()) + trace, err := c.HangupCall(conn.ExternalID()) - // insert any logged requests - for _, rt := range logger.RoundTrips { + // insert an channel log if we have an HTTP trace + if trace != nil { desc := "Hangup Requested" isError := false - if rt.Status/100 != 2 { + if trace.Response == nil || trace.Response.StatusCode/100 != 2 { desc = "Error Hanging up Call" isError = true } - _, err := models.InsertChannelLog( - ctx, db, desc, isError, - rt.Method, rt.URL, rt.RequestBody, rt.Status, rt.ResponseBody, - rt.StartedOn, rt.Elapsed, - channel, conn, - ) + log := models.NewChannelLog(trace, isError, desc, channel, conn) + err := models.InsertChannelLogs(ctx, db, []*models.ChannelLog{log}) // log any error inserting our channel log, but try to continue if err != nil { @@ -262,27 +254,19 @@ func RequestCallStartForConnection(ctx context.Context, config *config.Config, d return errors.Wrapf(err, "unable to create ivr client") } - // we create our own HTTP client with our own transport so we can log the request and set our user agent - logger := httputils.NewLoggingTransport(http.DefaultTransport) - client := &http.Client{Transport: httputils.NewUserAgentTransport(logger, userAgent+config.Version)} - // try to request our call start - callID, err := c.RequestCall(client, telURN, resumeURL, statusURL) + callID, trace, err := c.RequestCall(telURN, resumeURL, statusURL) - // insert any logged requests - for _, rt := range logger.RoundTrips { + /// insert an channel log if we have an HTTP trace + if trace != nil { desc := "Call Requested" isError := false - if rt.Status/100 != 2 { + if trace.Response == nil || trace.Response.StatusCode/100 != 2 { desc = "Error Requesting Call" isError = true } - _, err := models.InsertChannelLog( - ctx, db, desc, isError, - rt.Method, rt.URL, rt.RequestBody, rt.Status, rt.ResponseBody, - rt.StartedOn, rt.Elapsed, - channel, conn, - ) + log := models.NewChannelLog(trace, isError, desc, channel, conn) + err := models.InsertChannelLogs(ctx, db, []*models.ChannelLog{log}) // log any error inserting our channel log, but try to continue if err != nil { diff --git a/ivr/nexmo/nexmo.go b/ivr/nexmo/nexmo.go index 7e4a33595..830f00092 100644 --- a/ivr/nexmo/nexmo.go +++ b/ivr/nexmo/nexmo.go @@ -9,7 +9,6 @@ import ( "encoding/base64" "encoding/json" "fmt" - "io" "io/ioutil" "math/rand" "net/http" @@ -25,6 +24,7 @@ import ( "github.com/nyaruka/goflow/flows/routers/waits" "github.com/nyaruka/goflow/flows/routers/waits/hints" "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" @@ -65,6 +65,7 @@ const ( var indentMarshal = true type client struct { + httpClient *http.Client channel *models.Channel baseURL string appID string @@ -76,7 +77,7 @@ func init() { } // NewClientFromChannel creates a new Twilio IVR client for the passed in account and and auth token -func NewClientFromChannel(channel *models.Channel) (ivr.Client, error) { +func NewClientFromChannel(httpClient *http.Client, channel *models.Channel) (ivr.Client, error) { appID := channel.ConfigValue(appIDConfig, "") key := channel.ConfigValue(privateKeyConfig, "") if appID == "" || key == "" { @@ -89,6 +90,7 @@ func NewClientFromChannel(channel *models.Channel) (ivr.Client, error) { } return &client{ + httpClient: httpClient, channel: channel, baseURL: BaseURL, appID: appID, @@ -280,7 +282,7 @@ type CallResponse struct { } // RequestCall causes this client to request a new outgoing call for this provider -func (c *client) RequestCall(client *http.Client, number urns.URN, resumeURL string, statusURL string) (ivr.CallID, error) { +func (c *client) RequestCall(number urns.URN, resumeURL string, statusURL string) (ivr.CallID, *httpx.Trace, error) { callR := &CallRequest{ AnswerURL: []string{resumeURL + "&sig=" + url.QueryEscape(c.calculateSignature(resumeURL))}, AnswerMethod: http.MethodPost, @@ -290,64 +292,54 @@ func (c *client) RequestCall(client *http.Client, number urns.URN, resumeURL str } rawTo, err := strconv.Atoi(number.Path()) if err != nil { - return ivr.NilCallID, errors.Wrapf(err, "unable to turn urn path into number: %s", number.Path()) + return ivr.NilCallID, nil, errors.Wrapf(err, "unable to turn urn path into number: %s", number.Path()) } callR.To = append(callR.To, Phone{Type: "phone", Number: rawTo}) rawFrom, err := strconv.Atoi(c.channel.Address()) if err != nil { - return ivr.NilCallID, errors.Wrapf(err, "unable to turn urn path into number: %s", number.Path()) + return ivr.NilCallID, nil, errors.Wrapf(err, "unable to turn urn path into number: %s", number.Path()) } callR.From = Phone{Type: "phone", Number: rawFrom} - resp, err := c.makeRequest(client, http.MethodPost, BaseURL, callR) + trace, err := c.makeRequest(http.MethodPost, BaseURL, callR) if err != nil { - return ivr.NilCallID, errors.Wrapf(err, "error trying to start call") + return ivr.NilCallID, trace, errors.Wrapf(err, "error trying to start call") } - defer resp.Body.Close() - if resp.StatusCode != http.StatusCreated { - io.Copy(ioutil.Discard, resp.Body) - return ivr.NilCallID, errors.Errorf("received non 200 status for call start: %d", resp.StatusCode) - } - - // read our body - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return ivr.NilCallID, errors.Wrapf(err, "error reading response body") + if trace.Response.StatusCode != http.StatusCreated { + return ivr.NilCallID, trace, errors.Errorf("received non 200 status for call start: %d", trace.Response.StatusCode) } // parse out our call sid call := &CallResponse{} - err = json.Unmarshal(body, call) + err = json.Unmarshal(trace.ResponseBody, call) if err != nil || call.UUID == "" { - return ivr.NilCallID, errors.Errorf("unable to read call uuid") + return ivr.NilCallID, trace, errors.Errorf("unable to read call uuid") } if call.Status == statusFailed { - return ivr.NilCallID, errors.Errorf("call status returned as failed") + return ivr.NilCallID, trace, errors.Errorf("call status returned as failed") } - logrus.WithField("body", string(body)).WithField("status", resp.StatusCode).Debug("requested call") + logrus.WithField("body", string(trace.ResponseBody)).WithField("status", trace.Response.StatusCode).Debug("requested call") - return ivr.CallID(call.UUID), nil + return ivr.CallID(call.UUID), trace, nil } // HangupCall asks Nexmo to hang up the call that is passed in -func (c *client) HangupCall(client *http.Client, callID string) error { +func (c *client) HangupCall(callID string) (*httpx.Trace, error) { hangupBody := map[string]string{"action": "hangup"} url := BaseURL + "/" + callID - resp, err := c.makeRequest(client, http.MethodPut, url, hangupBody) + trace, err := c.makeRequest(http.MethodPut, url, hangupBody) if err != nil { - return errors.Wrapf(err, "error trying to hangup call") + return trace, errors.Wrapf(err, "error trying to hangup call") } - defer resp.Body.Close() - io.Copy(ioutil.Discard, resp.Body) - if resp.StatusCode != 204 { - return errors.Errorf("received non 204 status for call hangup: %d", resp.StatusCode) + if trace.Response.StatusCode != 204 { + return trace, errors.Errorf("received non 204 status for call hangup: %d", trace.Response.StatusCode) } - return nil + return trace, nil } type NCCOInput struct { @@ -533,7 +525,7 @@ func (c *client) WriteEmptyResponse(w http.ResponseWriter, msg string) error { return err } -func (c *client) makeRequest(client *http.Client, method string, sendURL string, body interface{}) (*http.Response, error) { +func (c *client) makeRequest(method string, sendURL string, body interface{}) (*httpx.Trace, error) { bb, err := json.Marshal(body) if err != nil { return nil, errors.Wrapf(err, "error json encoding request") @@ -549,7 +541,7 @@ func (c *client) makeRequest(client *http.Client, method string, sendURL string, req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") - return client.Do(req) + return httpx.DoTrace(c.httpClient, req, nil, nil, -1) } // calculateSignature calculates a signature for the passed in URL diff --git a/ivr/nexmo/nexmo_test.go b/ivr/nexmo/nexmo_test.go index 20d6dade4..561809ddf 100644 --- a/ivr/nexmo/nexmo_test.go +++ b/ivr/nexmo/nexmo_test.go @@ -1,6 +1,7 @@ package nexmo import ( + "net/http" "testing" "github.com/nyaruka/gocommon/urns" @@ -48,7 +49,7 @@ func TestResponseForSprint(t *testing.T) { channel := oa.ChannelByUUID(models.NexmoChannelUUID) assert.NotNil(t, channel) - c, err := NewClientFromChannel(channel) + c, err := NewClientFromChannel(http.DefaultClient, channel) assert.NoError(t, err) client := c.(*client) diff --git a/ivr/twiml/twiml.go b/ivr/twiml/twiml.go index 3cea2d86f..261dedca9 100644 --- a/ivr/twiml/twiml.go +++ b/ivr/twiml/twiml.go @@ -9,26 +9,25 @@ import ( "encoding/json" "encoding/xml" "fmt" - "io" - "io/ioutil" "net/http" "net/url" "sort" "strconv" "strings" - "github.com/nyaruka/goflow/envs" - - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/events" "github.com/nyaruka/goflow/flows/routers/waits" "github.com/nyaruka/goflow/flows/routers/waits/hints" "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -100,6 +99,7 @@ var validLanguageCodes = map[string]bool{ var indentMarshal = true type client struct { + httpClient *http.Client channel *models.Channel baseURL string accountSID string @@ -114,7 +114,7 @@ func init() { } // NewClientFromChannel creates a new Twilio IVR client for the passed in account and and auth token -func NewClientFromChannel(channel *models.Channel) (ivr.Client, error) { +func NewClientFromChannel(httpClient *http.Client, channel *models.Channel) (ivr.Client, error) { accountSID := channel.ConfigValue(accountSIDConfig, "") authToken := channel.ConfigValue(authTokenConfig, "") if accountSID == "" || authToken == "" { @@ -123,6 +123,7 @@ func NewClientFromChannel(channel *models.Channel) (ivr.Client, error) { baseURL := channel.ConfigValue(baseURLConfig, channel.ConfigValue(sendURLConfig, BaseURL)) return &client{ + httpClient: httpClient, channel: channel, baseURL: baseURL, accountSID: accountSID, @@ -132,8 +133,9 @@ func NewClientFromChannel(channel *models.Channel) (ivr.Client, error) { } // NewClient creates a new Twilio IVR client for the passed in account and and auth token -func NewClient(accountSID string, authToken string) ivr.Client { +func NewClient(httpClient *http.Client, accountSID string, authToken string) ivr.Client { return &client{ + httpClient: httpClient, baseURL: BaseURL, accountSID: accountSID, authToken: authToken, @@ -173,7 +175,7 @@ type CallResponse struct { } // RequestCall causes this client to request a new outgoing call for this provider -func (c *client) RequestCall(client *http.Client, number urns.URN, callbackURL string, statusURL string) (ivr.CallID, error) { +func (c *client) RequestCall(number urns.URN, callbackURL string, statusURL string) (ivr.CallID, *httpx.Trace, error) { form := url.Values{} form.Set("To", number.Path()) form.Set("From", c.channel.Address()) @@ -182,57 +184,47 @@ func (c *client) RequestCall(client *http.Client, number urns.URN, callbackURL s sendURL := c.baseURL + strings.Replace(callPath, "{AccountSID}", c.accountSID, -1) - resp, err := c.postRequest(client, sendURL, form) + trace, err := c.postRequest(sendURL, form) if err != nil { - return ivr.NilCallID, errors.Wrapf(err, "error trying to start call") - } - defer resp.Body.Close() - - if resp.StatusCode != 201 { - io.Copy(ioutil.Discard, resp.Body) - return ivr.NilCallID, errors.Errorf("received non 201 status for call start: %d", resp.StatusCode) + return ivr.NilCallID, trace, errors.Wrapf(err, "error trying to start call") } - // read our body - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return ivr.NilCallID, errors.Wrapf(err, "error reading response body") + if trace.Response.StatusCode != 201 { + return ivr.NilCallID, trace, errors.Errorf("received non 201 status for call start: %d", trace.Response.StatusCode) } // parse out our call sid call := &CallResponse{} - err = json.Unmarshal(body, call) + err = json.Unmarshal(trace.ResponseBody, call) if err != nil || call.SID == "" { - return ivr.NilCallID, errors.Errorf("unable to read call id") + return ivr.NilCallID, trace, errors.Errorf("unable to read call id") } if call.Status == statusFailed { - return ivr.NilCallID, errors.Errorf("call status returned as failed") + return ivr.NilCallID, trace, errors.Errorf("call status returned as failed") } - return ivr.CallID(call.SID), nil + return ivr.CallID(call.SID), trace, nil } // HangupCall asks Twilio to hang up the call that is passed in -func (c *client) HangupCall(client *http.Client, callID string) error { +func (c *client) HangupCall(callID string) (*httpx.Trace, error) { form := url.Values{} form.Set("Status", "completed") sendURL := c.baseURL + strings.Replace(hangupPath, "{AccountSID}", c.accountSID, -1) sendURL = strings.Replace(sendURL, "{SID}", callID, -1) - resp, err := c.postRequest(client, sendURL, form) + trace, err := c.postRequest(sendURL, form) if err != nil { - return errors.Wrapf(err, "error trying to hangup call") + return trace, errors.Wrapf(err, "error trying to hangup call") } - defer resp.Body.Close() - io.Copy(ioutil.Discard, resp.Body) - if resp.StatusCode != 200 { - return errors.Errorf("received non 204 trying to hang up call: %d", resp.StatusCode) + if trace.Response.StatusCode != 200 { + return trace, errors.Errorf("received non 204 trying to hang up call: %d", trace.Response.StatusCode) } - return nil + return trace, nil } // InputForRequest returns the input for the passed in request, if any @@ -376,13 +368,13 @@ func (c *client) WriteEmptyResponse(w http.ResponseWriter, msg string) error { return err } -func (c *client) postRequest(client *http.Client, sendURL string, form url.Values) (*http.Response, error) { +func (c *client) postRequest(sendURL string, form url.Values) (*httpx.Trace, error) { req, _ := http.NewRequest(http.MethodPost, sendURL, strings.NewReader(form.Encode())) req.SetBasicAuth(c.accountSID, c.authToken) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("Accept", "application/json") - return client.Do(req) + return httpx.DoTrace(c.httpClient, req, nil, nil, -1) } // see https://www.twilio.com/docs/api/security diff --git a/models/channel_logs.go b/models/channel_logs.go index 82e3a14bc..b76ada7f2 100644 --- a/models/channel_logs.go +++ b/models/channel_logs.go @@ -5,6 +5,7 @@ import ( "time" "github.com/jmoiron/sqlx" + "github.com/nyaruka/goflow/utils/httpx" "github.com/pkg/errors" ) @@ -35,17 +36,52 @@ func (l *ChannelLog) ID() ChannelLogID { return l.l.ID } const insertChannelLogSQL = ` INSERT INTO - channels_channellog( - description, is_error, url, method, request, response, response_status, - created_on, request_time, channel_id, connection_id) - VALUES( - :description, :is_error, :url, :method, :request, :response, :response_status, - :created_on, :request_time, :channel_id, :connection_id) - + channels_channellog( description, is_error, url, method, request, response, response_status, created_on, request_time, channel_id, connection_id) + VALUES(:description, :is_error, :url, :method, :request, :response, :response_status, :created_on, :request_time, :channel_id, :connection_id) RETURNING id as id ` +// NewChannelLog creates a new channel log +func NewChannelLog(trace *httpx.Trace, isError bool, desc string, channel *Channel, conn *ChannelConnection) *ChannelLog { + log := &ChannelLog{} + l := &log.l + + statusCode := 0 + if trace.Response != nil { + statusCode = trace.Response.StatusCode + } + + l.Description = desc + l.IsError = isError + l.URL = trace.Request.URL.String() + l.Method = trace.Request.Method + l.Request = string(trace.RequestTrace) + l.Response = trace.ResponseTraceUTF8("...") + l.Status = statusCode + l.CreatedOn = trace.StartTime + l.RequestTime = int((trace.EndTime.Sub(trace.StartTime)) / time.Millisecond) + l.ChannelID = channel.ID() + if conn != nil { + l.ConnectionID = conn.ID() + } + return log +} + +// InsertChannelLogs writes the given channel logs to the db +func InsertChannelLogs(ctx context.Context, db *sqlx.DB, logs []*ChannelLog) error { + ls := make([]interface{}, len(logs)) + for i := range logs { + ls[i] = logs[i].l + } + + err := BulkSQL(ctx, "insert channel log", db, insertChannelLogSQL, ls) + if err != nil { + return errors.Wrapf(err, "error inserting channel log") + } + return nil +} + // InsertChannelLog writes a channel log to the db returning the inserted log func InsertChannelLog(ctx context.Context, db *sqlx.DB, desc string, isError bool, method string, url string, request []byte, status int, response []byte, diff --git a/tasks/ivr/worker_test.go b/tasks/ivr/worker_test.go index 55120b8df..b9917c533 100644 --- a/tasks/ivr/worker_test.go +++ b/tasks/ivr/worker_test.go @@ -10,6 +10,7 @@ import ( "github.com/jmoiron/sqlx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" @@ -70,7 +71,7 @@ func TestIVR(t *testing.T) { var client = &MockClient{} -func newMockClient(channel *models.Channel) (ivr.Client, error) { +func newMockClient(httpClient *http.Client, channel *models.Channel) (ivr.Client, error) { return client, nil } @@ -79,12 +80,12 @@ type MockClient struct { callError error } -func (c *MockClient) RequestCall(client *http.Client, number urns.URN, handleURL string, statusURL string) (ivr.CallID, error) { - return c.callID, c.callError +func (c *MockClient) RequestCall(number urns.URN, handleURL string, statusURL string) (ivr.CallID, *httpx.Trace, error) { + return c.callID, nil, c.callError } -func (c *MockClient) HangupCall(client *http.Client, externalID string) error { - return nil +func (c *MockClient) HangupCall(externalID string) (*httpx.Trace, error) { + return nil, nil } func (c *MockClient) WriteSessionResponse(session *models.Session, number urns.URN, resumeURL string, req *http.Request, w http.ResponseWriter) error { From 6dfbee6028befb993f11be4295da3ba67a57a5e6 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 18 Aug 2020 14:54:45 -0500 Subject: [PATCH 40/56] Update to latest goflow v0.102.0 --- go.mod | 6 +++--- go.sum | 13 ++++++------- goflow/engine_test.go | 2 +- goflow/http.go | 2 +- hooks/airtime_transferred_test.go | 2 +- hooks/service_called_test.go | 2 +- hooks/session_triggered.go | 2 +- hooks/ticket_opened_test.go | 2 +- hooks/webhook_called_test.go | 2 +- ivr/ivr.go | 2 +- ivr/nexmo/nexmo.go | 2 +- ivr/twiml/twiml.go | 2 +- models/channel_logs.go | 2 +- models/http_logs_test.go | 2 +- models/orgs.go | 4 ++-- models/starts.go | 2 +- models/tickets.go | 4 ++-- models/tickets_test.go | 2 +- services/tickets/mailgun/client.go | 4 ++-- services/tickets/mailgun/client_test.go | 2 +- services/tickets/mailgun/service.go | 2 +- services/tickets/mailgun/service_test.go | 4 ++-- services/tickets/zendesk/client.go | 4 ++-- services/tickets/zendesk/client_test.go | 2 +- services/tickets/zendesk/service.go | 4 ++-- services/tickets/zendesk/service_test.go | 4 ++-- services/tickets/zendesk/utils.go | 2 +- services/tickets/zendesk/utils_test.go | 2 +- tasks/ivr/worker_test.go | 2 +- web/errors_test.go | 2 +- web/server.go | 2 +- web/testing.go | 6 +++--- web/wrappers_test.go | 2 +- 33 files changed, 49 insertions(+), 50 deletions(-) diff --git a/go.mod b/go.mod index 77163c25c..184014d8d 100644 --- a/go.mod +++ b/go.mod @@ -18,8 +18,8 @@ require ( github.com/lib/pq v1.4.0 github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 - github.com/nyaruka/gocommon v1.2.0 - github.com/nyaruka/goflow v0.101.2 + github.com/nyaruka/gocommon v1.3.0 + github.com/nyaruka/goflow v0.102.0 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 @@ -28,7 +28,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.9.1 - github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 + github.com/shopspring/decimal v1.2.0 github.com/sirupsen/logrus v1.5.0 github.com/stretchr/testify v1.5.1 gopkg.in/go-playground/validator.v9 v9.31.0 diff --git a/go.sum b/go.sum index 287d2a026..02280c601 100644 --- a/go.sum +++ b/go.sum @@ -128,10 +128,10 @@ github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= -github.com/nyaruka/gocommon v1.2.0 h1:gCmVCXYZFwKDMqQj8R1jNlK+7a06khKFq3zX8fBBbzw= -github.com/nyaruka/gocommon v1.2.0/go.mod h1:9Y21Fd6iZXDLHWTRiZAc6b4LQSCi6HEEQK4SB45Yav4= -github.com/nyaruka/goflow v0.101.2 h1:Z5Qg6hsNHwFrlFDyXA2Xgw97Gfx96HgwRhwd8QyPGB4= -github.com/nyaruka/goflow v0.101.2/go.mod h1:ttUI9hd9ufGU/3EqIst6Hdc68imMG1utlqcELbYrtOQ= +github.com/nyaruka/gocommon v1.3.0 h1:IqaPT4KQ2oVq/2Ivp/c+RVCs8v71+RzPU2VhMoRrgpU= +github.com/nyaruka/gocommon v1.3.0/go.mod h1:w7lKxIkm/qLAoO9Y3aI1LV7EiYogn6+1C8MTEjxTC9M= +github.com/nyaruka/goflow v0.102.0 h1:WdcQYZ8smr+M2Xbz+3kg1wSl8pVPwz7Ba0Z2ivvehlQ= +github.com/nyaruka/goflow v0.102.0/go.mod h1:wuvXZTs6a6S1rjSRLaQGVxDfKomDJ/1XQoLXCqFekK4= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= @@ -170,9 +170,8 @@ github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shopspring/decimal v0.0.0-20180319170823-2df3e6ddaf6e/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= diff --git a/goflow/engine_test.go b/goflow/engine_test.go index a00e68dff..77bfa1dab 100644 --- a/goflow/engine_test.go +++ b/goflow/engine_test.go @@ -4,9 +4,9 @@ import ( "net/http" "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/goflow" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" diff --git a/goflow/http.go b/goflow/http.go index a37cf1032..1dfb85800 100644 --- a/goflow/http.go +++ b/goflow/http.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "github.com/nyaruka/goflow/utils/httpx" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/mailroom/config" ) diff --git a/hooks/airtime_transferred_test.go b/hooks/airtime_transferred_test.go index e69314d9f..5970fa399 100644 --- a/hooks/airtime_transferred_test.go +++ b/hooks/airtime_transferred_test.go @@ -4,9 +4,9 @@ import ( "strings" "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/actions" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" diff --git a/hooks/service_called_test.go b/hooks/service_called_test.go index 8142e6522..a17718320 100644 --- a/hooks/service_called_test.go +++ b/hooks/service_called_test.go @@ -3,10 +3,10 @@ package hooks import ( "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/actions" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/models" ) diff --git a/hooks/session_triggered.go b/hooks/session_triggered.go index 0bb42bbb7..1a816f0a3 100644 --- a/hooks/session_triggered.go +++ b/hooks/session_triggered.go @@ -5,9 +5,9 @@ import ( "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/events" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/pkg/errors" diff --git a/hooks/ticket_opened_test.go b/hooks/ticket_opened_test.go index 317bcb963..3d777c615 100644 --- a/hooks/ticket_opened_test.go +++ b/hooks/ticket_opened_test.go @@ -3,10 +3,10 @@ package hooks import ( "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/actions" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" diff --git a/hooks/webhook_called_test.go b/hooks/webhook_called_test.go index ed37ed479..f5f520db0 100644 --- a/hooks/webhook_called_test.go +++ b/hooks/webhook_called_test.go @@ -6,9 +6,9 @@ import ( "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/actions" - "github.com/nyaruka/goflow/utils/httpx" ) func TestWebhookCalled(t *testing.T) { diff --git a/ivr/ivr.go b/ivr/ivr.go index 11c55e76f..58156c2bf 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -12,6 +12,7 @@ import ( "strings" "time" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/excellent/types" @@ -19,7 +20,6 @@ import ( "github.com/nyaruka/goflow/flows/resumes" "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/models" diff --git a/ivr/nexmo/nexmo.go b/ivr/nexmo/nexmo.go index 830f00092..bc1da095a 100644 --- a/ivr/nexmo/nexmo.go +++ b/ivr/nexmo/nexmo.go @@ -18,13 +18,13 @@ import ( "strings" "time" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/flows/events" "github.com/nyaruka/goflow/flows/routers/waits" "github.com/nyaruka/goflow/flows/routers/waits/hints" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" diff --git a/ivr/twiml/twiml.go b/ivr/twiml/twiml.go index 261dedca9..c52fee633 100644 --- a/ivr/twiml/twiml.go +++ b/ivr/twiml/twiml.go @@ -15,6 +15,7 @@ import ( "strconv" "strings" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" @@ -22,7 +23,6 @@ import ( "github.com/nyaruka/goflow/flows/routers/waits" "github.com/nyaruka/goflow/flows/routers/waits/hints" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" diff --git a/models/channel_logs.go b/models/channel_logs.go index b76ada7f2..9b6467695 100644 --- a/models/channel_logs.go +++ b/models/channel_logs.go @@ -5,7 +5,7 @@ import ( "time" "github.com/jmoiron/sqlx" - "github.com/nyaruka/goflow/utils/httpx" + "github.com/nyaruka/gocommon/httpx" "github.com/pkg/errors" ) diff --git a/models/http_logs_test.go b/models/http_logs_test.go index 3210f3798..3324e26b6 100644 --- a/models/http_logs_test.go +++ b/models/http_logs_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" diff --git a/models/orgs.go b/models/orgs.go index f609f1e3c..f1a1acc84 100644 --- a/models/orgs.go +++ b/models/orgs.go @@ -6,12 +6,12 @@ import ( "net/http" "time" + "github.com/nyaruka/gocommon/httpx" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/services/airtime/dtone" "github.com/nyaruka/goflow/services/email/smtp" - "github.com/nyaruka/goflow/utils/httpx" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/goflow" "github.com/nyaruka/null" diff --git a/models/starts.go b/models/starts.go index 4353a6f02..a4d8a78f6 100644 --- a/models/starts.go +++ b/models/starts.go @@ -6,9 +6,9 @@ import ( "encoding/json" "github.com/jmoiron/sqlx" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/null" "github.com/pkg/errors" diff --git a/models/tickets.go b/models/tickets.go index dff9844b5..b9f81edd5 100644 --- a/models/tickets.go +++ b/models/tickets.go @@ -7,11 +7,11 @@ import ( "net/http" "time" + "github.com/nyaruka/gocommon/dates" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/dates" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/goflow" "github.com/nyaruka/null" diff --git a/models/tickets_test.go b/models/tickets_test.go index 39624cac2..4e37866f0 100644 --- a/models/tickets_test.go +++ b/models/tickets_test.go @@ -3,8 +3,8 @@ package models_test import ( "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/models" _ "github.com/nyaruka/mailroom/services/tickets/mailgun" _ "github.com/nyaruka/mailroom/services/tickets/zendesk" diff --git a/services/tickets/mailgun/client.go b/services/tickets/mailgun/client.go index 6140490b1..b64a7a554 100644 --- a/services/tickets/mailgun/client.go +++ b/services/tickets/mailgun/client.go @@ -7,9 +7,9 @@ import ( "net/http" "sort" + "github.com/nyaruka/gocommon/httpx" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/httpx" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/goflow/utils/uuids" "github.com/pkg/errors" ) diff --git a/services/tickets/mailgun/client_test.go b/services/tickets/mailgun/client_test.go index f03bdd092..cb9909d0f 100644 --- a/services/tickets/mailgun/client_test.go +++ b/services/tickets/mailgun/client_test.go @@ -4,7 +4,7 @@ import ( "net/http" "testing" - "github.com/nyaruka/goflow/utils/httpx" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/services/tickets/mailgun" diff --git a/services/tickets/mailgun/service.go b/services/tickets/mailgun/service.go index 301ad7c88..de04e137a 100644 --- a/services/tickets/mailgun/service.go +++ b/services/tickets/mailgun/service.go @@ -7,9 +7,9 @@ import ( "strings" "text/template" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/services/tickets" diff --git a/services/tickets/mailgun/service_test.go b/services/tickets/mailgun/service_test.go index ad72b2f0f..2be0f4370 100644 --- a/services/tickets/mailgun/service_test.go +++ b/services/tickets/mailgun/service_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" + "github.com/nyaruka/gocommon/dates" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/assets/static/types" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/test" - "github.com/nyaruka/goflow/utils/dates" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/services/tickets/mailgun" diff --git a/services/tickets/zendesk/client.go b/services/tickets/zendesk/client.go index 48452fb0f..905576cb3 100644 --- a/services/tickets/zendesk/client.go +++ b/services/tickets/zendesk/client.go @@ -10,8 +10,8 @@ import ( "strings" "time" - "github.com/nyaruka/goflow/utils/httpx" - "github.com/nyaruka/goflow/utils/jsonx" + "github.com/nyaruka/gocommon/httpx" + "github.com/nyaruka/gocommon/jsonx" ) type baseClient struct { diff --git a/services/tickets/zendesk/client_test.go b/services/tickets/zendesk/client_test.go index 9419da6eb..800dff00c 100644 --- a/services/tickets/zendesk/client_test.go +++ b/services/tickets/zendesk/client_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/nyaruka/goflow/utils/httpx" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/mailroom/services/tickets/zendesk" "github.com/stretchr/testify/assert" diff --git a/services/tickets/zendesk/service.go b/services/tickets/zendesk/service.go index 50fe626df..0d2c2a399 100644 --- a/services/tickets/zendesk/service.go +++ b/services/tickets/zendesk/service.go @@ -4,10 +4,10 @@ import ( "fmt" "net/http" + "github.com/nyaruka/gocommon/dates" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/dates" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" diff --git a/services/tickets/zendesk/service_test.go b/services/tickets/zendesk/service_test.go index a7da7a581..f6397ac6d 100644 --- a/services/tickets/zendesk/service_test.go +++ b/services/tickets/zendesk/service_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" + "github.com/nyaruka/gocommon/dates" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/assets/static/types" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/test" - "github.com/nyaruka/goflow/utils/dates" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/services/tickets/zendesk" diff --git a/services/tickets/zendesk/utils.go b/services/tickets/zendesk/utils.go index ce4004111..63c8db1db 100644 --- a/services/tickets/zendesk/utils.go +++ b/services/tickets/zendesk/utils.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/nyaruka/goflow/utils/dates" + "github.com/nyaruka/gocommon/dates" "github.com/nyaruka/mailroom/models" "github.com/pkg/errors" diff --git a/services/tickets/zendesk/utils_test.go b/services/tickets/zendesk/utils_test.go index 8c762528a..aeaf8938e 100644 --- a/services/tickets/zendesk/utils_test.go +++ b/services/tickets/zendesk/utils_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/nyaruka/goflow/utils/dates" + "github.com/nyaruka/gocommon/dates" "github.com/nyaruka/mailroom/services/tickets/zendesk" "github.com/stretchr/testify/assert" diff --git a/tasks/ivr/worker_test.go b/tasks/ivr/worker_test.go index b9917c533..1080043c1 100644 --- a/tasks/ivr/worker_test.go +++ b/tasks/ivr/worker_test.go @@ -8,9 +8,9 @@ import ( "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/gocommon/urns" "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" diff --git a/web/errors_test.go b/web/errors_test.go index 34f469c7e..56e6d706b 100644 --- a/web/errors_test.go +++ b/web/errors_test.go @@ -3,9 +3,9 @@ package web_test import ( "testing" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/goflow/contactql" "github.com/nyaruka/goflow/envs" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/mailroom/web" "github.com/pkg/errors" diff --git a/web/server.go b/web/server.go index 43a28ceec..53135c11a 100644 --- a/web/server.go +++ b/web/server.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "github.com/nyaruka/goflow/utils/jsonx" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/mailroom/config" "github.com/aws/aws-sdk-go/service/s3/s3iface" diff --git a/web/testing.go b/web/testing.go index 804cb2628..12e4b22bf 100644 --- a/web/testing.go +++ b/web/testing.go @@ -13,10 +13,10 @@ import ( "testing" "time" + "github.com/nyaruka/gocommon/dates" + "github.com/nyaruka/gocommon/httpx" + "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/goflow/test" - "github.com/nyaruka/goflow/utils/dates" - "github.com/nyaruka/goflow/utils/httpx" - "github.com/nyaruka/goflow/utils/jsonx" "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/testsuite" diff --git a/web/wrappers_test.go b/web/wrappers_test.go index 53187d63b..3c426daf1 100644 --- a/web/wrappers_test.go +++ b/web/wrappers_test.go @@ -5,8 +5,8 @@ import ( "net/http" "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/flows" - "github.com/nyaruka/goflow/utils/httpx" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/testsuite" "github.com/nyaruka/mailroom/web" From 3d503b3621a836ca06cbad1e45cf3b36157b31d3 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 19 Aug 2020 15:16:08 -0500 Subject: [PATCH 41/56] Always write contact.status when writing is_blocked or is_stopped --- hooks/contact_status_changed_test.go | 25 +++++++++--------- mailroom_test.dump | Bin 1841664 -> 1841741 bytes models/contacts.go | 38 +++++++++++++++++++++------ models/contacts_test.go | 14 +++++----- tasks/handler/handler_test.go | 2 +- 5 files changed, 50 insertions(+), 29 deletions(-) diff --git a/hooks/contact_status_changed_test.go b/hooks/contact_status_changed_test.go index ad97c3b11..94978f90f 100644 --- a/hooks/contact_status_changed_test.go +++ b/hooks/contact_status_changed_test.go @@ -14,46 +14,45 @@ func TestContactStatusChanged(t *testing.T) { db := testsuite.DB() // make sure cathyID contact is active - db.Exec(`UPDATE contacts_contact SET is_blocked = FALSE WHERE id = $1`, models.CathyID) - db.Exec(`UPDATE contacts_contact SET is_stopped = FALSE WHERE id = $1`, models.CathyID) + db.Exec(`UPDATE contacts_contact SET status = 'A', is_blocked = FALSE, is_stopped = FALSE WHERE id = $1`, models.CathyID) tcs := []HookTestCase{ - HookTestCase{ + { Modifiers: ContactModifierMap{ models.CathyID: []flows.Modifier{modifiers.NewStatus(flows.ContactStatusBlocked)}, }, SQLAssertions: []SQLAssertion{ - SQLAssertion{ - SQL: `select count(*) from contacts_contact where id = $1 AND is_blocked = TRUE`, + { + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'B' AND is_blocked = TRUE`, Args: []interface{}{models.CathyID}, Count: 1, }, }, }, - HookTestCase{ + { Modifiers: ContactModifierMap{ models.CathyID: []flows.Modifier{modifiers.NewStatus(flows.ContactStatusStopped)}, }, SQLAssertions: []SQLAssertion{ - SQLAssertion{ - SQL: `select count(*) from contacts_contact where id = $1 AND is_stopped = TRUE`, + { + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'S' AND is_stopped = TRUE`, Args: []interface{}{models.CathyID}, Count: 1, }, }, }, - HookTestCase{ + { Modifiers: ContactModifierMap{ models.CathyID: []flows.Modifier{modifiers.NewStatus(flows.ContactStatusActive)}, }, SQLAssertions: []SQLAssertion{ - SQLAssertion{ - SQL: `select count(*) from contacts_contact where id = $1 AND is_stopped = FALSE`, + { + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'A' AND is_stopped = FALSE`, Args: []interface{}{models.CathyID}, Count: 1, }, - SQLAssertion{ - SQL: `select count(*) from contacts_contact where id = $1 AND is_blocked = FALSE`, + { + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'A' AND is_blocked = FALSE`, Args: []interface{}{models.CathyID}, Count: 1, }, diff --git a/mailroom_test.dump b/mailroom_test.dump index 26cd512995de4a62ce1932642075bc4443b7db6e..cb0c74125073e0ea9d742f1efb07d900300958b3 100644 GIT binary patch delta 64296 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

;VgB$pya{9+HQrA9zz^Z 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 CP}au) diff --git a/models/contacts.go b/models/contacts.go index ba93b49e5..3bd00c6d9 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -41,6 +41,23 @@ const ( NilContactID = ContactID(0) ) +// ContactStatus is the type for contact statuses +type ContactStatus string + +// possible contact statuses +const ( + ContactStatusActive = "A" + ContactStatusBlocked = "B" + ContactStatusStopped = "S" + ContactStatusArchived = "V" +) + +var contactStatusMap = map[flows.ContactStatus]ContactStatus{ + flows.ContactStatusActive: ContactStatusActive, + flows.ContactStatusBlocked: ContactStatusBlocked, + flows.ContactStatusStopped: ContactStatusStopped, +} + // LoadContact loads a contact from the passed in id func LoadContact(ctx context.Context, db Queryer, org *OrgAssets, id ContactID) (*Contact, error) { contacts, err := LoadContacts(ctx, db, org, []ContactID{id}) @@ -366,7 +383,7 @@ func (c *Contact) URNForID(urnID URNID) urns.URN { // Unstop sets the is_stopped attribute to false for this contact func (c *Contact) Unstop(ctx context.Context, db *sqlx.DB) error { - _, err := db.ExecContext(ctx, `UPDATE contacts_contact SET is_stopped = FALSE, modified_on = NOW() WHERE id = $1`, c.id) + _, err := db.ExecContext(ctx, `UPDATE contacts_contact SET status = 'A', is_stopped = FALSE, modified_on = NOW() WHERE id = $1`, c.id) if err != nil { return errors.Wrapf(err, "error unstopping contact") } @@ -619,9 +636,9 @@ func CreateContact(ctx context.Context, db *sqlx.DB, org *OrgAssets, urn urns.UR err = tx.GetContext(ctx, &contactID, `INSERT INTO contacts_contact - (org_id, is_active, is_blocked, is_stopped, uuid, created_on, modified_on, created_by_id, modified_by_id, name) + (org_id, is_active, status, is_blocked, is_stopped, uuid, created_on, modified_on, created_by_id, modified_by_id, name) VALUES - ($1, TRUE, FALSE, FALSE, $2, NOW(), NOW(), 1, 1, '') + ($1, TRUE, 'A', FALSE, FALSE, $2, NOW(), NOW(), 1, 1, '') RETURNING id`, org.OrgID(), uuids.New(), ) @@ -922,6 +939,7 @@ UPDATE contacts_contact SET is_stopped = TRUE, + status = 'S', modified_on = NOW() WHERE id = $1 @@ -1316,9 +1334,10 @@ type ContactStatusChange struct { } type contactStatusUpdate struct { - ContactID ContactID `db:"id"` - Blocked bool `db:"is_blocked"` - Stopped bool `db:"is_stopped"` + ContactID ContactID `db:"id"` + Status ContactStatus `db:"status"` + Blocked bool `db:"is_blocked"` + Stopped bool `db:"is_stopped"` } // UpdateContactStatus updates the contacts status as the passed changes @@ -1330,6 +1349,7 @@ func UpdateContactStatus(ctx context.Context, tx Queryer, changes []*ContactStat for _, ch := range changes { blocked := ch.Status == flows.ContactStatusBlocked stopped := ch.Status == flows.ContactStatusStopped + status := contactStatusMap[ch.Status] if blocked || stopped { archiveTriggersForContactIDs = append(archiveTriggersForContactIDs, ch.ContactID) @@ -1339,6 +1359,7 @@ func UpdateContactStatus(ctx context.Context, tx Queryer, changes []*ContactStat statusUpdates, &contactStatusUpdate{ ContactID: ch.ContactID, + Status: status, Blocked: blocked, Stopped: stopped, }, @@ -1364,13 +1385,14 @@ const updateContactStatusSQL = ` UPDATE contacts_contact c SET + status = r.status, is_blocked = r.is_blocked::boolean, is_stopped = r.is_stopped::boolean, modified_on = NOW() FROM ( - VALUES(:id, :is_blocked, :is_stopped) + VALUES(:id, :status, :is_blocked, :is_stopped) ) AS - r(id, is_blocked, is_stopped) + r(id, status, is_blocked, is_stopped) WHERE c.id = r.id::int ` diff --git a/models/contacts_test.go b/models/contacts_test.go index aba1f53a4..bc41c62e1 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -329,7 +329,7 @@ func TestStopContact(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contactgroup_contacts WHERE contact_id = $1`, []interface{}{CathyID}, 1) // verify she's stopped - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_stopped = TRUE AND is_active = TRUE and is_blocked = FALSE`, []interface{}{CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE AND is_active = TRUE and is_blocked = FALSE`, []interface{}{CathyID}, 1) } func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { @@ -405,24 +405,24 @@ func TestUpdateContactStatus(t *testing.T) { err := UpdateContactStatus(ctx, db, []*ContactStatusChange{}) assert.NoError(t, err) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_blocked = TRUE`, []interface{}{CathyID}, 0) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_stopped = TRUE`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B' AND is_blocked = TRUE`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{CathyID}, 0) changes := make([]*ContactStatusChange, 0, 1) changes = append(changes, &ContactStatusChange{CathyID, flows.ContactStatusBlocked}) err = UpdateContactStatus(ctx, db, changes) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_blocked = TRUE`, []interface{}{CathyID}, 1) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_stopped = TRUE`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B' AND is_blocked = TRUE`, []interface{}{CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{CathyID}, 0) changes = make([]*ContactStatusChange, 0, 1) changes = append(changes, &ContactStatusChange{CathyID, flows.ContactStatusStopped}) err = UpdateContactStatus(ctx, db, changes) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_blocked = TRUE`, []interface{}{CathyID}, 0) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_stopped = TRUE`, []interface{}{CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B' AND is_blocked = TRUE`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{CathyID}, 1) } diff --git a/tasks/handler/handler_test.go b/tasks/handler/handler_test.go index 4821c56ce..ea20b112a 100644 --- a/tasks/handler/handler_test.go +++ b/tasks/handler/handler_test.go @@ -347,7 +347,7 @@ func TestStopEvent(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) from contacts_contactgroup_contacts WHERE contactgroup_id = $1 AND contact_id = $2`, []interface{}{models.DoctorsGroupID, models.GeorgeID}, 1) // that cathy is stopped - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND is_stopped = TRUE`, []interface{}{models.CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{models.CathyID}, 1) // and has no upcoming events testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM campaigns_eventfire WHERE contact_id = $1`, []interface{}{models.CathyID}, 0) From c372903f49a33ab9fa14e079c2853185ae11671e Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 20 Aug 2020 09:50:12 -0500 Subject: [PATCH 42/56] Update CHANGELOG.md for v5.7.11 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 506b44f4f..090c51ad0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v5.7.11 +---------- + * Always write contact.status when writing is_blocked or is_stopped + * Convert IVR code to use goflow's httpx package + v5.7.10 ---------- * Tweak goreleaser config to include subdirectories inside docs folder From 5dc65693948a0f92d364f8aad534483977cba625 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 19 Aug 2020 13:43:13 -0500 Subject: [PATCH 43/56] WIP --- services/tickets/mailgun/web.go | 2 +- services/tickets/utils.go | 16 ++++++++++++---- services/tickets/zendesk/client.go | 19 +++++++++++++------ services/tickets/zendesk/web.go | 2 +- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/services/tickets/mailgun/web.go b/services/tickets/mailgun/web.go index 4bf64b36d..2fdcc3db2 100644 --- a/services/tickets/mailgun/web.go +++ b/services/tickets/mailgun/web.go @@ -112,7 +112,7 @@ func handleReceive(ctx context.Context, s *web.Server, r *http.Request, l *model return errors.Wrapf(err, "error updating ticket: %s", ticket.UUID()), http.StatusInternalServerError, nil } - msg, err := tickets.SendReply(ctx, s.DB, s.RP, ticket, request.StrippedText) + msg, err := tickets.SendReply(ctx, s.DB, s.RP, ticket, request.StrippedText, nil) if err != nil { return err, http.StatusInternalServerError, nil } diff --git a/services/tickets/utils.go b/services/tickets/utils.go index 42d0f44d6..cee5a3def 100644 --- a/services/tickets/utils.go +++ b/services/tickets/utils.go @@ -6,6 +6,7 @@ import ( "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/courier" "github.com/nyaruka/mailroom/models" @@ -69,17 +70,24 @@ func FromTicketerUUID(ctx context.Context, db *sqlx.DB, uuid assets.TicketerUUID } // SendReply sends a message reply from the ticket system user to the contact -func SendReply(ctx context.Context, db *sqlx.DB, rp *redis.Pool, ticket *models.Ticket, text string) (*models.Msg, error) { +func SendReply(ctx context.Context, db *sqlx.DB, rp *redis.Pool, ticket *models.Ticket, text string, fileURLs []string) (*models.Msg, error) { // look up our assets assets, err := models.GetOrgAssets(ctx, db, ticket.OrgID()) if err != nil { return nil, errors.Wrapf(err, "error looking up org #%d", ticket.OrgID()) } + // fetch and files and prepare as attachments + attachments := make([]utils.Attachment, len(fileURLs)) + //for i := range fileURLs { + // // TODO + // + //attachments[i] = + //} + // build a simple translation - translations := map[envs.Language]*models.BroadcastTranslation{ - envs.Language("base"): {Text: text}, - } + base := &models.BroadcastTranslation{Text: text, Attachments: attachments} + translations := map[envs.Language]*models.BroadcastTranslation{envs.Language("base"): base} // we'll use a broadcast to send this message bcast := models.NewBroadcast(assets.OrgID(), models.NilBroadcastID, translations, models.TemplateStateEvaluated, envs.Language("base"), nil, nil, nil) diff --git a/services/tickets/zendesk/client.go b/services/tickets/zendesk/client.go index 905576cb3..04ca35a14 100644 --- a/services/tickets/zendesk/client.go +++ b/services/tickets/zendesk/client.go @@ -2,7 +2,6 @@ package zendesk import ( "bytes" - "encoding/json" "errors" "fmt" "io" @@ -224,13 +223,19 @@ func NewPushClient(httpClient *http.Client, httpRetries *httpx.RetryConfig, subd return &PushClient{baseClient: newBaseClient(httpClient, httpRetries, subdomain, token)} } +// FieldValue is a value for the named field +type FieldValue struct { + ID string `json:"id"` + Value string `json:"value"` +} + // Author see https://developer.zendesk.com/rest_api/docs/support/channel_framework#author-object type Author struct { - ExternalID string `json:"external_id"` - Name string `json:"name,omitempty"` - ImageURL string `json:"image_url,omitempty"` - Locale string `json:"locale,omitempty"` - Fields json.RawMessage `json:"fields,omitempty"` + ExternalID string `json:"external_id"` + Name string `json:"name,omitempty"` + ImageURL string `json:"image_url,omitempty"` + Locale string `json:"locale,omitempty"` + Fields []FieldValue `json:"fields,omitempty"` } // DisplayInfo see https://developer.zendesk.com/rest_api/docs/support/channel_framework#display_info-object @@ -250,6 +255,8 @@ type ExternalResource struct { Author Author `json:"author"` DisplayInfo []DisplayInfo `json:"display_info,omitempty"` AllowChannelback bool `json:"allow_channelback"` + Fields []FieldValue `json:"fields,omitempty"` + FileURLs []string `json:"file_urls,omitempty"` } // Status see https://developer.zendesk.com/rest_api/docs/support/channel_framework#status-object diff --git a/services/tickets/zendesk/web.go b/services/tickets/zendesk/web.go index 4986a28e9..089ec7c3f 100644 --- a/services/tickets/zendesk/web.go +++ b/services/tickets/zendesk/web.go @@ -76,7 +76,7 @@ func handleChannelback(ctx context.Context, s *web.Server, r *http.Request) (int return errors.Wrapf(err, "error updating ticket: %s", ticket.UUID()), http.StatusBadRequest, nil } - msg, err := tickets.SendReply(ctx, s.DB, s.RP, ticket, request.Message) + msg, err := tickets.SendReply(ctx, s.DB, s.RP, ticket, request.Message, request.FileURLs) if err != nil { return err, http.StatusBadRequest, nil } From d0e594fd58c9e5b6766fbcf2232d4c44ad57b30b Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 20 Aug 2020 14:55:41 -0500 Subject: [PATCH 44/56] Abstract S3 code so tests and dev envs can use file storage --- config/config.go | 4 +-- ivr/ivr.go | 28 +++------------ mailroom.go | 30 +++++----------- s3utils/s3.go | 43 ---------------------- storage/base.go | 64 +++++++++++++++++++++++++++++++++ storage/base_test.go | 26 ++++++++++++++ storage/fs.go | 41 +++++++++++++++++++++ storage/fs_test.go | 27 ++++++++++++++ storage/s3.go | 73 ++++++++++++++++++++++++++++++++++++++ storage/testdata/test.jpg | Bin 0 -> 14591 bytes testsuite/testsuite.go | 15 ++++++++ web/ivr/ivr.go | 2 +- web/ivr/ivr_test.go | 8 ++--- web/server.go | 8 ++--- 14 files changed, 271 insertions(+), 98 deletions(-) delete mode 100644 s3utils/s3.go create mode 100644 storage/base.go create mode 100644 storage/base_test.go create mode 100644 storage/fs.go create mode 100644 storage/fs_test.go create mode 100644 storage/s3.go create mode 100644 storage/testdata/test.jpg diff --git a/config/config.go b/config/config.go index ae77583a6..f6b6b4c8d 100644 --- a/config/config.go +++ b/config/config.go @@ -94,8 +94,8 @@ func NewMailroomConfig() *Config { S3MediaPrefix: "/media/", S3DisableSSL: false, S3ForcePathStyle: false, - AWSAccessKeyID: "missing_aws_access_key_id", - AWSSecretAccessKey: "missing_aws_secret_access_key", + AWSAccessKeyID: "", + AWSSecretAccessKey: "", RetryPendingMessages: true, diff --git a/ivr/ivr.go b/ivr/ivr.go index 58156c2bf..2119d5092 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -7,9 +7,7 @@ import ( "net/http" "net/url" "path" - "path/filepath" "strconv" - "strings" "time" "github.com/nyaruka/gocommon/httpx" @@ -24,9 +22,8 @@ import ( "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/runner" - "github.com/nyaruka/mailroom/s3utils" + "github.com/nyaruka/mailroom/storage" - "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" "github.com/pkg/errors" @@ -46,9 +43,6 @@ const ( ErrorMessage = "An error has occurred, please try again later." ) -// WriteAttachments controls whether we write attachments, used during unit testing -var WriteAttachments = true - // CallEndedError is our constant error for when a call has ended var CallEndedError = fmt.Errorf("call ended") @@ -397,7 +391,7 @@ func StartIVRFlow( // ResumeIVRFlow takes care of resuming the flow in the passed in start for the passed in contact and URN func ResumeIVRFlow( - ctx context.Context, config *config.Config, db *sqlx.DB, rp *redis.Pool, s3Client s3iface.S3API, + ctx context.Context, config *config.Config, db *sqlx.DB, rp *redis.Pool, store storage.Storage, resumeURL string, client Client, oa *models.OrgAssets, channel *models.Channel, conn *models.ChannelConnection, c *models.Contact, urn urns.URN, r *http.Request, w http.ResponseWriter) error { @@ -484,24 +478,12 @@ func ResumeIVRFlow( } resp.Body.Close() - // check our content type - contentType := http.DetectContentType(body) - // filename is based on our org id and msg UUID filename := string(msgUUID) + path.Ext(attachment.URL()) - path := filepath.Join(config.S3MediaPrefix, fmt.Sprintf("%d", oa.OrgID()), filename[:4], filename[4:8], filename) - if !strings.HasPrefix(path, "/") { - path = fmt.Sprintf("/%s", path) - } - if WriteAttachments { - // write to S3 - logrus.WithField("path", path).Info("** uploading s3 file") - url, err := s3utils.PutS3File(s3Client, config.S3MediaBucket, path, contentType, body) - if err != nil { - return errors.Wrapf(err, "unable to write attachment to s3") - } - attachment = utils.Attachment(contentType + ":" + url) + attachment, err = storage.StoreAttachment(store, config.S3MediaPrefix, int(oa.OrgID()), filename, body) + if err != nil { + return errors.Wrapf(err, "unable to store IVR attachment") } } diff --git a/mailroom.go b/mailroom.go index 8986d9f71..abc9b97b9 100644 --- a/mailroom.go +++ b/mailroom.go @@ -11,14 +11,9 @@ import ( "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/queue" - "github.com/nyaruka/mailroom/s3utils" + "github.com/nyaruka/mailroom/storage" "github.com/nyaruka/mailroom/web" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" "github.com/nyaruka/librato" @@ -52,7 +47,7 @@ type Mailroom struct { DB *sqlx.DB RP *redis.Pool ElasticClient *elastic.Client - S3Client s3iface.S3API + Storage storage.Storage Quit chan bool CTX context.Context @@ -163,25 +158,18 @@ func (mr *Mailroom) Start() error { log.Info("redis ok") } - // create our s3 client - s3Session, err := session.NewSession(&aws.Config{ - Credentials: credentials.NewStaticCredentials(mr.Config.AWSAccessKeyID, mr.Config.AWSSecretAccessKey, ""), - Endpoint: aws.String(mr.Config.S3Endpoint), - Region: aws.String(mr.Config.S3Region), - DisableSSL: aws.Bool(mr.Config.S3DisableSSL), - S3ForcePathStyle: aws.Bool(mr.Config.S3ForcePathStyle), - }) + // create our storage (S3 or file system) + mr.Storage, err = storage.New(mr.Config) if err != nil { return err } - mr.S3Client = s3.New(s3Session) - // test out our S3 credentials - err = s3utils.TestS3(mr.S3Client, mr.Config.S3MediaBucket) + // test our storage + err = mr.Storage.Test() if err != nil { - log.WithError(err).Error("s3 bucket not reachable") + log.WithError(err).Error(mr.Storage.Name() + " storage not available") } else { - log.Info("s3 bucket ok") + log.Info(mr.Storage.Name() + " storage ok") } // initialize our elastic client @@ -211,7 +199,7 @@ func (mr *Mailroom) Start() error { mr.handlerForeman.Start() // start our web server - mr.webserver = web.NewServer(mr.CTX, mr.Config, mr.DB, mr.RP, mr.S3Client, mr.ElasticClient, mr.WaitGroup) + mr.webserver = web.NewServer(mr.CTX, mr.Config, mr.DB, mr.RP, mr.Storage, mr.ElasticClient, mr.WaitGroup) mr.webserver.Start() logrus.Info("mailroom started") diff --git a/s3utils/s3.go b/s3utils/s3.go deleted file mode 100644 index 9cb30f00c..000000000 --- a/s3utils/s3.go +++ /dev/null @@ -1,43 +0,0 @@ -package s3utils - -import ( - "bytes" - "fmt" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/aws/aws-sdk-go/service/s3/s3iface" -) - -var s3BucketURL = "https://%s.s3.amazonaws.com%s" - -// TestS3 tests whether the passed in s3 client is properly configured and the passed in bucket is accessible -func TestS3(s3Client s3iface.S3API, bucket string) error { - params := &s3.HeadBucketInput{ - Bucket: aws.String(bucket), - } - _, err := s3Client.HeadBucket(params) - if err != nil { - return err - } - - return nil -} - -// PutS3File writes the passed in file to the bucket with the passed in content type -func PutS3File(s3Client s3iface.S3API, bucket string, path string, contentType string, contents []byte) (string, error) { - params := &s3.PutObjectInput{ - Bucket: aws.String(bucket), - Body: bytes.NewReader(contents), - Key: aws.String(path), - ContentType: aws.String(contentType), - ACL: aws.String(s3.BucketCannedACLPublicRead), - } - _, err := s3Client.PutObject(params) - if err != nil { - return "", err - } - - url := fmt.Sprintf(s3BucketURL, bucket, path) - return url, nil -} diff --git a/storage/base.go b/storage/base.go new file mode 100644 index 000000000..76c1ca27a --- /dev/null +++ b/storage/base.go @@ -0,0 +1,64 @@ +package storage + +import ( + "fmt" + "net/http" + "path/filepath" + "strings" + + "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/mailroom/config" +) + +// Storage is the interface that provides storage of atttachments etc +type Storage interface { + Name() string + Test() error + Put(path string, contentType string, contents []byte) (string, error) +} + +// New creates a new storage service +func New(cfg *config.Config) (Storage, error) { + if cfg.AWSAccessKeyID != "" && cfg.AWSSecretAccessKey != "" { + return NewS3(cfg) + } + return NewFS("_storage"), nil +} + +// StoreAttachment saves an attachment to storage +func StoreAttachment(s Storage, prefix string, ownerID int, filename string, content []byte) (utils.Attachment, error) { + contentType := http.DetectContentType(content) + + path := attachmentPath(prefix, ownerID, filename) + + url, err := s.Put(path, contentType, content) + if err != nil { + return "", err + } + + return utils.Attachment(contentType + ":" + url), nil +} + +func attachmentPath(prefix string, ownerID int, filename string) string { + parts := []string{prefix, fmt.Sprintf("%d", ownerID)} + + // not all filesystems like having a directory with a huge number of files, so if filename is long enough, + // use parts of it to create intermediate subdirectories + if len(filename) > 4 { + parts = append(parts, filename[:4]) + + if len(filename) > 8 { + parts = append(parts, filename[4:8]) + } + } + parts = append(parts, filename) + + path := filepath.Join(parts...) + + // ensure path begins with / + if !strings.HasPrefix(path, "/") { + path = fmt.Sprintf("/%s", path) + } + + return path +} diff --git a/storage/base_test.go b/storage/base_test.go new file mode 100644 index 000000000..90ff43b20 --- /dev/null +++ b/storage/base_test.go @@ -0,0 +1,26 @@ +package storage_test + +import ( + "io/ioutil" + "testing" + + "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/mailroom/storage" + "github.com/nyaruka/mailroom/testsuite" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestStoreAttachment(t *testing.T) { + store := testsuite.Storage() + defer testsuite.ResetStorage() + + image, err := ioutil.ReadFile("testdata/test.jpg") + require.NoError(t, err) + + attachment, err := storage.StoreAttachment(store, "media", 1, "668383ba-387c-49bc-b164-1213ac0ea7aa.jpg", image) + require.NoError(t, err) + + assert.Equal(t, utils.Attachment("image/jpeg:_test_storage/media/1/6683/83ba/668383ba-387c-49bc-b164-1213ac0ea7aa.jpg"), attachment) +} diff --git a/storage/fs.go b/storage/fs.go new file mode 100644 index 000000000..6f2907a57 --- /dev/null +++ b/storage/fs.go @@ -0,0 +1,41 @@ +package storage + +import ( + "io/ioutil" + "os" + "path" +) + +type fsStorage struct { + directory string + perms os.FileMode +} + +// NewFS creates a new file system storage service suitable for use in tests +func NewFS(directory string) Storage { + return &fsStorage{directory: directory, perms: 0766} +} + +func (s *fsStorage) Name() string { + return "file system" +} + +func (s *fsStorage) Test() error { + return nil +} + +func (s *fsStorage) Put(p string, contentType string, contents []byte) (string, error) { + fullPath := path.Join(s.directory, p) + + err := os.MkdirAll(path.Dir(fullPath), s.perms) + if err != nil { + return "", err + } + + err = ioutil.WriteFile(fullPath, contents, s.perms) + if err != nil { + return "", err + } + + return fullPath, nil +} diff --git a/storage/fs_test.go b/storage/fs_test.go new file mode 100644 index 000000000..f53c37420 --- /dev/null +++ b/storage/fs_test.go @@ -0,0 +1,27 @@ +package storage_test + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/nyaruka/mailroom/storage" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFS(t *testing.T) { + s := storage.NewFS("_testing") + assert.NoError(t, s.Test()) + + url, err := s.Put("/foo/bar.txt", "text/plain", []byte(`hello world`)) + assert.NoError(t, err) + assert.Equal(t, "_testing/foo/bar.txt", url) + + data, err := ioutil.ReadFile(url) + assert.NoError(t, err) + assert.Equal(t, []byte(`hello world`), data) + + require.NoError(t, os.RemoveAll("_testing")) +} diff --git a/storage/s3.go b/storage/s3.go new file mode 100644 index 000000000..9930aeeb7 --- /dev/null +++ b/storage/s3.go @@ -0,0 +1,73 @@ +package storage + +import ( + "bytes" + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3iface" + "github.com/nyaruka/mailroom/config" + "github.com/sirupsen/logrus" +) + +var s3BucketURL = "https://%s.s3.amazonaws.com%s" + +type s3Storage struct { + client s3iface.S3API + bucket string +} + +// NewS3 creates a new S3 storage service +func NewS3(cfg *config.Config) (Storage, error) { + s3Session, err := session.NewSession(&aws.Config{ + Credentials: credentials.NewStaticCredentials(cfg.AWSAccessKeyID, cfg.AWSSecretAccessKey, ""), + Endpoint: aws.String(cfg.S3Endpoint), + Region: aws.String(cfg.S3Region), + DisableSSL: aws.Bool(cfg.S3DisableSSL), + S3ForcePathStyle: aws.Bool(cfg.S3ForcePathStyle), + }) + if err != nil { + return nil, err + } + + return &s3Storage{ + client: s3.New(s3Session), + bucket: cfg.S3MediaBucket, + }, nil +} + +func (s *s3Storage) Name() string { + return "S3" +} + +// Test tests whether our S3 client is properly configured +func (s *s3Storage) Test() error { + params := &s3.HeadBucketInput{ + Bucket: aws.String(s.bucket), + } + _, err := s.client.HeadBucket(params) + return err +} + +// Put writes the passed in file to the bucket with the passed in content type +func (s *s3Storage) Put(path string, contentType string, contents []byte) (string, error) { + params := &s3.PutObjectInput{ + Bucket: aws.String(s.bucket), + Body: bytes.NewReader(contents), + Key: aws.String(path), + ContentType: aws.String(contentType), + ACL: aws.String(s3.BucketCannedACLPublicRead), + } + + logrus.WithField("path", path).Info("** uploading s3 file") + + _, err := s.client.PutObject(params) + if err != nil { + return "", err + } + + return fmt.Sprintf(s3BucketURL, s.bucket, path), nil +} diff --git a/storage/testdata/test.jpg b/storage/testdata/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f741d11312697ac7ea76570c71ff0df3f5f50668 GIT binary patch literal 14591 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 DFEL+^ literal 0 HcmV?d00001 diff --git a/testsuite/testsuite.go b/testsuite/testsuite.go index 63f54671d..3706bb3a9 100644 --- a/testsuite/testsuite.go +++ b/testsuite/testsuite.go @@ -11,10 +11,13 @@ import ( "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" + "github.com/nyaruka/mailroom/storage" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) +const storageDir = "_test_storage" + // Reset clears out both our database and redis DB func Reset() (context.Context, *sqlx.DB, *redis.Pool) { logrus.SetLevel(logrus.DebugLevel) @@ -97,6 +100,18 @@ func CTX() context.Context { return context.Background() } +// Storage returns our storage for tests +func Storage() storage.Storage { + return storage.NewFS(storageDir) +} + +// ResetStorage clears our storage for tests +func ResetStorage() { + if err := os.RemoveAll(storageDir); err != nil { + panic(err) + } +} + // utility function for running a command panicking if there is any error func mustExec(command string, args ...string) { cmd := exec.Command(command, args...) diff --git a/web/ivr/ivr.go b/web/ivr/ivr.go index c67df53b1..afc03f770 100644 --- a/web/ivr/ivr.go +++ b/web/ivr/ivr.go @@ -352,7 +352,7 @@ func handleFlow(ctx context.Context, s *web.Server, r *http.Request, rawW http.R case actionResume: err = ivr.ResumeIVRFlow( - ctx, s.Config, s.DB, s.RP, s.S3Client, resumeURL, client, + ctx, s.Config, s.DB, s.RP, s.Storage, resumeURL, client, oa, channel, conn, contacts[0], urn, r, w, ) diff --git a/web/ivr/ivr_test.go b/web/ivr/ivr_test.go index b3316b938..fef2b8db1 100644 --- a/web/ivr/ivr_test.go +++ b/web/ivr/ivr_test.go @@ -23,7 +23,6 @@ import ( "github.com/stretchr/testify/assert" _ "github.com/nyaruka/mailroom/hooks" - "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/ivr/nexmo" "github.com/nyaruka/mailroom/ivr/twiml" ivr_tasks "github.com/nyaruka/mailroom/tasks/ivr" @@ -33,6 +32,7 @@ func TestTwilioIVR(t *testing.T) { ctx, db, rp := testsuite.Reset() rc := rp.Get() defer rc.Close() + defer testsuite.ResetStorage() // start test server ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -60,7 +60,7 @@ func TestTwilioIVR(t *testing.T) { twiml.IgnoreSignatures = true wg := &sync.WaitGroup{} - server := web.NewServer(ctx, config.Mailroom, db, rp, nil, nil, wg) + server := web.NewServer(ctx, config.Mailroom, db, rp, testsuite.Storage(), nil, wg) server.Start() defer server.Stop() @@ -327,6 +327,7 @@ func TestNexmoIVR(t *testing.T) { ctx, db, rp := testsuite.Reset() rc := rp.Get() defer rc.Close() + defer testsuite.ResetStorage() models.FlushCache() // deactivate our twilio channel @@ -364,11 +365,10 @@ func TestNexmoIVR(t *testing.T) { defer ts.Close() wg := &sync.WaitGroup{} - server := web.NewServer(ctx, config.Mailroom, db, rp, nil, nil, wg) + server := web.NewServer(ctx, config.Mailroom, db, rp, testsuite.Storage(), nil, wg) server.Start() defer server.Stop() - ivr.WriteAttachments = false nexmo.BaseURL = ts.URL nexmo.IgnoreSignatures = true diff --git a/web/server.go b/web/server.go index 53135c11a..9f3c2501c 100644 --- a/web/server.go +++ b/web/server.go @@ -10,8 +10,8 @@ import ( "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/mailroom/config" + "github.com/nyaruka/mailroom/storage" - "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "github.com/gomodule/redigo/redis" @@ -60,12 +60,12 @@ func RegisterRoute(method string, pattern string, handler Handler) { } // NewServer creates a new web server, it will need to be started after being created -func NewServer(ctx context.Context, config *config.Config, db *sqlx.DB, rp *redis.Pool, s3Client s3iface.S3API, elasticClient *elastic.Client, wg *sync.WaitGroup) *Server { +func NewServer(ctx context.Context, config *config.Config, db *sqlx.DB, rp *redis.Pool, store storage.Storage, elasticClient *elastic.Client, wg *sync.WaitGroup) *Server { s := &Server{ CTX: ctx, RP: rp, DB: db, - S3Client: s3Client, + Storage: store, ElasticClient: elasticClient, Config: config, @@ -212,7 +212,7 @@ type Server struct { CTX context.Context RP *redis.Pool DB *sqlx.DB - S3Client s3iface.S3API + Storage storage.Storage Config *config.Config ElasticClient *elastic.Client From b3467c36df5d98decab740f9089e3e444ee6e186 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Thu, 20 Aug 2020 15:34:10 -0500 Subject: [PATCH 45/56] Use path/filepath instead of path --- storage/fs.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/storage/fs.go b/storage/fs.go index 6f2907a57..1a1c7e6cb 100644 --- a/storage/fs.go +++ b/storage/fs.go @@ -3,7 +3,7 @@ package storage import ( "io/ioutil" "os" - "path" + "path/filepath" ) type fsStorage struct { @@ -24,10 +24,10 @@ func (s *fsStorage) Test() error { return nil } -func (s *fsStorage) Put(p string, contentType string, contents []byte) (string, error) { - fullPath := path.Join(s.directory, p) +func (s *fsStorage) Put(path string, contentType string, contents []byte) (string, error) { + fullPath := filepath.Join(s.directory, path) - err := os.MkdirAll(path.Dir(fullPath), s.perms) + err := os.MkdirAll(filepath.Dir(fullPath), s.perms) if err != nil { return "", err } From 9a5dc88c78793393ec9de40d3c081fad405ac59d Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 21 Aug 2020 08:48:58 -0500 Subject: [PATCH 46/56] Fix inserting channel logs and add test --- models/channel_logs.go | 2 +- models/channel_logs_test.go | 45 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 models/channel_logs_test.go diff --git a/models/channel_logs.go b/models/channel_logs.go index 9b6467695..7f8aa931c 100644 --- a/models/channel_logs.go +++ b/models/channel_logs.go @@ -72,7 +72,7 @@ func NewChannelLog(trace *httpx.Trace, isError bool, desc string, channel *Chann func InsertChannelLogs(ctx context.Context, db *sqlx.DB, logs []*ChannelLog) error { ls := make([]interface{}, len(logs)) for i := range logs { - ls[i] = logs[i].l + ls[i] = &logs[i].l } err := BulkSQL(ctx, "insert channel log", db, insertChannelLogSQL, ls) diff --git a/models/channel_logs_test.go b/models/channel_logs_test.go new file mode 100644 index 000000000..d444c64a5 --- /dev/null +++ b/models/channel_logs_test.go @@ -0,0 +1,45 @@ +package models_test + +import ( + "net/http" + "testing" + + "github.com/nyaruka/gocommon/httpx" + "github.com/nyaruka/mailroom/models" + "github.com/nyaruka/mailroom/testsuite" + + "github.com/stretchr/testify/require" +) + +func TestChannelLogs(t *testing.T) { + ctx := testsuite.CTX() + db := testsuite.DB() + + db.MustExec(`DELETE FROM channels_channellog;`) + + defer httpx.SetRequestor(httpx.DefaultRequestor) + httpx.SetRequestor(httpx.NewMockRequestor(map[string][]httpx.MockResponse{ + "http://rapidpro.io": {httpx.NewMockResponse(200, nil, "OK")}, + "http://rapidpro.io/bad": {httpx.NewMockResponse(400, nil, "Oops")}, + })) + + oa, err := models.GetOrgAssets(ctx, db, models.Org1) + require.NoError(t, err) + + channel := oa.ChannelByID(models.TwilioChannelID) + + req1, _ := httpx.NewRequest("GET", "http://rapidpro.io", nil, nil) + trace1, err := httpx.DoTrace(http.DefaultClient, req1, nil, nil, -1) + log1 := models.NewChannelLog(trace1, false, "test request", channel, nil) + + req2, _ := httpx.NewRequest("GET", "http://rapidpro.io/bad", nil, nil) + trace2, err := httpx.DoTrace(http.DefaultClient, req2, nil, nil, -1) + log2 := models.NewChannelLog(trace2, true, "test request", channel, nil) + + err = models.InsertChannelLogs(ctx, db, []*models.ChannelLog{log1, log2}) + require.NoError(t, err) + + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM channels_channellog`, nil, 2) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM channels_channellog WHERE url = 'http://rapidpro.io' AND is_error = FALSE AND channel_id = $1`, []interface{}{channel.ID()}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM channels_channellog WHERE url = 'http://rapidpro.io/bad' AND is_error = TRUE AND channel_id = $1`, []interface{}{channel.ID()}, 1) +} From 75e6ecdcc96e77eed58232de5c9d9dbe26aa9437 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 21 Aug 2020 09:01:30 -0500 Subject: [PATCH 47/56] Update CHANGELOG.md for v5.7.12 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 090c51ad0..3ab355abb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.12 +---------- + * Fix inserting channel logs and add test + v5.7.11 ---------- * Always write contact.status when writing is_blocked or is_stopped From f61bf688b990c7084e03e8ef046b6c105fcce820 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 21 Aug 2020 09:20:34 -0500 Subject: [PATCH 48/56] Move StoreAttachment into org class --- ivr/ivr.go | 2 +- models/orgs.go | 43 +++++++++++++++++++++++++ models/orgs_test.go | 22 +++++++++++++ {storage => models}/testdata/test.jpg | Bin storage/base.go | 44 -------------------------- storage/base_test.go | 26 --------------- 6 files changed, 66 insertions(+), 71 deletions(-) rename {storage => models}/testdata/test.jpg (100%) delete mode 100644 storage/base_test.go diff --git a/ivr/ivr.go b/ivr/ivr.go index 2119d5092..1107f5437 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -481,7 +481,7 @@ func ResumeIVRFlow( // filename is based on our org id and msg UUID filename := string(msgUUID) + path.Ext(attachment.URL()) - attachment, err = storage.StoreAttachment(store, config.S3MediaPrefix, int(oa.OrgID()), filename, body) + attachment, err = oa.Org().StoreAttachment(store, config.S3MediaPrefix, filename, body) if err != nil { return errors.Wrapf(err, "unable to store IVR attachment") } diff --git a/models/orgs.go b/models/orgs.go index f1a1acc84..634b7661d 100644 --- a/models/orgs.go +++ b/models/orgs.go @@ -3,7 +3,10 @@ package models import ( "context" "encoding/json" + "fmt" "net/http" + "path/filepath" + "strings" "time" "github.com/nyaruka/gocommon/httpx" @@ -12,8 +15,10 @@ import ( "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/services/airtime/dtone" "github.com/nyaruka/goflow/services/email/smtp" + "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/goflow" + "github.com/nyaruka/mailroom/storage" "github.com/nyaruka/null" "github.com/jmoiron/sqlx" @@ -164,6 +169,44 @@ func (o *Org) AirtimeService(httpClient *http.Client, httpRetries *httpx.RetryCo return dtone.NewService(httpClient, httpRetries, login, token, currency), nil } +// StoreAttachment saves an attachment to storage +func (o *Org) StoreAttachment(s storage.Storage, prefix string, filename string, content []byte) (utils.Attachment, error) { + contentType := http.DetectContentType(content) + + path := o.attachmentPath(prefix, filename) + + url, err := s.Put(path, contentType, content) + if err != nil { + return "", err + } + + return utils.Attachment(contentType + ":" + url), nil +} + +func (o *Org) attachmentPath(prefix string, filename string) string { + parts := []string{prefix, fmt.Sprintf("%d", o.ID())} + + // not all filesystems like having a directory with a huge number of files, so if filename is long enough, + // use parts of it to create intermediate subdirectories + if len(filename) > 4 { + parts = append(parts, filename[:4]) + + if len(filename) > 8 { + parts = append(parts, filename[4:8]) + } + } + parts = append(parts, filename) + + path := filepath.Join(parts...) + + // ensure path begins with / + if !strings.HasPrefix(path, "/") { + path = fmt.Sprintf("/%s", path) + } + + return path +} + // gets the underlying org for the given engine session func orgFromSession(session flows.Session) *Org { return session.Assets().Source().(*OrgAssets).Org() diff --git a/models/orgs_test.go b/models/orgs_test.go index 363d04692..bba3ca08e 100644 --- a/models/orgs_test.go +++ b/models/orgs_test.go @@ -1,13 +1,16 @@ package models import ( + "io/ioutil" "testing" "time" "github.com/nyaruka/goflow/envs" + "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/testsuite" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestOrgs(t *testing.T) { @@ -53,3 +56,22 @@ func TestOrgs(t *testing.T) { _, err = loadOrg(ctx, tx, 99) assert.Error(t, err) } + +func TestStoreAttachment(t *testing.T) { + ctx := testsuite.CTX() + db := testsuite.DB() + + store := testsuite.Storage() + defer testsuite.ResetStorage() + + image, err := ioutil.ReadFile("testdata/test.jpg") + require.NoError(t, err) + + org, err := loadOrg(ctx, db, Org1) + assert.NoError(t, err) + + attachment, err := org.StoreAttachment(store, "media", "668383ba-387c-49bc-b164-1213ac0ea7aa.jpg", image) + require.NoError(t, err) + + assert.Equal(t, utils.Attachment("image/jpeg:_test_storage/media/1/6683/83ba/668383ba-387c-49bc-b164-1213ac0ea7aa.jpg"), attachment) +} diff --git a/storage/testdata/test.jpg b/models/testdata/test.jpg similarity index 100% rename from storage/testdata/test.jpg rename to models/testdata/test.jpg diff --git a/storage/base.go b/storage/base.go index 76c1ca27a..c074046ec 100644 --- a/storage/base.go +++ b/storage/base.go @@ -1,12 +1,6 @@ package storage import ( - "fmt" - "net/http" - "path/filepath" - "strings" - - "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/config" ) @@ -24,41 +18,3 @@ func New(cfg *config.Config) (Storage, error) { } return NewFS("_storage"), nil } - -// StoreAttachment saves an attachment to storage -func StoreAttachment(s Storage, prefix string, ownerID int, filename string, content []byte) (utils.Attachment, error) { - contentType := http.DetectContentType(content) - - path := attachmentPath(prefix, ownerID, filename) - - url, err := s.Put(path, contentType, content) - if err != nil { - return "", err - } - - return utils.Attachment(contentType + ":" + url), nil -} - -func attachmentPath(prefix string, ownerID int, filename string) string { - parts := []string{prefix, fmt.Sprintf("%d", ownerID)} - - // not all filesystems like having a directory with a huge number of files, so if filename is long enough, - // use parts of it to create intermediate subdirectories - if len(filename) > 4 { - parts = append(parts, filename[:4]) - - if len(filename) > 8 { - parts = append(parts, filename[4:8]) - } - } - parts = append(parts, filename) - - path := filepath.Join(parts...) - - // ensure path begins with / - if !strings.HasPrefix(path, "/") { - path = fmt.Sprintf("/%s", path) - } - - return path -} diff --git a/storage/base_test.go b/storage/base_test.go deleted file mode 100644 index 90ff43b20..000000000 --- a/storage/base_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package storage_test - -import ( - "io/ioutil" - "testing" - - "github.com/nyaruka/goflow/utils" - "github.com/nyaruka/mailroom/storage" - "github.com/nyaruka/mailroom/testsuite" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestStoreAttachment(t *testing.T) { - store := testsuite.Storage() - defer testsuite.ResetStorage() - - image, err := ioutil.ReadFile("testdata/test.jpg") - require.NoError(t, err) - - attachment, err := storage.StoreAttachment(store, "media", 1, "668383ba-387c-49bc-b164-1213ac0ea7aa.jpg", image) - require.NoError(t, err) - - assert.Equal(t, utils.Attachment("image/jpeg:_test_storage/media/1/6683/83ba/668383ba-387c-49bc-b164-1213ac0ea7aa.jpg"), attachment) -} From 216a43b94ac98a2c717c4eea926c7bc5b4953868 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 21 Aug 2020 10:48:16 -0500 Subject: [PATCH 49/56] Move some packages into utils/ --- ivr/ivr.go | 2 +- mailroom.go | 2 +- models/msgs.go | 2 +- models/orgs.go | 2 +- runner/runner.go | 2 +- tasks/campaigns/cron.go | 9 +++++---- tasks/campaigns/worker.go | 2 +- tasks/expirations/cron.go | 9 +++++---- tasks/expirations/cron_test.go | 3 ++- tasks/groups/worker.go | 2 +- tasks/handler/cron.go | 9 +++++---- tasks/handler/worker.go | 2 +- tasks/ivr/cron.go | 4 ++-- tasks/schedules/cron.go | 2 +- tasks/stats/cron.go | 7 ++++--- tasks/timeouts/cron.go | 11 ++++++----- tasks/timeouts/cron_test.go | 3 ++- testsuite/testsuite.go | 3 ++- {celery => utils/celery}/celery.go | 0 {celery => utils/celery}/celery_test.go | 10 ++++++---- {cron => utils/cron}/cron.go | 2 +- {cron => utils/cron}/cron_test.go | 1 + {gsm7 => utils/gsm7}/gsm7.go | 0 {gsm7 => utils/gsm7}/gsm7_test.go | 6 ++++-- {locker => utils/locker}/locker.go | 0 {locker => utils/locker}/locker_test.go | 18 ++++++++++-------- {marker => utils/marker}/marker.go | 0 {marker => utils/marker}/marker_test.go | 12 +++++++----- {storage => utils/storage}/base.go | 0 {storage => utils/storage}/fs.go | 0 {storage => utils/storage}/fs_test.go | 2 +- {storage => utils/storage}/s3.go | 0 web/server.go | 2 +- 33 files changed, 73 insertions(+), 56 deletions(-) rename {celery => utils/celery}/celery.go (100%) rename {celery => utils/celery}/celery_test.go (83%) rename {cron => utils/cron}/cron.go (98%) rename {cron => utils/cron}/cron_test.go (99%) rename {gsm7 => utils/gsm7}/gsm7.go (100%) rename {gsm7 => utils/gsm7}/gsm7_test.go (84%) rename {locker => utils/locker}/locker.go (100%) rename {locker => utils/locker}/locker_test.go (59%) rename {marker => utils/marker}/marker.go (100%) rename {marker => utils/marker}/marker_test.go (76%) rename {storage => utils/storage}/base.go (100%) rename {storage => utils/storage}/fs.go (100%) rename {storage => utils/storage}/fs_test.go (92%) rename {storage => utils/storage}/s3.go (100%) diff --git a/ivr/ivr.go b/ivr/ivr.go index 1107f5437..b8628ad7a 100644 --- a/ivr/ivr.go +++ b/ivr/ivr.go @@ -22,7 +22,7 @@ import ( "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/runner" - "github.com/nyaruka/mailroom/storage" + "github.com/nyaruka/mailroom/utils/storage" "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" diff --git a/mailroom.go b/mailroom.go index abc9b97b9..cfda2408f 100644 --- a/mailroom.go +++ b/mailroom.go @@ -11,7 +11,7 @@ import ( "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/queue" - "github.com/nyaruka/mailroom/storage" + "github.com/nyaruka/mailroom/utils/storage" "github.com/nyaruka/mailroom/web" "github.com/gomodule/redigo/redis" diff --git a/models/msgs.go b/models/msgs.go index 0adc2c957..24ce2e249 100644 --- a/models/msgs.go +++ b/models/msgs.go @@ -19,7 +19,7 @@ import ( "github.com/nyaruka/goflow/flows/events" "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/config" - "github.com/nyaruka/mailroom/gsm7" + "github.com/nyaruka/mailroom/utils/gsm7" "github.com/nyaruka/null" "github.com/gomodule/redigo/redis" diff --git a/models/orgs.go b/models/orgs.go index 634b7661d..a7f3bf63f 100644 --- a/models/orgs.go +++ b/models/orgs.go @@ -18,7 +18,7 @@ import ( "github.com/nyaruka/goflow/utils" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/goflow" - "github.com/nyaruka/mailroom/storage" + "github.com/nyaruka/mailroom/utils/storage" "github.com/nyaruka/null" "github.com/jmoiron/sqlx" diff --git a/runner/runner.go b/runner/runner.go index 746fe1633..7e4f24b15 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -12,9 +12,9 @@ import ( "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/librato" "github.com/nyaruka/mailroom/goflow" - "github.com/nyaruka/mailroom/locker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" + "github.com/nyaruka/mailroom/utils/locker" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/campaigns/cron.go b/tasks/campaigns/cron.go index 71d153645..2e1ae5407 100644 --- a/tasks/campaigns/cron.go +++ b/tasks/campaigns/cron.go @@ -5,15 +5,16 @@ import ( "fmt" "time" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/librato" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/cron" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" + "github.com/nyaruka/mailroom/utils/cron" + "github.com/nyaruka/mailroom/utils/marker" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/campaigns/worker.go b/tasks/campaigns/worker.go index 23a774936..06d5eb029 100644 --- a/tasks/campaigns/worker.go +++ b/tasks/campaigns/worker.go @@ -10,10 +10,10 @@ import ( "github.com/jmoiron/sqlx" "github.com/nyaruka/goflow/flows/triggers" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/nyaruka/mailroom/runner" + "github.com/nyaruka/mailroom/utils/marker" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/expirations/cron.go b/tasks/expirations/cron.go index ee72bb94a..8b79015db 100644 --- a/tasks/expirations/cron.go +++ b/tasks/expirations/cron.go @@ -5,14 +5,15 @@ import ( "fmt" "time" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/cron" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/tasks/handler" + "github.com/nyaruka/mailroom/utils/cron" + "github.com/nyaruka/mailroom/utils/marker" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/expirations/cron_test.go b/tasks/expirations/cron_test.go index 91567576c..0303c363c 100644 --- a/tasks/expirations/cron_test.go +++ b/tasks/expirations/cron_test.go @@ -8,11 +8,12 @@ import ( "github.com/nyaruka/goflow/utils/uuids" _ "github.com/nyaruka/mailroom/hooks" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/nyaruka/mailroom/tasks/handler" "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/mailroom/utils/marker" + "github.com/stretchr/testify/assert" ) diff --git a/tasks/groups/worker.go b/tasks/groups/worker.go index 3f94b0332..d18dbaa46 100644 --- a/tasks/groups/worker.go +++ b/tasks/groups/worker.go @@ -7,9 +7,9 @@ import ( "time" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/locker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" + "github.com/nyaruka/mailroom/utils/locker" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/handler/cron.go b/tasks/handler/cron.go index 6e2687f1e..09db3953a 100644 --- a/tasks/handler/cron.go +++ b/tasks/handler/cron.go @@ -6,14 +6,15 @@ import ( "fmt" "time" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/mailroom" "github.com/nyaruka/mailroom/config" - "github.com/nyaruka/mailroom/cron" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" + "github.com/nyaruka/mailroom/utils/cron" + "github.com/nyaruka/mailroom/utils/marker" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/handler/worker.go b/tasks/handler/worker.go index c022d5b3f..31eb026fa 100644 --- a/tasks/handler/worker.go +++ b/tasks/handler/worker.go @@ -17,10 +17,10 @@ import ( "github.com/nyaruka/goflow/utils" "github.com/nyaruka/librato" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/locker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/nyaruka/mailroom/runner" + "github.com/nyaruka/mailroom/utils/locker" "github.com/nyaruka/null" "github.com/pkg/errors" "github.com/sirupsen/logrus" diff --git a/tasks/ivr/cron.go b/tasks/ivr/cron.go index 71d2e4089..052c4be57 100644 --- a/tasks/ivr/cron.go +++ b/tasks/ivr/cron.go @@ -5,14 +5,14 @@ import ( "time" "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/mailroom" "github.com/nyaruka/mailroom/config" "github.com/nyaruka/mailroom/ivr" "github.com/nyaruka/mailroom/models" + "github.com/nyaruka/mailroom/utils/cron" "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" - "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/cron" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/schedules/cron.go b/tasks/schedules/cron.go index 1af783007..f10108629 100644 --- a/tasks/schedules/cron.go +++ b/tasks/schedules/cron.go @@ -7,9 +7,9 @@ import ( "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/cron" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" + "github.com/nyaruka/mailroom/utils/cron" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/stats/cron.go b/tasks/stats/cron.go index 572134dea..f352a70cf 100644 --- a/tasks/stats/cron.go +++ b/tasks/stats/cron.go @@ -4,13 +4,14 @@ import ( "context" "time" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/librato" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/cron" "github.com/nyaruka/mailroom/queue" + "github.com/nyaruka/mailroom/utils/cron" "github.com/sirupsen/logrus" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" ) const ( diff --git a/tasks/timeouts/cron.go b/tasks/timeouts/cron.go index dffc94f5b..8e9a56c63 100644 --- a/tasks/timeouts/cron.go +++ b/tasks/timeouts/cron.go @@ -5,13 +5,14 @@ import ( "fmt" "time" - "github.com/gomodule/redigo/redis" - "github.com/jmoiron/sqlx" "github.com/nyaruka/mailroom" - "github.com/nyaruka/mailroom/cron" - "github.com/nyaruka/mailroom/tasks/handler" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" + "github.com/nyaruka/mailroom/tasks/handler" + "github.com/nyaruka/mailroom/utils/cron" + "github.com/nyaruka/mailroom/utils/marker" + + "github.com/gomodule/redigo/redis" + "github.com/jmoiron/sqlx" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) diff --git a/tasks/timeouts/cron_test.go b/tasks/timeouts/cron_test.go index 585be1e6b..47480286c 100644 --- a/tasks/timeouts/cron_test.go +++ b/tasks/timeouts/cron_test.go @@ -7,11 +7,12 @@ import ( "github.com/nyaruka/goflow/utils/uuids" _ "github.com/nyaruka/mailroom/hooks" - "github.com/nyaruka/mailroom/marker" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/queue" "github.com/nyaruka/mailroom/tasks/handler" "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/mailroom/utils/marker" + "github.com/stretchr/testify/assert" ) diff --git a/testsuite/testsuite.go b/testsuite/testsuite.go index 3706bb3a9..9ede02a35 100644 --- a/testsuite/testsuite.go +++ b/testsuite/testsuite.go @@ -9,9 +9,10 @@ import ( "strings" "testing" + "github.com/nyaruka/mailroom/utils/storage" + "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" - "github.com/nyaruka/mailroom/storage" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) diff --git a/celery/celery.go b/utils/celery/celery.go similarity index 100% rename from celery/celery.go rename to utils/celery/celery.go diff --git a/celery/celery_test.go b/utils/celery/celery_test.go similarity index 83% rename from celery/celery_test.go rename to utils/celery/celery_test.go index 66273cf92..821609bcd 100644 --- a/celery/celery_test.go +++ b/utils/celery/celery_test.go @@ -1,11 +1,13 @@ -package celery +package celery_test import ( "encoding/json" "testing" - "github.com/gomodule/redigo/redis" "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/mailroom/utils/celery" + + "github.com/gomodule/redigo/redis" ) func TestQueue(t *testing.T) { @@ -15,7 +17,7 @@ func TestQueue(t *testing.T) { // queue to our handler queue rc.Send("multi") - err := QueueTask(rc, "handler", "handle_event_task", []int64{}) + err := celery.QueueTask(rc, "handler", "handle_event_task", []int64{}) if err != nil { t.Error(err) } @@ -31,7 +33,7 @@ func TestQueue(t *testing.T) { } // make sure our task is valid json - task := Task{} + task := celery.Task{} err = json.Unmarshal([]byte(taskJSON), &task) if err != nil { t.Errorf("should be JSON: %s", err) diff --git a/cron/cron.go b/utils/cron/cron.go similarity index 98% rename from cron/cron.go rename to utils/cron/cron.go index 1bdf1134a..9fb81f002 100644 --- a/cron/cron.go +++ b/utils/cron/cron.go @@ -6,7 +6,7 @@ import ( "github.com/apex/log" "github.com/gomodule/redigo/redis" - "github.com/nyaruka/mailroom/locker" + "github.com/nyaruka/mailroom/utils/locker" "github.com/sirupsen/logrus" ) diff --git a/cron/cron_test.go b/utils/cron/cron_test.go similarity index 99% rename from cron/cron_test.go rename to utils/cron/cron_test.go index 6b998b045..ec7c4c0f5 100644 --- a/cron/cron_test.go +++ b/utils/cron/cron_test.go @@ -6,6 +6,7 @@ import ( "time" "github.com/nyaruka/mailroom/testsuite" + "github.com/stretchr/testify/assert" ) diff --git a/gsm7/gsm7.go b/utils/gsm7/gsm7.go similarity index 100% rename from gsm7/gsm7.go rename to utils/gsm7/gsm7.go diff --git a/gsm7/gsm7_test.go b/utils/gsm7/gsm7_test.go similarity index 84% rename from gsm7/gsm7_test.go rename to utils/gsm7/gsm7_test.go index 13546d3cf..7aa50ee48 100644 --- a/gsm7/gsm7_test.go +++ b/utils/gsm7/gsm7_test.go @@ -1,8 +1,10 @@ -package gsm7 +package gsm7_test import ( "testing" + "github.com/nyaruka/mailroom/utils/gsm7" + "github.com/stretchr/testify/assert" ) @@ -33,6 +35,6 @@ func TestSegments(t *testing.T) { } for _, tc := range tcs { - assert.Equal(t, tc.Segments, Segments(tc.Text), "unexpected num of segments for: %s", tc.Text) + assert.Equal(t, tc.Segments, gsm7.Segments(tc.Text), "unexpected num of segments for: %s", tc.Text) } } diff --git a/locker/locker.go b/utils/locker/locker.go similarity index 100% rename from locker/locker.go rename to utils/locker/locker.go diff --git a/locker/locker_test.go b/utils/locker/locker_test.go similarity index 59% rename from locker/locker_test.go rename to utils/locker/locker_test.go index 356bd8efa..78e09f3c4 100644 --- a/locker/locker_test.go +++ b/utils/locker/locker_test.go @@ -1,10 +1,12 @@ -package locker +package locker_test import ( "testing" "time" "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/mailroom/utils/locker" + "github.com/stretchr/testify/assert" ) @@ -13,36 +15,36 @@ func TestLocker(t *testing.T) { rp := testsuite.RP() // acquire a lock, but have it expire in 5 seconds - v1, err := GrabLock(rp, "test", time.Second*5, time.Second) + v1, err := locker.GrabLock(rp, "test", time.Second*5, time.Second) assert.NoError(t, err) assert.NotZero(t, v1) // try to acquire the same lock, should fail - v2, err := GrabLock(rp, "test", time.Second*5, time.Second) + v2, err := locker.GrabLock(rp, "test", time.Second*5, time.Second) assert.NoError(t, err) assert.Zero(t, v2) // should succeed if we wait longer - v3, err := GrabLock(rp, "test", time.Second*5, time.Second*5) + v3, err := locker.GrabLock(rp, "test", time.Second*5, time.Second*5) assert.NoError(t, err) assert.NotZero(t, v3) assert.NotEqual(t, v1, v3) // extend the lock - err = ExtendLock(rp, "test", v3, time.Second*10) + err = locker.ExtendLock(rp, "test", v3, time.Second*10) assert.NoError(t, err) // trying to grab it should fail with a 5 second timeout - v4, err := GrabLock(rp, "test", time.Second*5, time.Second*5) + v4, err := locker.GrabLock(rp, "test", time.Second*5, time.Second*5) assert.NoError(t, err) assert.Zero(t, v4) // return the lock - err = ReleaseLock(rp, "test", v3) + err = locker.ReleaseLock(rp, "test", v3) assert.NoError(t, err) // new grab should work - v5, err := GrabLock(rp, "test", time.Second*5, time.Second*5) + v5, err := locker.GrabLock(rp, "test", time.Second*5, time.Second*5) assert.NoError(t, err) assert.NotZero(t, v5) } diff --git a/marker/marker.go b/utils/marker/marker.go similarity index 100% rename from marker/marker.go rename to utils/marker/marker.go diff --git a/marker/marker_test.go b/utils/marker/marker_test.go similarity index 76% rename from marker/marker_test.go rename to utils/marker/marker_test.go index 7cf85305c..f5bf1e18e 100644 --- a/marker/marker_test.go +++ b/utils/marker/marker_test.go @@ -1,9 +1,11 @@ -package marker +package marker_test import ( "testing" "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/mailroom/utils/marker" + "github.com/stretchr/testify/assert" ) @@ -30,18 +32,18 @@ func TestMarker(t *testing.T) { for i, tc := range tcs { if tc.Action == "absent" { - present, err := HasTask(rc, tc.Group, tc.TaskID) + present, err := marker.HasTask(rc, tc.Group, tc.TaskID) assert.NoError(t, err) assert.False(t, present, "%d: %s:%s should be absent", i, tc.Group, tc.TaskID) } else if tc.Action == "present" { - present, err := HasTask(rc, tc.Group, tc.TaskID) + present, err := marker.HasTask(rc, tc.Group, tc.TaskID) assert.NoError(t, err) assert.True(t, present, "%d: %s:%s should be present", i, tc.Group, tc.TaskID) } else if tc.Action == "add" { - err := AddTask(rc, tc.Group, tc.TaskID) + err := marker.AddTask(rc, tc.Group, tc.TaskID) assert.NoError(t, err) } else if tc.Action == "remove" { - err := RemoveTask(rc, tc.Group, tc.TaskID) + err := marker.RemoveTask(rc, tc.Group, tc.TaskID) assert.NoError(t, err) } } diff --git a/storage/base.go b/utils/storage/base.go similarity index 100% rename from storage/base.go rename to utils/storage/base.go diff --git a/storage/fs.go b/utils/storage/fs.go similarity index 100% rename from storage/fs.go rename to utils/storage/fs.go diff --git a/storage/fs_test.go b/utils/storage/fs_test.go similarity index 92% rename from storage/fs_test.go rename to utils/storage/fs_test.go index f53c37420..c0d138787 100644 --- a/storage/fs_test.go +++ b/utils/storage/fs_test.go @@ -5,7 +5,7 @@ import ( "os" "testing" - "github.com/nyaruka/mailroom/storage" + "github.com/nyaruka/mailroom/utils/storage" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/storage/s3.go b/utils/storage/s3.go similarity index 100% rename from storage/s3.go rename to utils/storage/s3.go diff --git a/web/server.go b/web/server.go index 9f3c2501c..2a3116f7a 100644 --- a/web/server.go +++ b/web/server.go @@ -10,7 +10,7 @@ import ( "github.com/nyaruka/gocommon/jsonx" "github.com/nyaruka/mailroom/config" - "github.com/nyaruka/mailroom/storage" + "github.com/nyaruka/mailroom/utils/storage" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" From 1507e860240b1be1af3f036b25434c49e042dd06 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Fri, 21 Aug 2020 12:21:20 -0500 Subject: [PATCH 50/56] Implement saving of zendesk ticket files as attachments --- .gitignore | 1 + services/tickets/mailgun/web.go | 2 +- services/tickets/utils.go | 46 ++++++++++++++++++++++++++------- services/tickets/utils_test.go | 26 ++++++++++++++++++- services/tickets/zendesk/web.go | 2 +- utils/storage/fs.go | 6 +++++ utils/storage/fs_test.go | 7 +++++ 7 files changed, 78 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 036beb944..494792c01 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ docs/* docs .DS_Store +_storage/ # Test binary, build with `go test -c` *.test diff --git a/services/tickets/mailgun/web.go b/services/tickets/mailgun/web.go index 2fdcc3db2..858fe8aed 100644 --- a/services/tickets/mailgun/web.go +++ b/services/tickets/mailgun/web.go @@ -112,7 +112,7 @@ func handleReceive(ctx context.Context, s *web.Server, r *http.Request, l *model return errors.Wrapf(err, "error updating ticket: %s", ticket.UUID()), http.StatusInternalServerError, nil } - msg, err := tickets.SendReply(ctx, s.DB, s.RP, ticket, request.StrippedText, nil) + msg, err := tickets.SendReply(ctx, s.DB, s.RP, s.Storage, s.Config.S3MediaPrefix, ticket, request.StrippedText, nil) if err != nil { return err, http.StatusInternalServerError, nil } diff --git a/services/tickets/utils.go b/services/tickets/utils.go index cee5a3def..2a2f1d97d 100644 --- a/services/tickets/utils.go +++ b/services/tickets/utils.go @@ -2,13 +2,19 @@ package tickets import ( "context" + "net/http" + "path/filepath" + "time" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/assets" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/courier" "github.com/nyaruka/mailroom/models" + "github.com/nyaruka/mailroom/utils/storage" "github.com/gomodule/redigo/redis" "github.com/jmoiron/sqlx" @@ -70,29 +76,37 @@ func FromTicketerUUID(ctx context.Context, db *sqlx.DB, uuid assets.TicketerUUID } // SendReply sends a message reply from the ticket system user to the contact -func SendReply(ctx context.Context, db *sqlx.DB, rp *redis.Pool, ticket *models.Ticket, text string, fileURLs []string) (*models.Msg, error) { +func SendReply(ctx context.Context, db *sqlx.DB, rp *redis.Pool, store storage.Storage, mediaPrefix string, ticket *models.Ticket, text string, fileURLs []string) (*models.Msg, error) { // look up our assets - assets, err := models.GetOrgAssets(ctx, db, ticket.OrgID()) + oa, err := models.GetOrgAssets(ctx, db, ticket.OrgID()) if err != nil { return nil, errors.Wrapf(err, "error looking up org #%d", ticket.OrgID()) } // fetch and files and prepare as attachments attachments := make([]utils.Attachment, len(fileURLs)) - //for i := range fileURLs { - // // TODO - // - //attachments[i] = - //} + for i, fileURL := range fileURLs { + fileBody, err := fetchFile(fileURL) + if err != nil { + return nil, errors.Wrapf(err, "error fetching file %s for ticket reply", fileURL) + } + + filename := string(uuids.New()) + filepath.Ext(fileURL) + + attachments[i], err = oa.Org().StoreAttachment(store, mediaPrefix, filename, fileBody) + if err != nil { + return nil, errors.Wrapf(err, "error storing attachment %s for ticket reply", fileURL) + } + } // build a simple translation base := &models.BroadcastTranslation{Text: text, Attachments: attachments} translations := map[envs.Language]*models.BroadcastTranslation{envs.Language("base"): base} // we'll use a broadcast to send this message - bcast := models.NewBroadcast(assets.OrgID(), models.NilBroadcastID, translations, models.TemplateStateEvaluated, envs.Language("base"), nil, nil, nil) + bcast := models.NewBroadcast(oa.OrgID(), models.NilBroadcastID, translations, models.TemplateStateEvaluated, envs.Language("base"), nil, nil, nil) batch := bcast.CreateBatch([]models.ContactID{ticket.ContactID()}) - msgs, err := models.CreateBroadcastMessages(ctx, db, rp, assets, batch) + msgs, err := models.CreateBroadcastMessages(ctx, db, rp, oa, batch) if err != nil { return nil, errors.Wrapf(err, "error creating message batch") } @@ -109,3 +123,17 @@ func SendReply(ctx context.Context, db *sqlx.DB, rp *redis.Pool, ticket *models. } return msg, nil } + +func fetchFile(url string) ([]byte, error) { + req, _ := httpx.NewRequest("GET", url, nil, nil) + + trace, err := httpx.DoTrace(http.DefaultClient, req, httpx.NewFixedRetries(time.Second*5, time.Second*10), nil, 10*1024*1024) + if err != nil { + return nil, err + } + if trace.Response.StatusCode/100 != 2 { + return nil, errors.New("fetch returned non-200 response") + } + + return trace.ResponseBody, nil +} diff --git a/services/tickets/utils_test.go b/services/tickets/utils_test.go index 922aa92df..9d2cc8047 100644 --- a/services/tickets/utils_test.go +++ b/services/tickets/utils_test.go @@ -1,10 +1,14 @@ package tickets_test import ( + "io/ioutil" "testing" + "github.com/nyaruka/gocommon/httpx" "github.com/nyaruka/goflow/envs" "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/utils" + "github.com/nyaruka/goflow/utils/uuids" "github.com/nyaruka/mailroom/models" "github.com/nyaruka/mailroom/services/tickets" _ "github.com/nyaruka/mailroom/services/tickets/mailgun" @@ -118,6 +122,20 @@ func TestSendReply(t *testing.T) { testsuite.ResetDB() ctx := testsuite.CTX() db := testsuite.DB() + rp := testsuite.RP() + defer testsuite.ResetStorage() + + defer uuids.SetGenerator(uuids.DefaultGenerator) + uuids.SetGenerator(uuids.NewSeededGenerator(12345)) + + image, err := ioutil.ReadFile("../../models/testdata/test.jpg") + require.NoError(t, err) + + defer httpx.SetRequestor(httpx.DefaultRequestor) + httpx.SetRequestor(httpx.NewMockRequestor(map[string][]httpx.MockResponse{ + "http://coolfilesfortickets.com/a.jpg": {httpx.MockResponse{Status: 200, Body: image}}, + "http://badfiles.com/b.jpg": {httpx.MockResponse{Status: 400, Body: nil}}, + })) ticketUUID := flows.TicketUUID("f7358870-c3dd-450d-b5ae-db2eb50216ba") @@ -128,9 +146,15 @@ func TestSendReply(t *testing.T) { ticket, err := models.LookupTicketByUUID(ctx, db, ticketUUID) require.NoError(t, err) - msg, err := tickets.SendReply(ctx, db, testsuite.RP(), ticket, "I'll get back to you") + msg, err := tickets.SendReply(ctx, db, rp, testsuite.Storage(), "media", ticket, "I'll get back to you", []string{"http://coolfilesfortickets.com/a.jpg"}) require.NoError(t, err) assert.Equal(t, "I'll get back to you", msg.Text()) assert.Equal(t, models.CathyID, msg.ContactID()) + assert.Equal(t, []utils.Attachment{"image/jpeg:https:///_test_storage/media/1/1ae9/6956/1ae96956-4b34-433e-8d1a-f05fe6923d6d.jpg"}, msg.Attachments()) + assert.FileExists(t, "_test_storage/media/1/1ae9/6956/1ae96956-4b34-433e-8d1a-f05fe6923d6d.jpg") + + // try with file that can't be fetched + _, err = tickets.SendReply(ctx, db, rp, testsuite.Storage(), "media", ticket, "I'll get back to you", []string{"http://badfiles.com/b.jpg"}) + assert.EqualError(t, err, "error fetching file http://badfiles.com/b.jpg for ticket reply: fetch returned non-200 response") } diff --git a/services/tickets/zendesk/web.go b/services/tickets/zendesk/web.go index 089ec7c3f..bc7b60b71 100644 --- a/services/tickets/zendesk/web.go +++ b/services/tickets/zendesk/web.go @@ -76,7 +76,7 @@ func handleChannelback(ctx context.Context, s *web.Server, r *http.Request) (int return errors.Wrapf(err, "error updating ticket: %s", ticket.UUID()), http.StatusBadRequest, nil } - msg, err := tickets.SendReply(ctx, s.DB, s.RP, ticket, request.Message, request.FileURLs) + msg, err := tickets.SendReply(ctx, s.DB, s.RP, s.Storage, s.Config.S3MediaPrefix, ticket, request.Message, request.FileURLs) if err != nil { return err, http.StatusBadRequest, nil } diff --git a/utils/storage/fs.go b/utils/storage/fs.go index 1a1c7e6cb..d6f492bda 100644 --- a/utils/storage/fs.go +++ b/utils/storage/fs.go @@ -21,6 +21,12 @@ func (s *fsStorage) Name() string { } func (s *fsStorage) Test() error { + path, err := s.Put("test.txt", "text/plain", []byte(`test`)) + if err != nil { + return err + } + + os.Remove(path) return nil } diff --git a/utils/storage/fs_test.go b/utils/storage/fs_test.go index c0d138787..af761f681 100644 --- a/utils/storage/fs_test.go +++ b/utils/storage/fs_test.go @@ -15,6 +15,13 @@ func TestFS(t *testing.T) { s := storage.NewFS("_testing") assert.NoError(t, s.Test()) + // break our ability to write to that directory + require.NoError(t, os.Chmod("_testing", 0555)) + + assert.EqualError(t, s.Test(), "open _testing/test.txt: permission denied") + + require.NoError(t, os.Chmod("_testing", 0777)) + url, err := s.Put("/foo/bar.txt", "text/plain", []byte(`hello world`)) assert.NoError(t, err) assert.Equal(t, "_testing/foo/bar.txt", url) From 94eb7ed0467d7e47f5e2ce53d4a3ed39e11ab272 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Mon, 24 Aug 2020 13:48:30 -0500 Subject: [PATCH 51/56] Read from contact.status intead of is_stopped/is_blocked --- go.mod | 2 +- go.sum | 4 ++-- mailroom_test.dump | Bin 1841741 -> 1841800 bytes models/contacts.go | 48 ++++++++++++++++++---------------------- models/msgs.go | 2 +- tasks/handler/worker.go | 10 ++++----- web/ivr/ivr.go | 6 ++--- web/ivr/ivr_test.go | 2 +- 8 files changed, 34 insertions(+), 40 deletions(-) diff --git a/go.mod b/go.mod index 184014d8d..4f315d351 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nyaruka/ezconf v0.2.1 github.com/nyaruka/gocommon v1.3.0 - github.com/nyaruka/goflow v0.102.0 + github.com/nyaruka/goflow v0.102.1 github.com/nyaruka/librato v1.0.0 github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d github.com/nyaruka/null v1.2.0 diff --git a/go.sum b/go.sum index 02280c601..dc6cc1e92 100644 --- a/go.sum +++ b/go.sum @@ -130,8 +130,8 @@ github.com/nyaruka/ezconf v0.2.1 h1:TDXWoqjqYya1uhou1mAJZg7rgFYL98EB0Tb3+BWtUh0= github.com/nyaruka/ezconf v0.2.1/go.mod h1:ey182kYkw2MIi4XiWe1FR/mzI33WCmTWuceDYYxgnQw= github.com/nyaruka/gocommon v1.3.0 h1:IqaPT4KQ2oVq/2Ivp/c+RVCs8v71+RzPU2VhMoRrgpU= github.com/nyaruka/gocommon v1.3.0/go.mod h1:w7lKxIkm/qLAoO9Y3aI1LV7EiYogn6+1C8MTEjxTC9M= -github.com/nyaruka/goflow v0.102.0 h1:WdcQYZ8smr+M2Xbz+3kg1wSl8pVPwz7Ba0Z2ivvehlQ= -github.com/nyaruka/goflow v0.102.0/go.mod h1:wuvXZTs6a6S1rjSRLaQGVxDfKomDJ/1XQoLXCqFekK4= +github.com/nyaruka/goflow v0.102.1 h1:7QX2jTwV7uIbaGnkkpmB+ao+E7Cmyar9g7sRQH4Bu3M= +github.com/nyaruka/goflow v0.102.1/go.mod h1:wuvXZTs6a6S1rjSRLaQGVxDfKomDJ/1XQoLXCqFekK4= github.com/nyaruka/librato v1.0.0 h1:Vznj9WCeC1yZXbBYyYp40KnbmXLbEkjKmHesV/v2SR0= github.com/nyaruka/librato v1.0.0/go.mod h1:pkRNLFhFurOz0QqBz6/DuTFhHHxAubWxs4Jx+J7yUgg= github.com/nyaruka/logrus_sentry v0.8.2-0.20190129182604-c2962b80ba7d h1:hyp9u36KIwbTCo2JAJ+TuJcJBc+UZzEig7RI/S5Dvkc= diff --git a/mailroom_test.dump b/mailroom_test.dump index cb0c74125073e0ea9d742f1efb07d900300958b3..40f1474af46cb81e3504cd3c6deb0c0bf77bea13 100644 GIT binary patch delta 65976 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

+Hrkd3+Md>bi1*7#dNfiRpIhM&J) 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 delta 65110 zcmZ_12Ygh;_XnC=_TJqJcASOy|-W zo~)>+c4u9}{n3H(bHq57&l~-=UaTe|f#})9Weg?OO)y%LvdhJ~@rA>om?WY+L27M|gyoOv22z#Qdon#bB!7=Y%?d;_x;B(ZTfu04_nRC@C_1O- zW#=Oto!w`UCVPs+1X)ksMd{JY{W;w+N!uIE7}!J(X8U4nRwa8vTJ+Ar4V+RdraddI zoZ2Y5ap;{+sU6dal}?+I9=++7X-=s>rWGq)u_QfuTdc9)8tMK8=-D|`1_(d8x2$Z`F4G;iU0O*Z$(WS06CCX&fL&Df~+ zQmmwyKM<3_20OAmEo!}*?-D5ZgE37+X_M&d%Wsnt_lIH{qLgeLYBr2Ed;O?KVi1lR z>o;&_u>t{aObVG+s-{Q3+1OK-`NJ^{d0FZFEhafTSFK-mTFEGlk2WN?J*9P-F zNy$s9tF+GhX7rW4gB3QHiNXQ?G z?))TKU>OQpG4bTc2v_~+#RIQ9WsFWJON?&(%*%W5`M~7A9@cpe`0z(Bl{btNBH6;s{s%fNRr{*TFUQ!asZ+$@7f}dTb1HMX)9{%#0>InL!zu5ut@Q4Et70GhweGa3Vx0) zE%?DGU48-tI{u5S=eNj|Jz8>fafKm!!@Sc;&KqiG^phXkNSuS-m>gb4%HL2;^2#Np zel+lNFG0hw*B71p>&?7F+wb>AkDQvuA-3NRm##RMMc&F$6UfXE)~&KKp|tR<8QpO9 zJn!1}bJp|S=Sq+6`mHl(d-TCr4`mspQ!9;Vi^_f+HQOJwW9pMJubIiwMgMzQju-Tm zmi(Db(wkz4O#?v2%F0;cU8BZF7yofdOfn39TKLz^f^=b!uHv!~N5O)M?BVUV6#ieNTU=u+a#)~RNxd+&^@kFCv>!Ls|1j}-0Kl1PzDiKQzPWgMS| zFC2`3YMtLRGifWAa)%&qI23`nMqv_NXDTzD9zxXTQHDwk!vTV?q_RP}L1u1J4Z5M0 z(p5H(gh2u(?P**crK4;R2{Hsg1dk*F$CAt*tn1{&e$Alo#w(H*5pRTUPEba2Y2%A{ zLu7J_l2zKWQY;W_=pp5+U9t53WaW3UMuA9#ZP;`rjXs;Ij23Gfh=l0HbVY1gJLvP$ z!c1kKXb|*KFms%*V$=>}w+PSqdQr5B~BqvX4Ma$bLQw6<)RuBUoIi#hLj^)6c zGler&5-Idz{L8hJM@eBLr7o#BtktGHeacwbpC7cglqq5p1tExAh^{Io=yBvkxn`2y z#lU^{G=X~($@eRXbgf@$Bhd?lNPb74y(tXNx*k+|$gTnba2CjwNe)I7H($NO!_^E5 z0%Xai!2rpjY7+haCPm0tUodF1-m=AZWP3#rEdFzsPOi5H!TNRpoAA953~*`n^kQe_4p|fWho2XcrH}#SktfvpbY)j%wZtRjCmX-invvduB`j)r!Mi^URHpG0 z#^;R$Vp7=&xqPsa%4J(=C`dGJ$&x? z^2ao1RdUIwJFp?@-l5EL8rw0A7$l2syHmMKjvENm+zHB$e3w|^kR6jnyv2GWQuq{h z#NB5xuRR|qv7~4Um}%+#N~h8e|C*&I{;pqI{)LNteUDPikIOJ9-jp|_C6kp$`G9uB z%Lbf1O=&_dE>PlW?;@oQpF1EvI&+#_87mz2VP)c{gTXq^R%}v2^!jAk{mMnAZvdwV zsWV+^Nq0XWWd<5VsP`dd2=5GEA)?GsS`bu7pdUS~3>I{W*a4dTC~7es$Bx)G*Kx?e z3ats*^?*{JzVnzeQc@ujB85}5#M%R)vH*k&zO!BJ+9Ou1>4_JVkX(R3fGjJ)zTz|+Q4Drq-TS>(7?n3KL}e_QsEooO z*|^ZDd{3#vI}x8vvhLF|>EDZ#N;wUm4+rqxbR&b-dP(Ufs2j0-bl5A(R6&-AFG3H# zs^kk!k3c_X_a?IWv{s+CTB-~c%3H*W#H7pebaoEVcb6$Cl8SZ&M_JJ>J(*ryp)8f% z+96W$hLX)i8tOJ7%g<=>WaLZAVA}r;rC8zzQJO*)v@+7Sy{W91E&TzKeOAjA(yg@z z#|?-HmY=T0k@8g_^3y%k!AxsyTwO-juU00=J|R;RNawaj61Cq_T1gxOc1#*8Os0>m zQ-soBMX*zMZBP#JBNShLQh82Gr|Y*U>9Q5h_yn?mVz2$R2s`G_x0T)!$xw(CQ*qwX z>D!b9N!oCTmb|09DVv8OkBIWIo>)5cXgX($ii2Q_${k7^UA|p8!~3$mUN0@#sr)Ya z3#+)fQcWd?_bG1r)*hvutmX5O(fgFxX3HNVj`EM@lC?1>1{tPiEly zq;Rxhkle@BczW+AN&|_M6(Z9rwZ=j_Wy&wX4C6)JP5TwI^p)ddOGod7iu|8qGWtn1 zOsC~gV$7HhRe%w@MnQ9tEPvhn2c8K;nB;}6n zwF8WBiKOxkw^7=-GL3$JSP^$n+v^X|>qnGazS8)zN%rqrI_J&ZTR_PTf2wuF5Cu_C zk$*-WP$T5RT}HiCBfl0F13MJ-(Q)560xcAX&|Tk3X7X8fxjdc3+N#Mj!X3Gw;d)d1r5~&v1oaY0{|g{3HgIX& zl?+l6uewO~Y3L*<{z+_gi*0AN)$3i*>(hctC08PV9bI?@$1g5A;`p^Je~6r%r!^pu zICV*#kdj*3DX|VIP;ea@zf|c=;taI`DfvTLEpWgpbox`dU1Agn&=r3xxP~z4j2j+l zJ73GCMgL$jvdAXht6D40T=eo)=X9_FHmjORDsEtkv#%@i3TTDwtzW1kWPc$a4Qi^m z!C5%L>1dZKZeaNGk&D-GpM$bYuNtbny5fu>onoPBLHia8g9ZMljcTb)1VY%Uw0~_? zib~t(jY;B4!C{D+jdj#{POUKQ9Ip=LtL*oNLb%h_``oBcw zFNx(T+%S^?c0?EzPDxvzyLSmwOG=jv1-!uIqFH# zj?Mh5#%it@1~cE*RQ1abToKweSLce$mTd*Vteq3VtUt9@vt?_`Ce!lNT-vs+Dptp5 z+cur!Rh!8QwvQ+_rgG5dOvUzw>A$v`EC=!XNZwK{mHL8elAwtV#!Mr=rMQjkNzqJt zcc=;@=;v=n&^J>pa4*N9!WL#zJ2iz?-lU2fh#&eR&FP@N%Q3*0pPuZfc9+8iLbPpX z^#SKAK;P;L=HVOF4hCR**xW!%q-Sncg+Ai5afMCgg=BV5)lJsUQWNNq9%`KIA!O4D zz0_3_BdB9sF&)zfg1t&d;Kcu}uUfk-PB-bpeN=HE_+bYi_1=J{Ijf&KmCqeT>|Rw* zGZRU{0F`fGZVaHE2FR6$EzzP~2C8Cf;>%0t3pJXPyS@6`n8;TBtTaVSB0wU zx4Z%R<*n){QPc9;WY$R7G}vW~jvIl^!8H*J2CzhOsSp%>dXzdwR<^_RVj-HcDi#!9 zoR*s=dXnhfcc|Ywg?=m=D>&m9b?vV?HDq&JmUvJ4-m~5M)WYF1D)efS|AgKPqGKSaCb7{Ba z5lH#b_k+)In*6|NVF!a2*|-t3e*Hmp07n@`%s8}pqlPo@5iISwxoTUo^bs|g!d&)? zAR*LX+I@z4TG9df>cA~p7J2nor5QQ#xLS{F+=4x|uC>yTyggGrAV>%mHk*_@;b}nP z=b&FE$mz~ms!+>dCJm7MDAczmkE^Z3C^*x|t|!%8E&-X*j`W*@zT>^7N%uUVnsRiQ z8M2?oUIL;*EcgSKpLpMfu4_FbcN~f=TKFt>BgZ9RTd-dEUQko%XY z)y6gM;d@?G4YK=rwJy1q1{Qtg1@(&HN2sRI`3|K+=i5@O4j1SKzz*>XAZxhz4g_pE zwN#zKVXzC@^wL6g0B;UkpbuQZEQfS#nL0vN!7l!gsH0^StU@BQ_$86XZ{bwWw{Xss zJYXi2y`sjGf<=&-d)|X6*#ENnAs;Uku;`*!)J~##2%EM(xBAh_S5=|4!KxRbotLOR z_;@hjMQHI-b-Mh5Rvfn+q+p%-eEtxfx~b0OwRhB8WI2=-l;0;tWCr0J;=4m{M3-%M z&<(=g3DXUEh~c^GP$LM{<=#Qsy+-MOk3~UJy!qLozVl zokdUYRVT^9h!x{y#tk2RexJHr6b3-iG+~$M|DohUAO6tIAE|c>jD0xr8-JqW=FT>V zA1BBQ`_(@D3pz!Bo;V;m1_v>Y{ew^fIE}opZshW7KfUsq`j~70_3^R8U_Vv`5+sQ0 zI4<{%X=S9_|-i7E4Cqy;IpC( z_hBy>n$$gtJ$vp;bsswsq1ae4S?okS`7q2jyyJ6Uskh1@p`7NB<4a&<03M0toQ927 zv|MjUIvs(Mo_|z@Ew2I^UHnn?bB;>H>jf&fi|3H3->8Wcs0h}uBCr=`S6!Rq$i;Gr zY1uqnJ=h(acj|ooDrx1zPRAWOiTaPJeI-^{@5cO^%<(06olu*TPKnU8uK%Dm=XGGe z@u3d89g8`k&Ygl-5nqtmzVCxlay~d zQ@G8hkW;%rj^iIeg)QF&Re0_%YF*hqY~AVn+DhrKj=+ip!ptDd?w$VAa$n$58KLve zRP`NZdu+jn*kjkuINFrk_GDK0v* z1fjf;vP|#23{^iId3wmBUQI09;^v2(E&hV1>P{=MeWY7sL_3~1T>%FYTlKf|l zI`qI5HCeE}<+JIjf8;@dyG)Q>B@#)=ueygc&%?h&%l+;;bosx~A~~N~SfW&Rn@JP1 zD%rq#XLYi#tLd_1zePLWa5jmBg-IjIB|UxXVNHl~;2owuRhuFEgviJt-uYS%{aVxR zmz{)ybf8NU=K`(=LAuPSY98@Z#jSM`HE~GO9v;9r5804}T(8@F*hm)aB5+h)N#uoE zT0M47H6Yoh<|3K()D&_MEJS8qM_GAYED5S`d!64KX2&VNC4_5hy*a8-_nBP863zL!1}(NeeJM*eho%~!XR_rSppANIpGKMxvG@wpC5<(qHTW%@ zu_;0at=&Wu=N7b1=7)iTnM}I8jQx6ItJt{gg{g;vC;V#8WaPqfs;F$_hJ=@3j2q=Q<^Rq;c{p)md#tjfD>9J*k?;@%C_ zE|Y?r$BEhELW9k*=Sel4ZuElIj95^^LNv*e! zr=qjVASb%H;^@$TR-5-+!_7;c3~GNVPm&oSEtBB;^WULGN-GS zD1f$?%nNI0Vs|;fGaSfwTeUZrydBZb$A0hBIai|tf3Q^9olK71q`ez^*{N{8MkiQd z;io0#?X(lj!8(FlmX;IM=i4+<5BoyV`72- zm@@KE zS1s$TDM}t$-bLV0!|O`E?V>G(>hVxl2UO)kCBJoodcS@$Oqd0ou$wP-)gD&DWMVft zIk-;A3*EHM%23kjW>JP+JqaGBC=-L=k&Qb{iN z5JT5+krIDT?F04d0rF2ztpVR~aD&p!URt~YZ$R7La%$kM(wwWwbV6_KPDKfjLwy`T zO|K?tG(yXw-o9E`Q63=^`^kw`J2S}}{j?7hLMHZiK>rC#A*=dpzs0_NP)_Efs+ISJ zs~wu34bYO6*dtD*Ppa1hPD=u(Wh%`cs6C`87s$(lMoB-C#*b_#_E@ zlBpzli1wk9PmT?dQ$w82wxL=`iM@14BDAi0EI1sQt1yF3AEsq0u}@XXDjRB4`Hwg8 zi{V;=61(JgS#MK~dN4-7yO>Mb-l}blz2{F^V@u5%n3x6YtoJr;mvWX|yv;$erst1X zw`#(LRmS-E^A4}Un8jDak=K1B2oyUqR#tkiMx`pp9$7j{ zE5{N~9WB?fh7)eXXsxw^HU7R(A}O71@5H|C^!aEtYVffU_}EfNXqMKH1jlG8WaB3| z;jOV+VeINSiNsLO)?CEF%SPx}ZBOj~QY3JAH4sW0S$v1~2JD5M$BE&YvyI$2PP-A? zK2yPOVj7 zL=N4)ifnL~;g0_(IIwuKwod6w+D~z&DqLk>#!hrvsZ|K$sQQn8i*RJT^Dys{BK*bm z@k4ChUr*HvVoRJJ8dZ<$4TK52T`8nTDHeZrk@jTldZ${)s)6ikrxxiyP1~# zT_4qQl-Ti36^~()2lPL+mK0#^<~S=db^GKm;1tG|wZ>Vdp%_0n+nvNO_5Ddfq966BiDROwwZ{ z_DbCsw11SXBo>YezT(os@pJ6w&WPXDzzK%SP_YKL!^L`}U5VTd5R3#~izKqTA3B7z zi6{B$YhzB-V;VIgQ2DL%|(E;EqTpQzUH7>iF@xZM9B={ya zT2ivasc$uqnf=?X(qffZ%YpWU+|YkSd6UGi7k$*Q?UP~awQI3Ar$`K~DhzQMv*|+{pp&T= zQpocg#gv)Bp2A>XhiQnrHc8^JTk(&Za79x_kv3bLLSdCZpzI(GU{`09b&Twvs^6xO zxVI%0rL}xp>|bdTi`%OyQEe$FO}1)l;RrvnRZIf+HOB}};`gbG!CVtnnn1ec;tH0%Zh3J_kdK=Lo z6tZG^a{D-W=pi$KlsD6x(n-y98Cx3)d1-bF^v-2hC=#Skw$!`urnpyyV+OIn*K~TO zmHvY)geAz5g>CdZc{|+Cd~|4@9+6)mKV9V2zmW~#%zQ?%N<*DX8R}0Up3Qc%dWaGP~&RnjR{vn$i_!pF1oXuE({s~hhthZ z|3E9+qdREMB?5#3E$N{T6q5_Xh2UlWfhM$WFWqq(;Ii6O6fW$o%b2+^tT9LW=rVFK z9Q0!zyxrt}a&kUqhrWsV6)X~Oz@dJjzb^d*VVIn~Jj9h;+-0Vc#yj;4k~K(gO-ek9 zYt^9wU7`cW77YG~WhLbwn+>QjNSCG|n6n9nPa?App?%>Hgt4}03ENm9Jz+x4CT>7b9%;v|byMPUNT-i}pxcLes1xNdUGKVVi37Fpf@0u zf0~U*r%JOqDKCd+KVza^DKLha-_M64vkzjbt0zf1!i!>o0WgceNKlBz~jy! zbso~&u(I)DR^cGTLv;tcrt5Cf;W9e-WS-Lj%1-gh0Vw7c_xF&JGC8v;IRZ@xGHgi(rT`0Xr_YB2^wGz3=^C;lVfyP#{Wjjf51jxF zcFn-E}58qwqE%rbc(;fl>TgZs-Em;(G5 zx7x!lZpGXVrZ`Ty8CTY>6(CUhD{#tP69ObtY36 zgX;6{&>K*=%fumP`>?+^tn!~T_Yeh#qCS#@C%vJKnAZ({4chZrAQy{*U?3E|E6@fE2n-n|@x3RWQZz;O~g1NkqH2e_JD!XT6{be9|*UN)QTL&EQIH@Eq5s*^4FbApZ!+vE+G&_*`)R=(Dv`|ByHiWV(J$! z>~&14UoaX(;1rKr*tTKSW{Ml31ZfOPpU`qSde4tq&K zIo77=v~H3CXW+pdeM&#X@q^KUo#OCQ=8?-bL;_SK;in|CvFlcCJR|fZm@LAWoN@q@ z`}VAy94sPUxmBN#<~vX8-GK;D9ecXI|5zVtgB_UoM$_4G|I}Z%Ecdgex;s4Y=k` z+PdDAEGdOe;N|jw`C&6PPcpr#xP+>P1DEN=%(qJBd*BzmPjd<77!W_*q`M|@OkkPt z(Hz4iE>!qJz&puF_N39}rb|dvxLX-Qw>9uIrf1zQu@_Jnfk5pTjl(qlQw03;wI$2 zVz5AA3$Q>@g3Ci@HE>;Ks}JQR%oI#`jY+307xL3Oc}%)4(>0y<05D5dVPFbyPl*7| zsrlKih#Um$*_=gNCedGVTzzE~=pf<7t}5Shge^1kEz?}|B1Yzl!|{PwuvSgwg2Ab5 z!C6~-m?wiIgmBWn(#+-IJz|g8^sVNun?+*_*^6ztyP4$Q0hVgg($$^Uv!HpAoJ2E) z{ChXtz)M=W#BIc;p);f9Vb5p)4JcZA00J8KiLLlBT-UiReCwVkmq*(n6;Nr3*_ z#U&1Fe1*^peBZ6;vTiQn@JHlE0GDx=&P+yjcO}v$-ND6NpafupXeJ;#dqBaS+ryP3 z)`n4TeNR`|`LgJ5y#V79mC-Si$%*&+xH4(5k4tlE`DuP%R}=9Sg3@+RKUW9m%ch(9 zyM+2~g%CA-d4Mxk2s7)6BT^RlTrl*IyYRfjZpI*I1awg)y1Beo1+0f+hy|712yUiui zIRFVFyoEu^9x&tSySKaQ$_@|#e|Ut;Cy~Rwt1-`iCgr0bEb>OVl4Lz-GJQt7WRx?! zy4ZI-$N5Gp7@cR&G~F~>=*Tvtonnq0+~F=)UFsg|YRBi{^M#-Sv3b-R=W0%;-{G`? z)e%P^A}JHe#W`j@x__KYXp=DXuxLOIsR-!qZR1@j99N%(3>9oQ#0Lq_!Z^wK`DOx5n&L`zAQr?thg@6$JH#DRr7%YumRH9i7mC1(+l%C! zY(L1?ghS}LX_BE3SL3C5_qoQ1ZUZ=%xdEvGdG-MWj~=*R?km)@KznqXK_)+lZv78} zh#cjBg=~iDuE|ah{+K*ok5)e9l98tY5RGG-!OTku^ub4@D76uCf}I2NQZhX>!xfNy zK!a(*3rXecn702h$xwd3pNUmgo#f9#vhtjnU~tZ=EH$VRBdGGG*@&K-g-LU=vpk&T zPq-3E-fE1|b`E+H>{jB*Y6kF$nGOf|U9|G3-=7HXpQp zYkt)bu*$Y&2DD7_NeSAxOXTAEkb34o!Y=~y(1L0Rvv=_}%}POv-(GY{yK4l7LEK$f zZ_5^fA;v9q)CqQXX~7M3WgAtUZd&9L7GPflN!ORkT;gU0E2a-KMh8i(8d>@>w3ShZ z(bKV)aI%RB;_AZ5U7shd&wm9=KKvDzuul6TFbY*e>GD^r#(~s0x!5J5FHtQls3bbs zuoR+U`qCLm~)UWDY4=2fS}t=j>p-g@NG( zvpo8J zA=oaP3+rR$+gQY%QCA)6iAuIZ`>N!6fNRsCZ#xQ(A33l*eSXtcm;h&Ob=4Qk9)bd$ zEjlcEk7@6}n6>DxZSwR%han0SUgVYW6$Te@+b1fg(U;zJiQ6^sVk^NQG;2GM75Ky7 z%8iEkJ6#Rv{2eZ@91~`kHliDr=}#+mO3lC*Lau;sx0DUArCQh!$lPy4;`g~sa&-@; z^!6TSSA?LbgsQ-)H1a;QCNVG)%rLMJv^bE07>+*x@XLo-rdA)y1q37{A$0afRX8Ao zC!6lU{C@jPDiI(c zf1W^;lh);UqXFB{*#wBV0IebJKF31LJ_3RAMY&Wsd|^b-Fdzj`XgDbH(*a-LaAC~o zXTF7|WZ)OB47%w{i7E<_Y{kOy*#iNz$L0ePogB;~?u#KRB}wLj}w`;oPUfh{0^j#>yh( zB8vu2b^#vHh4s#cAk2td{LXRvtgQPCkjtnswGCEDf-;;vpht z6wM^_eseXVtIxUa;)F#kC$o|Ol0}|74=nqgmkfwD%sU52E~$GF?;d=1p&H@`ZFrk` zm7q=kN;zj><7J91>+P{-?z;5AC8^kA92<0E5SsP7Yq%I39%gjJ-vRjZ51bZT|Byt6 z{vM#pU#@AQUIZ#bgxOe|lB<6MN&2_b1EOfq1BYb)1Bu`73VINvfKJc#qLUWv61)F_ z!YIoTT+ax(cM*&ol~<+eXhTthSqXO49Fk=sw!GtY%=wOMuKp5LC?0JEc;gKWbnZH& zA@2}D$1xV`5J?D`i1G*uivtfKi0+L}oD;lyKp5>+??y$BG$rtgS>Mx7VjzyY?u{<`ZLho2r_K%@R&B!;MofRr0p1Z7#5}(Qj7G#NV_}T zxRtkpjId}{17nL^5KNmVj2s^Wo87;ehPWWZl3>x=S%zcl4tr_eY@?^s1}QIWWnh%W zYY5{p*ataAssj{nZE+y|w~^uHYQ z>d{us&@W#(FEpP>6~sgDZf=wcn)%`DY$#qO$ZTocEoft7mc^|Mp&Qy3WCheFJPJVe zw86^&_1YNX1O~*So!S~gsNzc+jg!fZB6kYil4rCO(_)cAe9lXKMlP-G16pjgF|7b? zWr3O;Nfu0zL)usdY~Qva5*JVU4y^%>9wl|~=#gDTTNmd<=Y>KgjKOP=#i=OCctdI+aC`vAOPt1VL^lUz? zYDph~gFnbO`be5U9m{5XfEwAfT^B=KVQqNCY5%T9K&}KF+Rt^veh}y)G+@`w#uSHM zOrgfJ3&_KH5^QvP4@2nRU<(Ty!GXBRnVwj-^*xPll2*8N;z=$vr18BCX?(V@1E90x z6$Y~WW7yQaeSz-NeGGA9wsECr$|VCAJqH8v(Y{z*z7_p2{zI<>gl6?OWL}a566J{M z2L_;{mj)Pho$4W$d%`-pUV#01u)rAVK=6u^=&0i$LzqqM5adKlW_C{`#|DEl-Wn{& zh275vPXmITH^jJ~_klt-b5=;s4nvC3`e9OH*ft^^5HBDfctEbeEfAl%w_t~H=7R)) zK&}SomBW#+#tVvC5zNPDU?&bZ6@3b2IVU+%CxkE}3_;@Fa* zj46}6AMfK3cbDftW(x?ouQh)&g62OVxgKG6%_Sw z)l*V*V>UiI^=W5rURXL|O=C|{EO`g&$WPB0^6F*dV%~^3N$S(==Oh+zcQAz+g&E}2 zpY%HP!Fh&=ngE1ZWH==I1yJDB^K!A_!tsFuyd&>?$(zXUV%{EB2-kyQ(kF_IOg>RO znBhZ5{2_}`r!d6f5(o}P0zlYoIpoTV*f$+t#BAAGVhD@QD3xo8FPpuWkw{N0g!GUV zU_@IaB@jqp@gy|bhsYxg(j2#6#w90@xLeRqUczy}&UBOqV_M4cL|XS1a23Y|vCUYH z&VS-kn7G%Q?NAs8=R!&+Y30H!^-0X=f+Au3Ru@uMo;4XJArPBvDK&irCej@*nr*?zMz zz^RW%Oc=EnUvf8C72P5chTB2tB-y`1CpjLKItjW7&^ATS<92vgJ8d_P z^JT-RAqTQyCm^GC8tEb(-w%)0tlh?V?p;Ma{&wI#oReGMH|miQ7EbL^srVPxB#z|2 zZ(J6O4Wo0XeMUXL2r#;N>F^JXg_2M(O7fRK_k3hDq&RM+A=!_xya6AhjbKJNr!vXF zkMY*ilb;wVa+)|xxHj790CF_C)z%6Vpc!C3l zYBrag1WzM6@q4M>`vQ<-oNqQJ!W*;tnB*Ijhv=>!Fe00*4}yXIdR&SkeAzTufvJn0 zp)+#bdUGaxf*VdsK1MAc-SwkUAZqzx;^CTQ`OnZSJN_&+OCREZ>BwIUae4FMULhPB z15QDa`}9{s6SRPZ0kmL`vXD)uF)!t`LknggXf7c0&tRJlI|Et>oN?!$bGB**I6l{$ zlluTSDMlxF923dZww}6FJr6o@s{5gU=LksKJWo7rcfp|u6AuF~8sf(7W8#LrbV~~S z@Vl+4G_J`(VT`+k>Bui1z4AY!wd@*O40d()-b;rNx*q(8yp`da#}q^kDTsLL(S?6X z5%0tHrfg zf}5N5rPMNWX+^9lZ#C={r5m-(0et>`gs9P>ai+LS!Mwt*sCXYHl`OA|7|;`SOnIYa z>Pd3}$uGovMuXx_q0RU$aA~f9Y#0Zwdb1uzV$?+1uZ5c#e>Em9urIL^i-W z9;U+@n8E>#uMl0CX$q?xz9RHOL$f&_7QWFC&CISE2<=AZm{RWyq2>#XKw`!ub`TNA zM;bdsV$L4$0()8JwRcd$=K_m{zZwBvDSyK>+_YeX{?`>uZ$DJS6CXfvN zU6=q{m@Oq05Ha1krFp0Gg_pisnpp&H-dZH?DX{j5R;DmkqdnL}wD-0#r3V+PGWIYM zm7)IU!E0FB)|49sUTHXP0l^ESUZ8b6&lFY}_=hc;<1hfH0_B!}M=5*9{kxXl=sjUm`q?E?<~2f!6g+0!&>v?yo_!yN3^0pN}IW>N^; z!+3QxY)UuKsj-k^{|h-72f&B9qT;)+LTLCR4)?Otvfw834S}&Ar)5yO2HKmOoWd}? z=iFa#tb=*NDP&6Ox-MoG{i%~Fu7U7ZF};`-l9JA*K}U8rMQi{dKKfP{XBZ}d{GwiZ zPqP*|*v*Wi^ShZsF+^pXdb^tv%Wnp|pVSw)MWv&p58^8-B)B2c?D2Z&N z1`u1qUNE10-(B~O#$Tj!KeHjt>}S5_)DF{+`kUfSD%6h9?+VOgVp;(>RSLxGD<=n; z-#djqD5Knfe{_hsofld`pB2-OXD<+BFC>!D!_6Erf2li_Oxf*jK(mLN>qSMpupiUE zs$wcxdMnXN%h-~k&}hm5?_%qDF|nQk&=GzO@K z7QE{ox~KzQO)8&g>a0f7D&XT>S_E+`YA5>qxDWh+D@VdJ*yb_tYu}OPVonN+W%gej zWmZZoa2?F&X%=K=KNw0g#+YA72y}(c0mfBs$ORZ%&FMMOgzgINLLB^n0}znt^F5~q{1kVaJw?c9 z$g)>eOg6dp2+6_7l8}R1a^sA&CQJ z56O=GUOM1@Q@jU`P%SoR_6~Yg#)nDTjKuNx-E?OSHVkn$Adj}t11uk;CX}rKS-!>O z(0H=5-gLhwO;%A{9&V zkk!sG0)|Q+gKG>`grG*`KnQ%vvP)RwY!-5mMzNS;H~L_;M5H#-Mr<G-*b4=j@MI8&FPV6BkRwun|JbIY-gn2~t!0ds8Sv)~Q z`ovtb8D9^WyI~=C+UzD)Cyd;Lf1fo~5jyFIX{j&w?~A+;@AIa3IMBu+N*26`)P@W5 zu?N^@p)b$Jf-|DweYyxX6b~3+=_I6bf!VBVlE+UgN=y-dg@_%CqJ3>K4hxRy&l;rD zJqu0o!w@z!&X|F`a2qjOON8JR8OF;*(#eFEO&PWvfY(*jhTGN@R~20DVZK;m_Lrj| z4`2{aJRyf?fJ-heM}!lYi!*E{DeQ_6i^|oihZJ|$5f+Rp6jdg2Ub6$i5FP!R*;sak zMMQSdYV70qH^HJ8Mj^;8?+ddD8NJSQkxr|?5bNJCTafYt<``0FuqV;_qkBM`uog>% z76AREo9G3x1Wm=}S+*A}>Qr`7boH#@b}#hT!>i3yi2-=9pJ+SzNmnx2z7}khzt&+E z7L(kQXTp$?&p-f7T5tX&m>`17O)mjKz<}JbdE>;OxVrVyo3KcNW+Z=sIf|5QGEZ}D z5CO`oW^EQPvLPbCCi(mDa@n<>U_`_av=9_1yuD^O6oC8Wpg1K9m}ef!+E%$?Vf1Da z8inmh`8(J=T;x`kgF<_@BXnljJLb!L=BS8wHQzG_2!@RWy#!x=k23m#yPL=jq1#eTDk*i(p87l`pBp`zEYTGtQa zc;{oU8YxLekty^hrxwg(EbyH7i6%lS+5y}a3fTK)E$D`FvmPJa!ox|}psbLLUX6aI zerd*YHlkq0eWEv(Cf!fefzO|BM8RKpJl{h)4b_{mSOC7>Ge~??O&~Xpn2lN4D?-JC z!sq=40)p@DAbw3{DD(M?bS1(<0!aS%a#$w%GfBZQGrtCaGg3uM%rol;vtt$D3DF-o zqi@arj>$8Xu#G?m95a{kX&?+C6w`}`6!2`Q?Bk}0?}h`2?M3dc=ZQ`TBS@wbD;$1D zv>W)n8vMgg|6%&VQF=VNHUdn~0S?n=lJf0%%INy-NEHC!6^5%X1a&08Mpu>FaKQij z%YP1+>i(*s&f!wCQwRDuf43CzmW5Xlg2dmGLn@XKGrka(Zm<}zDhmrg#sP}2J0mFW zCm663FQX_c6fv+NJV7%-7v1s9F0%YLhpZcVKp62xyo}>k`3Y8yPnZu=RH!#)Ef$Db z!_hQ^DN;dNbl!{?Y#%~k^hgnHz#g(=nOgW+iStlyrdG-W0dd&o6pGKeLIxmP6UjEL zA5pQ>U#5p-@52ez_kY#h+W$Y@qP9F|(CzQCM{J4yj69hHiCsx#`QO;lT#Dcv&LsJl zArc?@+k8pZhFxL+OAu>Aj$J`!;oVovi$WxXY(E`y)$Ayz23>!!OeFirl|nCEGyjqG zU=6=`!)(a6HC|0c$mdlE!K!32vZox!%6ZkDBE%uv40O5b-X@zz?El+f#OIJ3OLVt9 zZ-X$fcjrlIq|kH=-I9EE2y;O%H&K+`BD!Kv^X+!K=L?KkqUR8nB<82j)pFMnG6-+_ z<5?~D8u^7}@&WPg_Ob!OVTOtZpCq`&+ul%Wy!2$EyNjq2fIDDFbuJlUp$nu=s+)@! zKbiF*o(ugf#l1q%mIbm76)z1U^GrxiT*X3AHCgf(Me^4rjyXJBh&#!2OKAc}vCR7- zNbyP{H?rNW=;PUL@vO1!$CII`oK5nd(G5}K)?CnKW=9;_klGE%o*d*A%z6svH3QIP zjop33ILwZ8Dc3EOPN3qW`OW0qY%dJ9Ls_^%h~&3IdwxP(ZQ=fwPX=HcdIATpZ!Jfo zy<58v2r$w&kyFHfW&k-w$>dxfQb%UAbqh5Vwzvo*1%8D9uVT3~1h05u!#!fT|CK$! zDt8NuA;>09W|xQ73b>nb(!&_f_SS#E^~sGe5G|gLdB1S8o4TCMS_{s6`8N*W(ICX z`qzeyuy0>yf!VEpfPkFq4~CoF-~FrL8ar&Snp`0JX9iclNIEMX?pF( zE{t)1C1#4KFnZt)Y&6aQ?0u|Wi~(4}89~BX5=DT+CD|$b7`<4e0TP*;fsjKdxK9cQ zdn9@=&p<2NgPTt6yWNe+b2GrBj9u8Hl66Sd8pT5^Cb?e~Euf|0xMz<@^87TCKiMty zUMMUL$flX@S|op}yDbI4@s`8m(L=mDiIg@)>=E2rpwv|LLlL(i)4lMsNyt&)d2X%m zbN?xZWii&>MV?zn%WxBfDb%7P9&n$PU??>m1Q<~VE)k+IbGm!KpcQg*X#a=Z7er+| zWs5r&8-Sdj;ciMX;g2N*JljJ+>U4uc=T$9$1wN9KM)E&mwN<#B*3j zt`xF-#W~MI<_Q}ff`8`Ecjq}@5rX8u0C{zRyOj{G?H9PONCaR5!W|U3fE2la;&*0X z<&5AU=RSOvW-BFV2{vBT1c>cb9lJp3j>wqRn}GBD|~=W)f`^d6Yh zd3V$x^S;uXZ(HV`Bl|-LEuRGs4iHUAzZDK%-ks2Z|J#-VdM|Gb3?ta2EaQ+Az3v?S zFz@gtbxGk-9X}oLy1PIOg%n3%$pZ+Giinr(nVd&37mZ!z7Rri^6n$E2jXP2BQwWhG zH}kwh>{9rn3fH=YqYn`RUW5d)j6`y7y%-qRmE+jDXMR9p8p`_fB}XiPpXP6L2YH9^ z;Ri8UxYW}L@(z>ehRyCc2??^y8V8a_xX(WBZTAh1I$k{tLX0smMMI0XL4+4$fT}hW zUV5=}EyPAayXWbH**o0TH*J}KIO{jPG2wvfn>JohZOh8UB^!1G2z&V8(<#y*g>3WODd@N3`QA66M&VAv0~jJKu&h_yFhr+I^C7;8S2+ z$sze4gI^fuZuvb!Aom;F1e3Eq?L)*MO!9V@U2 zAh>prNYs4nxD@mV3-E!FSoWp}82G9JYBVP(!d~d{AKl_-5fF~xr*(gkx);782tHz& znzYR+9EMEVB8QgAf1bXXvDQc-yU#dyLHVwk@HzD?R4jf+Y;)FqOsp(k5sp9S7FK8M z5q3DNFc44TJ`Wz|_`nrF>ir2pn{m;7Mi#+{fudCM<|Vf@p1_LNfX=?;o+ojFMb^s#2t?%HLOj28?}Nou%5}l$%wyV4+vlj$l0*FK2-icc1m(j{+!+&=o&XdcDWd~px#oZlMNcMM#o5+v% z91!&a@T%2I@aViA{M;-;n&rik_YytOO@3j<=VVU{GAqf`lvX5q!m=3x=(CbNzj3tS zg7@Ko;YqSrk7MHfQa#e3%VKMK2uPm_NZzUGo*$ioz4Vp_o_|CSkbzh@mPbntWnm;3 z=06toSai*lY>&_k;8pcQ0p;~Zo-*o^aAS{fFwokFrV5woA z2zV=StgsZ;cms0&u{f7a0lif=1_fZ2L+&m`?rsv_QgF)$>95T_;^&5Z>^kLX<&i(z zg7Et{+js=|*yI0QYGmocXD(P5ZGtq}=Mgf`hs;b`&-NUXGem^XAAXN8ZNeEJfE;Gt z@3Lehhn0sMyleHxC8Q+eDVB)h^!S(Bh)9XQUrY=;aYl%fRi; zUc_NpzXVyo^+~OM@O~fc1EiSX!V73Dt=$19kP-bE4ZyNxeLVq+uUlk2c#ygio+n%} zz$3(x-v^h`v4I|8&cKr59q=I@AwuyLp|Qg};!X>$ z1e}dEx~LeBNSCrZJwhR}SPX7o=9_PUgiB|#Oo87v!Ly355vqjfhKU|8=Xv~gEHmS? z1~mR2usc`aL%1P#t4ftNNkuYjV>_ov#vqK9tCOZ#HnpfiQKg5|10xnZ`T=sR$df|` z+=mPDj3SRXv*7TzKqm&K^Y8UIY95T8@Jk?(ns^`daMzi_4|;YAtYP77FWPU)fnD?2=>lOGe5%?r00ltiBp@e>9)8HvT!>lx)Ho2}etslv zCy=~c0IBoI(;d&zEz_2keFFM9B+7ZUm;-=*va zmIkpH0qDx@kok1=1;}^YCxnXY7s_ZgxUd-fcz(X*B)^T#*Gr&;*n^tns>X%`s%hpR zvV&_V&`jSfb*KfG(*Tjo-gc1`?ucv*)7}IkhgT0EJ8$&Mo~H5(kKaH4swdid)-jyw z4=tWNf8^B1y{X+de!B5!!jv)R`?UIU-2VGNdThwuUw+kX?3V1_Pdz%MR_iB5cY5dV zW9?H8e;Cm_Joxg_2bWKo{rlJ@uU`1Q-)ArW(R|q4oH6m~qdn7Z-*Eg$=hyUpy+>}F zJEi5&C2?na6}%9mJy=u`e?9+n>c75t^3dXf!+Q^^_mAl?ewDs!?K1b#Pny>L`{);6 zjQf86Uo&=bE|}RlxTSrs zp<~+}EiJqL*yOHfwDzy2g^PZ@cVNH9w@g^MXh{FpOn}c=YTfX|lQ%CU+nUMAi&Cvf^xf&u6BedZdlFyda_Og2mx~#?|lt z>GMx5sOMGBB<+9kr-YvxdEa^{fB61{cOx0OoBsMS`;T?mM|zYm))VJ7PkOb>{PB~& z-uV3w4|=~D*Wsp9&pi9t_y?XlQ1`xTvo7`-yrcNezsFp-IA!XthW%fCvuoG-PrjAV zdEtBA%0KK{miX-Uj!*Ra@bNdc&349%D#2~Om3GMU zPRpXlx3w+$xciuk9Tpw!JTdUZ{og+RR8|#5uU<;n z_wdHuX&;Hkv! zcU@`m_^AW${zKY7IBCW0Ek?$6-!`sM!tEaoyRFOV?ccQ2)1Nz1bYyzjeeT}RsIJ=S z^`nhn(BW^6l09iG z%Ir8*bEvywZ4*R)qAx?clkdBfoD29Hh!Nkw%W*F7c2MYoJ|@psc^OoPfq44rrbxy-zGdE^9PEyudts^ zMY;YHH$>j$1ph&d|Cx=SLXCY({QASA7Kkt$`UfyT@q-X{7@^&g)I1^V)5|IDj6F;} z;nC0S_Z*D_>ND4<2|3*`w<4ble%r(W4cmB)wcV>8#~wdqA+LjZmB+xpQ=-7#UWqar zwTl61&loul^WFOIP}`FYxV>!?<_Qg(Q`N#_9loLF?$?&5RpHlMN8sVLCA8=5Rf^Db z{Ik$s*}Z)ehOuPKWtmA{sz}@K?^g%lx7VS~{hrq_X8)I0=64?8wdn0K7kJ18Y;K0$ z|MkZLZ&hzx;O<+z)Qu@bd_ef^!k~xCVx}@%uYg#effdFOD_nSNitC1~r&}ZxczNx4 zbA8=me)!w-egwQe=K8Z{y?4CvIRGB_@?mGG!tZw{%&!%(uUE{#Bd%T4$lG1`=6eiF zTVuNZzTT*Zi|dO}3uCfsffCb{73EAZ{a9i_xhS$y)o#!0qHt3WFnOw6?GFFqWQ*Lx z+F7A6P}D4W$ziLsV~TPG4h+_dc<&#|<$WRU6YeC%7r$C%erMwrzDWdLFTkW=zEe_N z@rc!um>f2#=V~;t$w_}z+VVh@Qq6|eVwhuesh7#)-TjSH&)d$+Nh02qoRvBroB50C z)I(9PL+F60>mW1WC&cUHGb#Lb($n}z|CaqaTX4CrLh(pt{7kzGMZC$doT>;dfY^X9 zMa9rKP(2Hp09F7RIU=KP}i{@%X@29QJk!bdoLek1@r=6;Dd;w)xQ;>5*m zFN~xHLx-^+Y|~7UCNQf9`@Xj_!Y+$OB&aiysYfRxXu1O*xPO;Va4L8IvQ6pqurvs5pvuEd@nrzk(!o;6jwu z-JAz^wa@|32AL7pH-(1XH67I#La`-kMLMq(x3H~&=b&-xA9ZBTCTN7@vEPi#hBLEM zNXbr@^pQv}p!?FioCu&QH=?UBaiZ1S;B@L^$rz{H18R3xc9Z)gcp@zcIZ_H5q3Z`> znFEsbV&(SD9I$Vo`eG>KkKPSQp9zDWHX=Vu=O6>vQ8l}B;!OXzzRtsuIs2maUM#V) zeY`;vyJq#v4bNA{^RJZ>MF)Kkf2AKSVqI}!}q6U&yHj*yWdoWA;lJp7TGPDUX*VWJ~E{Voh=dU{J!|bYk-kd zG;0wsj%PY8KBdq;t6oQTlT{t|XYJP}gJ9VK%%=wucFEoM7lz_Z%p_8F6DVgEq68`h zs>lFx0*tvY-BEF9N4*yjte<~hdgK0#%UgsV^k+1MwSuceifC1)stMHaBZOJGGJ&lL z+EoIj3}Vosr9nv$d+nAK3-OP_oXEp?@=}KbjEvuIuR00aPEK*YSB|PyhJF}`({y9s zmniZS-VaQ(9*Pu`T|ND`NDfL)^>9{8|GC0~h`Q;@*BGn$lJ5&$yYmH6_Kg^xBF`d7 zR1OjGvx^A6x|R1hYQ1W;^HUA3>C&UDZy44Js3SmrfRcO0PBD$Ik0#HVYa*%u`^8#t{DK zV_9;HP-u&?EQj`*R^T~@@-bL=2Zh`kuon{D6l;SPQ$YMIs9NNSy@-g-15nKt65= z$zNuPanVZXy#*HRG!$XXXz7(tps(|~wG>Qb8;(`pXhIA#?v zAtd6Kjva7#+tLIK_FR0TO#Ll^8Kvb!D7Vcnm6E-N;!AaucEqZC5&g>ZEVX>0Mn)+03v~M{uA@rz#PA3-LCX@zEeaqG`o;bs?%Gq?I z$Oh}5VtZnjM5q#cw-QuJuzND9OO0J&R%~l-u^mIpm^Jzx{uP zwo(pdA-}~T%jL$S+5bSrwjNJ1rWTc%tgM`JzWf)i9Kr804j1f`r)^;vcS-W}VP>Rx zQ#3|;vs$!crQ3As5!M)xim@?v5sg90BVl<{d?^KmqIDH^QD~^x>phzROS_T$E+PI4 znb>(nBfs9)KND{68Bvqzm)m=iWBDD^r$XewYjatq#{e=Tw`Vb9QaU`u|MZZ~+Zu>~ zU!*ZT8%VqpL(G|!!1R#bSk1)Vp@R{kQrwykO_@iXUXUe+<`1x)537js9GOs9NlQv= zrW))XlH=L6EKeZSvjF0+zowj}Vle(boIpc+SxZ_Ch!(G6Nh9iwFqx(|{$W*chd9Jx z6^Uw9*oRLVCR~derJrOeY3UB zt~vv=n0+xMoIrTz=H9o&7#Mi}UiJH|`XA-ev;M|`zqjfCTD$NUf|lzF`j*3qf{M3i z8`sYnnmax`s>^pY7V_m8x;6J3Ks|H2#%A z!)QJQ>4Na)lC;V%1^!BEty*R{d0@(iN~7qz{BT=wOae&wacj7PjaCmHvJQhdru!&F zY2_ixL|r{de%=>pn@oI&CQY6;d^R+X2oz_)dQ|hWJNZ&&Yh+B<^b8 zZmc;cGKx(KXd>=2o7J}LHd)3@3^6j>?}<9%{Ho;UFjF2mTHL~;6!IOBRZP{K1)j6c zViI1lpkk+OiWS(7sz$vU(t=+fB?m1``>bQ6m9K!3s>Mdip#;}BWPgJdQH9HEf1TS$%@`-kysX91b+1+lBQLHDH&>9B zl{m{wA!;3qT%$C02)u2%9HesQHiL8-6Krzr-vjr0ZuayOap!)NmX$~}HR3ReGh9`4 z3AlmXjweBdX5BpG0+Y?y8alBdpV9_YVH!a5`QvU%rMg6hN_lXA0!L9rOOjor);fOS zza1iE$^YEN`oI#UKIN;M6nkogv1EAE%n3g(Pa9W(OrLKF3ZLGpFuv3{CF>$}`LaO* z@AYL?fdRWmQUSvT?izN4kY0_>ZOGP{5g?`+KKk$<3qd-&?1JKKsQmDO&ix!@^nq!F zRE4E%zr}*G1V4D~O2P!-=rA1;^iH`aABl;AOa$Zldor3(ppRDkcu8P)r5rdwbad-! zAhSGkpRXIuX>sLe3?|DubW<_RCbkH0x!|@xWC1z16j;|GI)`}__|ZAxh*BCrtl9Sf zP(j!<`ZcexOM$4DhP6JdX*#C`hT0^{tdrAlVwW-bW6n4GDpFgi>lC8+B8NHXTc{(U z@)N<|7a#u!kYQt{oL2d6b0G0MP)*Yqib!LmIaBaXk9!EU;2ti+{F&BhoaW0J-X-D2 zTBouJ6bqCN|DyY*@de3(ijYYLptC>^0+-y@no1(EhGf2MUBMk}84>*R!HH+8438U- z{z#LFHv5y`;!9Y20=)wDBTGqv0Rn|+aYdYb^VuMN5dI*~q2xL%rE!4c?x>x9*VgQb zvXiM2hCRuQ`zQ*h7R$bj;7JTop6HR}uQAnX47j)`O)V`3+{Suj#NAdK0NxrLq~f_I zo$q9V_m3Dlgi9;cw}~3@V^M#32eg}5qZqSLn$5a1Wl@r2AKHQ?u!{o*a@qMdN z;$hPy-0%!36Ka=uYAjwz^N!`MWMv--qu8o3XWf~)rDK_r7-ZAPAz~(7=F)(8^h6E;+ zS@wCOg3-y-;o1_!^_b0-~sSq$7gj95G|5 z7*VxW6?^9l-TJ?Mi|{;DSrv602nc`O$rkt3{x~nkQ_gJ8bA3cV`$)P_WLLDf9vR~Y zV4t1Ys|Vfzxetu})+ai64zzpEWVuLGG@XHy9U`(tVqwkFSh|9}6`j zAhHxs$?kQ&pOq3XPlm4-0rRnrjD()s^f7XRs$S)JtzkymyXxqAPaIIb&{<;JV6(UY(T>C=B+Z2Hn~o@c6Nzw^J@mtQQOPf z2N3aas75Wj<&*RkKgQD&wsI}<&#)w0cZ5TGfmWm=NIPYa`Yx9B7APcP5`qjvaJ z!981b>f?7-@rtiKxEux4W8dL0zro4Hse26<_O~)$;2vx?WBcLAgFOX65*DW3);ErvHyORiNqnDvfcGZUwRnbx2Zb_)?wt>jp82Proa~q-GeXitB$YONdAE6Fp zZOK5ZjqJU=r`R9TKToGA(+B;#YVs&L02U;IF~&5?!vw+<1H3d&79wThK53cY9V4mp zO)M#Hx0()FecS6(UVz87Ux@w4`hgY24Efncgm!LZEuI$=C!gZ0b+aXbyli9|U=lT` ztXy4@vj$g22tOOsqw)T2bN@rOYnFU_pe@3N!9~fvU0R@lZC$mi30@<-%6h~`2KYUq zKG!>9eyeB?H7ZA?O6k%-C9`hF%Jh_B;g4Q89&%c%H~qe6@li-Thl~(`m`Y>S{~Q;& zpWKlQ$yZDp%rWbFlJ6JM^C$Xa5(ulG(2SmyVcOQcdY7-T69rXT-_Vh9+I1)2544=V z5bE%6SP?Y@V~#DP38plicOXBY6}a$D4z~E_px21rtF~^(tBS8r{+EQc6k83U3d_aK z&t2bDGp(;b!S}xzfu9w*J8}}n>g{nZDO)l1Kv1#cf?>^A$EPwqks-Am;1A&ZY5R^a zi>ERw+SSzjgk^Oa)sIuk<4P+U$SnDE6P(6AM-Smoh9RdJnTZTO^vCV zSDeBT0fk>;rM0)tg3X7WluHxAx?`IJq6CT8+JB2lz!Hwf1hFwdcGZFGvakbN7v)kB ztwP%=7xxDF__A?Nd|EsA`k`?pJyyw1zP(4!lds*XPk61IicRtmk%e#gFaK}l7?Va& zC#wx~(r|AE-lYxJ-k2<~AtgB6vz;L(ft z2F*A%f9|fvkqn!#fIH2K>yL%IKAhs*{L1xdr&#`{^@sl^M8KLaZ>czRPHx_h<;=c!FUJikSA!NBfBK|M~Fiv(E^aEO5K)1IDM;fOJT3?1yvZ!^)5<*aE}Hl9-uvuZ~8fF!QW%mr+ot5rzY@Z5;da~IUg{ljZ1 zhp^^1qk{Hmq5v-5dQ!&W-yqrAVgujgADm&k;yey;zVTV3a3MluiwbNpIV_k9)aJjB zZOUd_4qbT|N2>zD;kNbTccfDKSW07IwwEe@%qoW11%@mQESh|BL-1HbdI(ZpIqUE* zr2AOX=83QwL1w491kY59h3goqsMnvU>lI#WI+S0}pAI~0W59Yej|E~Y!Hk4lmg!^^ z#IqoL)Dg(W{hdNgp5y8Ht5ZBcQXBex*XVDR2aLaD=HoPum)HoUnvi`*x40LLRDFAM zZ3p6ksi@T{Mr8j;Z3S*nS#$FxGG+fHo$%@3^zs?1iyWHck_@~f)Ly^6>a zL7~ISJBi|Xv&mjBpg{T8TdbHBO@ZL#wz_IC3P~3FC4a$)?Y6G!K-QNM@7la^ZZTxS z+R^+uizK!Q-xPy%40nTEz?G5=G?bn9I*ehi4WNs`k?52+v&+W8!bsK3GfjdXVYkzX zpvddi3Xea0GZ>#&q#+1`%V~EB^*8A3%pDL;b?XxM+Lsjh@KV2Q_?QKOe#6no>iv3D`U&tLeCF!ks5x|Ui_Z!u`B)H*pU$!D`4%BkU%of zrK^^5)&Wl@n?*0xw~1!6-PXTOCenExBQ0F7PV&=;`o`!W zhkp%K%%~{y`z7yC-_dijJf;vBK3^+U6QFOlZ8a+Vs4F1)5cJOL6^nLo`($Q6i zy~>E|Gi`5`s?<=f(JL0@_sgRYf9Cvi270g9T80>NpXBQH);Bt-E$Mu=xmXVL&darJ z2aGs(54bJxcdX#1pZD7&mGId%Fa9QA!PGzdK{*1KeXilp$k6|$Laq8Bb@E?mrGQ(_ zr_(yFq++$eEImXy_Z%9Np_ruW#o70hmiw`GnSR3|6E5OMJ45sVQ}%PeW^R%PF~ytIf+ITyQSPqvH@M>8zgK^qXnU~^U13*TbXULsk~R=VmXBso5Wvfk)$s&> z4`FopIl~#wZ1LkeNU>l3y9~pyg=o@D56bwTaGU4{MUg3E-N3Z-|GK0zItX)`P3R?P1iz;~BJU zm#*K?*F2Z{Orb2WT|W~-vID#}-2|{UTgLSCr}V4df+4|Nu5O4)i51Ljf?BIwe&~nzmV42JpP)RdOZW+$<0@qX8f1ZwB?vRg7@mx%I1I1 z!xMkW{+l+eA8Vch;dOVIw`e_k3j9$t4?}1D`NSZfz(AIey|r~>+wyXU3@_(-6*Xwz z-e&x=YY}o2us!YFg-!dIBc18>##CW$lz#j4YL_;OnyLmmd?!GGpf% z*-(IrXaf4~!`fyH`u8;PZlhveOipAKc2S9iHtVLTpC{^+mZ~S%JdjupvaMto>!D$v z&bz7&jxmaf7@>-ErIa!G9ERlh z(ta}V`cFd`-u4?aPUo@r+|kiNh&h^ZKrw%5*&?y!zTR$J5!dUP88_33M*ePR!a6-N zT7COwBsONG{xfn5x=)20U&H3VmPGwFVh6o5q~HpiJlC?g7<%m(t9}`~HMP?qUvG$Z z41sRjJFXr~DPUjz*m&Fy#IP$Ka&2Aa&Dg1z3E(dNr(ve!?OjUOrYcVqc}Bo)>b$`a znxkPHCku81ITL1d>;#=7285GsE&J3U904NWzF*%ag+%nd}tkH()Mx>KMlA^&du(bQr9P@z+8RJQt5NYIQ7e* zORx^+_WSyh`@|V~_0DGqnW=@sd_!Iou2C_iA2Jbg+A6wH2{9MN^NT6UUCI9*K zbzq+vJ$v8Vron)&o_=7JolKzPPY||Dw2`1VeR2-{X=MJ=>CaP7h>Lta+Biu`)2$jE_Vs zri5%F6_b$IQ(iDacmEmmTPS5DbXRt$W#+TBHL->w1{dRbfDvjwUOi*&7f1cur+iB| z?q)VSZ!ae-_v&!KddaO7M)dn?>Y^`f0gA6Vdvj&8!da*Yu2>sQnd{s<>1O&hn(G7BTh4uoq^d7$bL zUo9KqW|fB+P}yGQ1|oRg-*$7F-9iH)!tYTK!z~o`Hi-Px#*|C6;l5r9hjMp{SfX8GL8 z)F)bHvgVm#gpkTB==0A5G-&_XO*ByGqh#Zs85Tg+iw@TIAo~tU?C{V)ZkSw)wpEVZ!Zk0c|xC@#|_dr$l)`_s*+UZkAwBS1Nq(;TVWcDu@ z57zlw`qi}MDo*KQ{nZq--PZqD61CUG-;bY%0EI4}*El_g@Wfq37GzU@C>?Tm=u4|C8IxknJrRJ%vQ2LEU{*=dd$M z2SOoFhYrq9O`=#W$4+rbiWL{oXsMNyC+{C|Z6FCXAU{uomg@*p*qeAn&f-gv)?BVkz^4&~N)N3%YvfCh`wmN-#^80thObH&xF3Q@eByHz*|%x z-QeaylKlk95PYdm%uI|BN*ZwhW%4O-cz#7kPPfr5qiG!gPfB~Do(G7;#o(Eco2{yk zdVsM`#Y0S;>?7OBvxb61rNbwp^DLd$Jg_&~RJ`RYzL)*b@e=Pb&If_c?6c0t z_A*08+YlD*zdWJJx^-V}Zx=4Adr2@t4lOo0b=Xxuc4UnxM#}wYe$_b}7-HFXVDG;%3_$z>3B&)wbZ?Q-|@b(Rv_8RV5EM&_X4$57m7TA$gX!mA6+syj7 zsQY_EUCdj1ImnN*BvF+{$2xv=(ZzgmLvf+rqhBrpZwXev+DpK@F;y6M^;kB+GN@r7 zQn0X8!4(Cg^ibjZPVLte{%di$iSyG2)4#@|0Fa)P8DZ651q0m{|KJ((es$Qc@^ z_KYe&7oyb9R?LT++JQc=&hUMb-WY-(Eva8N?QV~(?5U(`*jMZZ+&T zg8d-Acu>s4Z)8A#MNh23(-GI_=qC%g;er`A;X<+fKCU8$$GA4My&>oQawqNHZP2b6 zNv?9VW;@ink~&WmX(rHlcn{GL0_11acXKt1y6DVtYdvc8ax{VL@7 zk^tFM#efHdE@rnNk&&n$PaRz)Lnp!?oU#ac@yqq>F>&^Q;e&WE5Q%|de6NfXK|+5U zl4@VIOpyM>(Rf&CsPG%?|FnMLe-A(nl`ALxSG)nK;;8(uiUR@We^neB3O|UsF$8V> z2i^j80a=X%*=t6#-len&V-jCPe7~d=&O3aMq1}s;c1u5eHd*=L_RPh@uIg{MyXzyE zSkM-idxPQJNt;I93cQHkzgoY9ayMF>dAkJ7m5BWmQH~>wVDrITHKn>gpAQ@}CUm))yU*V^*)Pf-+OrsGl15 znOH}|aM9KhunH{z(sK3EVNx?ByiFKc>+^fds!t@`0I|NXu>YICn52OrcQyd_T@g z;1o*TGytPel&C8Jt63L6xUKI?XO;u0dhA!h?v=3vJfBBTi5amd<-uCJ=sclw+QqaV zEs@gl`$Gy+no84!va%a5rY0N5&W8;?0-HjF)a}BCaKo}6J|Z*1vA}J>Veb;WmWuqH zNShhxWW}dZC}s%C34fl*sO9|o7R1L~22i@{sSO4AWJ>PqCRZX|8`T5b_zn3{BhZkQjz_YBc zMjbZS%U(o$s-Ij>8NHfe`uA;V*Nyd zryz99p=TvBge$7HzKM*xR0gw^&P2vFN>S@N4eiZ__S{F#0RKHI#Z@}wcaf{2a)aMT z{7>2(khfP80Wo|}6!FooHdyD+z`^Nzu;4)}7*}&S3yY2e4Ftt0-k?`+j=Y;kj_{5g zZzo$lxIL-CrZ1dk@W)Lk{WKy&V*K_QTazD`Xdh}^^Lbi?{x z=YPd)p-DY1*sLhwwijxcrhcgecYfk;I)Ekh{sJc*2JFCLYS zMM^|#%Xw1hLgLdMBIs#g-)$BTS z-Cy6uul|KmFwyZ;5%8#V7P5vCyHftj!isYVtUMN#vWw8B@^+az*f}}bM458L56Ybi z66c|1Iv|hQxai6Nlc0X=k1J;JDg4>RHBHDX_cO!90~~wi3%q!{Y_6pOANsJ26tfmT zWL57N&E^c56Vt$R@QCc;L#fdQci>#D`!&rj<9^`w1HB2!BxN~5>&;sKJ`Z-z-gl?P zwj!j1c9)OWJy6yq{|EDKNp+6R?YDFiH@Is5kiEa2x&Y^w{GrPfPFB;BNIuXB@$zIN%kPhrjAyv6<*PQnPe6(Y$0BwG8QL>)l?`8$nt znG`BsH1Wle{(m14P&?(;--%H}*k|IK=;+KHfCoZpW!$%+_lG_JH}_qM`CxP1M%UO! z*Vr4$tcOlGN6Log5L!Cq4J{{)G`86+92_euvEh?}g&ROA@8ON+k7=!OA% zrRKUZx+#05d(Fg60x1P4i#BuDI?=k#^QH6kgiU=h(Ym4Yr5d`?y2+4{X2K>u%>vEE zyVCgvL7VwzDSPJCg68$RQhVY!l~rq>Ige%1rY`%~6(I=8kiVcgH(O=Z-g0iTp512X zENTUjzre$ZRO&1#TZMmhvNYQifY6%wZ4Q=6nr1zu&X_t1Jl4-k*K7H0xX)r%2Cl$O z9S|r8AsP4-c;t4ebl5x2ZPatyOr1rqAo~>D&1{r*K~VHRTs9X=L`|MmQfGoEDn9mt zHeHocRqNm8_#j~R+gv*YwA_|*2Kmfo{1J4CzBDLUjJUW3Fu$OmWpPpX&NpKIwN)Zw z?VfDJ+&xhwQt94k#N4kaL0y-je@oQ#U761Q{a2nLQ70?iT=fTgle~lTeu@m!A<1lu}qP&q~1$?43kYmYBOkijfC1f~W$&xBZnVpNp0$cay%y zi2)wP$;ul@{$ukX!I?(o{SNaTl35@5E&p#-O4qr#VDrrw7`tH2eYw7>^!9(mzsl*; zB6jo^UZ@X2*BO<2V0s=M>b}GQ-uIrDOR$7;;<37Oo%djr5Di`R9^w>zfk*$zHC&^rRLpA@?@ z8h+z$_8Ld=diZ4QFZGb|)Hl@N9};`z=l**6c5*E+6nas@>?^(IABs*eS#v2EgABeI z#}T4Z?WymHx~=d{n@YS5R(pmVE}lMi_uGg)qC1Aj-RG&Jb@V9S z+xYJ#PhFSpsWdgE8oc@GIrF6p0-1eBx-av#zEk^Z$2#qq8a`+vv|r{WfEI7USEkHg zwU65_dpG+-V>R+@U+P=2yZi5L{d<8Ma^KoT(01^RDTzv#DZSBN|5GXOlP?;0fw_4e68?1`3)Ds}yzaGLat^t_J_tplSH?aK(ZoIw z9aOvpvN6sHE02UdAw;fWykF+77~H4s^o7r`4+{JKCI9ch`rmy93S@S}=XtnMHVi7&_2OyLbp!>KuHKdO=hz0E*DNuVR&QzcKo4n56vc<$t?6 z5_g2m9eNoO7V{gmcAcK#qthU8pF&KSE+ZOLiXY#$wg>(dyAe~qg$VdvgZ>bhr2>Pv0*d=+7B?x?N z8FoqHUw|RB2L5l@EbOw^kUa$bEsf6i@?Cyg+%J*Nx3$L%2@D*6hoFL~5EN{Nw7Cw_}-0c0zl{~Pj-1bBM(z5|#3>3_kM+-fhux2BO03`l~Y7pgD8 zZ@GWLo#=%R2p8gXZ@u66286YHAlOMR_Pfz*=6|$e2u%w@dm@L>42vMxDg=90fL!J+ z0Wu+%`ekS6J21umvg4Th2=#W=qSV#W?Kg?{c6AnfAKHn211TrI1MU#st~|3g5x2pc z_c!;z!K$T@-{_F@HZsJDdsv#UMQil`T|MIp<-{sJ3J!(FK30Xs=JI@f2%16$PdOqR zsu(`R<=W60<};s!`)bpNq;5(=#AP7&;M8q{2!1I{x#Z2o6WTq{{hyoJ0`K*O`>HVc zPM|l|`}ZD%q8~K8j1ArBF!>G-?e!r5!gP?yJucgFLJ;qRhtn7SqD$^Oe1KE$&$Ef+ z@`hoEGa7yy!wkL=ABcCp45f&aj2%gp=$2hjWwL{k;rF-?(xY zZ+D(=U#?#JhS1mPdb|5InuwH#GJ9btf2roxbh=X1{J2Gxqk@X}AM(v)bOXwVGjA3em)OK8S)B z$6V&URTW$X-U|15@-m%hot`{h`9W4y<7(dRn>z^U_@-^@vl)(G96veh-Q(SK5Q5V- zHG~fJw^v_oA}?9>g!T7!oK#bgApymY|uG0;ekIQ>_sB-&(P=R{^|2XWFD|g5Wpn?3{TtGA0U4;8mA#I8S)uzC){x|)j!R^ zU?eG_HTjQ-A39Ym|6LCLVwUSk8)eEt990t%@qUi@cu#uy)%p;4M_pl&b*i9f>k8{G zM~bN#Uy@3|b#0e7%UKZt4G-MH2MhhyhpbD0b!E&;kJeLOU9tLM=NxhTZ+a3gQ{Tfm zz;S(ZQ7wL8+06hGzT;)`(?sB#+L%QEvTxJws94@3! zEsR%l1zPK^=!aWFG$rOy)Lg5BV{#vHXieRb@T*%O@erC)fq;RA1xOF^9_z={_xlYD zknmji{tTIiV8qtGz#0;zdB`fGp2Ji)kk#trBxGisU*GneKo8=|dX8P00=D}%AFBH> zc|RjpMLd{+3clV2P_C4bz7&y8PVi9he}M+7-=3P!6(6*8m>3Hq?2G2s3e137%frE#9e+p3~>z1m)p)<|U#P>zC0 zK>iUH3>an_UpcvTp*#49{I!sq>oc~H6Dn`!)l?IX>gFT$6GVC4n!4rDEP3i3sGO%W zkY;w{I?1whpwVR8UBccq!=hcT}Kiw9F>oEPtm_mLo!8f0FpM8Ia;{kgj7_D<#%WniHKjcR-*h%33Q;zAzKO~ ziLk&_d0I?L4Fj?RYTo;E+xPh>C+P5|tOPol zaQ`PYt&5sSXAwTpq?f9T_}vqSP72&|G#QFg8o6F-S9Xb+mARh9^^*b_fJi|9_p+eF zEd0-ZHoG?IbX`9&6hCLu>RlPGz6Y-VQ)hy%p<#$U3;(iRHJMt@I{=SJ;TM*uckPw5 z>w|wE-dx>&LJgBhErnX}(3x<@bA7PS5h5iC_wN>=Ug6x`Tqe?*fP`TnN6an~Dcq^8 zI7{7}4qqpm_AWVXlbuIE5{QAK*rVZ$uo)70n=!1mZ^3PFgrSG*dW_t|~^>sRoNyyoE-Gdzk8P8jzL zo;|i?222;-0c?7e(s;$8{hne{gTXAZMm}!O$x~99j{7Yy^z-W1CGAAhkyflgobD3$>e?d z9VW44LVaBtUB{k?u@2C8O8s3zppZuHOcLvmPVVmwR{!D1jC|>GOxWGwmFqtYr_B3E zN=vo(pPph8;(j-y1yGDXqf=x^Ga}1)I~SRy9wQm7$eJs4EvG~%FYQC@q^Wg zoa=d-Ucb)!?{Ls1DKd6w+TtXzqHf#t?>frxn?EvqH%V&8tkMF|Zo9PM3G-zLG%|6j z9iO5RuY7b=QVI72q7OWZ*gUN<&6(M|vF1$ zTCR34Yz2KSYSW?!(vuKS3~ND|JJW^&>bPiw(s4tCoIM?RI33?p@KVCdR(?6gi&mm! z+D$S@il{H@m9_y`BzDK9QF?zUHhfw=Vqsu!Xi}M?SuJqDF}m_VV2hRVjJBiZ_EpuT z-FP;|VqhDK13M|@L}lO3s_uEKDCR`dG{rdGv>%@z4$)@hMChAR-8do0$rPt}4`etn zcs6;$YQv@rCt!!9ir}c#c16YAgKGg)GP`?Lc8DhutpOstA#rR5{naa!9)?heILGu^ zL$dO$N2?nCRulOobf{hRP*m_pa#R)2*8JlkLGUYC%+s>Sf_S7IvT-Icl6`3jj0fM! zSyI$>;M@MCd1z1+aXhT}oWqYDNQ}J{)DDsQGK$R~J8kCY}%$JbA3~QCdj6id% zfM=bp^eD+SE{Lc8m6o6Q=%A6e#fvVm?=)GQo&8mU*2*)SMdhFv_*LaX!I-}GxzBy{ zdo*!)7+s06SVf-MXMG2apK<(NJo-WbU+K-{iyVODpUN`7%I>|gQD8IBjSoEa+-d*a zk?-4FR}hp4X-z`^i09j*vHY=b3i=B5+KP$@8k@c8c-`21YI$2Bsn~9?$+Yn$GgLu> zLnsBELu#B+-pf0q7=GyVnHS8J7)A)x_^ zj)lxbIa^5!`Nh_LY$7#)-?}nKX%TtN-~Cs6iqMuZ+j>!)RZQc41LMhb=NO|^15f@Z z3@2NlBMIB>ht=3=2;9ojsQ* z1M%?&Y$LM{kEDsh%|z;jGhcH3O;dJ;m;aN7KQjUr4%x`F9wSv|WHZa&1%`#R9AXbp zY26qtRe)uhcI0A=w{M-`;PI1=$#3}L}=k$mG>VTw1W72w7uPw>cmvD5n1qcf>*p7*BJYXPC=h? z+DQO0yqfGR?_2}*(!A<)-uDq4HVoSSePViVOxgLd7FY9!;*7iN_Y`6Omj_|a&sb@x zbofYB06EHkapi=LzT;PJEI&>E(5=*SX!BoFqyL`!+J?$XhwAeE}Y(YlC7 zG?LkKb+Ln^VZ$6Mdd__*r4n`vh)iw6X)bioy%VV#1W3FG zzgueigjp$4!rjll{IJU1E6nEVL$o#vN0>$Jgi1-xMwy6fKf`atn$>LQ{Mu7cMxGsX^Wn#)c00 zoRVZ&pDKpBHQQ&BZa^Ue-_(Ppu}+rLY(^%(D0ELHDzK>_QOM5p>8^gE5${t+NMyhy z;@l4{1qjojE1>s}vf_hBzsFT6R1r`z-g+-eDu61(Z|{;Yt=X!4Wb3$IFFN-O0ew3J#RYq(Gi&Vl-fX6=yK zL;9C6JRdV8hDy*^QXRLPh0e8Z1J@3P&;biqXCNE@!oon#2mlwsR!nSVW^oCq?U#M~ zY)L3=Q=ChSk(^;vzD4;cQ`}eDVmcQ}OO#2Kk%G%g8M3+hxzHn>@k5bGx?cmW@WkxP z{D98>EzFV)FU>jh`D?OIoSN83u#w|%5VRd4GeLC|BV{XPi>u78YwXh2r5BTBBWQ}?Y2DF3>LJh zmZ9isaHdU&#c-gghGb!3hPBS*8pGlppG4`n(v9NX1k#K>9K!}m5{Bb9bB#@ts@b?7 z^VN&UGJX>i1@@elBI)d>;STdjsN%sLIu&H{e$ zu6bcR@_nfxg2h4Iy?04Kwjya<)g8^FIl6H0n`ziVyLfrM8}%bdPz={+emH%aZCn$% zLRtE#S{kq~ia=o{*`&Fppio%l?s>+eZ`?9q(`Gx;<5|7lu=niNUW%X)N8__B9eGGV zvs=wyFAF`*O5;M$89J1xOee$15(6m1+b)xC>E*$qP~Vk%2VcK*3{&T~Q@9tam=(85 zoRIBMwHR@rI344vlPs$Ux^c~=N5Gp;acnllsuo?I=57M~fOGqkIfBHd(#R=yg+yCo z_mpGJ8uH5GnDcFip(X<5K^vJDr&t?R+V?36YBM&Tjd)vfNu3Mp`AzI8Eg*5=28ysRyW}rx%4Fjq;FKwN3OMy?gXKno*%#BB?KsrgN#T#kz>!~?tQ>;wd zXslaQ2fsj=!akad?Vqf)M&8d4aTIjl>nm03sYkREPZnrOTU1SOi`?qYjS)N+#WF+A z1B+m8(Uy-JrX<-uWQUb9Qvk_f9%2V+#4;?maRti1#xX0j7x&m&LKqoInczc*zH}dv zS8OX^xHm%oRnFgn8$THcDIFb+%brJR#G7+WM7$$FMI~e3^&AmgO+=F4fXW1iZLSua z?LC5K>2eEQ5FPCokF2=y{iZqMEQm^3OS#*~uvNdl1dY$)D36QFl>jp`$9K&pdA~@m zlk;JI5gu~$4EJM4ekzg=IH=C?R$KUSBkI)pe_g#(bSJ_7#T(nUZF6EL6Wg}!{9@aj z*tR{fZQC~H=A8ezYu$ApJ`erUwW_PCdsTmT?R{l5_@J8g&vvEg&4^omg8QEr!lCW^ zU-vu&PE~(dmvy{(a=$>{Ceh^#>g&F;B#|^Q^87zY0&*7Jy9tr|v@xTjL|jFuCIgq_ zPl#o`7uI-PYMrC)LL)j?fPk5YrL{L|`&yjmT0cJhsyj!-NGQ)s95TvCLTM&2;&tvO zA#q|VqSc}eJ{aIcx9ZpP^9$oSZH?x?Wp3lZqDYw*X>h=J(%O={7`BXv-g6(%rxXG2 zV?qc*&?YEe+PVo&q1m@E9rFDyL~bj~_hybfRo!Ff5XaX$Gx7Id0RP=JpU$3LcgR=b zasQHb>nZ1QCcgpdj%Vd@wrPdj*yAVH>-BBU&kYu7rAdv%^NEO z@=wixS!R@Tdo_Y87-j#eQyT%Rc#>d$FqlKO6mPz(tfl+u<(*BPw$_)czn1jSGgwhd zms(;G|=S z$g$&N%bT4}=Vur&1DgG*HC`@~{E$C~aHXx-*lxRIH$#LH4WMsB;^Z9NkhZ*_FzL*S zg1%jQ~WO_6Q0 z&8Z{aW!nRCh+bsMTTUU7_8|ph2nHbC%M2FKD#kRqJ>zF31_hg0BG`grE8rcXILHFY z!@r1R;Ol-jWcjie4fD1Cvy4L_sOZz+HTMzOZn!Yn0fXuqlcQg98E*+#H5Vh>v(58}H4GHZ9?&<2YbDMW7f^sl zi3?B1?iDEi*}?1j3W-X>p(kAbweu0J1`Mq5BO$Iz600>#`M$9Avk~}eKl!^6`dyS+ z)ryL+sC*;lSeS-3;Mb=UBaT!0M;6&Cmc$TdZ2Nuy^XsT=c@(9r6;I~Nxfc_jtkRXH zAWOnL_*#QBV$KW+J4g+5Q*Hd;MYn}jpQ|{lw(IjOd~wWyNj?r3VZOP@&4=Z7RLAm6 zAb>kUO98bCQGu=pc3tT=1*UeE3n~$1%u-H*}pmO!hLLSAeKC*aeO(k8_9Sf%vgbX%Idomtfm`Z7~u3pJtEzvQ3YJbpYZv@1s(~WksPSr;HeuuZbHib-GYP7$z@>x`1M32cK(aW0)*b zouY$IWLyNrM7=IN)WDx3(09&VE_ODnBfW%(`iZKicpM8VLq}nFjv<3#w(=6v3NWjR zM06F|H&*wAK4zDF{(!P^}9KX?=h?Bz7hL~(d&p<$gfmPJTSr5?Tm}8Ac}w(s|YSIOG1xP5{k~OVE=C4 z)^dFaf-ri%b$=O0l+XR;c`wjH2IF|~zpD59f4zBHamiu&fdQ6rCL@kl=J)DoCxfWa zzn>?3=P)Nw=rrr7VMz@8>!O7i5?G&B7nZI=1{3oBeamg0AE~)-b*$mdd&FTSF34<6 z;$ly5V<#k>H)hQ=Eh>#tsjO3d$lwF04>X%7$ceWG5UUpx0Pn5p_I9nce(i4?l~KBd z7iad;%PP&PB!J-AkQC`iyu0F3ET?>ooYVzIz3ZA*&W)|1$06<~+)whMl`M76PMJ^D zvq$&u{R8s7N_E2f=VRF&-R|~+i;1lv_U`@M3KZ8OByi2o5gbg>1|eA7h6EMWmj*fn zvm5{x{q#ryVcGWfY?jU&>B@rSaQYwRRFV#x+s|`R6+l3+6GdfJldKedY*C^Y));mx zM{10&GQGHHB$*AO7#Sot4GFf)!x~QKuhe-&;|#22)9|@W*7bxdf zr46k#%*iS71;3}MY_}3C?BEa{s7hxP>OK5MVsoiP7d6J-4A0~O4ntSED*FbOC^H_2 zXqu>bUOGBkM9O6rpXzgoPP?@;8V ziL=ZAdtd~3ncv@+y!iStI~mqy##oH(KWiEqs-H&Pt=(*fHckq|=VH_K;YLc~3{C5w z(9F_rOzFS4QU2Y&n`!rMTz`!|!oTl1d57qqa{^qRj=!Eka(4+KrsVl%FzxLhHqIQ$ zMc6*Ob*D}?dXGOmZ$%jHKhE6!vU+!PZQr0jr+5KRxd3lhfsnH(-1mT!uk)Fk`zbT; z?zgti?)Aq`dAsv#ANME3TC*ERSoF)zI4C@d`7hN)=A?NOM z7{JEVSl9apK=!7!yB!y6p?yv7H!8sSUmmeK4{n<_ouax_IuLl%Ve)8xe;w-ZO9b7WOICm86!74JRb44uC4ZuS` zV{d_M{vd*szq=~@Xflb;ab&O&P6jp4;87_rX*{YtBau|&7Q#*4;K8|5Fp6?xrfk>D zmDJSR7+Q&+y|;8|O`E;b&DiPX{qcw4dHm&Eeo^o4X4yx?-d&xL5Od5kDQKDGEj+$f zDWp(R3k^Ja!E2uEYtv!p=z{ZYpXwkBv9ppRx8|(-wWfNuju!Z|8?x6slr)bIfVbd?B5w4A0{XdDFfY8WHs-$$m;FWPKH5AzoTCEZ zxQy50BXk=TmV*44ddA82qZLWmLKxC!j`QP*95^U6CZRnq3%=qn#C?9O~T zW)iv`#w@V3C1z~Qe(z7rB$qAO7X`G1*Az2FMg-6}D(Z*!k*O&r@P?Ww zgs1MaX`+yg!RIG(1uaeI%Qot7D^?W*-Z7kiPd9UD0PDhSk zrrbLp4p^=IMdJyCJ8HZ7m4T|W7oZ-Hf@3-=O2o||4gnBk>Rq?gMrNuU392A2Ac!59NYm)YC+|;ZH@6l`m!9g4t*a+eFjFp1uz)|demen0(*hvMb0bq9n?TyV zzjl1{Dj5-HFVyv``7ffTdXF!%9^z^_36H~5!5d*ra_oSmVV5gliAXkd$NKj8PxXu* zRFZH4O-0HR+tb3tTEL1$K0~W%1FJ#HBc?60(E!dgEd&D%#BfYa^1O*cnH#RI2y7ED zFie;e?^>@1d7tR9g4H`&DR^h{vxOhw0+f?edv_6+pK6LP`()=O(5#lYD+ zk^zncyPQKbc!V=1DYyvxvIBk1a1rfyi%WJT{f%}9=Yd305Br?R2du1fqJ4!I#TT94 za(dTv1CsjhIoVkaJ15mS9mLZ#_NSJfuR62fvGAzw8E@a?F0b$edbG&x!O&H3AW97! ze{UldG(ZHwA}Ios!zW{qDhX9iYGI8k{(t(=#_xV^s1WrZB0tqez)06w=8hl-4NduC7kVKmPz!ta)@vZ@x%J>sJ+>KjekOK$3{94~TdRHNy zj^-yaZUE1r-1fJ&)?4Ewjz%egHHMC!UtyJWggXW>oarA~J;e_#^3$at|4w;?(?C4p z$DDqR4yali=+gM_(@jY6r50IqX9DPN{7cYdCBUR^CtEOq{#wGeEM8J;&rg)Uy=79J zslx#4B{KhGe!CagpUdic8@&2xfc$OE{m_Z1^P6xLt>aD5rCw2ZOtm*bmSo8WIR)qM z@n{4JDN;QMhnNAh0lCPjk>s~CBFG2yAHHx?hf3^Oc4};mk5rkMqFj$1;z|In5T=L~ z_s&1Mc~2ll#lpWgn6Htd5Q@WDMA{Ye8(!(u@Zn&(IFOKu>Hdi*bEhPk2<)07f{0!| zorWN*(gfxu4b*8ucp=8_Hd(DCs-Iylf^Ak9v7gwbJGA3jykguyO5(#v{nXl~B|oJx zAPxDUW{_qs+f66|{KVDY2bus?M2;SDy>o6u9F!000TVjc8==RhsV+;MN~+KiF^8zx z{q%P&27{k9`+B+G5BiA}%wdu+VR0njugtKgQ8uNp&X%vLv7A&z4J3~ZGT5TZq8dsR z?X>Ql?sjF19F1mglSagqe+prth!cdRrz|$TQq%oAEY@)Jj|ASJj4vQv)!+o36x(?Q z7Ucx%w>mfFd|x5uq|Z`hD1m@5Z&N5=8^WUs8yFgE_ODyeOOTsj2R$7JS}VTCa7rs* zNT})Sy%E%_p2?M!jhi^+_;w6L;yiib%-IwRvQi7!g|uKSFeP}zQ`cr8Q~fEL`M>`J zIAJAO$x#PUW)BIkVf_Gcz_OOo@mn$pAVQ!pNmU@rdyPSI3bphjrMGeJT-)|9>(5q$ ztUG#a?*WR7{qLJWgWU?@%+nvJK(hj=m+Pl-Abph^QJn79J^~SL>U5JhI)Mte7un(x zhoJ&!G@Y5WsVg!75J>*msub;;fny_hEi9t_-d_|T09}PMb1m>puYB?>7@_PzR z?z^Q_i=6s^#y5J#F(7XqDwaN^TF#Zn!3%hSKY$NHjvc_PY0tiF<{9TT{E1hP!4pE$ z#XE~S&%qwYqlh2CQ!cCb^C-nBD;Dx7E6aHxtx~iK*l4gAa`&pJy#TRtvOFVRMh3;& z-xZ6*NaT-k>>sq~+~{EE7Ie^33KXKGvTm(X|K3Vf`4&%!t|6#xocpE50PCrWAQAsq zA}B4t-g!VK@~}Bf1tjTL>27uYNZc+xqRu{vg)JTQX}xMVn>9HZuO)FP)}CETV52+-6CarJIVyq? zBvo|LCS7R&_TsLojLC*5Tr4_2_^W#z@d4u8S`C0q=hjeaG1afZgr~$VW~**hqJDHd zwo~OO2G)GD;clG#pdLrxE3`{BnNUXF@~SWv-DJg$$L;Slhh)X}tUWpOm3*We;}sH! zkRjVwQQPkO_N^~yyWUg9^LW#0aXv+suezSF?0q06=Yj;Q<#y?Rd+62ob^Xio@9qlc z3mf2+P-%(r+l;WQ#(v`CihUuyaVppHfdL@@ky!8ZHSzQKK>!48{NB<3z9hePNX+Jz zK6zh&o!F&N_c;ISm7@EUEeG_@>3}~6V&t-#M>`&f_^Xz-^Pj^#MYFK9LW)jfP6Jhb z5|KX|O?$}V`obUysEIMT)Pt8ZQD{pcjU}Pa zixY+zfU&a&&8i})vS4tdaHBPuB;AP&$+Q0wR(9!w&3f~Qr8 zN{4R3?_Y7@QM$}bp8)*4L>u_9T!$O*E_%^D&o7hb*lXOFyyJES>M=Uty`1~Ya}#ti zTq;)<8dqcGT1GCLdsm2kpI(Jl6D)K#c4Va7752%eC%=hV6`PkzIMPkyEnP z=y>yT1o?z^qk>wNe~gO#3wa-;^9OzR$=XwhSFMrPp|X7)xE?t;cQ6cZIB{@E^MzSi zMTHblSYK!NCACdO*Lq15mh%*k819WTbm@<{T*VF}K;ss20So#0p^vl3yV3B4g|AN% zK65w3Nh-9p-L?+E6ES+uIK)7k#Yet&d!K(X!gb?+}?WqV3$}@7EUEuv*|X zk~lshv3tHVcjP5tk35W1H3f=T7lv?mYVQ>pBmY7;Od*m+N~uaf2J9^6j%*RUF4%e= zZ&`+&n&y}2laBt`pQ5YK>;p+KY?#XjfPr~q@E*q;i#f3hWb6SC4SEomWie4X{l{az zZW^~jB|1%I(e6w?1a8=JO-OwVmp#OU%>nGHoOIU7D@QNKnYZe`e;X4!W$uwPy%21hgq-`-C?;ORBd&`DkhWTswmF z>g>(|7Mi-Xmh?dWSjYOD4U=vA{i;N#qho8JDyyPEH=QP3GY}{ciO>UYRd%pio|NXr zawRBDPl&+g!&QenQu^6dwvIyt09N7-qx2j`PP?TpFH^C)M>bn%l=7K{k!u8_4cE;b z;FQsn7dxAIJbAXDp~;bg)s7u;R$Pz|a*b*)+fQlm@Ls?wae@8^bV%vKi4$1GFniD8 z;T6@|MxB6 z<-UUhkqp{omzcK{1fxnl*ow+F4arD5wP307aLKEJ-2YD&h%gXSR(ooqb;#bJcExlj zfpQ`xO?Q$Bs`zM?}+3ydNn;} zwmXF`<)i08Q&dZ$&cs{1H<6vzAo-N2)n7;kTw6$vJIemGEm4r#?f8XyDH`aP}Ch!q4q!V&m5U@1kFfS{m0W~wfD<**+Q0n)pS zN9V2XW}z3a{fuKX`@%*opdn(V$7ZEAf~KwF=id!Sy`C+mgU4Zqh5V3!pNAZh74v=- zw$+~*4RtsAJQKd312FnsUtIL_OU_+~J7h)>zU@wswJyL)r?mMhH(#QQKk@ii*1(9f z^kY`}OrLb>!`AbDjpx9%+j~~#m)}N@=?;5b?o30zNR69o(CKl_?XHnKYm{qk+UUZ= z?3@rL2sMh9H-GhTswj_CSk2g#^cN|+%#Yz|U~vM`iyH!9h*XQ-%LZ2V;}YLT>WtAOB7O!` zk)QjSA4fLh&sS^5xqc+>l)B2zlJq{%@ijLPc|{Vh9vRT@DLQz(*pEu?D?Ef!FlwXY z(=txHcmQoE=^X7Pf?sX?d_YY5oT=d4yk~tIS?+<}PN#cMp?+m~6%Ls0Q_)-lzk!b- zcDB1pWdl;4AL6nQZ=Oqky-{6s`gpz}%go-7um@;6b*q|+$=ePHZ^kzc>{+44(8^8l zxXpT7d|dhmSX8@Ika%2!;fy&QEeS&B$<*UL7E!DqlGV#VVl`9K)4+fLALI3B}| zx39vDKg^d0413*Pc;8xV-Anma<4bZleuX;Ih5}>8)g@*zCC0fnUyHd_)c+XylJgW_ zO91w$d)vEta*G`8`)>a9d>wH^to3gDOhLH;Wkd}tjN!od4t_CcsT;(xB%9qJndH%Jf&Cs6>_;soit|E;shBNN#nUU3C>gf`h z`5+7hFRGuU9HplAUCM(*?YB9v?Lqn7$YM9@BCOuo;;=QpKv=|Y{Vkm>l$lpUS^$Q} zK0XPK1Vh=al|72WqXr04Izvv9J5PAF&2dwDC67$ObGARfzq+jz99oEk!U>A`eo~@P z6Gn&fVV0A82LfF6LMhptcX-gW2HUSTN&UX3Qp`jaM@I@PkXF6lhT!-iP8PBeKMC4doBdgyFF zA7*>C4ML4U$X80#28CDz8M*Q9D~{x;CgpO5CqQnCh>E=X$7rDGU!pSK)w zJnGW1feXE2397r)=*XisTqSpX5ltTBZ+@O@sVINASU7(S{}F>iYy@NOi1Mcc4I%i= z8$s0;#$5#EasYD5a>$D#sLV(`ZlKXCKg@$>$M4PDmnNq!c~u90sD4>CL?1=3*)A|@61LUZ%A5Q+3@5nN(@o3LqMRtr$9Ot* zgZ~k$npYZpN5)0&t3lG5re|VFooGOT>qp#sld?7>CDOtTNa~cetyL z_-1_uZi=~PyE$HO45!LuVP2l%*8X`)o*SD>G3( z)*3EjcAR4Mk0*X*ZH~+p`BQUf^n6z(R64{}wa=xv8bFlQI+%+@jTB zH3oi?f*mtN3cGOUVs+yf?u!Yd8P$CpS0gbVhr3x~BZ1Cg2B1BO^5ttHrU?rAw43X+ zjXxooF!TA79an=ye#CJ_ZUdiEC>jL~q`hy0buD}S0^qk3l5aq^%_b?%ybNqi1{P0% znyYxgk2!PQnZ9@?DBl)N5|BvR#w>!ku&3FEm97tba44QbN{J{g%I&;4bIkn6BB9hr zD(vfPgqi!n0FVNuNHQ4o@xa=Q+u&ET=UYygsjESsLf|uEQuw^nV-TQFg3CB}mUqdp z-^Le>3>#{%xv>za#pTJJp=o_a;_ds3h*lwd(>+&k2P~=aizFpQh$}Her+z$?*Zmd4 z%kPa$%NJGz^o(y7PMY4$j!@c119wsj&3sqkmr;UsGGMS)D)fhOq29=(?#?KOxPW~jN)E}GUx7_Xe(afli( zqURAVHrZVl6Z^6$MxQw$*v8usvuTp#j#s=?%omU>GW{?TS`V9wk&E75oCd~BSn3U4 z#e{r02^b$f@vhVJ@5z93zqvGq4oQn-WV7n{OJl{7g9z`GW^n=r*UhztvQ)Z~53hKX zK*aG^_C#`wO!w6eJyB;K1No|Ph_YOQhP?Gq4!l0!at0kIb8&A=G?$0Rc}w@X7`9N_ z+9S65-K2WuA@&;X1wJ|mjWF}Lr_QuOhO=FL0G2JxNI1h>LSUs_}?{)aIEbrUc&Rp{3v^}Eqw1+qV;G6w@DZp!fs4Aho z2Jjs?eicTw+Zi$Uhe@tdvHa@Ewz#)|tY_^lMmBmRbYEN2mle4|v~)H)!dBjQc&KE2 zW0L(Ne3jO9=NszqSw#1;YMQ8Ljm6oe_5e51xnF?`M0Vc68CXa?@ngL2eFN{<`TG}D z$lnB7C~Q&?r0#?nq%A^5fdO=nE7Wc8%zawhdcE#Pgnvd`&=|3*7vyuoF=N(l?y#WPT z)XHz09TYws*fafqZ>LljiSh5!rTu{&(fR-+|hSy*W8Gs ziBT~mnm4~%Ia;5j4EN%PeWc|iGcGBCIdR|IC_u3+x|IeC2j9%Od;8~VU9rt>!I%Ny z`-fPRA0)2{kMx0@iWTGZ8zp~qiSgB06@V0n?hF^t+u>spbDGzQ^StxI4faUWoP~M# zIErK--7^H(v^#s~eS(d1jRZBCe5&kca*Dxk9=2d|oJ03J6bA3T*WQ*^`vJAx>f}UV z16GyPtc=)}*ofpO6UadHc_$O)sC=D*>zM)0O5Ipf?~Ib_6V>$i`%F5%&$7VSE)3H8 zcvEq1PalL1B_E{hq|ni4E(qVh{Ps;&e3Gn#gGFJN9^A+$M@)j^5!bey;_@6aMRS`(ygvCTgB*zN^YH!WcXF*gsi;bVe0 zI?9FZcX)x2K!x`{4-%~(T6+@UyC8#{UknX=uZG|eioZb|im%-nlm5b@nBI^pD5M&j zIFC+Et|(Yj`p*5FztvWgfwKX!SGoGb^UDR6QmYjX`=1ZnOmiGK?Gb>dwNUk^zLubX zKZ#LP{^;O@dtZ0hcHO4CJ2h|H-!r~>?!u0`Q<_Mkk1g7T4W_yaJKX5!#uI8^<>{=y z^WHWi;qW}~+|RQD?Hm+uA_b)EMu&v%xkLQs;O9-Nm#(V{6y;;VYdxht=q9R180a}aoa;DK*f`-6Q4feRuwU5XFB$MCd%&k1I=ObTf5C^6cPGG73|@KoJng&dnFx%np9Kf62d8D_kc_f82V<&eUIg?4S+A1_~; z%2UJ#T;)ZoVli24hxAbqRXGgb(q^c@m`!3Mg0BV1Ue1De;{ldl4J0zAV;yTzB)chs zN>zAVhDG#@HHjcI-5V0T=np+ue_2~TbE=Ju*J$C)s8f899L$g;5(G9w+oQ2Nf)lUk zc-q~q(Os0UED1!&i`aRaK-xpiPp=3M+=j;~IjqlO^!RDWP@}c}6Rc`FUVIx<5OI`@$>1psg{T%u}OcWJB`l*8F24E&qc=`0VCgS3DDbD4|P_?pF7h-b-hfW)-b zec;pkd3BG_Wl6ec@fd(gSk6twPh#%||GeK(-%Rx9jdCkDEcvLs5U{$_D#U?_z3VuTaicj3RZ@V~ zmW*Uv{DBK%zNE|VV5H^NlY%p+AR5IbiJgmpv-&&tG^Oo)JB)&Df4eXS--8_nn+tpn zxfpi;k3;d8ozDqhp|M1-gq}Ue_W=2Gq!GIg+7_T=FAI}bEt@N-Q1&*M-Tg&3IW^8G zuB*?$fjfduKW^JZ;8Cgegmdj<0doxzd!*FkjhLbP_=vQtD{*AAE74rfSvkJY?)$n_ z?P}{2)W08u0}1M{yj|7_Hk$!6G90h4dn(U*P)+L2ZqBr&^A6jmOoiMzgm*24!{NE$ z$X~$Mmdf0kG=EQRsmVBU##r}cY}<07k3zzmzVn;zytTg!209K%)2LGVRLi#W8y-#5Z-S*Qbs-N#=XnZrP1`- z`}w^0o1c1mvQ?l>VB$b*+hb4gS{p+ulmbA6hdt#&;)-%2MCWnKL3&ezPtPUrF+um-pIP88(Stc zVIG;IQNI*u1Zkc8C=)p)z#gSZir)R00jx)9H!?huM=q#;Q*mdhWPfw*^Jen7&jV;p zETmg^;b8BJmEN_Q*OI+saGmWtN|-;;V-7!f|F+#FfK>`Yw&uSXunzJU9mtsVnM>@@ z=>Z!q*HrxH1<4qWv>m5CV%~$~Gk=S*xEO=ZL|C+wGuk!f-Y<)VRjFB;c*`%#M{=i! zaXAk98wdwgAESj!&8zB6ou?X>*%Oe9%+q%bnp84u8|Z7bDUZ^`uz@z<6lv09qF4jN z>@J!L(mPwynfalDXwsq3jeQ{$Tg00{l0lyy0owYkQpuc`MzT2EJj^F_h3xKAn}<=M zsxXw#>1@``si}@NWSNgE5m4koN%HV?wu#ijW^D0>C!S8ukc?0nrb&fa`UWsN7&k|% z9z!w?NPM;E8?q63)VoeH-!fikULfrbCIS6KYtV#oRMdUgHhwMlm@Y_M}XU(XE0y z`U$#{PJ4O2>`HMeh1(>~Mgh+Ee~;yptWr&VO!=(0-X3{H{!~`#-I4(qhQKh-1SNc1 zqen(Mo8@EjS3R^2Y>j6a6ACCZv9 zX|WLCM^T)8d`>4`69XAA6XZ1Dgtz=WOMs3!HVpy`ps=M$)tS`4E`TJ@RImZ_Jc4HY zM1?X)xY38Dpae%gf0s%0*cHKq?h{xZITdIG`u%J}UR4t{@v?FpyhyS{NM1;Vw8*#x zjmlIB-224`e4u-rej`S+<1FK_Jd zR{G3pi7~(BgpOXTHUZxnSyocx4jZKT6`3uB;aSK2NiOyt2Xi0Wam5XO?nCq*v2yg- zZGS-CuQX3=q;x1@ThX-GoGN<5Mev(Uhbp=L8q0Svp5qFgZrX8r`6SS!2k>(=>pP=w z-erVn*e;7d@`+CXc$^DiPwPXUAnaZy@1@+??&2m+nB zIT{5HZv?)(SQkQY>HBP`ADYb*Ul)mz)!WzE!!SN(H}(w7df(D9)mW1&+WL?Pitak! zNgBY(N0_Gft78hxr521?56oC2HnRRIy>URn=A!Mw7DqIQML_LeNUAygO_(Mc%tdGn z6ft}7(Y74Tp9Y9;X^+@!5@&hvU&mYL#PF7X`>Y~2d;KU)0Ds_lEoU|%V^1d^48!oA zE>KNJfLm5FlL{ny=y=X2EsYIYwP1F}Yjl2j%{+xq=9Ojk8qpIT?ec9U z*MpdhVQNiqA$Iremh9PMjrflH?ahARU1H*RdJQ^2?E>hHm&(s3dNda=rfy!sxCwYM z#83D)4V%d?}=hf%jdHc>F z6KgIu1>7r=NPp9zL{X=v+F)*5^<)4$67zD!SD1!tX;(Z&{0(gh7KiGeJ?_u$EGzg0 z+24ox4s2nV;(^I$f$5R7P361KUy~NQ+;oXw<@47A;~_VL=Xj~5-aLu*`6GJs%#yGFCzJ~5#65j9BwB_e$wYRSww|ijBKG86cP{Az} z%_<2paqKuo&YR*gFFGSn=3?nBaG6fcn)kA6%;M5ihLVw+Jy6lQ9Xa{0QYr-Z(B$eh zN%TgC1Q*Z#mW_7zY_Aby*cl*lI108#^tEmRA>qg-Qvd4*daDa8L*D)n*q|4OBxt55~D*ym_p z=HYz4$Az61Wv)21P{-HXAM+*Pgg5jTtN_|;VsJdc)Tzw#D>rvDYinzvj43}ctp5{A zHMu_De1y`vwqwrz|723MJ6ZMjRg4_}GHdPsb#9XS|gwLrM;NfC!j{XLWl{_OsUZ!pX0|TmlB=SF*tFgQYK}<;C*3K{tbr!a@ zcMQ78i$zk{(DVkSg2X7qVs^RqQF;&J3(@SAj;BcR{nD1@j+;d430)~bSS?ks`r5{P z6miIGkw8PgfLM7X4~PhC2ZBxPCW^D3GAA9|ldn#ia9;kLL)o&pG?fG8a zm0}hJ0i~fqvi9#m#O9JINnjsY#l;VG>2<%bm2O<~&Hwe)r`anY`n{4}SwN+inlBU| zMxp`p1MClQKfwQh@B`uxNIxL|fbs+C4`@H2|A6rW<_}muVE=&AN}_>_&;jWFzrIf~ zEB%BXhwQC;!!YDU(~mV|vzkz0Wlk2|X~E1QQP91NNTrbY4OxHh%Q({60F#P`!<6@s zZ5Lh_Uc;EvgD}rniFK*!^JZy>W%7V_GOMrxThp7_M=G&*z0DkT`1%5ZMfx1P@Y7P+ zZrPS(YS>nycDp%<=lO*nm81ePU`}yZ^Gsz3uX|@~ve#*_Pg){VwfT4xDp9kc z;km}@LXd)aYv`YJRtN6xTYdS*OSc;6{`~_}vTeOZ!TTA+{}?uUWH-;$+x-lp|K8d! zG5y`s9By3w7An~yX=H8AqH!!avbUREc2>9Qa>!Z)7x5NMr@ISiHDhfo838X zm&S@(hN3`uYo4U2jzzY`GF?;s$OU`kbfPG8=~>fj-#cMfwN-82I2DN#2y_=M-TzuG z`oC6R(D9xCLjQ>)7XM!y@wZ!v3s+QxAr+Py8H#LIH&*L?i~U_dT%aso8FH!>iyA`QTXWCxM#s$zH<{dT9cZ@zxN?NunlcPUqb~q?noch!GGt_YcMAl# zAzM5UEHwz_NtlkrvU16tR>dkr!MnQk7Y`?|11 z1(Af1n8Q6oEoC&K6cst4R?rI0NseR-_|&uKOTq#j;4JlNMpXv$g`;K4%Pk$CDVXuL zQ?WO5yj!|`r~hD_RK=+Sc1c&<*e5-+jvN&VBl2$t;MYC1;W&Dy?_JNuoqxv~1g8H+ z!33NZK~a={VCh=8^X_f_(>)ui>g1-c9v%TB{EQIYfUfR_CPubAicv_SPR_ZP7hE2| zbz;WX(VvD`ITS5tZq_3W;G;yDPm~$Oog`WaBn_b%PXN0yTmH$0**)59y!ujnHASON zH%R8ZyVs`dd__AX%J5fbo`e;L~$=73aoAsgTf6AvIsEvClZGk~|lQeE;=f zUB7121LT;N;_|=IR`^f)wA_Cu7waM29vcf2%Pf1{EPIm*6I(q?Lmf-qA}b3gFo`ax zvQ7g91e3v9;NOD9E|h63foV25dpS;|!SIFIzP>&@QP6fBW-lEb9U$6iG^zjHUMY Date: Mon, 24 Aug 2020 15:11:27 -0500 Subject: [PATCH 52/56] Add test --- web/contact/testdata/modify.json | 129 +++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/web/contact/testdata/modify.json b/web/contact/testdata/modify.json index 31b23cad6..92aaa552f 100644 --- a/web/contact/testdata/modify.json +++ b/web/contact/testdata/modify.json @@ -160,6 +160,135 @@ } ] }, + { + "label": "set status to blocked", + "method": "POST", + "path": "/mr/contact/modify", + "body": { + "org_id": 1, + "user_id": 1, + "contact_ids": [ + 10000 + ], + "modifiers": [ + { + "type": "status", + "status": "blocked" + } + ] + }, + "status": 200, + "response": { + "10000": { + "contact": { + "uuid": "6393abc0-283d-4c9b-a1b3-641a035c34bf", + "id": 10000, + "status": "blocked", + "timezone": "America/Los_Angeles", + "created_on": "2018-07-06T12:30:00.123457Z" + }, + "events": [ + { + "type": "contact_status_changed", + "created_on": "2018-07-06T12:30:00.123456789Z", + "status": "blocked" + } + ] + } + }, + "db_assertions": [ + { + "query": "SELECT count(*) FROM contacts_contact WHERE id = 10000 AND status = 'B'", + "count": 1 + } + ] + }, + { + "label": "set status to archived", + "method": "POST", + "path": "/mr/contact/modify", + "body": { + "org_id": 1, + "user_id": 1, + "contact_ids": [ + 10000 + ], + "modifiers": [ + { + "type": "status", + "status": "archived" + } + ] + }, + "status": 200, + "response": { + "10000": { + "contact": { + "uuid": "6393abc0-283d-4c9b-a1b3-641a035c34bf", + "id": 10000, + "status": "archived", + "timezone": "America/Los_Angeles", + "created_on": "2018-07-06T12:30:00.123457Z" + }, + "events": [ + { + "type": "contact_status_changed", + "created_on": "2018-07-06T12:30:00.123456789Z", + "status": "archived" + } + ] + } + }, + "db_assertions": [ + { + "query": "SELECT count(*) FROM contacts_contact WHERE id = 10000 AND status = 'V'", + "count": 1 + } + ] + }, + { + "label": "set status to active", + "method": "POST", + "path": "/mr/contact/modify", + "body": { + "org_id": 1, + "user_id": 1, + "contact_ids": [ + 10000 + ], + "modifiers": [ + { + "type": "status", + "status": "active" + } + ] + }, + "status": 200, + "response": { + "10000": { + "contact": { + "uuid": "6393abc0-283d-4c9b-a1b3-641a035c34bf", + "id": 10000, + "status": "active", + "timezone": "America/Los_Angeles", + "created_on": "2018-07-06T12:30:00.123457Z" + }, + "events": [ + { + "type": "contact_status_changed", + "created_on": "2018-07-06T12:30:00.123456789Z", + "status": "active" + } + ] + } + }, + "db_assertions": [ + { + "query": "SELECT count(*) FROM contacts_contact WHERE id = 10000 AND status = 'A'", + "count": 1 + } + ] + }, { "label": "set text field with valid value", "method": "POST", From 286acd1d66671676221176979c9fff871f4d6b31 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 25 Aug 2020 08:23:15 -0500 Subject: [PATCH 53/56] Update CHANGELOG.md for v5.7.13 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ab355abb..fdc83b2c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +v5.7.13 +---------- + * Read from contact.status intead of is_stopped/is_blocked + * Implement saving of zendesk ticket files as attachments + * Abstract S3 code so tests and dev envs can use file storage + v5.7.12 ---------- * Fix inserting channel logs and add test From 035b0d739257e6ad3cb3d6c3252e2cd6b92dc693 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 25 Aug 2020 08:40:13 -0500 Subject: [PATCH 54/56] Stop writing is_blocked and is_stopped --- hooks/contact_status_changed_test.go | 10 +++++----- mailroom_test.dump | Bin 1841800 -> 1841022 bytes models/contacts.go | 19 ++++++------------- models/contacts_test.go | 14 +++++++------- tasks/handler/handler_test.go | 2 +- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/hooks/contact_status_changed_test.go b/hooks/contact_status_changed_test.go index 94978f90f..9cb5f13cf 100644 --- a/hooks/contact_status_changed_test.go +++ b/hooks/contact_status_changed_test.go @@ -14,7 +14,7 @@ func TestContactStatusChanged(t *testing.T) { db := testsuite.DB() // make sure cathyID contact is active - db.Exec(`UPDATE contacts_contact SET status = 'A', is_blocked = FALSE, is_stopped = FALSE WHERE id = $1`, models.CathyID) + db.Exec(`UPDATE contacts_contact SET status = 'A' WHERE id = $1`, models.CathyID) tcs := []HookTestCase{ { @@ -23,7 +23,7 @@ func TestContactStatusChanged(t *testing.T) { }, SQLAssertions: []SQLAssertion{ { - SQL: `select count(*) from contacts_contact where id = $1 AND status = 'B' AND is_blocked = TRUE`, + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'B'`, Args: []interface{}{models.CathyID}, Count: 1, }, @@ -35,7 +35,7 @@ func TestContactStatusChanged(t *testing.T) { }, SQLAssertions: []SQLAssertion{ { - SQL: `select count(*) from contacts_contact where id = $1 AND status = 'S' AND is_stopped = TRUE`, + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'S'`, Args: []interface{}{models.CathyID}, Count: 1, }, @@ -47,12 +47,12 @@ func TestContactStatusChanged(t *testing.T) { }, SQLAssertions: []SQLAssertion{ { - SQL: `select count(*) from contacts_contact where id = $1 AND status = 'A' AND is_stopped = FALSE`, + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'A'`, Args: []interface{}{models.CathyID}, Count: 1, }, { - SQL: `select count(*) from contacts_contact where id = $1 AND status = 'A' AND is_blocked = FALSE`, + SQL: `select count(*) from contacts_contact where id = $1 AND status = 'A'`, Args: []interface{}{models.CathyID}, Count: 1, }, diff --git a/mailroom_test.dump b/mailroom_test.dump index 40f1474af46cb81e3504cd3c6deb0c0bf77bea13..8e1f40120c23bda3ec3e2aae78644ad17aa552b5 100644 GIT binary patch delta 69272 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
  • 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 diff --git a/models/contacts.go b/models/contacts.go index 5ce6be945..cb0b81e75 100644 --- a/models/contacts.go +++ b/models/contacts.go @@ -388,9 +388,9 @@ func (c *Contact) URNForID(urnID URNID) urns.URN { return urns.NilURN } -// Unstop sets the is_stopped attribute to false for this contact +// Unstop sets the status to stopped for this contact func (c *Contact) Unstop(ctx context.Context, db *sqlx.DB) error { - _, err := db.ExecContext(ctx, `UPDATE contacts_contact SET status = 'A', is_stopped = FALSE, modified_on = NOW() WHERE id = $1`, c.id) + _, err := db.ExecContext(ctx, `UPDATE contacts_contact SET status = 'A', modified_on = NOW() WHERE id = $1`, c.id) if err != nil { return errors.Wrapf(err, "error unstopping contact") } @@ -630,9 +630,9 @@ func CreateContact(ctx context.Context, db *sqlx.DB, org *OrgAssets, urn urns.UR err = tx.GetContext(ctx, &contactID, `INSERT INTO contacts_contact - (org_id, is_active, status, is_blocked, is_stopped, uuid, created_on, modified_on, created_by_id, modified_by_id, name) + (org_id, is_active, status, uuid, created_on, modified_on, created_by_id, modified_by_id, name) VALUES - ($1, TRUE, 'A', FALSE, FALSE, $2, NOW(), NOW(), 1, 1, '') + ($1, TRUE, 'A', $2, NOW(), NOW(), 1, 1, '') RETURNING id`, org.OrgID(), uuids.New(), ) @@ -932,7 +932,6 @@ const markContactStoppedSQL = ` UPDATE contacts_contact SET - is_stopped = TRUE, status = 'S', modified_on = NOW() WHERE @@ -1330,8 +1329,6 @@ type ContactStatusChange struct { type contactStatusUpdate struct { ContactID ContactID `db:"id"` Status ContactStatus `db:"status"` - Blocked bool `db:"is_blocked"` - Stopped bool `db:"is_stopped"` } // UpdateContactStatus updates the contacts status as the passed changes @@ -1354,8 +1351,6 @@ func UpdateContactStatus(ctx context.Context, tx Queryer, changes []*ContactStat &contactStatusUpdate{ ContactID: ch.ContactID, Status: status, - Blocked: blocked, - Stopped: stopped, }, ) @@ -1380,13 +1375,11 @@ const updateContactStatusSQL = ` contacts_contact c SET status = r.status, - is_blocked = r.is_blocked::boolean, - is_stopped = r.is_stopped::boolean, modified_on = NOW() FROM ( - VALUES(:id, :status, :is_blocked, :is_stopped) + VALUES(:id, :status) ) AS - r(id, status, is_blocked, is_stopped) + r(id, status) WHERE c.id = r.id::int ` diff --git a/models/contacts_test.go b/models/contacts_test.go index bc41c62e1..c82a6c53c 100644 --- a/models/contacts_test.go +++ b/models/contacts_test.go @@ -329,7 +329,7 @@ func TestStopContact(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contactgroup_contacts WHERE contact_id = $1`, []interface{}{CathyID}, 1) // verify she's stopped - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE AND is_active = TRUE and is_blocked = FALSE`, []interface{}{CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_active = TRUE`, []interface{}{CathyID}, 1) } func TestUpdateContactLastSeenAndModifiedOn(t *testing.T) { @@ -405,24 +405,24 @@ func TestUpdateContactStatus(t *testing.T) { err := UpdateContactStatus(ctx, db, []*ContactStatusChange{}) assert.NoError(t, err) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B' AND is_blocked = TRUE`, []interface{}{CathyID}, 0) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B'`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S'`, []interface{}{CathyID}, 0) changes := make([]*ContactStatusChange, 0, 1) changes = append(changes, &ContactStatusChange{CathyID, flows.ContactStatusBlocked}) err = UpdateContactStatus(ctx, db, changes) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B' AND is_blocked = TRUE`, []interface{}{CathyID}, 1) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B'`, []interface{}{CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S'`, []interface{}{CathyID}, 0) changes = make([]*ContactStatusChange, 0, 1) changes = append(changes, &ContactStatusChange{CathyID, flows.ContactStatusStopped}) err = UpdateContactStatus(ctx, db, changes) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B' AND is_blocked = TRUE`, []interface{}{CathyID}, 0) - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'B'`, []interface{}{CathyID}, 0) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S'`, []interface{}{CathyID}, 1) } diff --git a/tasks/handler/handler_test.go b/tasks/handler/handler_test.go index ea20b112a..fcd529ad1 100644 --- a/tasks/handler/handler_test.go +++ b/tasks/handler/handler_test.go @@ -347,7 +347,7 @@ func TestStopEvent(t *testing.T) { testsuite.AssertQueryCount(t, db, `SELECT count(*) from contacts_contactgroup_contacts WHERE contactgroup_id = $1 AND contact_id = $2`, []interface{}{models.DoctorsGroupID, models.GeorgeID}, 1) // that cathy is stopped - testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S' AND is_stopped = TRUE`, []interface{}{models.CathyID}, 1) + testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM contacts_contact WHERE id = $1 AND status = 'S'`, []interface{}{models.CathyID}, 1) // and has no upcoming events testsuite.AssertQueryCount(t, db, `SELECT count(*) FROM campaigns_eventfire WHERE contact_id = $1`, []interface{}{models.CathyID}, 0) From df920c02632c7b4cc11baa615735e18c3ec299b7 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Tue, 25 Aug 2020 12:49:38 -0500 Subject: [PATCH 55/56] Update CHANGELOG.md for v5.7.14 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdc83b2c7..38ce20750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +v5.7.14 +---------- + * Stop writing is_blocked and is_stopped + v5.7.13 ---------- * Read from contact.status intead of is_stopped/is_blocked From 9efcb0742a7fd19777655e4a7a9d5ff5d439fc37 Mon Sep 17 00:00:00 2001 From: Allan Lima Date: Fri, 6 Nov 2020 21:04:51 -0300 Subject: [PATCH 56/56] Update Dockerfile --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index c303dcd53..30420921a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,8 +11,8 @@ RUN addgroup -S golang \ COPY . . -RUN curl https://codeload.github.com/nyaruka/goflow/tar.gz/$(grep goflow go.mod | cut -d" " -f2) | tar --wildcards --strip=1 -zx "*/docs/*" -RUN cp docs/en_US/completion.json docs/completion.json && cp docs/en_US/functions.json docs/functions.json +RUN export GOFLOW_VERSION=$(grep goflow go.mod | cut -d" " -f2 | cut -c2-) && curl https://codeload.github.com/nyaruka/goflow/tar.gz/v$GOFLOW_VERSION | tar --wildcards --strip=1 -zx "goflow-${GOFLOW_VERSION}/docs/*" +RUN cp ./docs/en-us/*.* docs/ RUN go install -v ./cmd/...