package bcbsi import ( "bytes" "crypto/md5" "encoding/hex" "encoding/xml" "fmt" "io/ioutil" "net/http" "strings" "time" "github.com/pquerna/ffjson/ffjson" "bitbucket.org/nemt/nemt-portal-api/application/third/eligibility/bcbsi/bcbsimodel" "bitbucket.org/nemt/nemt-portal-api/application/viewmodel" "bitbucket.org/nemt/nemt-portal-api/infra/config" ) type bxeService struct { cfg *config.Config } func newBXEService(cfg *config.Config) *bxeService { return &bxeService{ cfg: cfg, } } func (s bxeService) getSignature(APIKey string, secretKey string) string { rawKey := fmt.Sprintf("%s%s%v", APIKey, secretKey, time.Now().Unix()) hasher := md5.New() hasher.Write([]byte(rawKey)) key := hex.EncodeToString(hasher.Sum(nil)) return strings.ToLower(key) } func (s bxeService) GetPayerDetails(subscriberID string) ([]bcbsimodel.EntityResponse, error) { apiKey := s.cfg.Blue365.APIKey secretKey := s.cfg.Blue365.Secret URL := s.cfg.Blue365.URL prefix := subscriberID[:3] client := &http.Client{} req, _ := http.NewRequest("GET", URL+"/"+prefix, bytes.NewBuffer([]byte{})) req.Header.Add("X-Api-Key", apiKey) req.Header.Add("X-Signature", s.getSignature(apiKey, secretKey)) resp, err := client.Do(req) if err != nil { fmt.Println("Error Blue365: ", err) return nil, err } defer resp.Body.Close() bReturn, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error Blue365: ", err) return nil, err } var response []bcbsimodel.EntityResponse err = ffjson.Unmarshal(bReturn, &response) if err != nil { fmt.Println("Error Blue365: ", err) return nil, err } return response, nil } func (s bxeService) CheckEligibility(eligibility viewmodel.Eligibility) (bcbsimodel.MemberEligibilityResponse, error) { payer, err := s.GetPayerDetails(eligibility.Subscriber.SubscriberID) if err != nil { return bcbsimodel.MemberEligibilityResponse{}, err } eligibility.Payer.PayerID = payer[0].ID eligibility.Payer.PayerName = payer[0].Name envelope := bcbsimodel.GetEnvelope(eligibility) apiKey := s.cfg.BXE.APIKey secretKey := s.cfg.BXE.Secret bObj, err := xml.Marshal(envelope) if err != nil { return bcbsimodel.MemberEligibilityResponse{}, err } client := &http.Client{} req, _ := http.NewRequest("POST", s.cfg.BXE.URL, bytes.NewBuffer(bObj)) req.Header.Add("Soapaction", "CheckEligibility") req.Header.Add("Content-Type", "text/xml") req.Header.Add("X-Api-Key", apiKey) req.Header.Add("X-Signature", s.getSignature(apiKey, secretKey)) resp, err := client.Do(req) if err != nil { fmt.Println("Error WebService: ", err) return bcbsimodel.MemberEligibilityResponse{}, err } defer resp.Body.Close() bReturn, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error WebService: ", err) return bcbsimodel.MemberEligibilityResponse{}, err } sResponse := string(bReturn) sResponse = strings.Replace(sResponse, "soapenv:Envelope", "Envelope", -1) sResponse = strings.Replace(sResponse, "soapenv:Body", "Body", -1) sResponse = strings.Replace(sResponse, "ns2:", "", -1) var result bcbsimodel.EnvelopeResponse err = xml.Unmarshal([]byte(sResponse), &result) if err != nil { fmt.Println("Error WebService: ", err) return bcbsimodel.MemberEligibilityResponse{}, err } return result.Body.MemberEligibilityResponse, nil }