update structure and bridging bpjs
This commit is contained in:
No files matched your search
@@ -9,4 +9,10 @@ SATUDATA_HOST=10.10.123.165
|
||||
SATUDATA_USERNAME=stim
|
||||
SATUDATA_PASSWORD=stim*RS54
|
||||
SATUDATA_NAME=satu_db
|
||||
SATUDATA_PORT=5000
|
||||
SATUDATA_PORT=5000
|
||||
|
||||
BASEURL_BPJS=https://apijkn-dev.bpjs-kesehatan.go.id/
|
||||
ANTREAN_RS=antreanrs_dev
|
||||
CONS_ID=16041
|
||||
USER_KEY=04a742fc834e0d3dc5b18913c8d46b90
|
||||
SECRET_KEY=8pP3D5431E
|
||||
@@ -0,0 +1,67 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"bridging-rssa/models/config"
|
||||
"crypto/hmac"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var DB *gorm.DB
|
||||
var SatuDataDB *gorm.DB
|
||||
var err error
|
||||
|
||||
func ConnectDB() {
|
||||
hostSatuData := os.Getenv("SATUDATA_HOST")
|
||||
userNameSatuData := os.Getenv("SATUDATA_USERNAME")
|
||||
passwordSatuData := os.Getenv("SATUDATA_PASSWORD")
|
||||
dbNameSatuData := os.Getenv("SATUDATA_NAME")
|
||||
portSatuData := os.Getenv("SATUDATA_PORT")
|
||||
|
||||
satuData := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta", hostSatuData, userNameSatuData, passwordSatuData, dbNameSatuData, portSatuData)
|
||||
|
||||
SatuDataDB, err = gorm.Open(postgres.Open(satuData), &gorm.Config{})
|
||||
if err != nil {
|
||||
log.Fatal("Failed to connect to Satu Data database: ", err)
|
||||
} else {
|
||||
log.Println("Successfully connected to the database")
|
||||
}
|
||||
}
|
||||
|
||||
func SetHeader(cfg config.ConfigBpjs) (string, string, string, string, string) {
|
||||
|
||||
timenow := time.Now().UTC()
|
||||
time := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC)
|
||||
tstamp := timenow.Unix() - time.Unix()
|
||||
|
||||
log.Println("TIMENOW: ", timenow)
|
||||
log.Println("TIME UNIX", timenow.Unix())
|
||||
log.Println("T: ", time)
|
||||
log.Println("T UNIX: ", time.Unix())
|
||||
|
||||
cfg.Cons_id = os.Getenv("CONS_ID")
|
||||
cfg.User_key = os.Getenv("USER_KEY")
|
||||
cfg.Secret_key = os.Getenv("SECRET_KEY")
|
||||
|
||||
log.Println("TIMESTAMP:", tstamp)
|
||||
|
||||
secret := []byte(cfg.Secret_key)
|
||||
message := []byte(cfg.Cons_id + "&" + fmt.Sprint(tstamp))
|
||||
hash := hmac.New(sha256.New, secret)
|
||||
hash.Write(message)
|
||||
// to lowercase hexits
|
||||
hex.EncodeToString(hash.Sum(nil))
|
||||
// to base64
|
||||
X_signature := base64.StdEncoding.EncodeToString(hash.Sum(nil))
|
||||
|
||||
return cfg.Cons_id, cfg.Secret_key, cfg.User_key, fmt.Sprint(tstamp), X_signature
|
||||
|
||||
}
|
||||
@@ -4,6 +4,7 @@ go 1.23.0
|
||||
|
||||
require (
|
||||
github.com/andrean360/bridging-bpjs-go v1.0.1
|
||||
github.com/daku10/go-lz-string v0.0.6
|
||||
github.com/gin-gonic/gin v1.10.0
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/mashingan/smapping v0.1.19
|
||||
|
||||
@@ -11,6 +11,8 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/
|
||||
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
||||
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
|
||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||
github.com/daku10/go-lz-string v0.0.6 h1:aO8FFp4QPuNp7+WNyh1DyNjGF3UbZu95tUv9xOZNsYQ=
|
||||
github.com/daku10/go-lz-string v0.0.6/go.mod h1:Vk++rSG3db8HXJaHEAbxiy/ukjTmPBw/iI+SrVZDzfs=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package bpjs
|
||||
|
||||
import (
|
||||
"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) {
|
||||
param := "/jadwaldokter/kodepoli/" + kdPoly + "/tanggal/" + tanggal
|
||||
url += param
|
||||
log.Println("URL", url)
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
log.Fatalf("Error creating request: %v", err)
|
||||
}
|
||||
|
||||
for key, value := range headers {
|
||||
req.Header.Set(key, value)
|
||||
}
|
||||
|
||||
log.Println("REQ", req.Header)
|
||||
client := http.Client{}
|
||||
response, err := client.Get(url)
|
||||
if err != nil {
|
||||
log.Fatalf("Error making external API request: %v", err)
|
||||
}
|
||||
log.Println("RESPONSE: ", response)
|
||||
|
||||
res, err := io.ReadAll(response.Body)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
|
||||
log.Println("res: ", res)
|
||||
|
||||
return string(res), nil
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package bpjs
|
||||
|
||||
import (
|
||||
"bridging-rssa/database"
|
||||
"bridging-rssa/models"
|
||||
"bridging-rssa/models/dokter"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
)
|
||||
|
||||
func GetAllSubspesialis(c *gin.Context) {
|
||||
var subspesialis []models.DaftarSubspesialis
|
||||
var subspesialis []dokter.DaftarSubspesialis
|
||||
result := database.SatuDataDB.Debug().Raw(`SELECT * FROM "daftar_subspesialis"`).Find(&subspesialis)
|
||||
if result.Error != nil {
|
||||
if result.Error == gorm.ErrRecordNotFound {
|
||||
@@ -0,0 +1,40 @@
|
||||
package jadwal_dokter
|
||||
|
||||
import (
|
||||
cfg "bridging-rssa/config"
|
||||
"bridging-rssa/handlers/bpjs"
|
||||
"bridging-rssa/models/config"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func GetJadwalDokter(c *gin.Context) {
|
||||
fmt.Println("MASUK SINI KAH?")
|
||||
baseUrl := os.Getenv("BASEURL_BPJS")
|
||||
endpoint := os.Getenv("ANTREAN_RS")
|
||||
url := baseUrl + endpoint
|
||||
kdPoly := c.Param("kdpoly")
|
||||
tanggal := c.Param("tanggal")
|
||||
|
||||
conf := config.ConfigBpjs{}
|
||||
|
||||
cons_id, _, User_key, tstamp, X_signature := cfg.SetHeader(conf)
|
||||
|
||||
headers := map[string]string{
|
||||
"X-cons-id": cons_id,
|
||||
"X-timestamp": tstamp,
|
||||
"X-signature": X_signature,
|
||||
"user_key": User_key,
|
||||
}
|
||||
log.Println("Headers : ", headers)
|
||||
|
||||
res, err := bpjs.BPJSGetResponse(url, cons_id, User_key, tstamp, X_signature, kdPoly, tanggal, headers)
|
||||
if err != nil {
|
||||
log.Fatalf("Error making external API request: %v", err)
|
||||
}
|
||||
c.JSON(http.StatusOK, res)
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
package Vclaim
|
||||
|
||||
import (
|
||||
"bridging-rssa/docs"
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
|
||||
"github.com/andrean360/bridging-bpjs-go/helper"
|
||||
lzstring "github.com/daku10/go-lz-string"
|
||||
)
|
||||
|
||||
func ResponseVclaim(encrypted string, key string) (string, error) {
|
||||
@@ -38,9 +39,9 @@ func ResponseVclaim(encrypted string, key string) (string, error) {
|
||||
mode.CryptBlocks(cipherText, cipherText)
|
||||
|
||||
// cipherText, _ = pkcs7.Unpad(cipherText, aes.BlockSize)
|
||||
cipherText, _ = helper.Unpad(cipherText, aes.BlockSize)
|
||||
// data, err := lzstring.DecompressFromEncodedUriComponent(string(cipherText))
|
||||
data, err := helper.DecompressFromEncodedUriComponent(string(cipherText))
|
||||
cipherText, _ = docs.Unpad(cipherText, aes.BlockSize)
|
||||
data, err := lzstring.DecompressFromEncodedURIComponent(string(cipherText))
|
||||
// data, err := helper.DecompressFromEncodedUriComponent(string(cipherText))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
@@ -52,7 +53,7 @@ func GetRequest(endpoint string, cfg interface{}) interface{} {
|
||||
fmt.Println(err)
|
||||
}
|
||||
|
||||
body, err := ioutil.ReadAll(res.Body)
|
||||
body, err := io.ReadAll(res.Body)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
@@ -1,17 +1,16 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bridging-rssa/database"
|
||||
"bridging-rssa/ginHandlers"
|
||||
"bridging-rssa/ginHandlers/bpjs"
|
||||
"bridging-rssa/config"
|
||||
ginHandlers "bridging-rssa/handlers"
|
||||
"bridging-rssa/handlers/bpjs"
|
||||
"bridging-rssa/handlers/jadwal_dokter"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
_ "bridging-rssa/docs"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/rs/cors"
|
||||
swaggerFiles "github.com/swaggo/files"
|
||||
ginSwagger "github.com/swaggo/gin-swagger"
|
||||
)
|
||||
@@ -28,7 +27,7 @@ func main() {
|
||||
log.Fatal("Error loading .env file")
|
||||
}
|
||||
|
||||
database.ConnectDB()
|
||||
config.ConnectDB()
|
||||
|
||||
r := gin.Default()
|
||||
|
||||
@@ -42,27 +41,24 @@ func main() {
|
||||
user.PUT("/update/:id", ginHandlers.UpdateUser)
|
||||
user.DELETE("/delete/:id", ginHandlers.DeleteUser)
|
||||
}
|
||||
|
||||
subspesialis := v1.Group("/subspesialis")
|
||||
{
|
||||
subspesialis.GET("/", bpjs.GetAllSubspesialis)
|
||||
}
|
||||
|
||||
jadwalDokter := v1.Group("/jadwaldokter")
|
||||
{
|
||||
jadwalDokter.GET("/kdpoly/:kdpoly/tanggal/:tanggal", jadwal_dokter.GetJadwalDokter)
|
||||
}
|
||||
|
||||
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||
r.POST("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||
r.PUT("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||
r.DELETE("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||
err = r.Run()
|
||||
log.Println("JALAN DI PORT : 8081")
|
||||
err = r.Run(":8081")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
c := cors.New(cors.Options{
|
||||
AllowedOrigins: []string{"*"},
|
||||
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"},
|
||||
AllowedHeaders: []string{"Content-Type"},
|
||||
AllowCredentials: true,
|
||||
})
|
||||
|
||||
handler := c.Handler(r)
|
||||
log.Println("Server berjalan di port 8002")
|
||||
log.Fatal(http.ListenAndServe(":8002", handler))
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package config
|
||||
|
||||
type ConfigBpjs struct {
|
||||
Cons_id string
|
||||
Secret_key string
|
||||
User_key string
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package models
|
||||
package dokter
|
||||
|
||||
type DaftarSubspesialis struct {
|
||||
ID int `json:"id"`
|
||||
@@ -0,0 +1,23 @@
|
||||
package jadwal_dokter
|
||||
|
||||
type JadwalDokter struct {
|
||||
Response struct {
|
||||
List []ListDokter `json:"list"`
|
||||
} `json:"response"`
|
||||
MetaData struct {
|
||||
} `json:"metadata"`
|
||||
}
|
||||
|
||||
type ListDokter struct {
|
||||
KodeSubspesialis string `json:"kodesubspesialis"`
|
||||
Hari int `json:"hari"`
|
||||
KapasitasPasien int `json:"kapasitaspasien"`
|
||||
Libur int `json:"libur"`
|
||||
NamaHari string `json:"namahari"`
|
||||
Jadwal string `json:"jadwal"`
|
||||
NamaSubspesialis string `json:"namasubspesialis"`
|
||||
NamaDokter string `json:"namadokter"`
|
||||
KodePoli string `json:"kodepoli"`
|
||||
NamaPoli string `json:"namapoli"`
|
||||
KodeDokter int `json:"kodedokter"`
|
||||
}
|
||||
Reference in New Issue
Block a user