From 418db90c4eee1cbf76e2b2e08bd16292843bd9fa Mon Sep 17 00:00:00 2001 From: Paulo Bernardo <paulo.bernardo@weni.ai> Date: Tue, 19 Nov 2024 10:13:30 -0300 Subject: [PATCH 1/6] feat: add whatsapp broadcasts support --- core/models/contacts.go | 2 +- core/models/msgs.go | 340 +++++++++++++++++++++++++- core/queue/queue.go | 6 + core/tasks/msgs/send_wpp_broadcast.go | 171 +++++++++++++ 4 files changed, 517 insertions(+), 2 deletions(-) create mode 100644 core/tasks/msgs/send_wpp_broadcast.go diff --git a/core/models/contacts.go b/core/models/contacts.go index 0f574b988..8013d1b39 100644 --- a/core/models/contacts.go +++ b/core/models/contacts.go @@ -694,7 +694,7 @@ func contactIDsFromURNs(ctx context.Context, db Queryer, orgID OrgID, urnz []urn owners[identityToOriginal[urn]] = id } - if (orgConfig.Get("verify_ninth_digit", false) == true) { + if orgConfig.Get("verify_ninth_digit", false) == true { owners, err = checkNinthDigitContacts(ctx, owners, db, orgID) if err != nil { return nil, errors.Wrapf(err, "error while checking for ninth digit contacts") diff --git a/core/models/msgs.go b/core/models/msgs.go index 1b57f4160..26f824cd3 100644 --- a/core/models/msgs.go +++ b/core/models/msgs.go @@ -328,6 +328,16 @@ func GetMsgRepetitions(rp *redis.Pool, contactID ContactID, msg *flows.MsgOut) ( return redis.Int(msgRepetitionsScript.Do(rc, key, contactID, msg.Text())) } +// GetWppMsgRepetitions gets the number of repetitions of this msg text for the given contact in the current 5 minute window +func GetWppMsgRepetitions(rp *redis.Pool, contactID ContactID, msg *flows.MsgWppOut) (int, error) { + rc := rp.Get() + defer rc.Close() + + keyTime := dates.Now().UTC().Round(time.Minute * 5) + key := fmt.Sprintf("msg_repetitions:%s", keyTime.Format("2006-01-02T15:04")) + return redis.Int(msgRepetitionsScript.Do(rc, key, contactID, msg.Text())) +} + // NewOutgoingFlowMsg creates an outgoing message for the passed in flow message func NewOutgoingFlowMsg(rt *runtime.Runtime, org *Org, channel *Channel, session *Session, out *flows.MsgOut, createdOn time.Time) (*Msg, error) { return newOutgoingMsg(rt, org, channel, session.ContactID(), out, createdOn, session, NilBroadcastID) @@ -348,6 +358,10 @@ func NewOutgoingBroadcastMsg(rt *runtime.Runtime, org *Org, channel *Channel, co return newOutgoingMsg(rt, org, channel, contactID, out, createdOn, nil, broadcastID) } +func NewOutgoingWppBroadcastMsg(rt *runtime.Runtime, org *Org, channel *Channel, contactID ContactID, out *flows.MsgWppOut, createdOn time.Time, broadcastID BroadcastID) (*Msg, error) { + return newOutgoingMsgWpp(rt, org, channel, contactID, out, createdOn, nil, broadcastID) +} + // NewOutgoingMsg creates an outgoing message that does not belong to any flow or broadcast, it's used to the a direct message to the contact func NewOutgoingMsg(rt *runtime.Runtime, org *Org, channel *Channel, contactID ContactID, out *flows.MsgOut, createdOn time.Time) (*Msg, error) { return newOutgoingMsg(rt, org, channel, contactID, out, createdOn, nil, NilBroadcastID) @@ -552,6 +566,18 @@ func newOutgoingMsgWpp(rt *runtime.Runtime, org *Org, channel *Channel, contactI // if msg is missing the URN or channel, we also fail it m.Status = MsgStatusFailed m.FailedReason = MsgFailedNoDestination + } else { + // also fail right away if this looks like a loop + repetitions, err := GetWppMsgRepetitions(rt.RP, contactID, msgWpp) + if err != nil { + return nil, errors.Wrap(err, "error looking up msg repetitions") + } + if repetitions >= 20 { + m.Status = MsgStatusFailed + m.FailedReason = MsgFailedLooping + + logrus.WithFields(logrus.Fields{"contact_id": contactID, "text": msgWpp.Text(), "repetitions": repetitions}).Error("too many repetitions, failing message") + } } // if we have a session, set fields on the message from that @@ -573,7 +599,7 @@ func newOutgoingMsgWpp(rt *runtime.Runtime, org *Org, channel *Channel, contactI } } - if len(msgWpp.QuickReplies()) > 0 || len(msgWpp.ListMessage().ListItems) > 0 || msgWpp.Topic() != flows.NilMsgTopic || msgWpp.Text() != "" || msgWpp.Footer() != "" || msgWpp.HeaderType() != "" || msgWpp.InteractionType() != "" { + if len(msgWpp.QuickReplies()) > 0 || len(msgWpp.ListMessage().ListItems) > 0 || msgWpp.Topic() != flows.NilMsgTopic || msgWpp.Text() != "" || msgWpp.Footer() != "" || msgWpp.HeaderType() != "" || msgWpp.InteractionType() != "" || msgWpp.Templating() != nil { metadata := make(map[string]interface{}) if msgWpp.Topic() != flows.NilMsgTopic { metadata["topic"] = string(msgWpp.Topic()) @@ -628,6 +654,10 @@ func newOutgoingMsgWpp(rt *runtime.Runtime, org *Org, channel *Channel, contactI if msgWpp.TextLanguage != "" { metadata["text_language"] = msgWpp.TextLanguage } + if msgWpp.Templating() != nil { + metadata["templating"] = msgWpp.Templating() + m.Template = msgWpp.Templating().Template().Name + } m.Metadata = null.NewMap(metadata) } @@ -1402,6 +1432,314 @@ func CreateBroadcastMessages(ctx context.Context, rt *runtime.Runtime, oa *OrgAs return msgs, nil } +type WppBroadcastTemplate struct { + UUID assets.TemplateUUID `json:"uuid" validate:"required,uuid"` + Name string `json:"name" validate:"required"` + Variables []string `json:"variables,omitempty"` +} + +type WppBroadcastMessageHeader struct { + Type string `json:"type,omitempty"` + Text string `json:"text,omitempty"` +} + +type WppBroadcastMessage struct { + Text string `json:"text,omitempty"` + Header WppBroadcastMessageHeader `json:"header,omitempty"` + Footer string `json:"footer,omitempty"` + Attachments []utils.Attachment `json:"attachments,omitempty"` + QuickReplies []string `json:"quick_replies,omitempty"` + Template WppBroadcastTemplate `json:"template,omitempty"` + InteractionType string `json:"interaction_type,omitempty"` + OrderDetails flows.OrderDetailsMessage `json:"order_details,omitempty"` + FlowMessage flows.FlowMessage `json:"flow_message,omitempty"` + ListMessage flows.ListMessage `json:"list_message,omitempty"` + CTAMessage flows.CTAMessage `json:"cta_message,omitempty"` +} + +type WppBroadcast struct { + b struct { + BroadcastID BroadcastID `json:"broadcast_id,omitempty" db:"id"` + URNs []urns.URN `json:"urns,omitempty"` + ContactIDs []ContactID `json:"contact_ids,omitempty"` + GroupIDs []GroupID `json:"group_ids,omitempty"` + OrgID OrgID `json:"org_id" db:"org_id"` + ParentID BroadcastID `json:"parent_id,omitempty" db:"parent_id"` + Msg WppBroadcastMessage `json:"msg"` + } +} + +func (b *WppBroadcast) ID() BroadcastID { return b.b.BroadcastID } +func (b *WppBroadcast) OrgID() OrgID { return b.b.OrgID } +func (b *WppBroadcast) ContactIDs() []ContactID { return b.b.ContactIDs } +func (b *WppBroadcast) GroupIDs() []GroupID { return b.b.GroupIDs } +func (b *WppBroadcast) URNs() []urns.URN { return b.b.URNs } +func (b *WppBroadcast) Msg() WppBroadcastMessage { return b.b.Msg } + +func (b *WppBroadcast) MarshalJSON() ([]byte, error) { return json.Marshal(b.b) } +func (b *WppBroadcast) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, &b.b) } + +func NewWppBroadcast(orgID OrgID, id BroadcastID, msg WppBroadcastMessage, urns []urns.URN, contactIDs []ContactID, groupIDs []GroupID) *WppBroadcast { + bcast := &WppBroadcast{} + bcast.b.OrgID = orgID + bcast.b.BroadcastID = id + bcast.b.Msg = msg + bcast.b.URNs = urns + bcast.b.ContactIDs = contactIDs + bcast.b.GroupIDs = groupIDs + + return bcast +} + +func (b *WppBroadcast) CreateBatch(contactIDs []ContactID) *WppBroadcastBatch { + batch := &WppBroadcastBatch{} + batch.b.BroadcastID = b.b.BroadcastID + batch.b.Msg = b.b.Msg + batch.b.OrgID = b.b.OrgID + batch.b.ContactIDs = contactIDs + return batch +} + +type WppBroadcastBatch struct { + b struct { + BroadcastID BroadcastID `json:"broadcast_id,omitempty"` + Msg WppBroadcastMessage `json:"msg"` + URNs map[ContactID]urns.URN `json:"urns,omitempty"` + ContactIDs []ContactID `json:"contact_ids,omitempty"` + IsLast bool `json:"is_last"` + OrgID OrgID `json:"org_id"` + } +} + +func (b *WppBroadcastBatch) BroadcastID() BroadcastID { return b.b.BroadcastID } +func (b *WppBroadcastBatch) ContactIDs() []ContactID { return b.b.ContactIDs } +func (b *WppBroadcastBatch) URNs() map[ContactID]urns.URN { return b.b.URNs } +func (b *WppBroadcastBatch) SetURNs(urns map[ContactID]urns.URN) { b.b.URNs = urns } +func (b *WppBroadcastBatch) OrgID() OrgID { return b.b.OrgID } +func (b *WppBroadcastBatch) Msg() WppBroadcastMessage { return b.b.Msg } + +func (b *WppBroadcastBatch) IsLast() bool { return b.b.IsLast } +func (b *WppBroadcastBatch) SetIsLast(last bool) { b.b.IsLast = last } + +func (b *WppBroadcastBatch) MarshalJSON() ([]byte, error) { return json.Marshal(b.b) } +func (b *WppBroadcastBatch) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, &b.b) } + +func CreateWppBroadcastMessages(ctx context.Context, rt *runtime.Runtime, oa *OrgAssets, bcast *WppBroadcastBatch) ([]*Msg, error) { + repeatedContacts := make(map[ContactID]bool) + broadcastURNs := bcast.URNs() + + // build our list of contact ids + contactIDs := bcast.ContactIDs() + + // build a map of the contacts that are present both in our URN list and our contact id list + if broadcastURNs != nil { + for _, id := range contactIDs { + _, found := broadcastURNs[id] + if found { + repeatedContacts[id] = true + } + } + + // if we have URN we need to send to, add those contacts as well if not already repeated + for id := range broadcastURNs { + if !repeatedContacts[id] { + contactIDs = append(contactIDs, id) + } + } + } + + // load all our contacts + contacts, err := LoadContacts(ctx, rt.DB, oa, contactIDs) + if err != nil { + return nil, errors.Wrapf(err, "error loading contacts for broadcast") + } + + channels := oa.SessionAssets().Channels() + + // for each contact, build our message + msgs := make([]*Msg, 0, len(contacts)) + + // utility method to build up our message + buildMessage := func(c *Contact, forceURN urns.URN) (*Msg, error) { + if c.Status() != ContactStatusActive { + return nil, nil + } + + contact, err := c.FlowContact(oa) + if err != nil { + return nil, errors.Wrapf(err, "error creating flow contact") + } + + urn := urns.NilURN + var channel *Channel + + // we are forcing to send to a non-preferred URN, find the channel + if forceURN != urns.NilURN { + for _, u := range contact.URNs() { + if u.URN().Identity() == forceURN.Identity() { + c := channels.GetForURN(u, assets.ChannelRoleSend) + if c == nil { + return nil, nil + } + urn = u.URN() + channel = oa.ChannelByUUID(c.UUID()) + break + } + } + } else { + // no forced URN, find the first URN we can send to + for _, u := range contact.URNs() { + c := channels.GetForURN(u, assets.ChannelRoleSend) + if c != nil { + urn = u.URN() + channel = oa.ChannelByUUID(c.UUID()) + break + } + } + } + + // no urn and channel? move on + if channel == nil { + return nil, nil + } + + // evaluate our message fields + text := bcast.Msg().Text + attachments := bcast.Msg().Attachments + quickReplies := bcast.Msg().QuickReplies + headerType := bcast.Msg().Header.Type + headerText := bcast.Msg().Header.Text + footerText := bcast.Msg().Footer + var templating *flows.MsgTemplating = nil + templateVariables := bcast.Msg().Template.Variables + + ctaMessage := bcast.Msg().CTAMessage + listMessage := bcast.Msg().ListMessage + flowMessage := bcast.Msg().FlowMessage + orderDetails := bcast.Msg().OrderDetails + + // build up the minimum viable context for evaluation + evaluationCtx := types.NewXObject(map[string]types.XValue{ + "contact": flows.Context(oa.Env(), contact), + "fields": flows.Context(oa.Env(), contact.Fields()), + "globals": flows.Context(oa.Env(), oa.SessionAssets().Globals()), + "urns": flows.ContextFunc(oa.Env(), contact.URNs().MapContext), + }) + + // evaluate our text + text, _ = excellent.EvaluateTemplate(oa.Env(), evaluationCtx, text, nil) + + // evaluate our header text + headerText, _ = excellent.EvaluateTemplate(oa.Env(), evaluationCtx, headerText, nil) + + // evaluate our footer text + footerText, _ = excellent.EvaluateTemplate(oa.Env(), evaluationCtx, footerText, nil) + + // evaluate our quick replies + for i, qr := range quickReplies { + quickReplies[i], _ = excellent.EvaluateTemplate(oa.Env(), evaluationCtx, qr, nil) + } + + // evaluate our template + if bcast.Msg().Template.UUID != "" { + // load our template + var templateMatch assets.Template = nil + for _, t := range oa.templates { + if t.UUID() == bcast.Msg().Template.UUID { + templateMatch = t + break + } + } + if templateMatch == nil { + return nil, errors.Errorf("template not found: %s", bcast.Msg().Template.UUID) + } + + // looks for a translation in these locales + locales := []envs.Locale{ + contact.Locale(oa.Env()), + oa.Env().DefaultLocale(), + } + translation := oa.SessionAssets().Templates().FindTranslation(bcast.Msg().Template.UUID, channel.ChannelReference(), locales) + if translation != nil { + // evaluate our variables + evaluatedVariables := make([]string, len(templateVariables)) + for i, variable := range templateVariables { + sub, err := excellent.EvaluateTemplate(oa.Env(), evaluationCtx, variable, nil) + if err != nil { + return nil, errors.Wrapf(err, "failed to evaluate template variable") + } + evaluatedVariables[i] = sub + } + + text = translation.Substitute(evaluatedVariables) + var templateReference = assets.NewTemplateReference(bcast.Msg().Template.UUID, bcast.Msg().Template.Name) + templating = flows.NewMsgTemplating(templateReference, translation.Language(), translation.Country(), evaluatedVariables, translation.Namespace()) + } + } + + // don't do anything if we have no text or attachments + if text == "" && len(attachments) == 0 { + return nil, nil + } + + // create our outgoing message + out := flows.NewMsgWppOut(urn, channel.ChannelReference(), bcast.Msg().InteractionType, headerType, headerText, text, footerText, ctaMessage, listMessage, flowMessage, orderDetails, attachments, quickReplies, templating, flows.NilMsgTopic) + msg, err := NewOutgoingWppBroadcastMsg(rt, oa.Org(), channel, c.ID(), out, time.Now(), bcast.BroadcastID()) + if err != nil { + return nil, errors.Wrapf(err, "error creating outgoing message") + } + + return msg, nil + } + + // run through all our contacts to create our messages + for _, c := range contacts { + // use the preferred URN if present + urn := broadcastURNs[c.ID()] + msg, err := buildMessage(c, urn) + if err != nil { + return nil, errors.Wrapf(err, "error creating broadcast message") + } + if msg != nil { + msgs = append(msgs, msg) + } + + // if this is a contact that will receive two messages, calculate that one as well + if repeatedContacts[c.ID()] { + m2, err := buildMessage(c, urns.NilURN) + if err != nil { + return nil, errors.Wrapf(err, "error creating broadcast message") + } + + // add this message if it isn't a duplicate + if m2 != nil && m2.URN() != msg.URN() { + msgs = append(msgs, m2) + } + } + } + + // allocate a topup for these message if org uses topups + topup, err := AllocateTopups(ctx, rt.DB, rt.RP, oa.Org(), len(msgs)) + if err != nil { + return nil, errors.Wrapf(err, "error allocating topup for broadcast messages") + } + + // if we have an active topup, assign it to our messages + if topup != NilTopupID { + for _, m := range msgs { + m.SetTopup(topup) + } + } + + // insert them in a single request + err = InsertMessages(ctx, rt.DB, msgs) + if err != nil { + return nil, errors.Wrapf(err, "error inserting broadcast messages") + } + + return msgs, nil +} + const updateMsgForResendingSQL = ` UPDATE msgs_msg m diff --git a/core/queue/queue.go b/core/queue/queue.go index 0cc5e1b86..b38a6b90e 100644 --- a/core/queue/queue.go +++ b/core/queue/queue.go @@ -50,6 +50,12 @@ const ( // SendBroadcastBatch is our type for sending a broadcast batch SendBroadcastBatch = "send_broadcast_batch" + // SendTemplateBroadcast is our type for sending a template broadcast + SendWppBroadcast = "send_whatsapp_broadcast" + + // SendTemplateBroadcastBatch is our type for sending a template broadcast batch + SendWppBroadcastBatch = "send_whatsapp_broadcast_batch" + // HandleContactEvent is our task for event handling HandleContactEvent = "handle_contact_event" diff --git a/core/tasks/msgs/send_wpp_broadcast.go b/core/tasks/msgs/send_wpp_broadcast.go new file mode 100644 index 000000000..2ac362d54 --- /dev/null +++ b/core/tasks/msgs/send_wpp_broadcast.go @@ -0,0 +1,171 @@ +package msgs + +import ( + "context" + "encoding/json" + "time" + + "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/mailroom" + "github.com/nyaruka/mailroom/core/models" + "github.com/nyaruka/mailroom/core/msgio" + "github.com/nyaruka/mailroom/core/queue" + "github.com/nyaruka/mailroom/runtime" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" +) + +func init() { + mailroom.AddTaskFunction(queue.SendWppBroadcast, handleSendWppBroadcast) + mailroom.AddTaskFunction(queue.SendWppBroadcastBatch, handleSendWppBroadcastBatch) +} + +func handleSendWppBroadcast(ctx context.Context, rt *runtime.Runtime, task *queue.Task) error { + ctx, cancel := context.WithTimeout(ctx, time.Minute*60) + defer cancel() + + // decode our task body + if task.Type != queue.SendWppBroadcast { + return errors.Errorf("unknown event type passed to send worker: %s", task.Type) + } + broadcast := &models.WppBroadcast{} + err := json.Unmarshal(task.Task, broadcast) + if err != nil { + return errors.Wrapf(err, "error unmarshalling broadcast: %s", string(task.Task)) + } + + return CreateWppBroadcastBatches(ctx, rt, broadcast) +} + +func CreateWppBroadcastBatches(ctx context.Context, rt *runtime.Runtime, bcast *models.WppBroadcast) error { + // we are building a set of contact ids, start with the explicit ones + contactIDs := make(map[models.ContactID]bool) + for _, id := range bcast.ContactIDs() { + contactIDs[id] = true + } + + groupContactIDs, err := models.ContactIDsForGroupIDs(ctx, rt.DB, bcast.GroupIDs()) + if err != nil { + return errors.Wrapf(err, "error getting contact ids for group ids") + } + + for _, id := range groupContactIDs { + contactIDs[id] = true + } + + oa, err := models.GetOrgAssets(ctx, rt, bcast.OrgID()) + if err != nil { + return errors.Wrapf(err, "error getting org assets") + } + + // get the contact ids for our URNs + urnMap, err := models.GetOrCreateContactIDsFromURNs(ctx, rt.DB, oa, bcast.URNs()) + if err != nil { + return errors.Wrapf(err, "error getting contact ids for urns") + } + + urnContacts := make(map[models.ContactID]urns.URN) + repeatedContacts := make(map[models.ContactID]urns.URN) + + q := queue.BatchQueue + + // two or fewer contacts? queue to our handler queue for sending + if len(contactIDs) <= 2 { + q = queue.HandlerQueue + } + + // we want to remove contacts that are also present in URN sends, these will be a special case in our last batch + for u, id := range urnMap { + if contactIDs[id] { + repeatedContacts[id] = u + delete(contactIDs, id) + } + urnContacts[id] = u + } + + rc := rt.RP.Get() + defer rc.Close() + + contacts := make([]models.ContactID, 0, 100) + + // utility functions for queueing the current set of contacts + queueBatch := func(isLast bool) { + // if this is our last batch include those contacts that overlap with our urns + if isLast { + for id := range repeatedContacts { + contacts = append(contacts, id) + } + } + + batch := bcast.CreateBatch(contacts) + + // also set our URNs + if isLast { + batch.SetIsLast(true) + batch.SetURNs(urnContacts) + } + + err = queue.AddTask(rc, q, queue.SendWppBroadcastBatch, int(bcast.OrgID()), batch, queue.DefaultPriority) + if err != nil { + logrus.WithError(err).Error("error while queuing wpp broadcast batch") + } + contacts = make([]models.ContactID, 0, 100) + } + + // build up batches of contacts to start + for c := range contactIDs { + if len(contacts) == startBatchSize { + queueBatch(false) + } + contacts = append(contacts, c) + } + + // queue our last batch + queueBatch(true) + + return nil +} + +func handleSendWppBroadcastBatch(ctx context.Context, rt *runtime.Runtime, task *queue.Task) error { + ctx, cancel := context.WithTimeout(ctx, time.Minute*60) + defer cancel() + + // decode our task body + if task.Type != queue.SendWppBroadcastBatch { + return errors.Errorf("unknown event type passed to send worker: %s", task.Type) + } + broadcast := &models.WppBroadcastBatch{} + err := json.Unmarshal(task.Task, broadcast) + if err != nil { + return errors.Wrapf(err, "error unmarshalling broadcast: %s", string(task.Task)) + } + + // try to send the batch + return SendWppBroadcastBatch(ctx, rt, broadcast) +} + +func SendWppBroadcastBatch(ctx context.Context, rt *runtime.Runtime, bcast *models.WppBroadcastBatch) error { + // always set our broadcast as sent if it is our last + defer func() { + if bcast.IsLast() { + err := models.MarkBroadcastSent(ctx, rt.DB, bcast.BroadcastID()) + if err != nil { + logrus.WithError(err).Error("error marking broadcast as sent") + } + } + }() + + oa, err := models.GetOrgAssets(ctx, rt, bcast.OrgID()) + if err != nil { + return errors.Wrapf(err, "error getting org assets") + } + + // create this batch of messages + msgs, err := models.CreateWppBroadcastMessages(ctx, rt, oa, bcast) + if err != nil { + return errors.Wrapf(err, "error creating broadcast messages") + } + + msgio.SendMessages(ctx, rt, rt.DB, nil, msgs) + return nil +} From be01fa07083a710b27a338c51bf5ccd36d115737 Mon Sep 17 00:00:00 2001 From: Paulo Bernardo <paulo.bernardo@weni.ai> Date: Tue, 19 Nov 2024 10:14:37 -0300 Subject: [PATCH 2/6] feat: add whatsapp broadcasts tests --- core/tasks/msgs/send_wpp_broadcast_test.go | 357 +++++++++++++++++++++ dump_merger.sh | 17 +- mailroom_test.dump | Bin 1908890 -> 1907630 bytes weni_dump.sql | 1 + 4 files changed, 359 insertions(+), 16 deletions(-) create mode 100644 core/tasks/msgs/send_wpp_broadcast_test.go diff --git a/core/tasks/msgs/send_wpp_broadcast_test.go b/core/tasks/msgs/send_wpp_broadcast_test.go new file mode 100644 index 000000000..f7bb441c6 --- /dev/null +++ b/core/tasks/msgs/send_wpp_broadcast_test.go @@ -0,0 +1,357 @@ +package msgs_test + +import ( + "encoding/json" + "testing" + "time" + + "github.com/nyaruka/gocommon/urns" + "github.com/nyaruka/goflow/flows" + "github.com/nyaruka/goflow/utils" + _ "github.com/nyaruka/mailroom/core/handlers" + "github.com/nyaruka/mailroom/core/models" + "github.com/nyaruka/mailroom/core/queue" + "github.com/nyaruka/mailroom/core/tasks/msgs" + "github.com/nyaruka/mailroom/testsuite" + "github.com/nyaruka/mailroom/testsuite/testdata" + + "github.com/stretchr/testify/assert" +) + +func TestWppBroadcastTask(t *testing.T) { + ctx, rt, db, rp := testsuite.Get() + rc := rp.Get() + defer rc.Close() + + defer testsuite.Reset(testsuite.ResetAll) + + oa, err := models.GetOrgAssets(ctx, rt, testdata.Org1.ID) + assert.NoError(t, err) + + templates, err := oa.Templates() + assert.NoError(t, err) + + // insert a broadcast so we can check it is being set to sent + existingID := testdata.InsertBroadcast(db, testdata.Org1, "base", nil, models.NilScheduleID, nil, nil) + + doctorsOnly := []models.GroupID{testdata.DoctorsGroup.ID} + cathyOnly := []models.ContactID{testdata.Cathy.ID} + + // add an extra URN for cathy + testdata.InsertContactURN(db, testdata.Org1, testdata.Cathy, urns.URN("tel:+12065551212"), 1001) + + // change alexandrias URN to a twitter URN and set her language to eng so that a template gets used for her + db.MustExec(`UPDATE contacts_contacturn SET identity = 'whatsapp:559899999999', path='559899999999', scheme='whatsapp' WHERE contact_id = $1`, testdata.Alexandria.ID) + db.MustExec(`UPDATE contacts_contact SET language='eng' WHERE id = $1`, testdata.Alexandria.ID) + + baseMsg := models.WppBroadcastMessage{ + Text: "hello world", + } + + evaluationMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name", + Attachments: []utils.Attachment{ + "image/png:http://example.com/image.png", + }, + } + + replyMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name, how are you doing today?", + InteractionType: "reply", + Header: models.WppBroadcastMessageHeader{ + Type: "text", + Text: "header for @contact.name", + }, + Footer: "footer for @contact.name", + QuickReplies: []string{ + "quick reply 1", + "quick reply 2", + "quick reply 3 for @contact.name", + }, + } + + listMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name", + InteractionType: "list", + ListMessage: flows.ListMessage{ + ButtonText: "button text", + ListItems: []flows.ListItems{ + { + Title: "title 1", + Description: "description 1", + UUID: "123", + }, + }, + }, + } + + ctaMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name", + InteractionType: "cta_url", + CTAMessage: flows.CTAMessage{ + DisplayText_: "click here", + URL_: "http://example.com", + }, + } + + flowMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name", + InteractionType: "flow_msg", + FlowMessage: flows.FlowMessage{ + FlowID: "123", + FlowData: flows.FlowData{"key": "value"}, + FlowScreen: "screen", + FlowCTA: "cta", + FlowMode: "draft", + }, + } + + orderDetailsMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name", + InteractionType: "order_details", + OrderDetails: flows.OrderDetailsMessage{ + ReferenceID: "123", + PaymentSettings: &flows.OrderPaymentSettings{ + Type: "digital-goods", + PaymentLink: "http://example.com", + PixConfig: nil, + }, + TotalAmount: 1000, + Order: &flows.MessageOrder{ + Items: nil, + Subtotal: 0, + Tax: nil, + Shipping: nil, + Discount: nil, + }, + }, + } + + templateMsg := models.WppBroadcastMessage{ + Text: "hello @contact.name", + Template: models.WppBroadcastTemplate{ + UUID: templates[2].UUID(), + Name: templates[2].Name(), + Variables: []string{ + "@contact.name", + }, + }, + } + + tcs := []struct { + BroadcastID models.BroadcastID + URNs []urns.URN + ContactIDs []models.ContactID + GroupIDs []models.GroupID + Queue string + BatchCount int + MsgCount int + Msg models.WppBroadcastMessage + MsgText string + }{ + { + models.NilBroadcastID, + nil, + cathyOnly, + doctorsOnly, + queue.BatchQueue, + 2, + 121, + baseMsg, + "hello world", + }, + { + existingID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + evaluationMsg, + "hello Cathy", + }, + { + models.NilBroadcastID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + evaluationMsg, + "hello Cathy", + }, + { + models.NilBroadcastID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + replyMsg, + "hello Cathy, how are you doing today?", + }, + { + models.NilBroadcastID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + listMsg, + "hello Cathy", + }, + { + models.NilBroadcastID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + ctaMsg, + "hello Cathy", + }, + { + models.NilBroadcastID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + flowMsg, + "hello Cathy", + }, + { + models.NilBroadcastID, + nil, + cathyOnly, + nil, + queue.HandlerQueue, + 1, + 1, + orderDetailsMsg, + "hello Cathy", + }, + { + models.NilBroadcastID, + []urns.URN{ + urns.URN("whatsapp:559899999999"), + }, + nil, + nil, + queue.HandlerQueue, + 1, + 1, + templateMsg, + "Welcome Alexandia!", + }, + } + + lastNow := time.Now() + time.Sleep(10 * time.Millisecond) + + for i, tc := range tcs { + // handle our start task + bcast := models.NewWppBroadcast(oa.OrgID(), tc.BroadcastID, tc.Msg, tc.URNs, tc.ContactIDs, tc.GroupIDs) + err = msgs.CreateWppBroadcastBatches(ctx, rt, bcast) + assert.NoError(t, err) + + // pop all our tasks and execute them + var task *queue.Task + count := 0 + for { + task, err = queue.PopNextTask(rc, tc.Queue) + assert.NoError(t, err) + if task == nil { + break + } + + count++ + assert.Equal(t, queue.SendWppBroadcastBatch, task.Type) + batch := &models.WppBroadcastBatch{} + err = json.Unmarshal(task.Task, batch) + assert.NoError(t, err) + + err = msgs.SendWppBroadcastBatch(ctx, rt, batch) + assert.NoError(t, err) + } + + // assert our count of batches + assert.Equal(t, tc.BatchCount, count, "%d: unexpected batch count", i) + + // assert our count of total msgs created + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2`, lastNow, tc.MsgText). + Returns(tc.MsgCount, "%d: unexpected msg count", i) + + // assert our attachments are being sent + if len(tc.Msg.Attachments) > 0 { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND attachments[1] = $3`, lastNow, tc.MsgText, tc.Msg.Attachments[0]). + Returns(1, "%d: unexpected attachment count", i) + } + + // assert our quick replies are being sent + if len(tc.Msg.QuickReplies) > 0 { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'quick_replies' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected quick reply count", i) + } + + // assert our header is being sent + if tc.Msg.Header.Text != "" { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'header_text' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected header count", i) + } + + // assert our footer is being sent + if tc.Msg.Footer != "" { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'footer' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected footer count", i) + } + + // assert our list items are being sent + if len(tc.Msg.ListMessage.ListItems) > 0 { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'list_message' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected list message count", i) + } + + // assert our cta is being sent + if tc.Msg.InteractionType == "cta_url" { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'cta_message' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected cta count", i) + } + + // assert our flow message is being sent + if tc.Msg.InteractionType == "flow_msg" { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'flow_message' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected flow message count", i) + } + + // assert our order details message is being sent + if tc.Msg.InteractionType == "order_details" { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata LIKE '%' || 'order_details' || '%'`, lastNow, tc.MsgText). + Returns(1, "%d: unexpected order details message count", i) + } + + // assert our template is being sent + if tc.Msg.Template.UUID != "" { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_msg WHERE org_id = 1 AND created_on > $1 AND text = $2 AND metadata = $3`, + lastNow, + tc.MsgText, + `{"templating":{"template":{"uuid":"17f52732-9655-4230-8225-6bd0800351e1","name":"welcome"},"language":"eng","country":"US","variables":["Alexandia"],"namespace":"7300ee93-b610-4ea5-98f0-f49d66dba123"},"text":"Welcome Alexandia!"}`, + ).Returns(1, "%d: unexpected template count", i) + } + + // make sure our broadcast is marked as sent + if tc.BroadcastID != models.NilBroadcastID { + testsuite.AssertQuery(t, db, `SELECT count(*) FROM msgs_broadcast WHERE id = $1 AND status = 'S'`, tc.BroadcastID). + Returns(1, "%d: broadcast not marked as sent", i) + } + + lastNow = time.Now() + time.Sleep(10 * time.Millisecond) + } +} diff --git a/dump_merger.sh b/dump_merger.sh index 94b57b7ce..1c97df6f4 100755 --- a/dump_merger.sh +++ b/dump_merger.sh @@ -5,28 +5,13 @@ sleep 1 -echo "add remote nyaruka" -git remote add nyaruka https://github.com/nyaruka/mailroom.git - -if [ -z $MAILROOM_TAG ] -then - echo "checkout mailroom_test.dump from nyaruka main" - git checkout nyaruka/main -- mailroom_test.dump -else - echo "fetch nyaruka remote" - git fetch nyaruka - echo "checkout mailroom_test.dump from tag $MAILROOM_TAG" - sleep 3 - git checkout tags/${MAILROOM_TAG} -- mailroom_test.dump -fi - echo "creating postgres/postgis container" docker run --name dbdump -d -e POSTGRES_PASSWORD=temba -e PGPASSWORD=temba -p 5432:5432 'postgis/postgis:13-3.1' sleep 4 echo "setup pg user and db" docker exec -i dbdump bash -c "PGPASSWORD=temba psql -U postgres --no-password -c \"CREATE USER mailroom_test PASSWORD 'temba';\"" docker exec -i dbdump bash -c "PGPASSWORD=temba psql -U postgres --no-password -c \"ALTER ROLE mailroom_test WITH SUPERUSER;\"" -sleep 1 +sleep 5 docker exec -i dbdump bash -c "PGPASSWORD=temba psql -U postgres --no-password -c \"CREATE DATABASE mailroom_test;\"" sleep 2 echo "restore dump" diff --git a/mailroom_test.dump b/mailroom_test.dump index 30c36afddf9e0b507db011ace402a630e339d221..125d68f0862bd6ac04552fa157f138ea39ed230e 100644 GIT binary patch delta 61681 zcma%k2Xs`$_kZTKO#+0FK*%PWO+trIwijvuL3)A>5otCM1cIO_3IrP+0;^oG&}?4; zAsA#7rK%`B*bop13Ko!N!-DYp%-hQT^UnEuj-2e9J2Q9g+_`h-mYElKOkBq&+KO+! zsc$h$Nl+3QV+r_A|0h-al`j5C5&tBMf1VWoBm@@TmeI$GKkUxd?!0C<-G9%6!^h@{ zAFb@IOGex`!fv+}*qbN(e}F90(9HM%Q|c{z<T3WJ_#?2Ksewc`olOY+T5Oq^DY_N^ zDfr*+@Hi4w@rU1Ia|OotOb^^I{g4#?;tt#{uVIg%@^_(cUZ*2)URlQ;6%8)#DJg+> z)f0M|!{&8)srKt~Mn#22QvN5Ref_^+M{c*?5y0HegdQjeTz=nDF*C^}<?k{EbtQBT zgZ@*awUYm-F{nGiEI=2grdJG3eUOEba(gN&>zL&H&kSpV1RX@pQ|6`>dG%ULmfgmn z&Wh3Xx2iP+fiMz}E1@1;-mGL+^v$`<EPD*=d2JPga*wn8{l*Y>eU2&RcatS>?8$l+ zbMilu^A8xqI}$R01Rc6!s$20)<87+tpfRkoVpu^vEx*zj!j+IMT3h+A$y`xx_b2Bc zGKO_0*aW$DJds<`qJ6fM|G6=!C*dXmTJn5WU`BCTMWEwLlI06yaBoHL&NbxxFO4C5 z2@cWVWp{SqaQE5)XZ!4mEjNL%Ul~{NC)^^cENoLRu)eicak%>@QvTP5;67Wzz#w>T z#qplma{ggsP<z6iA<)3_o|zT>`~D;4e`5^pNbm^oL&aGYGm4WW%MoKxXT{sMq)C>e z#t^QGZ*OZVS&kV)xGVAoJSydXYYgE@@C$@;@5-$>JTOJdKW+@_P3R;*>tttD<lj9+ zvYapm^;Nt)WQ>%**BHW|P#_wczagul+wgsnmFl-uWZ&yiE&B{>`n?rnM}92_dL^ZY zm$%<nG5n!LO5np9(NF%0)baCb1e&F$rvw+O&t}tCSHM<ktvLSVdvf4#-DsITp@~4} z#PqC+L!~oVpmpbHnIl2SOFEU5m{C#oR68wj$4${fXM$Z+w7#BGkvwZoV&KK@(X!xz zTC^xT@X@ODiZcs;tPyy*XSCRzkc+B|7S#<DEvr#cYuQ94@K>Mk2z)kA#j;h8$bsI) z(NEqA+Z!*+fwEiDL(<1*^Cjd2R;;R9@!wla4s5$E3hS@Pe!I6C=vO}iYqupd4&=OT zsaW~Wtx}+4ZUokDuc-6x9a_MbAN}O0c;<t3Qi#GnyR)MG)=|-){)+PL0~nh`!}l=r z;(AJMpm67zFtEd3(dMI<!c*#VxGKK<_^;?sZy^6ObH&A7IgC9fb`ZKyPst3l{p?_P zOb&lSMxgUvb4Bajrbw4gM@6T-w=woOjZc@%bRa{q2KMgzKHR6%Rq@{bS6O0cu3do- zDy`J+eU?T;S4-K8_A6AYAhBj(+rgjMWPKmpQu$lBuFFxe`OupY1YN$0(O<M+><Q}M zR5AzFe|b0z=(bgqef41kCAWvho0S|&DhPEGSn<tY>`A@(bw?u2yL}aFjwVK$_t-18 z9J4VtCA@pmU0F(6z<hjfc>Eq`LI$l|te7j3PPAZ=ubzaQ;MY4(`Wc(5)1hKb6^pj) ztJrjEbmXVk9+-C8LQ9)Vtpb&&GXk@}uVT}5<VsIp3J=NateAXeniTHD>rY6f4KFL{ z6`4O}Mq2VY0t?UPP|8**NKQ1T(%3UnjX=@QCfa|F-9sy$0I6>Hd~v7LAu#G}8Y|WN zTy!=<5T7e>=$8zgY!&>R%Gh*3nCWbeQU_C-9gxni3!~@rP-#HUt2lbz79oVspO8=6 zRw+4w>z7P{p(oQT`d)0x*i$+^)0jfrtV)AG`K5E=M*Q}Q*Dv>s)c3m*(gGW<)~l%f z+mOh>{oVw#{&D^vcE+Bj{DaIKIP&KoVZ!+R3H4E)Rq^|kZgQw$zs((3f3;DN&2n~1 z*?|MslLO`d)Cvs!*F^K`gDkc?K$e)Vf!<e(*faX7sn~c`3FG9qc@xs<)Zc1G#nJy> z3Dezgw^dBP-kY&!$)3Zq=*4^`E3oHCHkIbE?7+e6W-4ZEei#|MgHo5ub@^4s++h~= z+uby^fs#$hpMXW*S}A4INlYshOPWS2RHo69mC_UO-*#VM9q6j8rLpG(O{wZ}MWLq~ zC>gXmlVwxo72p!rOwTq_9V)3AY+9vMjg1OX&TsdErB)`hbiPz$S0l7@IQjBq)`hVd zdLKg@Di&Ik4+OWZk@V(M>CT#LQMeU{J0Xi$8p|Q&C`;uHYq7!6rhIh04r@wd`bcSk zz8Cc|rczm|R)ccWFvjbt>>QgZy4jS*>O^Snv_WwjZq_pChXN^;cS~pEqGiqmizqXb zErXeORb7_H*euR6Sp6uB8!$rgqrzV$6SaMxrIXdkEL0_^gz5i*%_h`nPTQYMRD(cw z?LzrH7s>&&COkN&n0-Mas$4EBe4UxK4>P9U<;1}CvZ_X!Lgl|n8ue@<r7zxrMlcJh z6#YKP!oFg2IGCkQgoj*iN?9pq2L8BGn@_N^wsN>rmoLFgsVn7rRMJcdp<g=?=8zQ) z(6Y|LsrN$M>eG#HL)lz?X^^=g`y;fm`rWpm8alig%izvN?A{3bxjlSE69%b0PnT9a zr5R2{VTN`4xVbs|H1gZyqGQdK+~9K3F}c)))udrI%|t_6VjhbM*!OIHu>Y#&N)`>; zB?x&h_$3bV-%PN3Su<8c)Yj;5%P2c~JPGybR6DIM4gDLW{Cl$0nkt<b?66kML~C2I zQ*1$)BUSoeYjz=wugAw%v|)u2w(~lu*u@&~noib+u`)5$SyW!2SOP~XG5;>MD_qm- zBGjx$c|NA{Np3bfGP}?;t<-sslFwWFSceE}`J4%jgP)i9Sx?3m>KH9;skETvcQEGm z?btWr#(i#qhTgbF%R7Ku3)>5X7DW)MEjrfAeu`A`@`WAQ!;udCwuI)i;hNN#^17gf zc7?1LV*$O_xviDf!CtS-!2oqyt!NE-J@92#ho%h1noqqB7P+en8x`7q{eCLDjb%_} zSC-7rcVWGw{kS2!(N89A?~92^wJ92%-wwtfSAt>bZHr1&eiNqpdC~vkG|+5aHwM`f z+}r(rFV$HqTX<D>mKow^yUpgr?udrdskAps(d8ZY_F}n=y%1!*63EdI8h~~uWb4qp ztPdLyVpqG(Zs(W#v3nU?tdD$(U1>`GGt3=C44^gWS`oP9r((7^xQtN8iM1;_=CAZ; zXCqBH?0n&E7&xP#?0(V#*)8}&$Zk4$8#B|eJJ|eiD-I_RI&@O8^2`D3ju3m;ZP0{T ziO)8^dLSDSLEq^}aOt0E{UD%|yc4~T7{vNAwnQM#_uP%?3ped_B{UGgxxCX5A#az4 z$5xBVTv$X~hqCiQ(%NlK4^4Xqq&+l@y&D;d%fZX;6^r=AASJKe7eh&x3&Xe9kTZDx z1FT)7Q<oP~OaDA|1amU>lAwZ__KswKh5K^(>A*(0K0o~+8xpAp13@NLZj|fNcCTUz zw7r;4xsxE1T0F!uY5i#S9ebHJypEREJj8wtx8(NnH^%_M@NbWktK*m_`rAYE#<NU5 z7(B+<EBg57k7uVN@ID&G<y`*K!)#21^j=p&9u?OHF>H^pPK+(ntJU`_jcN6x?B{S@ zuZPOtlk@r3Nvu<ZVm=35d|z(LTTjN~4MY0eeEJjY5yqD5E!AqPv<fb(+orG+;mPuO zF<F=22Qq`Fipg4`!(J;^lKHl2EIHbkpMO!xK8&!xA7=?-&#?y7Z#lNd{m-yw5m>*E zUw;;R8(SIdxV=)a_+>ER+uI;G^X5RrUYfx+hS0>?pp{$XW>mDC)uxU<kiC#&L9UpE zzj9}>D-k#+&zsF2V{Db)YV8h6YrRzniK+;Uo1dD?28CzWj>AeLVoc4W!ZJviar0Rr zTX;T$YIjy@Q*EZE>EG%4ORO`MhJG#&H)aQ7+vEm8#QuGQHKbx$twa45vfo0~vtunb zq#ZM~Ji16&7bWwt3%t0IH3>o%K96seYoV33eU~+g`8I3;>qNC?X{mu(5L(CH#lR2F z(9%RB4amBQHIBe8i}d7%+)gc2@^yOC;2!{4%983)(L#pN&4Qk?;03lJg1e7W3YCH& zM*n1jp+WZ=lxI@YY5QXKCwo0e#6qQoPDIFeeQKg0CMsUSmWI1`*dXmvJ1cp?>2AD~ zH4jg>-QlE^&e$k0dLI?OjJ2YVxzh%WS^udIH)(;Ex(FH_NZ%Y?UJhgGa8uzjRzG;A zc`PrCX|Gq<slZEW7NvI4&noWV0B9MT6RGK?1v}-29E@X+%s6zcMznCJoJY3yN@5VF zvRpY9C;caI>PQFcsC5FSogsc$zEe)qYXQAN(xE^C3#G2WtWI0Py3_SltWlUE5Q%j} zN9nxFtC0GU&qAK)pG#k3HWsM)Sq528V1rn;Q`QLIlIVO3q4PWhf|ss@8h~$!WP5|n z4Qe;wDQ`laIR5uvjhWR~7nrXgLT;Ch+x~~0G!WRAK?l1jsnp>`tsY&vNipeDdHpT+ zZ5SJu12U!mTClEYhtN(Vn$`#!Sl%pX++}OnyJ2Fw+`MS5X!XrXz15cCwwj0vb*XeC zc)4&j*i8RfwvLU8RQ1yEU2;RQP8=W`I4sJOZ>?wRgL||cCxb)XgDmM2U}<!11=KYC zuVu5*x;`asR%&$uFMJuC5`Jj|s}Uis+aXlsjVw1v6i)@n9>&3qE%Rojxz6t#E3kkC zmK@38SXyEA8U1^qh~+g^vv?+Fe?*$~2#rX5rn1eLi3{5?+o?l?e3(o{&6BWgZ3cS# zUYBmwk5_^dV+&F@v!cNHZ!-erR~4GP2W73As(PjHHfQ%Z_>2$Ogb2DGH*M{ySa{wR z){q4jR%HZAPb*Y)tCCFndn&bp=aL0m+2-&>dW6EBzZ2^2=xuCZ$m(FXdue$usB*yB z!UCgCXHecwb~Rkb>p-1p8?_AH@gue>GG4DZ*x+-0YTXJf31!GfB_Dw=D?bU2@*yhQ z1?K!<2ZU7dMhK}V&*}}Q(A<q$a<CST6(IvWknmFRJ~@XE{gkbb^dj`k#jRx!wU3g> z+wW$LSm487bQ*EcD0~pL+kK9NG|GQptH+n`Wo^Q{q1`7A3;3MDFYOoWXyT;|vK2vU zw|QSnBz!XkUOFAp#cf}*8jC-G(tZ)2>6}lT4A)^A3O@koCkLaP>bG%!C3_>JP}|{t zp#J@!kpR6ks`n+k7TES@1~vbRoek5_?*n%BBAiL}Bil`1vwq=8blB|FrU=Ie!7+UQ zVV1}OFJ9HLw8k71fLtxwUMZ_oe1tt8;#Y^wNy8687g3M0kHTYi*!++kb-u!4ZgZSz z{NlIF%wE`s9RdR6&u~qsjMkGZF+2tbc;K>E&ZJbYoXCs6gXR!gZw?&K&#>l!b{EsA zpa|P<`8kMylKu+V`!xH7CaGu{8-3HDQn0oda~=gLJHr--yL33X?FR;BRM&^?4jheh zsq=B1Xomd^$+q0j()pGj!O3*02HO0qztV`Zer7*L;Jq*}0Y07QosDWq4yTO|I|nU_ z&elP#Uv7a7W!>3qDse(f03tcm@jP1?ZUf>r*als?6^BRNyfCc~R;i9MzUh{Qd#Gaz zoD8DhU|A?yoWUaNtA5a;fTh)l^1jCzMX#wF6NdeUZFu9w@WBn+nk%6$RsD*+Nz6S> zu8%{6u9}p#lau+BOH7Wif>WP_x-{-Lrc$fhfuJ~J@GX~dil7OZ7~aWW+4V3zoqqn) zZ#V^n1ir)NPN*jY{=z?Ts!A-t;Y2r_oV|jdOBD75>3_Y)q)s%gkD5xh95krgNS0rT zD25LB!G<2eGF<-`bA;72huZ_;Hv9<I;k7#y6HmFyT#T+a06~PXns*1-_lf`5nJ|^z zK5<qpf{1+X8p{i-mky8p-EwIFqu-lGD<;3NO{zzQk`%JS!l~!vZDgrOgeV>lpRR~% zj+UWn&nZ%_&TWAUSF@<tBB@lOV!p=yjDy|5rudm!SHkH|!9Q~~DZIltJibk)n1;P} z8a7aA5Ht_M0FoVP3g@^)={K6!8Uz}5kCH^A2Ex)SxC*D^XpcHrEx}*0-4>f*RJs2= z_W5RaDRt<7$x_HTZFhK`i%n8pek56H#;BbuO#bYeQdlo{c-=gumQ)xSz1K&r2Pt`C z`SIB)k{OGmE$Tr)E3~Dy6h4(Wd^Wx<Rk|m#xNs8Bp&hB9%8GO;k@riJ8Za8y0aeX+ zW6Zh*LSG^}`AXBkl;<|bjN^$gm*JRxu?qa~PF-nEM8rU>TIq5X_`%l3Wa6XhOJOsm z-Ql;x1`sYwB-2*O%%M8AVf1WgY&@N^q?`zrerLFyVw*|f&t*$qMuBdjd9F1Ce1&6P zc6gqx)H6p~6voW&=4W!GVG;Jid7&szvN5`&H_H(2UAjI5QVPboy`d^jn~j$?kVdo6 zl5yhntve#OH<B`VY9py0quYwnyVyoMHI{yf)N^xp6Dga~x3`0W?+;Vz(&VPnr;%bW z@7)Y@8WNdKJ5{!ja%j|O><7AZ(TTjgNXB_&I9Bz6*PzTp#7w1)cSn0u=~xRXEbW|j z2dsS4TS=K5Vq-y=ADnhKpVmt1!f5(XU;^gM56)$jF;n`>sdT9|m@qn_L)%D`LyOZ1 zyJiM$=r5c3wKh^^1ZM}?ol+zIuU#<8>HAm~_d2DB<-zH22y@<8Qw}}16h_DKE@@tv z8=Mg2`N6VzKJZ!_uhfFkhLM;AVby+ZtSO675Hh3NoenQmos%2$^?s=&%n42?+)YFq z4Jo$+%v-u`MR-8ydV8r!P-&`q4rc=WCv=LAwEY*^MAO<!$+Ykx@YVA6QeK2gP6yxJ zL7EwvXQw-%z7UOv?vU#TMWfz!`R$Mu*2mNuRMH9b`mmF9iXIyey8bd4qNDf$C7liy zN+CCj-Rbo5^3GCHWZW(r#9Ze|rn+S7Cc)U+Rceei_Gq|%&q=15q9m;0IAM^;>@I~J zHg+dWoY#9u^?B9JQZl1IpVYbbRG6t;UVg5pba$A&oo*ZN-$&}iX!*1d&zu{n)TdWo z0g<o~VY3sXvGs-8QnQ~lJKT)h!B_N?MyrwEek%G+&Y?#JNww+LS8+N%I2?nujZ#vm z<hF<yc0$)2db<$2V`l`HBd@$eQX&-gxcG?yVEJ&f9xqQFD6m^HCxqSBQNXVBF6pZX zh@TG~Bo#!a9ExRq8a@an;UQ9DaIxsKQZiVoADDG9=$j$@dVtn12og2ILtYpEd5F$t z0hCOA2n({qFzM4Uk9$4Pw=OR-)#HtaOIZ;ly?!bl1DT>POx;oonk7+rz?4i|?*-ef zyGQz-Ho*WXlthKr+$)6~DR!sN4tKz*`(d%#cAu0HY0~H7C+`>QamPzR6l>A>`$1XV z+^M?+^e!&l2mV?<7Hfa`2q}E@boxBpHBveqZOl(u<CGlUX_Vlkf@Q%LYf_t0QYwsa zZZXA)G<h8K*O?g**5xDc^WV|Z!(kHp?R?Th(&G`H@w=!~i4=P()|sTNM5;+e<D_Hs z+e-9NSR$PYQ_k<fd9-o@cB#(eC0_(HSVj*_kgT-kM<}Tk4@(-O^4Gz0+s7*^oh$+Q zf0-a138CS#+4;eVQbrgJm(9g5J}Px%wCXK%cW?q|{`aF&-5`<lBdm^Ar%5n_`caWO z{43X_uOEwS-7cGla<9TzH|%jKa{O`G{Iv36_%S2yQp%YwSosO*BJFq^J-MHZNF5gx zUdI%veFP^cy!%R}pqo+D%OKwc=t%lsBTJ<s+Pfjd$g?Mak$YZ*ITeK~!eg}i`KQyR zqhSiUpxv%{T5>Y_<X!YUaw6)~cvjjU26wplch5@qNTDsl<)p$#aAXiJSpN7-sRpB= zn^Et@S&<#U1zoi+Rl1Yw^VeoepM<53%jtv3ReYwx1z;-SQ{ivS6Pr`lt!TmeD6A{k zoU*Ca*U*4lE|6A-alnzkYJv27gaj@pKd}f35e%`YsB?Vb^U@y?a5wMtg0wj@LbshR zPr~W}&aJ43q^s0qSGeAvlQ5WROQd5VK5`*WDu?P!kn=e9i~A$UyZx}M)Y)vxU;H@q z$lRBO#2B^*t(<ra$8N~7utCS=vGXO%q@xjJJzhHbc*rBjq1e`Dly?vnp}=Ov`1e*+ zfCEYs!IcYE3hD^|-n4Qlg%*`d-D&A$p^?2B(a2mLKiLu$Ge7aFG$k@nI7qfl1{HB4 zYenG(lj*=4Xb{KuuPFU1bi92sXmR~lsEsg<XT`u--;`bm(-0n%Hc3hb|Kd&Q*2qwx ztJziyneo*(XlL~k@Vvl%EF6d*hRKKHEIe!Lpq0F`Rtm=;*j+v!U%pQ2%_#8%Hj8rU zYPcU9Nwp19&+u8m1;wha*zkaTU46sj&sIpa7+pP$9{;ydIvc6z<}bf1{SuiVoK($p z=}DN6%in{}7Q)AEv%>-;KGUVmLXzREM!g;pr@@aw;7jkQI82LzONw+4ZQU%*q^h5= zDc}8ploD;jiSu6JwB!bS$%oKzBTaj-^NY`Pa2j}`)>i2zMjL+tp1r0i1-jM^i|^48 z!fu<7FWfFgPLXaqV$aBy3MLr$5u~B;^>g^N^BHAc3~pRhT#7gkXz#ijsUuwao(jX{ zPDp%RdB3&|gTOaU=<VIe`?1tG+@0M?=ne|^E&%I?D(q1(=IxR)0zX|3?NMm6J`MZ? zLSy%@z<cW_5wYWjxhlVoQlEdmOKKNpFt^=D<99=v&Uy_D_V+GyzThcr4U<2UzN2Ta zpoJz+L98v<9g(PRhi!41lFjGsk%oko8aI3|7BR=;x2sTI_emZ`UH%h9-!Dm#u3#5E zp9Th>en7e_LUM->%G|{?@a2C8g~&2VVua#IaqVd(JLv8?B<&2(5OlM;RQ9D*pWpwv zlpAJax6?_NzmoF#`Y)wcjJ{FP#_4BbgwKZj{50UF|0klN9Ej2khEdwxP{^|IiH3io zX7bF#QdeeaU<~Zxk9{M#n6;rXhzNr~=nX%8MC!~ejf??(yvs3gSo6llApV3Jz-@TR z=m|sd4=p^46YAE!;Qe#+a27oKt#sVl#IQD$!gTlt6YKJSj!UhXrKvHbop(DawPe<2 z#vl%?Mnu$P@zqsWGM47XkWOy;PJpy9266HGzK6<YEieXg19^ne)aBbw19@vpV@MIz zgJ2dbZ}9_GqqUVWq&K0Sh*06Hf0W$J+S(XUaOLn@6SKMbXE21djWHwwt@Nl9j=AwM zi_H)cO7jorr1s2WHwLluPUpc97Kbqibm$AxL(J+l264jZrUzv_&<uw0%71bGD}NV? zT9q08;*`s<{FMGCwWQ)K{6uVqM#-b(+SK7D97tCDB9zcfttQpFEKRgpjXQCn6GU#9 z`TLip4$SH@hIE5MdhklK-ynD_ZevIfFZ~@enC~$L!Qv8&wSOxOrp7<PW%*uXU|-M* zRcEJ?&L>|H%hqBH>=*ndoX}N&VYjjP3?V)6qWz0?Smk6Y@BWX}ky+Xr1KT-(?_}0? z#vl%ySrNd{fVce*ke2qwkWRk-nlzVXcQ6Ja_^pFs1Mg0f`!Y*MV^FvjnS3|1b}|ML z#x^}9KzQ!?WLYj|mO^82J*)sWG*wnMsj`<@yBfm^yN&LypQwpeZ!(7T^HV1IJ!b7@ z2;#LtICVaQo%az9uAP(pAt5b4K<{0i3=0IfJ%^6Dv5yVB2=%K~TQK_WckmBNCs?{0 zw`%8YY5+Iu&Bh?QVl15P&v>xb_B+vW$<Odxje)hkq?Qc3{bB6UG#ZE7wx@6y>*qqh zLu<*;T6!2a>f|g%wlPajV-OebS6d#*ti6mugnt!&a4Uhpb}If8-kHKWvdk>Kjq7;$ zurzrlv-B|r@p84U+>+6{zobxDEc{SD_}q2h`SEO!VeM3*ot;a}rIr>M9@MFD0MyQq zx6z_PIa<dL<6QYnxQ6vQ=dOWHwu^}ksg*_c(zI!C=ae*+Gid&GXf%cSat-k<lg{VL zchQhc_&=v#jv@f(OrCIy=hKO7Oh#_5+%)L^))5Fh!c8>Q0!epr0_H$(Q7`x<R~|&a znbG33zESjW$j%jx@LU}|J~T`2$gKSh$pS4oU-xEnjAkIC6JN(5=LB-4HE%!;ZsasU z9Y0;#0WK-)4A<^7i<}aJoDQNR_l_0F4f-agMG;w{`-BDUIELGq(b^+10B-0>y3=-1 zo(#3B@i8eBG;MeLJP8ej3?2WX79!V{hH^8id=c&som^!N<ge+uZ(~~XA}E06BsJ2h z%K_et(Wl2_0DQn_WqwjD`E|dkK9{;f^h9HMD>XYAQ^yYi>&{Po3>TY#z%;%p3V?tr zc<`I5*?dGZxhtG1r((+Nu&Qimrl#|6o67}^ZvH-|OgL6_&tm%m*~e(^>Bu3=?RWBp zEwQBO{F#`KE`F_*JdDw!KgP5I7e>&Fx2TQmW_0qWm<k?#+9sO5`)o`FC>Oe8jTbva zh27_3%6ym(_`&M(_nfkWQG@d_jrqCBEf+F+`a-0FM+Djj9a6TAY7PFZM=oMi^HQXi z2X+lO$?k)#?$?-FLPryBDS}%{<MaH2E$;n22EYkBm+k=4RfB)VVx1Njs<r8QTR2Yl zwS%x6R#$F9@CR+9eSgGs=i+y_m)kSyb|t1Y;dd3T7=EaOjFZyeS7XXND1+Z6n-_J$ z<XLizR*uK!<?9PY(~GeAhV*<7!dwviB*SXp{|{Sjo7O<IvMbhZ>5QZ#8q-Do_l0(m zwd&E`jH$P)X1=1U+=0=@ELw(${R~R2h2v{lH!)=$<d`x$=%srmbaLq126{=M)H+au zif;xvs(Q-#w5*E^A5I;d>EOYDt4^p(`YzJ17WR`c@C4eU$YBSI$L@eJ6-;G)*l^^C zwaJgTCrrGwCj^IOf-$&@|Jh4OUauC@4J;#lz&(~+<9Z(ca$mU-$YP4A=jF%y39eh3 z6hjXmlsaMPr?BRzQ(Yw(?NiCxAA(A!N98?;*sU=Ngo4s&A(;7}p|lz?jr;lf{?IIF zT1`1UWM=Z{R{gq*C#bb}k6YzFu<X~0)<CS^hTG&)M)uk<A052k9fGkorN(@O4m3b~ z?3xzy(FK#QAk9zdF(2K0;9X*f2Qp$ldibV6f*6xBqvLjnP`lx`OIbX9uxPqwR!jvS zpEyLc@=A8hM?XI_R6u%iqOIU;iYzu^>FqgO2!OrTm@+%GOO}>gm+B72{*-b8n_clh zxX^9WRE1!YO{9nJ1-t3mLfJ?Z%o`!4k-ru=ZQcoNfVyQo3^##><;Aou3^b*S)Ve(F zKDjlle)&;EolZXZenFTA8pc!*ZeZQ8`r!jY8kri$l!=Yw&_tMO-l-|H27x0?ptY!K zWDI&A(aTL@I`Qz52L&}+HH-P^<%dQIx~*;=^U=p!KLpK&Oa(C?{rrhBGQ7AGTSoEF z9U3q#!sj$rZVOjqtC%u72wm1CIfLI`BI*rk6H_L9Rh?gu>hUe(#Uy-ci*^JfW9<p@ zV~i}0n2#?0+C(9Ko^{5wBF-#3CL_2@UkHW2VY<pEf#0{k4#&p8N9Et?tSbiGgBh?V z;gm6Lk__+S&7PPt;p5WHXWu_2<j<Ghn7)17H(7kV-5>MO&*wcMsCl4m^dk<B7oLQ^ zN1fV7n|9lwb-`TKkT01k4}!m=Lret+Pc4P`vAk#~7u-%hZ@S!r<-cSMf>WMQ6?Qx= zXYg82L$+F9HU<_%(@i<ko)Lqp*C_^75i+jZZO%U{w`1lfg%2!}*lP==v?50;(0(i8 zZe~DDHBYS`#$l%?XUbohrx_HxX!I=kO7?Vv;!t7~(QNr&^V8J>IbF1Nj(ohyv(*<P z1}zcj4-Z>qcFd7;>EK*>oq0y}72LK!*;g6-?Rjz@GtV-B@zIa-<^N^RslGUp&_o|E zkl!=UGl25Z;xc)^c|rBXUMHWjP)=dlWd`Np)Fs-yNM36WR1XzQC^~9>q55LKohCjn zZ_8e6P#j7f;`hBEC$a1$22i0~A!@u5fxJ5xLuO>ZSS@HY?}r*Kkv})TTs;)FW2E+2 zS@tr6@<@u!;1}hIEPF-uVDK*ob7*+-%kl#(dsX#d`c|NuU_5KU8}q+|?40|eP$z^5 z=I2-B+1Zn;tr<;)rZ<<#|75>jEtDStmBDNmj%=4k%=~8cU<iRk;>t2cf4nBAR-0;a zYL#4@nb%Zb-R+~~*W`2N$EqzxnmR|CIu`S~YRml|pGeur=F{GQhHfse9_WU=juUUn zsVsX#^^lP~4=Q*|{@A?H0Ln|q%4kL(ZNtI0XtlhKX3dpTgF1*UHmQOzGdpO?JUKOJ zUq_*rBPrq`M*HW>sUbx)n&yD8KUR~!_qGi0)`A65fJpKJN$cfH^kiAID4LPbvK(a2 z-c}vTF&PRpV}pFcyt8^Jr-vi2;CAfffoKnr)B(~qVyJgLA0Ca}7R(L!*!)@b&AGj_ z_Fee^jaeM6;&IaRo8))Qd#kU4<Q>HL!?geBl4u>T2i_UEF*6^izEUub|2Oj?gJM6w zx>+t`*`HTm9u3Ohx*ZGY=MUv&<}a%S4Mp9bHGgeT>?Q=#H>7Rb!5BYml~>a5D<Z?d z?GPd|zKYhaiVzp!wK#+60qW@c1G@BTv?v-puA_zKvPEEc8vVBu3R~(<`F`s4MznQ= znINwF7_A0>hZqa7C!uI-TKbXvj`jQMvBpBr6C1D|Ij#5g*2nS+y7*SKp=d;OxZDzq zh`zQH3d;|l$iwNs)lpm!REOB+V{~Orw25dOvfjkvPvs>v<?WdAaGbGNG`Upsf{<i8 z5kjQL60iPDUTr>KJ^s-8$L^N*W?wWY4hI3#=sohs*_W$_iiG_JyD!}<Z=(C(i4Mu@ z<p|f6pj%Z$agIjeKD}RtPkZCWXa%?^|91d4a%BHqeTUH)*~O>jHo>88|6EI=HxDDA z{+mj9ocZ5sYa$AkBMSBwX8y1Ga=8BYe=a}CXz_aybZ!WE72A6*Rm}l~Q@;Q&m7hU! z$^I|psb*ahi&vQty6PZ=vRbLvaq#t4$cA9O?O(}LvL&IsRZ}G#y(-KECi0y?&D`_h zn&n^1r8Hwpgpx5)qx$Se`_PRBAju?}vo$&z#De<1k>TK-u`T)$dj&!{Yq0DZ)uR*% z)1(zg<!k20tD_!nJn;l7>(u4@j>$JOdVEK;c}Ok<YUT(cyl<{ueHR`dA|A8FXg{P; zA4ThWk==PxK197gj(+pm2qBCX@~)9v)A}<w16@BBGyx>jpelJX_536T*v%1^*p+41 zufF3OBNS=eck)4M|7o;7f(P&X9vdIE{w(ql;emwkz<NZd<(*BQsGb}!kO@6>%!CmW zhT<O*dMIChM&7{8xz(cLw0UXNkMh>+{OXG%fqr!NPx2Sp4Go~eQG0aX&+^Ia#??bb zqV)KaXJIZhH#Gp$Bk(Spn^#}#bkMn9<S)zx2E|@N7+eNjI4@r`x2hh-<)AAU<a5;X z%P4ihj#n?rX^eV*75#|tv}Tv(T9VmOeM4?NTy4MERedpXZ#}=uTgY}e+9YB+5NDP_ z4gZke%Jx@ZFA^X||NSAa&2CpcR3zq$zWEd4wu1o_Og&eip_n^WUyh)xLx0KnEW5Ko zc{t>X8vG-3`u#*?C<vq?1X9(f<bUOV>Ey|n0zDq;D1B8G{RT0Y{-2C=#h%sn<Ffmy z*ERV9bp+ps!#@y~bjx))lhMf25!n+BJbL#PWdJi5Ro|S;Mu;ZL<V_@HC^Kh?6KcHF zLw2j5kQx5DxxYahZbFDrCcUaCpJv}$Jxnx`=nYlLVCLJa2SdEj*P2qu%mWO{^+=yH z=7H50BcKq0Iu@2asQU6qKn_hwR<4@|R}Y0fZgCBzJ~IzBD0lNuYbtlL>|qAw;piLc zc^rG-)Y=GFs;n|4(TWshJiN$}IdUU%IT%bsMYWYr%=cB>9)e{=^hyr(PE|fMkEk9d z7@_is`N8Uo^~jSi%%crT_3)C)>@n3BM<Pe)Qo8ady_$rm8DtFL;+1cR)f6(Mp0bNx zt&P9-WGF|eBpm=-DlOEn3Cuvn7NrTzIwsY|^(Q9!xq(s?n0u%WHO~V0vP@+wZLt7+ z-4P4TH!JVZw0u~uaVN=EYTOtQt+SP5RNNF0rKhv0tpyMtw!n8OM>#+{TH~)Da+Gb9 z<CKDN%D8>w1P%1zyNHCt9U57pQU?8)tE{3~?RCtN04ETuYy-qD<ts^%OEa?bmHX(G zLR8knXqM(Hm85pV&+r`-yXb5W{KRz;$i8o?xM^2I%<W@cl$$BH5u((~`s!#jp)rk= z4{6gKfbG;6R4TeF_!kn3BbPDsZKAwKUk^rs-dS!_be290KlKp4q-Gf3!h7-ad^6<; z<&Ov#;Oc?>bl+$Y>C+YfX;Fd#^r4E}|1aqM3HXUj{d44cET$lugKwgTvM}}qQ;|u0 z(vEz=aB{vz4?M2iLie@CFmj(nU1Z+>O1xAbkV?pbN49BEkZf<#iDv*Y&xXl<W)}WJ zuKH=(F&}^FV|l`%d`V57$4}&f`)Qd|IY_;i1mX0&@540Y74g%J2Hsm0u7>>VY?|v) z-ldgq;M)MNa)=&YgTFfZl#l4_di;e9=qg&Y5q}|r`4V;i0Dp=6WI}#&4z(Nt{EFKt zZ&H7eT|9FJuH`7~h;RMcD{H9ZM*v2q@UQg0PsCq0ru}y62sXNVHwtb@!9|{<XaJ2C zP+lupp&}W{id9)M92y;!e)Pff$fN4MU$j@KoF&_#V9P(!w_kyBB7Fflt2^k2x@bi2 zF`QUxr6ygKx9FRCD2U4m-P{`AQd?k#w)e%*w!enFs)5~<Vp{qJI@_3m(i>7echhV2 zgWoRD%uM{HcZ76FB+PbIx(Bl=Q!;>ZNmr$a*4&I~zuOErjI@~;Uw7KR5nlFjqV&Kf zgd`V&NB-XoMnnhpP~NA^Y!t?(C~l=BvBWU-xwO3(rtg=~&)6ivzD0;B*xp-NPL(;) z#&c<OKU7`UM|qWAx8g4_e@t3maP7X-S6NA~<f0VWcxF*!J<ZAs0)GyHfxke(oFK4H zw~}JzF?vwk83X1xO+6dpFJz*fAbTVHh3vAU)Vy(Y6rWLjArO$3l}9Iq>AGY(h(D}9 zPzfh-jUcrt3c`t28FaKKejdGDSxOgC5YC`FN{5?8e+AQ`Rtx~qb~O)u*3+IWx1cfx z-I!W;#!00t6Pv>_1+j_e?o@`++bvKU&R9A~FBF73Mv74e{qwlePE^aF&37q7>FJgz z)mI%7iL$BRAkhDrR``Ytp`-MuU?n8$w4iaN_^YT8U5*{BJWEsCgz!On&Nnp4rbKdW zcG3tt%0kIA^=TLgMVES_Vyj`wqcq%spU9orN=42nn4a~LMmp!}utSOvDDcm4AUMW_ z3K-2dG{TK26Xc^<Y1+MzeFHq`G&Z*+QHafUwC+A-I(7D<7P3K*wSGU=Pct8WhVwZ- zA?6SN)YCHxM}Wdt@C^$N1Oln4-AH9I{ns{xA#yA}qbuz~Lq-ZjF8%T#Q24uj2momg zpAr)*9i3Q2VQ9>$qY*4vHqVqu<)amik{-f{t_e6~D{P^^JK--~UL(l>v8!X03i`V+ z*h(mcAW9Owsc;Ix1N3L-AY3ppfR+kw#a`K%0H>!1jH5$c@C|YO8T5ge(Sj1?1v=Oj zL<|S)e@gG(go0=+epGY}8;LzZkH8=L7#y!H9|mK+-wnVBr?=47hp~}v=^h$AV&gxf z4{k;wBHlkH-UELjhCP$+dPG@AZwXFEK>F7-rx*Uxhl>dFtRTuACn?M5k>23~gpk_^ z3l`k+FcQngb%EI0^ceP(p?v^?_;B2H&@EV+M%$N4HE8JL;VtyRW$@ee?+Z9Avpv*a zNCw1be@R(l-$8`+ev*nY$>o^7plZ<+EuEhvR?vF11l^(^6-_~BKLJbxNSmo_3P$i< zfBZxgb7RsM9yY(%>1(kB5u5xA?YcF@7l<(ahW>XOzIU9id`{2bj=vDYTS*h{z+W|= z7A!mff9b0YF}9U7@J{?hxa?Qt^=c{Uh>i7xVq?9C-F6A{lZcI_ZFLhfd5z~3#L4?U zR>H1&FHCe++LM`>!=Ia>)MeIF@eZPBYhFN}%>(4uGnI5kM+d6WR{RML5j9JHG(a!@ z*-AV3?y|I$lo)h;2zppJN9n~Z7mWJw!2t8uT!k2YzF7(T;(azZUprsPV%A@c>v<D; zh*;Ui)M=s8gxkuLml-|S)s&KY0|I^ohzlr=n;(!Jytj|(MhtQADGn%b0Uj-ms|q{u zEh2sv`6$mT703*{ExxLoFJG*TWz@bXzQoI0EK!;;+VZh_BR+P2LU$^DNoh!1s*pz8 z@<qf^zqeF*oLMyenq17Cem`yO7~pE}_mTqtV)uROjmYCZvGp&5yw*C#mE8%2A}Y5r zZEcsBNV}Jz!$HfG`x!m)X?$ylFj%hSF=}!s4r^S=(^drR`uXiEmEO!!->^HUoo`vC z{KKf%j0nT|oFbg+<Z`7xKmQuqw`LhvcO%7PN9RP`sPTrtWa6BdR=f!XqO5?w|E7Y- z=LW{D_!C-)sA1~R1EJKd-ckyfwXq?z%bw6W3cX^r;$oHpV`wM8yhfRbNQvj8s3CjW zC!&v?oWHH~Ky0mXb#FpTJ^Gkx-<gQGgY|;-=Kc^zZ<il_;uS*@^Qm-$qVNyPaV(@o zxS=p~^!B;!xR*j1&FH@sF&~|XGC<(o&=HAge0han_Z6#RirxI=Mg?ByT5m)#$AuIv z=+s8A$F$m-N|`Oy%*DG9cd3UTe>(!JOaESf4YIUGg$nG!Z$GzG3#ojgl4iZdaJWd> zX&b!3E~g|B0k|BS*|hhtMNEEOtw&>5;{Ll!7a-FIjZJJ8DLp`Uu8yMZu@i=hy2256 z?NLnV()SfV5_n4FIyJ(Q$_IO*4uyjb5<sUVX7IcZ6oj)5Hbl+i#!QGPXR7^FVkUi# zt0!TlS9OF^sn(3d0%|Z9Q8Q&b!{7GK0FqO-D7RYgHEtF3Ts$waIbGU{iL-1~nlgHb z#YshvpAXw61jl3LN;t^R=d~yF6_Q)TK9hAZ=KkFs2-fbfLz&5FuzI7M_j#QOEn=b5 zd99DY=2YWWxlXMJRdCNnlVCLPv=_k>Pks!Zu&y-}sb0YhdhoCg{{1IdX0$&^yHSMU zx=b6@DMVyv@vDjT`QT4MXUjxGiue#H^qDdqK_97cWbiq8r#(uFWPQrGvOA%Rh_r4? zEA}cHU%O91jMC1HQU1l<Q8s~cChv4W>Bp!=MjW=dIP)F>(1cPx7qeN3%O-AKrPkw3 zDwS86Wu{@*@QPQxo0zrfbFr_q-4ta=zmqVadQ^H9nsea+$kVf5z;;BYhH+hEpKYt- zChmPxso8q0fWm&7Y4O)c4?X%;cmb5HPwW!@zTdjY7$I+hBRD&_?M<Wko6%g^VWj>H zXo{xRjR%|BRQLq+(!N{3zt7){)%*ii^NO8`9Z3B~xs`kc@ksg;+6P+|0prx{J+xZ> zwrt`XzEO%1v$ZWkYd`Y1x&=W+xHujE1Z%PPQDqJSn833kH<=&CrIztfdEY|JS>G}m z8txQL7$ZW<d(y}gN>hH~xbh{Vm%oV693cbz;7R2#W_``L4KWZAo=$Ink0F0FAM3fK zV~{9Gi$~&WE9+?}iH;*m2mDH><)@XFl=D4kva8#TH1Q)XtS}hqj;0=AmJNoT+QGtS z#7geFFG>NpA-mDapKx?9{Slb#>Wb-^aulKtapvj#&L0(IxX(Kn9h}|Em;WRfyP#J* zBK`z~`65`Iw?3;NrmB748<&tDs=>486!=zhisMV1{O4bUwEyvz_!2iCenD)Y`wWML z@Ven561@?xyr^7ZG-h}lVo(Tr=l}!&+^G2k?(Ql44RYO77fY-AuVN_{4v6a*y1|Cu zl(~%9(I~N?8x-n6?|kwfptbdwAyP>D8mNb?bK4c=3q}V=#<%a~d4DUfG0Q3AHjtU{ zk5W^zo-qW0I?yW^<$mzISYfkqCCj#&Dwt^*rV#P&4Jfr~5=;)46LCZnrRV>KVEOky z<rC|V#;rON?iS(hex7+<*#ndLx#;}6-0xmjmoV#j<J#VYLBY`WsmW^1#VR5)FG%WV z%zDYVia()aw8|z`g~r!@V%#($9&K>YVUBid(U>JHjpkd`BpPc{>jxRv_9{lb-K1Kn z_Af{eC})V~ExewXtiy4@WiZPXLo5)nwlYygJd15|eAjLe1R?f*0zp#wo5|{Ctcr_K zs^EgdsWk;z^kh__7so5cerOkW1%v9r5jCmU1l-D3ffe;JY^|+k=wsk-rl`*#9Q64( z6g*;?>oNIp)l2>XCtu3MvR&{x1W0N+H1)ETxI?KbMRicEI_ekHqF&@A<VU1ecRh5U zE~cw>sXR?>z<Z>rVCE!|N2~uA%3%!e%zkJe&4S_ns3T5Jr=larbqF`tQ=72-8phTA z34_qCo)N&yGt_Sw`KR2dBKV<DbPvN2U~v8Do48zTYfW4;R=xn^!mQRHqz=@hAr~;U z!_4YMYaPQbp>YfnDFuiTvZxAQouzJP*1E>vZV*KWuY5_X6<k5lUW>DnI*?wVFP@Sd zbq8&~7L^LnMD7yl2{+S`TqLNzZB>^dUE-Oz34|t6D4;rt<_oE?LDEfPb~*{uV`n;% zqjn|RN-dR0icS{Xasz@%3|QW{Vxv(~79ZL`eUn-9499}|a5_fo@Zv^TOqL^tOpi-1 zKX0r;ufJbY!y3Ea=jGO>D$WhhB*uJ1*mW~?2ctLU#SIM?;WQ%F3JDw=M_}gWzJyg+ z+A7IK*#+t*GB1b+cY>XeUD1%HwM07gwULm*ww7uQWE~og3hGJAVAe%RD^;8>199>c z;Z=uPtJs&uWJKwQJHcJJR4tp9IFmB@G@A<JLQz(@++l-~&_d6`pzHpmx?FRp1<X=x zfCRvuyq{A=>?wcah9RLu90iM=YA(%ltBHJ{OU-1KJB=Iia^_L*!0Bd9d_(>Ox1P#D z!){MXr)~X`QurFL+MQX48@2`wpjk|v|DA&-UhG#>aPv~D=vZMPXc+@Fr5*5G+g5GH zEDsyE?B<u-sn~%YH3soQlM#2Daio$wioBGM;zk4`!hm3|NwE*+^(TiUA;r2-ZNYO3 z)fX8}`YaCKVNdYH!>8V&sJvDe6}hsdhL|88?zWipl$l-C!;E?!h;QBv#Wa${LV(KT z>$^d!SsyZP*^Aj-KRT%)Z+Wwt%V-UcZ&av00)U3}1V^9y1R6Iux(QYGP|sMOF>Kh0 z)4ZNAg9~ufp3E}G7}Cl6_g0Z3w!j!fXz=>gWuy8*0~p#@P3GtNfOY7yFUkf8`Emub zY5;X7qh{xBSV#yl^7E5LSo@Y`hCR9LyrjQ+352*5M+n@7?g}Q>%<T^x<huB$subc| z&#r+DAItq#^*76F#%&|0^mg?Z7z;W?k;Y}kHbMqY8{T7p>P77L@aS>cAz~3%T1@Fw zK0PUwZ@W{?Mmp8K(UYaa2F;-rEuW73vGXq^)#Od?QeBW@ouci-^IoiH@le@dY^2}b ztv2KP2B`}ez27+oO2{BR*9TBYqb@fb1k{1cL)5X%`hhWsKVe8TJBLbF;A+}o_2CP< zYq;8!pB$!cV%BYjwV@4kiLYI9FEXwA41h3AxmWGNXx1-rlY_0_6|8jatt4~s(4kLG z>ToDfmtIe5Nm=)+pTeILUr|_$^o!0!#l;?zN-zJRWb)z%ATMc8$_=(ihYfdcX5m7~ zBr~rVA*A|e#>4Q#WUE8|IZ}mjcdsEN^n*s!xesoSZ9huvR=4&KZ%hsw;?8G|R#!0V zA>-;oKF=PlHsqtmh!y<RQ?U$$2){SRs#yq;%8eU}Za&acmj1UZsXk9B5!^RuaFi#o zL*ty=A4zIc$E&w6D!wnK%!vi5-z2vEc#?(kCPEWwIYGq%XnC6(Y_JX+cHy##>T5_G z^u(8VdH+XMBt$N28;2W=1qD=m2hLjuCaIlqOJVys0Bp-mXyFe@jrpyQtFW)7+#C-e zUM@I(0TZ=uGA4?a4~hp6WXt^ng74oa1lhKai;fQOakS9O=-^Yh8SmaHYI8;}j*M@? zpU_9oeWG=xkOh~XG2yDmXR-C1pQ_Ge*81WeNBzGWbxsGaZ5MJ%Bu$~>oy?kT4C%xU zbmD2K6MdeBq|r~XQ~!nv63&3a%MQ<|&4Z<<pHh!ma*W$@^KYNV+P3B!gLs90h0DCC zN=;6q@;Si~)#Ihlszb5rCf-N^JF*9xMB#bE8JG%dEyL!qnZwI!O0LHz&s1ebQ-{R0 zhkYEcZwP=5v(%c*+SIryVUH3SV|1YwQp4uV2~$Tu9EPcb7b^mAtrpizZcR1kK>EEo zM?Gb2ZrrMv_eiU}axP?mHO&~@A4a#$e1UE&Lr84=9YqpbV?J$x`UKKtCr6kKcZ-6E zdRfPXf|Vbbe&aH+JKTKgB6Sf2_7gF+yr_lLwZ{Cm=S8jVv*Tz9%Rm<8WF(vU`WJ+x zYHx@fc4`<m#BE{c7prZVwa^$+XtyH8jo-Bdko51oh@`SR-F(ARv6%Zk8;1$D<wmri z5t6Msyo8lz>1*7+pFjSx3X4d8Ll9U6td!IyIVWT&o+%bX^JEjXc?+U@UYq26>bgwb zKr`n?QA74xo#pC1jQ%N$`3SMJ0(z?TUgN&-=2$QzE^C!Khgt78hJ>R-ha^CPj<1T% zqt?<mLSU~h6xV6x^E+S1sg#;7iOwgs=>}9@l$_6Ny(xD2qUG_Gg$Y>)82LZ75wlJ) zL<X*emcbOfj(1`yef^f$R9=52rZ2H<MbaJ3xjQ+H_go{E?JUFgupz@hk87;x(miNz z(^|A=Ei(oePNpFflXH2)b!vTB9C+MFaO7^J15nj^NXydoI8e}~kK>`d*qF;6OGYN; zW=Z20%CWgvR~q*!RB;_VuR?9k*S#Yw7OxqCW6!-wBmjEhAHX$wws*0At=*^&g3@>} z4iTKUhw7k<xmv(yZc^Vy4Ejg$KyHY1{Q|4&?_)23Du;~f_h37q+56%_y$N^dpd6q_ zal_T?(V4-X+=Pa1!K%*rP^{{vTjOK_jQE4M;C%_}dc&dNklc(GOqc6z+NQ!iv*(a0 z)-&y}`+~10>Y0hubs=&=XKWW+|M3sw5QRy<rJj{YB>~KP;!eRw{Hu5<e}X*<Me8n_ zG(O`a70E7RoLb1K;;<v&T7Pkm?a1U;K2~wn)MqX&bS6isop;_P1j^ICm@1Codz8hW zsaF2Mr>ev#w{1*u=;Exr%tQ<Q`<Z&4cD9QtbtU9r??s$bVh%Okqh8AY_6BbYgsMO2 zsz>kcAneh-Y7X78SG`2bKT%TBZvY8h{IGT()T}xC1TL2PrYQbizIwmfnvpv@=A)1Q zaX_3@f6tHk=;wKrs)m_uXbKYtM{NBqJ{nf3X7PItsmaWG+6Y_RG@j53?*1&Q)ez3L z4?b7not<_k{FX8JI&2QOQU%bU#_$Xke5vm%jZ7imfCDF?gaW<%?WXV@y!4e&5cf5X z!3eix2=YxojOQ}0e69XXP2d*~Iz3U_&1-$5BK`UI!pO*=8uPo4s8&X=-4xRfuD=lN zR2>D~wjC98>((Qtj*p)>rsgy2Rpa4`<EMCzj!KWKkX6UkI!Mav9~}yADQFc0s5+t6 z=Wm@51ZjIm3;?#b!1UAU!qK0})2l=SKkbfe1P<gkc0MIm>b(7th3J4Lf~SJu=%ww; z5CK&5J&wMszf-T$i!+rQNo{w5|HXrFwCyzd|NDFFU-Z!DF-^Il%jy7cpHb`ZhtCLN zZ~07(OuyX|B=*H0)I5IR2Q`t=&$Di1KqR^(<O@Q!{YlN|=AVQ{d+Bh@7<|0*&o~%a ztT!0LVp#%LU9LDQc=Xs@C8btuiG$c%Fq{|nK=?@3FA&+*Ji}I?$TZM>^s{><rqUzl z)$6otfs&GPLwgRs@Pg3V_brSsaq^27)qad7AC1z-;ew&y@<k|cC;Gz^Kku?&)*Z)U z0AQj;pV_qbH#L?2^D8FM+T0jJPeL0V+VTgc<L=+Z%+^{Gj|e<Hf2eoiVDW8CKR!KL zA)BUNL5%0(GE*uY`9i}DGe6^J-dcFfQE;B_IuTRFpU_l95g<(NZ#A87{0r;dVmHJM zx7?rn8w<zkFa{9^8@<K(|AOBK{wt0i#Y^Mx$JNNouc}j6ejnq8a4Waqm{VWM=~Q+N zSE1Z}P2G<h!i;O+ttQlXVZPSjg)!Q7i`N*^&1W&q!Sa2^Ah-}xbYD3vu?d%Dtp>BS zGY0nZ0tM|6e=Tlx;hxmyA~>KfFH^P07&ST-CBD-iDx=zoaDsp8#)K6z6K>i_gp)Bf z5!WESV$zP#i0`6xa5+NLV0&*RYS5xO8{z~-6M_dlZ%Wph;f9u1;xN;b2Sqt8e=xB& zjjEyjO>cZ3U6N2bOKWQIFg89D^U+0hauFF)^)6!k)~3K7ud~_S3*fNIR1Fu+MGCwr z+9CS-$C$cqxM{Qu5%ZD8`_|SV#>TxFkCX>%2@e%oX<QvVv9K;x!&++ebIka?Apo9| zreTkM`fN-GK0Z8MdjQuboQtU-G+VvJqIz0wo?cIbe7Mz+YHsnAoBnj6HB+m>$7E<0 z1P@(^wg(-!eFUHh|FOOXo$K?9Q7n*4G}Nq(WY*1wdjfRj=K9-*{8|>~#`=LVq$><L z*dic5G=_9z8`0lWoM+WC`Ik8wwvi!Y<QqjBo)pCVfl)hLj=|W=5$*#Yefh63<Mag? z4M%D5a^m)<64UwL`5M%L8o$Rt3F_*xF9M2pXsESfmO+Np#r=6;0kBUaOz!$d8n)BF z|BNDn?3n|NwcD9xsBsGpUf2{9Zyja~BB-lB%{Z<(t_s}IOsmUi^j}e=JuV=v1AI6S zTSk5hutffS#_fT!LJ|yb#_H3y0=(ifqd*Y%`ntG14v!<Y4g>P4mKyZIr>;h~NtoVr ziK4etyA2l0M2;2TY86)ekv6z@aY1YC1brYy^%SIC&u*i2fogk`e1ksc@ZgdJ(baN0 zgoJ9>ex)%!&6E^+ksgm&wd*eD+_0&6ZM4D%+<Q8N*jQ!AM>tqC(_eVxE1W`Z6!wf` zA+P>$BmCJf!gs5<wZG^{FZo850w<2V;46_O9t^XiNBcYbb>kj`_ZH^*AWhC*f|u>Y z4|tiZ)PbEV&j+$>^lArbd%t)z+#KVXCIS}Xd-q`e^*1W@>P79entW7S4c9BKHpaor zPqx!=+DJ5M5hW8>+rcYSsKH~?LBrFe;|y8E3*Drnb_=tV7=qxs<=TZ}<sE`x3x>Ej z9J+;4JYY$8cg6EQctjHqCw0~m`3s#joK<d0kMe@g!B2J3CNt|J#$5<65?afmsT-h( zymgb71A}Nq+}7)JA@c)kP*0pW*c~gRUU$LHt82w{<|f=Wna#)CjHN-d>c^CL_{tvI zY?l3;F&ea@hi2oGdI`yxSUaY!k6-Mq^+haDUJMERKw89IiP)z4e0E=f^eD)Ou(IyA z30x2}E}p#nun3Pfm6mI%{8~Q^rkHt#SRm>uIL!W94u7avjBvn*al4J*0bbX`)JkuG z%>25)*poIijv|L3=+;4i?b{Nq+<U9ojv6+N0dPUv3AWIinUMaEofOJK0~#h69|2UM zZ$ICreQXUFBkP7=O>aiOZ1e2x8vKuMw$ws5XgM56V8r63QV}k-bpV9tEX2ex%4!`$ zC$CuG^>i4%|4uC*2iP_-nEG&$pXh?;-KEuI)|ZTt5odTE89*lTaf8G>9@u^(8;LAs z{VG&}(x$<px5NWClGlloo>N3W<?z8nv?16fdq>c5;(+JZ%jo(rEth8u(+0qj&>;rE z3FAE~=hC&|5L-Kjiv{s?#~1(?Haq|{=B|4+SgU^R6jSC7_MA(l_k*c6-iL)}U1c<4 zC!*d9f_;@d03E^kfQEqa*Nwr24x*zr7SUk*l@X%#b;jU6AUgdW+~auc8yse>4}ur1 z>y5$vXk7>IH5yDge-wDm@}42M-Np}$hMJcDfiVa~y4WnvjnSIXh(m}$Y1s$Dwf;k3 z(SOF^mF78Pw8PZmtGF4)xpLZA?B{gXZBfeNTnU2~9`+=E39!39PJ^{`r*YRpf6>9q z$3wE${2UwJw4Wi~^GY;43-B;7*gjs{gFL$kBja%yLUdOy?VX@C;6FXA-G<Q7uj5z? zM^1+b_R6LG6Tuy26TuzU1IB20gW!$m_D8ikJpEC@OmE*F)2ELQourLo)=!Mv5H20P z%Vj?%*5(<HgGq?)jFJX7gWwz}ULPGhSwk4a2ScOnBfRe56Qcd&hV3J3-X@~b8qxwQ z4(o%bV(rbDqBUoh?~Lm>`Jt)WQ_S+cF^G$ol%i+YJ|os8{jD6q5gnh>@+s#j?JE8I za~y>o9*89UwbAuYV+S1nwAK!?adgaZbxmA6N4o7<(Ddpv;8W`bV?2DA0`a;iAMzZi zW4UY$>F3*K2zjw~T(mdj@U{^FW(|VW=`b7A89PhE*|^K3D49iI;B4(4X8Fgkb(}nH zb2S7*boe7~#0Vg4EuIC<r|Sxw)ql<t!hZI{F*t~Wz8>bKhlQ0d01gi>5Ky09j&I8i zbOk8iTc#l>rRs$kBt1NDk-%K0n6|x8x5cfkv^@ZcwE!VBc#Pw|m|8x*`FT<6hx=nb z`uTq^Xd0qMM?^p3fsH&8%z5$88x>S1j)ZnG?RIhf>%k@1MdvNS`pvI>gKsv*6oSWs z65OF0Zl3xghGI=K1{Sgb4|F2hW)-xVl9xfBmtGPAqMmUb7h-DkI>TPk>T>HVf?DUV z#*q_g5v@ghRvuO6s!4p=G6;NYwsE5{p#;HCu7H5fS^>IQEymzp2<YJ(8D1=21)3~a zDU^jx%8e#TCtiFHL9J*4_PDkRP?p1neCG1=cCU$Tan+3IEaP<9EciU<#b!x$_#3Ya zg(GKH41frF(x3Ib^oBTlKR-LB%mELJ{<h~M<ytl$`#&5q^P3xv3Wv;GF?Fd0h%v3d zTKkhaB_mHKc6Qw^-eL`CV`*jFikpvFtGRKzy)lS~Z+ly7%_t)!j%0A;G!cPe_37k# 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 O87Mx3N#%st$^QpT`WeUo delta 62661 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 E0ZR(yV*mgE diff --git a/weni_dump.sql b/weni_dump.sql index e69de29bb..89f9c2d12 100644 --- a/weni_dump.sql +++ b/weni_dump.sql @@ -0,0 +1 @@ +-- insert the SQL to be merged into the database using dump_merger.sh From 91835518ce6f283b73f364042d9bba18f236f952 Mon Sep 17 00:00:00 2001 From: Paulo Bernardo <paulo.bernardo@weni.ai> Date: Tue, 19 Nov 2024 10:41:25 -0300 Subject: [PATCH 3/6] feat: update goflow --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 1c03f9de0..e2e75a5a5 100644 --- a/go.mod +++ b/go.mod @@ -79,4 +79,4 @@ go 1.17 replace github.com/nyaruka/gocommon => github.com/Ilhasoft/gocommon v1.16.2-weni -replace github.com/nyaruka/goflow => github.com/weni-ai/goflow v1.5.1-staging +replace github.com/nyaruka/goflow => github.com/weni-ai/goflow v1.5.2-staging diff --git a/go.sum b/go.sum index 3f9583809..10fa832bd 100644 --- a/go.sum +++ b/go.sum @@ -331,6 +331,8 @@ github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPf github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/weni-ai/goflow v1.5.1-staging h1:s4Nf81YuWeqTkevQzepXPbMxwAZYitWzwsKIFw2D+pk= github.com/weni-ai/goflow v1.5.1-staging/go.mod h1:o0xaVWP9qNcauBSlcNLa79Fm2oCPV+BDpheFRa/D40c= +github.com/weni-ai/goflow v1.5.2-staging h1:aJNd1OPPn97F3oIIAOxDKB2OJ/0VqoV8L58ddHBkF+w= +github.com/weni-ai/goflow v1.5.2-staging/go.mod h1:o0xaVWP9qNcauBSlcNLa79Fm2oCPV+BDpheFRa/D40c= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From 23c1eeb8a7179c39228f3895d1aa5885e0d86e06 Mon Sep 17 00:00:00 2001 From: Paulo Bernardo <paulo.bernardo@weni.ai> Date: Tue, 19 Nov 2024 14:41:21 -0300 Subject: [PATCH 4/6] fix: tests --- core/models/channels_test.go | 11 +++++++++++ testsuite/testdata/constants.go | 1 + 2 files changed, 12 insertions(+) diff --git a/core/models/channels_test.go b/core/models/channels_test.go index a48b12ded..8a6281e32 100644 --- a/core/models/channels_test.go +++ b/core/models/channels_test.go @@ -51,6 +51,17 @@ func TestChannels(t *testing.T) { false, nil, }, + { + testdata.WhatsAppCloudChannel.ID, + testdata.WhatsAppCloudChannel.UUID, + "WhatsApp Cloud", + "+559999999999", + []string{"whatsapp"}, + []assets.ChannelRole{"send", "receive"}, + nil, + false, + nil, + }, { testdata.VonageChannel.ID, testdata.VonageChannel.UUID, diff --git a/testsuite/testdata/constants.go b/testsuite/testdata/constants.go index 1f99579cd..01bd1c519 100644 --- a/testsuite/testdata/constants.go +++ b/testsuite/testdata/constants.go @@ -31,6 +31,7 @@ var Surveyor = &User{7, "surveyor1@nyaruka.com"} var TwilioChannel = &Channel{10000, "74729f45-7f29-4868-9dc4-90e491e3c7d8"} var VonageChannel = &Channel{10001, "19012bfd-3ce3-4cae-9bb9-76cf92c73d49"} var TwitterChannel = &Channel{10002, "0f661e8b-ea9d-4bd3-9953-d368340acf91"} +var WhatsAppCloudChannel = &Channel{30000, "d55d54cf-3cdd-40a5-b612-e4d3e42390e2"} var Cathy = &Contact{10000, "6393abc0-283d-4c9b-a1b3-641a035c34bf", "tel:+16055741111", 10000} var Bob = &Contact{10001, "b699a406-7e44-49be-9f01-1a82893e8a10", "tel:+16055742222", 10001} From 8ff260d6108a179f41dc4461daccf17edf47d09a Mon Sep 17 00:00:00 2001 From: Paulo Bernardo <paulo.bernardo@weni.ai> Date: Tue, 19 Nov 2024 14:42:00 -0300 Subject: [PATCH 5/6] fix: unwanted replies and variables slice reference mutation --- core/models/msgs.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/models/msgs.go b/core/models/msgs.go index 26f824cd3..503f7a5eb 100644 --- a/core/models/msgs.go +++ b/core/models/msgs.go @@ -1606,12 +1606,14 @@ func CreateWppBroadcastMessages(ctx context.Context, rt *runtime.Runtime, oa *Or // evaluate our message fields text := bcast.Msg().Text attachments := bcast.Msg().Attachments - quickReplies := bcast.Msg().QuickReplies + quickReplies := make([]string, len(bcast.Msg().QuickReplies)) + copy(quickReplies, bcast.Msg().QuickReplies) headerType := bcast.Msg().Header.Type headerText := bcast.Msg().Header.Text footerText := bcast.Msg().Footer var templating *flows.MsgTemplating = nil - templateVariables := bcast.Msg().Template.Variables + templateVariables := make([]string, len(bcast.Msg().Template.Variables)) + copy(templateVariables, bcast.Msg().Template.Variables) ctaMessage := bcast.Msg().CTAMessage listMessage := bcast.Msg().ListMessage @@ -1674,6 +1676,8 @@ func CreateWppBroadcastMessages(ctx context.Context, rt *runtime.Runtime, oa *Or text = translation.Substitute(evaluatedVariables) var templateReference = assets.NewTemplateReference(bcast.Msg().Template.UUID, bcast.Msg().Template.Name) templating = flows.NewMsgTemplating(templateReference, translation.Language(), translation.Country(), evaluatedVariables, translation.Namespace()) + } else { + return nil, errors.Errorf("translation not found for template: %s, in channel: %s", bcast.Msg().Template.UUID, channel.UUID()) } } From 8baabd1a06838b09a97aaba7858dc058ed1aaa96 Mon Sep 17 00:00:00 2001 From: Paulo Bernardo <paulo.bernardo@weni.ai> Date: Thu, 21 Nov 2024 09:40:08 -0300 Subject: [PATCH 6/6] fix: template tests --- core/models/templates_test.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/models/templates_test.go b/core/models/templates_test.go index 5361e1bd4..04643ca81 100644 --- a/core/models/templates_test.go +++ b/core/models/templates_test.go @@ -21,9 +21,10 @@ func TestTemplates(t *testing.T) { templates, err := oa.Templates() require.NoError(t, err) - assert.Equal(t, 2, len(templates)) + assert.Equal(t, 3, len(templates)) assert.Equal(t, "goodbye", templates[0].Name()) assert.Equal(t, "revive_issue", templates[1].Name()) + assert.Equal(t, "welcome", templates[2].Name()) assert.Equal(t, 1, len(templates[0].Translations())) tt := templates[0].Translations()[0] @@ -40,4 +41,12 @@ func TestTemplates(t *testing.T) { assert.Equal(t, "2d40b45c_25cd_4965_9019_f05d0124c5fa", tt.Namespace()) assert.Equal(t, testdata.TwitterChannel.UUID, tt.Channel().UUID) assert.Equal(t, "Hi {{1}}, are you still experiencing problems with {{2}}?", tt.Content()) + + assert.Equal(t, 1, len(templates[2].Translations())) + tt = templates[2].Translations()[0] + assert.Equal(t, envs.Language("eng"), tt.Language()) + assert.Equal(t, envs.Country("US"), tt.Country()) + assert.Equal(t, "7300ee93-b610-4ea5-98f0-f49d66dba123", tt.Namespace()) + assert.Equal(t, testdata.WhatsAppCloudChannel.UUID, tt.Channel().UUID) + assert.Equal(t, "Welcome {{1}}!", tt.Content()) }