all data start with crmd all function start with crm so as to easy identify it.master
| package main | |||||
| import "log" | |||||
| //abstract CRUD operation for espoCRM Entity | |||||
| var crmSite = "https://c.hitxy.org.au/" | |||||
| func createEntity(entityType string, jsonB []byte) (entity interface{}, err error) { | |||||
| url := crmSite + "api/v1/" + entityType | |||||
| json, err := postRAW(jsonB, url, crmBuildCommonAPIHeader()) | |||||
| if err != nil { | |||||
| log.Println(err) | |||||
| return | |||||
| } | |||||
| return json, err | |||||
| } | |||||
| func updateEntity(entityType string, id string, jsonB []byte) (entity interface{}, err error) { | |||||
| url := crmSite + "api/v1/" + entityType + "/" + id | |||||
| json, err := patchRAW(jsonB, url, crmBuildCommonAPIHeader()) | |||||
| if err != nil { | |||||
| log.Println(err) | |||||
| return | |||||
| } | |||||
| return json, err | |||||
| } | |||||
| func replaceEntity(entityType string, id string, jsonB []byte) (entity interface{}, err error) { | |||||
| url := crmSite + "api/v1/" + entityType + "/" + id | |||||
| json, err := putRAW(jsonB, url, crmBuildCommonAPIHeader()) | |||||
| if err != nil { | |||||
| log.Println(err) | |||||
| return | |||||
| } | |||||
| return json, err | |||||
| } | |||||
| func deleteEntity(entityType string, id string) (json string, err error) { | |||||
| url := crmSite + "api/v1/" + entityType + "/" + id | |||||
| json, err = deleteRAW(url, crmBuildCommonAPIHeader()) | |||||
| if err != nil { | |||||
| log.Println(err) | |||||
| return | |||||
| } | |||||
| return | |||||
| } | |||||
| //give an id, return json | |||||
| func crmGetEntity(entityType string, id string) (json string, err error) { | |||||
| url := crmSite + "api/v1/" + entityType + "/" + id | |||||
| json, err = getRAW(url, crmBuildCommonAPIHeader()) | |||||
| if err != nil { | |||||
| log.Println(err) | |||||
| return | |||||
| } | |||||
| return json, err | |||||
| } | |||||
| func crmBuildCommonAPIHeader() (headers map[string]string) { | |||||
| headers = map[string]string{} | |||||
| headers["Authorization"] = crmAuthHeader() | |||||
| headers["Accept"] = "application/json" | |||||
| headers["Content-Type"] = "application/json" | |||||
| return headers | |||||
| } | |||||
| //given a json string, convert it to Typed structure | |||||
| func json2Entity(entityType string, json string) (r interface{}) { | |||||
| switch entityType { | |||||
| case "Lead": | |||||
| r = crmdLeadInfo | |||||
| case "Account": | |||||
| } | |||||
| return | |||||
| } |
| package main | |||||
| import "testing" | |||||
| func TestGetEntity(t *testing.T) { | |||||
| SetupConfig() | |||||
| leadID := "595071f8450974b72" | |||||
| crmGetEntity("Lead", leadID) | |||||
| } |
| "time" | "time" | ||||
| ) | ) | ||||
| type crmLeadInfo struct { | |||||
| type crmdLead struct { | |||||
| ID string `json:"id"` | ID string `json:"id"` | ||||
| Name string `json:"name,omitempty"` | Name string `json:"name,omitempty"` | ||||
| Deleted bool `json:"deleted,omitempty"` | Deleted bool `json:"deleted,omitempty"` | ||||
| } | } | ||||
| type crmSearchLead struct { | type crmSearchLead struct { | ||||
| Total int `json:"total"` | |||||
| List []crmLeadInfo `json:"list"` | |||||
| Total int `json:"total"` | |||||
| List []crmdLead `json:"list"` | |||||
| } | } | ||||
| func (m *crmLeadInfo) getCreatedAt() (r time.Time) { | |||||
| func (m *crmdLead) getCreatedAt() (r time.Time) { | |||||
| layout := m.getTimeLayout() | layout := m.getTimeLayout() | ||||
| r, _ = time.Parse(layout, m.CreatedAt) | r, _ = time.Parse(layout, m.CreatedAt) | ||||
| return | return | ||||
| } | } | ||||
| func (m *crmLeadInfo) setCreatedAt(v time.Time) string { | |||||
| func (m *crmdLead) setCreatedAt(v time.Time) string { | |||||
| layout := m.getTimeLayout() | layout := m.getTimeLayout() | ||||
| m.CreatedAt = v.Format(layout) | m.CreatedAt = v.Format(layout) | ||||
| return m.CreatedAt | return m.CreatedAt | ||||
| } | } | ||||
| func (m *crmLeadInfo) getModifiedAt() (r time.Time) { | |||||
| func (m *crmdLead) getModifiedAt() (r time.Time) { | |||||
| layout := m.getTimeLayout() | layout := m.getTimeLayout() | ||||
| r, _ = time.Parse(layout, m.ModifiedAt) | r, _ = time.Parse(layout, m.ModifiedAt) | ||||
| return | return | ||||
| } | } | ||||
| func (m *crmLeadInfo) setModifiedAt(v time.Time) string { | |||||
| func (m *crmdLead) setModifiedAt(v time.Time) string { | |||||
| layout := m.getTimeLayout() | layout := m.getTimeLayout() | ||||
| m.ModifiedAt = v.Format(layout) | m.ModifiedAt = v.Format(layout) | ||||
| return m.ModifiedAt | return m.ModifiedAt | ||||
| } | } | ||||
| func (m *crmLeadInfo) getTimeLayout() string { | |||||
| func (m *crmdLead) getTimeLayout() string { | |||||
| return "2006-01-02 15:04:05" | return "2006-01-02 15:04:05" | ||||
| } | } | ||||
| func crmFindOpenID(openID string) (info crmLeadInfo, found bool, err error) { | |||||
| func crmFindOpenID(openID string) (info crmdLead, found bool, err error) { | |||||
| found = false | found = false | ||||
| req, err := http.NewRequest("GET", "https://c.hitxy.org.au/api/v1/Lead", nil) | req, err := http.NewRequest("GET", "https://c.hitxy.org.au/api/v1/Lead", nil) | ||||
| if err != nil { | if err != nil { | ||||
| headers["Content-Type"] = "application/json" | headers["Content-Type"] = "application/json" | ||||
| return headers | return headers | ||||
| } | } | ||||
| func crmGetLeadByID(id string) (r crmdLead, err error) { | |||||
| resp, err := crmGetEntity("Lead", id) | |||||
| err = json.Unmarshal([]byte(resp), &r) | |||||
| return | |||||
| } |
| "createdOpportunityId": null | "createdOpportunityId": null | ||||
| }` | }` | ||||
| r := crmLeadInfo{} | |||||
| r := crmdLead{} | |||||
| err := json.Unmarshal([]byte(msg), &r) | err := json.Unmarshal([]byte(msg), &r) | ||||
| //log.Println(r) | //log.Println(r) | ||||
| AssertEqual(t, err, nil, "Decode CRM Lead Json shold be correct") | AssertEqual(t, err, nil, "Decode CRM Lead Json shold be correct") | ||||
| } | } | ||||
| func TestCrmLeadInfoByCompleteInfo(t *testing.T) { | |||||
| func TestcrmdLeadByCompleteInfo(t *testing.T) { | |||||
| msg := `{ | msg := `{ | ||||
| "id": "58f4aa0682ea74bb8", | "id": "58f4aa0682ea74bb8", | ||||
| "name": "same email", | "name": "same email", | ||||
| }, | }, | ||||
| "imagesTypes": {} | "imagesTypes": {} | ||||
| }` | }` | ||||
| r := crmLeadInfo{} | |||||
| r := crmdLead{} | |||||
| err := json.Unmarshal([]byte(msg), &r) | err := json.Unmarshal([]byte(msg), &r) | ||||
| //log.Println(r) | //log.Println(r) | ||||
| AssertEqual(t, err, nil, "") | AssertEqual(t, err, nil, "") | ||||
| } | } | ||||
| func TestLeadJsonCompose(t *testing.T) { | func TestLeadJsonCompose(t *testing.T) { | ||||
| info := crmLeadInfo{} | |||||
| info := crmdLead{} | |||||
| info.FirstName = "中文First" | info.FirstName = "中文First" | ||||
| } | } | ||||
| func TestGetLead(t *testing.T) { | |||||
| SetupConfig() | |||||
| id := "595071f8450974b72" | |||||
| r, err := crmGetLeadByID(id) | |||||
| AssertEqual(t, err, nil, "decode json should be nil") | |||||
| AssertEqual(t, r.ID, id, "Lead id should match") | |||||
| } |
| templateSendJoinCommunity(in.header.FromUserName, url, first, remark, communityName, joinDate) | templateSendJoinCommunity(in.header.FromUserName, url, first, remark, communityName, joinDate) | ||||
| } | } | ||||
| func sendGreeting4ExistingUser(in InWechatMsg, info crmLeadInfo) { | |||||
| func sendGreeting4ExistingUser(in InWechatMsg, info crmdLead) { | |||||
| first := "欢迎" + info.Name + "返回澳洲校友会" | first := "欢迎" + info.Name + "返回澳洲校友会" | ||||
| //url := "http://wechat.hitxy.org.au/profile_newly_register" | //url := "http://wechat.hitxy.org.au/profile_newly_register" | ||||
| } | } | ||||
| func (m *WechatUserInfo) registerNewUserWithInfo(in InWechatMsg) { | func (m *WechatUserInfo) registerNewUserWithInfo(in InWechatMsg) { | ||||
| u := crmLeadInfo{} | |||||
| u := crmdLead{} | |||||
| u.FirstName = "\u0020" | u.FirstName = "\u0020" | ||||
| u.LastName = m.NickName | u.LastName = m.NickName | ||||
| u.Password = "password" | u.Password = "password" |
| return httpRaw("PUT", targetURL, data, headers) | return httpRaw("PUT", targetURL, data, headers) | ||||
| } | } | ||||
| func patchRAW(data []byte, targetURL string, headers map[string]string) (resp string, err error) { | |||||
| return httpRaw("PATCH", targetURL, data, headers) | |||||
| } | |||||
| func getRAW(targetURL string, headers map[string]string) (resp string, err error) { | |||||
| return httpRaw("GET", targetURL, nil, headers) | |||||
| } | |||||
| func deleteRAW(targetURL string, headers map[string]string) (resp string, err error) { | |||||
| return httpRaw("DELETE", targetURL, nil, headers) | |||||
| } | |||||
| func httpRaw(httpMethod, targetURL string, data []byte, headers map[string]string) (resp string, err error) { | func httpRaw(httpMethod, targetURL string, data []byte, headers map[string]string) (resp string, err error) { | ||||
| requestBody := io.Reader(nil) | requestBody := io.Reader(nil) | ||||
| if data != nil { | if data != nil { |