mobile.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package http
  2. import (
  3. "encoding/xml"
  4. "io/ioutil"
  5. "net/http"
  6. "time"
  7. "go-common/app/interface/main/app-wall/model/mobile"
  8. "go-common/library/ecode"
  9. log "go-common/library/log"
  10. bm "go-common/library/net/http/blademaster"
  11. "go-common/library/net/metadata"
  12. )
  13. const (
  14. mobileOrders = 0
  15. mobileFlow = 1
  16. )
  17. var (
  18. emptyByte = []byte{}
  19. )
  20. // ordersSync
  21. func ordersMobileSync(c *bm.Context) {
  22. mobile, mtype, err := requestXMLToMap(c.Request)
  23. if err != nil {
  24. log.Error("requestXMLToMap error (%v)", err)
  25. mobileMessage(c, err, mtype)
  26. return
  27. }
  28. b, _ := xml.Marshal(&mobile)
  29. ip := metadata.String(c, metadata.RemoteIP)
  30. switch mtype {
  31. case mobileOrders:
  32. log.Info("mobile user orders xml response(%s)", b)
  33. if mobile.Threshold == "" {
  34. mobile.Threshold = "100"
  35. }
  36. if err := mobileSvc.InOrdersSync(c, ip, mobile, time.Now()); err != nil {
  37. log.Error("mobileSvc.InOrdersSync error (%v)", err)
  38. mobileMessage(c, err, mtype)
  39. return
  40. }
  41. case mobileFlow:
  42. log.Info("mobile user flow xml response(%s)", b)
  43. if err := mobileSvc.FlowSync(c, mobile, ip); err != nil {
  44. log.Error("mobileSvc.FlowSync error (%v)", err)
  45. mobileMessage(c, err, mtype)
  46. return
  47. }
  48. }
  49. mobileMessage(c, ecode.OK, mtype)
  50. }
  51. // mobileActivation
  52. func mobileActivation(c *bm.Context) {
  53. res := map[string]interface{}{}
  54. params := c.Request.Form
  55. usermob := params.Get("usermob")
  56. msg, err := mobileSvc.Activation(c, usermob, time.Now())
  57. if err != nil {
  58. if msg != "" {
  59. returnDataJSON(c, res, err)
  60. res["message"] = msg
  61. }
  62. returnDataJSON(c, res, err)
  63. return
  64. }
  65. res["message"] = ""
  66. returnDataJSON(c, res, nil)
  67. }
  68. // mobileState
  69. func mobileState(c *bm.Context) {
  70. params := c.Request.Form
  71. usermob := params.Get("usermob")
  72. data := mobileSvc.MobileState(c, usermob, time.Now())
  73. res := map[string]interface{}{
  74. "data": data,
  75. }
  76. returnDataJSON(c, res, nil)
  77. }
  78. // userFlowState
  79. func userMobileState(c *bm.Context) {
  80. params := c.Request.Form
  81. usermob := params.Get("usermob")
  82. data := mobileSvc.UserMobileState(c, usermob, time.Now())
  83. res := map[string]interface{}{
  84. "data": data,
  85. }
  86. returnDataJSON(c, res, nil)
  87. }
  88. // RequestXmlToMap
  89. func requestXMLToMap(request *http.Request) (data *mobile.MobileXML, mobileType int, err error) {
  90. body, err := ioutil.ReadAll(request.Body)
  91. if err != nil {
  92. log.Error("mobile_ioutil.ReadAll error (%v)", err)
  93. return
  94. }
  95. defer request.Body.Close()
  96. if len(body) == 0 {
  97. err = ecode.RequestErr
  98. return
  99. }
  100. var res interface{} = &mobile.OrderXML{}
  101. mobileType = mobileOrders
  102. log.Info("mobile orders xml body(%s)", body)
  103. if err = xml.Unmarshal(body, &res); err != nil {
  104. res = &mobile.FlowXML{}
  105. mobileType = mobileFlow
  106. if err = xml.Unmarshal(body, &res); err != nil {
  107. log.Error("xml.Unmarshal OrderXML(%v) error (%v)", res, err)
  108. err = ecode.RequestErr
  109. return
  110. }
  111. }
  112. if res == nil {
  113. err = ecode.NothingFound
  114. log.Error("xml.Unmarshal OrderXML is null")
  115. return
  116. }
  117. switch v := res.(type) {
  118. case *mobile.OrderXML:
  119. data = v.MobileXML
  120. case *mobile.FlowXML:
  121. data = v.MobileXML
  122. }
  123. return
  124. }
  125. func mobileMessage(c *bm.Context, err error, mobileType int) {
  126. // response header
  127. c.Writer.Header().Set("Content-Type", "text/xml; charset=UTF-8")
  128. c.Writer.Header().Set("Cache-Control", "no-cache")
  129. c.Writer.Header().Set("Connection", "keep-alive")
  130. var msg interface{}
  131. switch mobileType {
  132. case mobileOrders:
  133. msg = &mobile.OrderMsgXML{
  134. Msg: &mobile.Msg{
  135. Xmlns: "http://www.monternet.com/dsmp/schemas/",
  136. MsgType: "SyncFlowPkgOrderResp",
  137. Version: "1.0.0",
  138. HRet: err.Error(),
  139. },
  140. }
  141. case mobileFlow:
  142. msg = &mobile.FlowMsgXML{
  143. Msg: &mobile.Msg{
  144. Xmlns: "http://www.monternet.com/dsmp/schemas/",
  145. MsgType: "SyncFlowPkgLeftQuotaResp",
  146. Version: "1.0.0",
  147. HRet: err.Error(),
  148. },
  149. }
  150. }
  151. output, err := xml.MarshalIndent(msg, " ", " ")
  152. if err != nil {
  153. log.Error("xml.MarshalIndent (%v)", err)
  154. err = ecode.RequestErr
  155. output = emptyByte
  156. }
  157. c.Writer.Write([]byte(xml.Header))
  158. c.Writer.Write(output)
  159. }