From 70ab487d87745911b41accf69aa1f6fb9de3655f Mon Sep 17 00:00:00 2001 From: Patrick Peng Sun Date: Sun, 2 Jul 2017 21:49:09 +1000 Subject: [PATCH] unsubscribe implemented --- crmLead.go | 23 ++++++++++++++++++++++- crmLead_test.go | 10 +++++++++- eventSubscribe.go | 18 ++++++++++++++++-- serveEvents.go | 1 + 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/crmLead.go b/crmLead.go index de9fe23..c5cc6b6 100644 --- a/crmLead.go +++ b/crmLead.go @@ -1,6 +1,8 @@ package main import ( + "encoding/json" + "errors" "fmt" "log" ) @@ -67,7 +69,7 @@ type crmdSearchLead struct { List []crmdLead `json:"list"` } -func crmFindOpenID(openID string) (info crmdLead, found bool, err error) { +func crmFindLeadByOpenID(openID string) (info crmdLead, found bool, err error) { total, list, err := crmFindEntityByAttr("Lead", "wechat_hitxy_id", openID) if err != nil { return @@ -92,3 +94,22 @@ func crmGetLead(id string) (r crmdLead, err error) { r = entity.(crmdLead) return } + +func crmPatchLeadInfo(newInfo crmdLead) (updatedLead crmdLead, err error) { + b, err := json.Marshal(newInfo) + if err != nil { + log.Printf("Failed to Patch new Info for Lead") + log.Println(newInfo) + return + } + newEntity, err := crmUpdateEntity("Lead", newInfo.ID, b) + if err != nil { + return + } + updatedLead, ok := newEntity.(crmdLead) + + if !ok { + err = errors.New("Update Lead result in wrong entityType") + } + return +} diff --git a/crmLead_test.go b/crmLead_test.go index e0de7e4..f409d6d 100644 --- a/crmLead_test.go +++ b/crmLead_test.go @@ -409,11 +409,19 @@ func TestGetLead(t *testing.T) { AssertEqual(t, lead.Password, e.Password, "password should match") //start query - info, found, err := crmFindOpenID(e.WechatHitxyID) + info, found, err := crmFindLeadByOpenID(e.WechatHitxyID) AssertEqual(t, err, nil, "finding Lead record by ID should be nil") AssertEqual(t, found, true, "we should have found our record of Lead") AssertEqual(t, info.WechatHitxyID, e.WechatHitxyID, "wechat id should be the same") + //test patch lead + newStatus := crmdLead{} + newStatus.Status = "Dead" + newStatus.ID = id + newLead, err := crmPatchLeadInfo(newStatus) + AssertEqual(t, err, nil, "patch status for lead shold be correct") + AssertEqual(t, newLead.Status, "Dead", "Newstatus should be dead") + //delete temp record deleted, _ := crmDeleteEntity("Lead", id) AssertEqual(t, deleted, true, "test record shold be deleted correctly") diff --git a/eventSubscribe.go b/eventSubscribe.go index 187967f..9261c94 100644 --- a/eventSubscribe.go +++ b/eventSubscribe.go @@ -13,7 +13,7 @@ import ( func onSubscribe(in InWechatMsg) { openID := in.header.FromUserName //check whether we have his own record in the CRM system - info, found, err := crmFindOpenID(openID) + info, found, err := crmFindLeadByOpenID(openID) if err != nil { log.Println(err) @@ -128,5 +128,19 @@ func (m *WechatUserInfo) registerNewLeadWithInfo(in InWechatMsg) (newuser crmdLe //when user left func onUnSubscribe(in InWechatMsg) { - //TODO: record unSubscribe + info, found, err := crmFindLeadByOpenID(in.header.FromUserName) + + if err != nil { + log.Printf("Error happened when trying to unsubscribe a user %s", in.header.FromUserName) + log.Println(err) + } + if found == false { + log.Printf("not found openid %s", in.header.FromUserName) + return + } + //mark status + newStatus := crmdLead{} + newStatus.ID = info.ID + newStatus.Status = "Dead" + crmPatchLeadInfo(newStatus) } diff --git a/serveEvents.go b/serveEvents.go index 7d095f5..38d9b58 100644 --- a/serveEvents.go +++ b/serveEvents.go @@ -12,6 +12,7 @@ func (ss *openIDSessionData) serveEvents(in InWechatMsg) (processed bool) { case "unsubscribe": processed = true in.replyText("") + onUnSubscribe(in) return case "SCAN": case "LOCATION":