Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

106 lines
2.8KB

  1. package main
  2. import "log"
  3. import "encoding/json"
  4. import "strings"
  5. //abstract CRUD operation for espoCRM Entity
  6. func crmCreateEntity(entityType string, jsonB []byte) (entity interface{}, err error) {
  7. url := CRMConfig.BaseURL + "api/v1/" + entityType
  8. jsonStr, err := postRAW(jsonB, url, crmBuildCommonAPIHeader())
  9. if err != nil {
  10. entity, _ = crmRescueDuplicateCreate(err, entityType)
  11. return
  12. }
  13. return crmJSON2Entity(entityType, jsonStr)
  14. }
  15. func crmUpdateEntity(entityType string, id string, jsonB []byte) (entity interface{}, err error) {
  16. url := CRMConfig.BaseURL + "api/v1/" + entityType + "/" + id
  17. jsonStr, err := patchRAW(jsonB, url, crmBuildCommonAPIHeader())
  18. if err != nil {
  19. log.Println(err)
  20. return
  21. }
  22. return crmJSON2Entity(entityType, jsonStr)
  23. }
  24. func crmReplaceEntity(entityType string, id string, jsonB []byte) (entity interface{}, err error) {
  25. url := CRMConfig.BaseURL + "api/v1/" + entityType + "/" + id
  26. jsonStr, err := putRAW(jsonB, url, crmBuildCommonAPIHeader())
  27. if err != nil {
  28. log.Println(err)
  29. return
  30. }
  31. return crmJSON2Entity(entityType, jsonStr)
  32. }
  33. func crmDeleteEntity(entityType string, id string) (deleted bool, err error) {
  34. url := CRMConfig.BaseURL + "api/v1/" + entityType + "/" + id
  35. resp, err := deleteRAW(url, crmBuildCommonAPIHeader())
  36. if err != nil {
  37. log.Println(err)
  38. return
  39. }
  40. deleted = strings.ToLower(resp) == "true"
  41. return
  42. }
  43. //give an id, return json
  44. func crmGetEntity(entityType string, id string) (entity interface{}, err error) {
  45. url := CRMConfig.BaseURL + "api/v1/" + entityType + "/" + id
  46. jsonStr, err := getRAW(url, crmBuildCommonAPIHeader())
  47. if err != nil {
  48. log.Println(err)
  49. return
  50. }
  51. return crmJSON2Entity(entityType, jsonStr)
  52. }
  53. func crmBuildCommonAPIHeader() (headers map[string]string) {
  54. headers = map[string]string{}
  55. headers["Authorization"] = crmAuthHeader()
  56. headers["Accept"] = "application/json"
  57. headers["Content-Type"] = "application/json"
  58. return headers
  59. }
  60. //given a json string, convert it to Typed structure
  61. func crmJSON2Entity(entityType string, data string) (r interface{}, err error) {
  62. switch entityType {
  63. case "Lead":
  64. e := crmdLead{}
  65. err = json.Unmarshal([]byte(data), &e)
  66. r = e
  67. case "Account":
  68. //r = crmdAccount{}
  69. default:
  70. log.Fatalf("crmJSON2Entity: Unknown EntityType %s", entityType)
  71. }
  72. if err != nil {
  73. log.Println(err)
  74. }
  75. return
  76. }
  77. func crmRescueDuplicateCreate(e error, entityType string) (entity interface{}, success bool) {
  78. if !isErrIndicateDuplicate(e) {
  79. return
  80. }
  81. entity, err := e.(errorHTTPResponse).XStatusReason().Data2Entity(entityType)
  82. success = err == nil
  83. return
  84. }
  85. func isErrIndicateDuplicate(e error) (yes bool) {
  86. err, isOurError := e.(errorHTTPResponse)
  87. if !isOurError {
  88. return
  89. }
  90. reason := err.XStatusReason()
  91. yes = strings.ToLower(reason.Reason) == "duplicate"
  92. return
  93. }