From 563b822ce5013da9f8f97f6524e26271304da2fdbb61e1d9de7ff1ae42968a20 Mon Sep 17 00:00:00 2001 From: mirza Date: Thu, 19 Sep 2024 14:22:30 +0700 Subject: [PATCH] update response --- docs/lz-string.go | 72 +++++++++++++++++++++++++ handlers/bpjs/bpjs.go | 22 ++++++-- handlers/jadwal_dokter/jadwal_dokter.go | 2 +- models/jadwal_dokter/jadwal_dokter.go | 12 +++-- 4 files changed, 98 insertions(+), 10 deletions(-) diff --git a/docs/lz-string.go b/docs/lz-string.go index 08efdaf..dc7ebf7 100644 --- a/docs/lz-string.go +++ b/docs/lz-string.go @@ -1,6 +1,10 @@ package docs import ( + "crypto/aes" + "crypto/cipher" + "crypto/sha256" + "encoding/base64" "errors" "math" "unicode/utf8" @@ -109,3 +113,71 @@ func DecompressFromEncodedUriComponent(input string) (string, error) { return "", errors.New("Unexpected end of buffer reached.") } + +func StringDecrypt(key string, str string) string { + // hash + keyHash := sha256.Sum256([]byte(key)) + + // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning + iv := keyHash[:16] + + // create a new aes cipher using the key and iv + block, err := aes.NewCipher(keyHash[:32]) + if err != nil { + panic(err) + } + + // decode the base64 string to a []byte + ciphertext, _ := base64.StdEncoding.DecodeString(str) + + // create the decrypter + decrypter := cipher.NewCBCDecrypter(block, iv) + + // decrypt + decrypted := make([]byte, len(ciphertext)) + decrypter.CryptBlocks(decrypted, ciphertext) + + // remove padding + padLen := int(decrypted[len(decrypted)-1]) + decrypted = decrypted[:len(decrypted)-padLen] + + return string(decrypted) +} + +func ResponseVclaim(encrypted string, key string) (string, error) { + + cipherText, err := base64.StdEncoding.DecodeString(encrypted) + if err != nil { + return "", err + } + + hash := sha256.Sum256([]byte(key)) + + block, err := aes.NewCipher(hash[:]) + if err != nil { + return "", err + } + + if len(cipherText) < aes.BlockSize { + return "", errors.New("cipherText too short") + } + + iv := hash[:aes.BlockSize] + + if len(cipherText)%aes.BlockSize != 0 { + return "", errors.New("cipherText is not a multiple of the block size") + } + + mode := cipher.NewCBCDecrypter(block, iv) + mode.CryptBlocks(cipherText, cipherText) + + // cipherText, _ = pkcs7.Unpad(cipherText, aes.BlockSize) + cipherText, _ = Unpad(cipherText, aes.BlockSize) + // data, err := lzstring.DecompressFromEncodedURIComponent(string(cipherText)) + data, err := DecompressFromEncodedUriComponent(string(cipherText)) + if err != nil { + return "", err + } + + return data, nil +} diff --git a/handlers/bpjs/bpjs.go b/handlers/bpjs/bpjs.go index 0e120fc..45f23ae 100644 --- a/handlers/bpjs/bpjs.go +++ b/handlers/bpjs/bpjs.go @@ -1,13 +1,16 @@ package bpjs import ( + "bridging-rssa/docs" + "bridging-rssa/models/jadwal_dokter" + "encoding/json" "fmt" "io" "log" "net/http" ) -func BPJSGetResponse(url string, cons_id string, User_keys string, tstamp string, X_signature string, kdPoly string, tanggal string, headers map[string]string) (string, error) { +func BPJSGetResponse(url string, secretKey string, cons_id string, User_keys string, tstamp string, X_signature string, kdPoly string, tanggal string, headers map[string]string) (string, error) { param := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggal url += param log.Println("URL", url) @@ -22,18 +25,29 @@ func BPJSGetResponse(url string, cons_id string, User_keys string, tstamp string log.Println("REQ", req.Header) client := http.Client{} - response, err := client.Get(url) + response, err := client.Do(req) if err != nil { log.Fatalf("Error making external API request: %v", err) } log.Println("RESPONSE: ", response) + key := cons_id + secretKey + tstamp res, err := io.ReadAll(response.Body) if err != nil { fmt.Println(err) } - log.Println("res: ", res) + var jadwalDokter jadwal_dokter.JadwalDokter + err = json.Unmarshal([]byte(res), &jadwalDokter) + if err != nil { + log.Fatalf("Error Unmarshaling: %v", err) + } + log.Println("RESPONSE DATA", jadwalDokter.Response) + dataResp, err := docs.ResponseVclaim(jadwalDokter.Response, key) + if err != nil { + log.Fatalf("Error Unmarshaling: %v", err) + } + log.Println("res: ", dataResp) return string(res), nil -} \ No newline at end of file +} diff --git a/handlers/jadwal_dokter/jadwal_dokter.go b/handlers/jadwal_dokter/jadwal_dokter.go index 42f1f91..0d5d321 100644 --- a/handlers/jadwal_dokter/jadwal_dokter.go +++ b/handlers/jadwal_dokter/jadwal_dokter.go @@ -32,7 +32,7 @@ func GetJadwalDokter(c *gin.Context) { } log.Println("Headers : ", headers) - res, err := bpjs.BPJSGetResponse(url, cons_id, User_key, tstamp, X_signature, kdPoly, tanggal, headers) + res, err := bpjs.BPJSGetResponse(url, conf.Secret_key, cons_id, User_key, tstamp, X_signature, kdPoly, tanggal, headers) if err != nil { log.Fatalf("Error making external API request: %v", err) } diff --git a/models/jadwal_dokter/jadwal_dokter.go b/models/jadwal_dokter/jadwal_dokter.go index d48abd4..709e737 100644 --- a/models/jadwal_dokter/jadwal_dokter.go +++ b/models/jadwal_dokter/jadwal_dokter.go @@ -1,11 +1,13 @@ package jadwal_dokter type JadwalDokter struct { - Response struct { - List []ListDokter `json:"list"` - } `json:"response"` - MetaData struct { - } `json:"metadata"` + Response string `json:"response"` + MetaData Metadata `json:"metadata"` +} + +type Metadata struct { + Code int `json:"code"` + Message string `json:"message"` } type ListDokter struct {