You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.9 KiB
170 lines
3.9 KiB
package http |
|
|
|
import ( |
|
"encoding/xml" |
|
"io/ioutil" |
|
"net/http" |
|
"time" |
|
|
|
"go-common/app/interface/main/app-wall/model/mobile" |
|
"go-common/library/ecode" |
|
log "go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"go-common/library/net/metadata" |
|
) |
|
|
|
const ( |
|
mobileOrders = 0 |
|
mobileFlow = 1 |
|
) |
|
|
|
var ( |
|
emptyByte = []byte{} |
|
) |
|
|
|
// ordersSync |
|
func ordersMobileSync(c *bm.Context) { |
|
mobile, mtype, err := requestXMLToMap(c.Request) |
|
if err != nil { |
|
log.Error("requestXMLToMap error (%v)", err) |
|
mobileMessage(c, err, mtype) |
|
return |
|
} |
|
b, _ := xml.Marshal(&mobile) |
|
ip := metadata.String(c, metadata.RemoteIP) |
|
switch mtype { |
|
case mobileOrders: |
|
log.Info("mobile user orders xml response(%s)", b) |
|
if mobile.Threshold == "" { |
|
mobile.Threshold = "100" |
|
} |
|
if err := mobileSvc.InOrdersSync(c, ip, mobile, time.Now()); err != nil { |
|
log.Error("mobileSvc.InOrdersSync error (%v)", err) |
|
mobileMessage(c, err, mtype) |
|
return |
|
} |
|
case mobileFlow: |
|
log.Info("mobile user flow xml response(%s)", b) |
|
if err := mobileSvc.FlowSync(c, mobile, ip); err != nil { |
|
log.Error("mobileSvc.FlowSync error (%v)", err) |
|
mobileMessage(c, err, mtype) |
|
return |
|
} |
|
} |
|
mobileMessage(c, ecode.OK, mtype) |
|
} |
|
|
|
// mobileActivation |
|
func mobileActivation(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
params := c.Request.Form |
|
usermob := params.Get("usermob") |
|
msg, err := mobileSvc.Activation(c, usermob, time.Now()) |
|
if err != nil { |
|
if msg != "" { |
|
returnDataJSON(c, res, err) |
|
res["message"] = msg |
|
} |
|
|
|
returnDataJSON(c, res, err) |
|
return |
|
} |
|
res["message"] = "" |
|
returnDataJSON(c, res, nil) |
|
} |
|
|
|
// mobileState |
|
func mobileState(c *bm.Context) { |
|
params := c.Request.Form |
|
usermob := params.Get("usermob") |
|
data := mobileSvc.MobileState(c, usermob, time.Now()) |
|
res := map[string]interface{}{ |
|
"data": data, |
|
} |
|
returnDataJSON(c, res, nil) |
|
} |
|
|
|
// userFlowState |
|
func userMobileState(c *bm.Context) { |
|
params := c.Request.Form |
|
usermob := params.Get("usermob") |
|
data := mobileSvc.UserMobileState(c, usermob, time.Now()) |
|
res := map[string]interface{}{ |
|
"data": data, |
|
} |
|
returnDataJSON(c, res, nil) |
|
} |
|
|
|
// RequestXmlToMap |
|
func requestXMLToMap(request *http.Request) (data *mobile.MobileXML, mobileType int, err error) { |
|
body, err := ioutil.ReadAll(request.Body) |
|
if err != nil { |
|
log.Error("mobile_ioutil.ReadAll error (%v)", err) |
|
return |
|
} |
|
defer request.Body.Close() |
|
if len(body) == 0 { |
|
err = ecode.RequestErr |
|
return |
|
} |
|
var res interface{} = &mobile.OrderXML{} |
|
mobileType = mobileOrders |
|
log.Info("mobile orders xml body(%s)", body) |
|
if err = xml.Unmarshal(body, &res); err != nil { |
|
res = &mobile.FlowXML{} |
|
mobileType = mobileFlow |
|
if err = xml.Unmarshal(body, &res); err != nil { |
|
log.Error("xml.Unmarshal OrderXML(%v) error (%v)", res, err) |
|
err = ecode.RequestErr |
|
return |
|
} |
|
} |
|
if res == nil { |
|
err = ecode.NothingFound |
|
log.Error("xml.Unmarshal OrderXML is null") |
|
return |
|
} |
|
switch v := res.(type) { |
|
case *mobile.OrderXML: |
|
data = v.MobileXML |
|
case *mobile.FlowXML: |
|
data = v.MobileXML |
|
} |
|
return |
|
} |
|
|
|
func mobileMessage(c *bm.Context, err error, mobileType int) { |
|
// response header |
|
c.Writer.Header().Set("Content-Type", "text/xml; charset=UTF-8") |
|
c.Writer.Header().Set("Cache-Control", "no-cache") |
|
c.Writer.Header().Set("Connection", "keep-alive") |
|
var msg interface{} |
|
switch mobileType { |
|
case mobileOrders: |
|
msg = &mobile.OrderMsgXML{ |
|
Msg: &mobile.Msg{ |
|
Xmlns: "http://www.monternet.com/dsmp/schemas/", |
|
MsgType: "SyncFlowPkgOrderResp", |
|
Version: "1.0.0", |
|
HRet: err.Error(), |
|
}, |
|
} |
|
case mobileFlow: |
|
msg = &mobile.FlowMsgXML{ |
|
Msg: &mobile.Msg{ |
|
Xmlns: "http://www.monternet.com/dsmp/schemas/", |
|
MsgType: "SyncFlowPkgLeftQuotaResp", |
|
Version: "1.0.0", |
|
HRet: err.Error(), |
|
}, |
|
} |
|
} |
|
output, err := xml.MarshalIndent(msg, " ", " ") |
|
if err != nil { |
|
log.Error("xml.MarshalIndent (%v)", err) |
|
err = ecode.RequestErr |
|
output = emptyByte |
|
} |
|
c.Writer.Write([]byte(xml.Header)) |
|
c.Writer.Write(output) |
|
}
|
|
|