From 0383963fc3930efea383ec4755866a8bb468bf8b9e8d12bf76522aaaab08a97d Mon Sep 17 00:00:00 2001 From: ahdan15 Date: Tue, 8 Jul 2025 14:23:00 +0700 Subject: [PATCH] pembaruhan handler response --- .idea/inspectionProfiles/Project_Default.xml | 12 + config/config.go | 212 +++++++++--------- .../satu_data/surat_kontrol/surat_kontrol.go | 2 +- go.mod | 5 +- go.sum | 6 - handlers/bpjs/i_care/i_care.go | 2 +- handlers/bpjs/responseHandler.go | 156 +++++++++++++ handlers/bpjs/surat_kontrol/surat_kontrol.go | 6 +- 8 files changed, 282 insertions(+), 119 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 handlers/bpjs/responseHandler.go diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..f92b643 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/config/config.go b/config/config.go index 275cc78..17d816c 100644 --- a/config/config.go +++ b/config/config.go @@ -1,106 +1,106 @@ -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(isIcare bool, cfg config.ConfigBpjs) *config.Header { - - timenow := time.Now().UTC() - time := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC) - tstamp := timenow.Unix() - time.Unix() - - cfg.Cons_id = os.Getenv("CONS_ID") - cfg.User_key = os.Getenv("USER_KEY") - cfg.Secret_key = os.Getenv("SECRET_KEY") - - if isIcare { - cfg.User_key = os.Getenv("USER_KEY_ICARE") - } - 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)) - - header := &config.Header{ - ConsID: cfg.Cons_id, - SecretKey: cfg.Secret_key, - UserKey: cfg.User_key, - TimeStamp: fmt.Sprint(tstamp), - XSignature: X_signature, - } - - return header - -} - -func SetHeaderDev(cfg config.ConfigBpjs) *config.Header { - - timenow := time.Now().UTC() - time := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC) - tstamp := timenow.Unix() - time.Unix() - - cfg.Cons_id = os.Getenv("CONS_ID_DEV") - cfg.User_key = os.Getenv("USER_KEY_DEV") - cfg.Secret_key = os.Getenv("SECRET_KEY_DEV") - - // cfg.Cons_id = os.Getenv("CONS_ID") - // cfg.User_key = os.Getenv("USER_KEY") - // cfg.Secret_key = os.Getenv("SECRET_KEY") - - 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)) - - header := &config.Header{ - ConsID: cfg.Cons_id, - SecretKey: cfg.Secret_key, - UserKey: cfg.User_key, - TimeStamp: fmt.Sprint(tstamp), - XSignature: X_signature, - } - - return header - -} +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(isIcare bool, cfg config.ConfigBpjs) *config.Header { + + timenow := time.Now().UTC() + time := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC) + tstamp := timenow.Unix() - time.Unix() + + cfg.Cons_id = os.Getenv("CONS_ID") + cfg.User_key = os.Getenv("USER_KEY") + cfg.Secret_key = os.Getenv("SECRET_KEY") + + if isIcare { + cfg.User_key = os.Getenv("USER_KEY_ICARE") + } + 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)) + + header := &config.Header{ + ConsID: cfg.Cons_id, + SecretKey: cfg.Secret_key, + UserKey: cfg.User_key, + TimeStamp: fmt.Sprint(tstamp), + XSignature: X_signature, + } + + return header + +} + +func SetHeaderDev(b bool, cfg config.ConfigBpjs) *config.Header { + + timenow := time.Now().UTC() + time := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC) + tstamp := timenow.Unix() - time.Unix() + + cfg.Cons_id = os.Getenv("CONS_ID_DEV") + cfg.User_key = os.Getenv("USER_KEY_DEV") + cfg.Secret_key = os.Getenv("SECRET_KEY_DEV") + + // cfg.Cons_id = os.Getenv("CONS_ID") + // cfg.User_key = os.Getenv("USER_KEY") + // cfg.Secret_key = os.Getenv("SECRET_KEY") + + 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)) + + header := &config.Header{ + ConsID: cfg.Cons_id, + SecretKey: cfg.Secret_key, + UserKey: cfg.User_key, + TimeStamp: fmt.Sprint(tstamp), + XSignature: X_signature, + } + + return header + +} diff --git a/database/satu_data/surat_kontrol/surat_kontrol.go b/database/satu_data/surat_kontrol/surat_kontrol.go index 36486d5..27ed6f7 100644 --- a/database/satu_data/surat_kontrol/surat_kontrol.go +++ b/database/satu_data/surat_kontrol/surat_kontrol.go @@ -469,7 +469,7 @@ func Getdatahistori(norm string, offset, limit string) ([]*suratkontrol.HistoriS left join data_ktp dk on dp."KTP" = dk. "id" left join daftar_subspesialis ds on dp."Subspesialis" = ds."id" left join daftar_spesialis ds2 on ds."FK_daftar_spesialis_ID" = ds2."id" - where dkp2."NOMR" = ? order by dsk."Tanggal_rencana_kontrol" desc offset ? limit ?`, norm, offset, limit).Scan(&dataHistoriSurKon).Error + where dkp2."NOMR" = ? order by dsk."Status_surat_kontrol" != '1',dsk."Tanggal_rencana_kontrol" desc offset ? limit ?`, norm, offset, limit).Scan(&dataHistoriSurKon).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { errMsg := errors.New("data tidak ada") diff --git a/go.mod b/go.mod index c78cb6c..f4ffb41 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,11 @@ module bridging-rssa 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-contrib/cors v1.7.2 github.com/gin-gonic/gin v1.10.0 github.com/joho/godotenv v1.5.1 github.com/mashingan/smapping v0.1.19 - github.com/rs/cors v1.11.1 github.com/swaggo/files v1.0.1 github.com/swaggo/gin-swagger v1.6.0 github.com/swaggo/swag v1.16.3 @@ -23,7 +22,6 @@ require ( github.com/cloudwego/iasm v0.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/gabriel-vasile/mimetype v1.4.5 // indirect - github.com/gin-contrib/cors v1.7.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect @@ -43,7 +41,6 @@ require ( github.com/leodido/go-urn v1.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect diff --git a/go.sum b/go.sum index 2a98a09..b8002ba 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/andrean360/bridging-bpjs-go v1.0.1 h1:06eJ23vcI2tNyPryr8p3jxJ+Vy4P4/nneNPWuUrgnLg= -github.com/andrean360/bridging-bpjs-go v1.0.1/go.mod h1:sRBG5zI4Ky/UMCI7u/QuMTlrzREV2UQn043lhrejfFE= github.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg= github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= @@ -84,8 +82,6 @@ github.com/mashingan/smapping v0.1.19 h1:SsEtuPn2UcM1croIupPtGLgWgpYRuS0rSQMvKD9 github.com/mashingan/smapping v0.1.19/go.mod h1:FjfiwFxGOuNxL/OT1WcrNAwTPx0YJeg5JiXwBB1nyig= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -100,8 +96,6 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= -github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/handlers/bpjs/i_care/i_care.go b/handlers/bpjs/i_care/i_care.go index edb6e29..cd78005 100644 --- a/handlers/bpjs/i_care/i_care.go +++ b/handlers/bpjs/i_care/i_care.go @@ -239,7 +239,7 @@ func GetFKTP(c *gin.Context) { conf := config.ConfigBpjs{} - header := cfg.SetHeaderDev(conf) + header := cfg.SetHeaderDev(false, conf) headers := map[string]string{ "X-cons-id": header.ConsID, diff --git a/handlers/bpjs/responseHandler.go b/handlers/bpjs/responseHandler.go new file mode 100644 index 0000000..5743147 --- /dev/null +++ b/handlers/bpjs/responseHandler.go @@ -0,0 +1,156 @@ +package bpjs + +import ( + sk "bridging-rssa/models/bpjs/surat_kontrol" + + "github.com/gin-gonic/gin" + "net/http" + "strconv" +) + +func HandleResponse(c *gin.Context, res *sk.Response) { + code, err := strconv.Atoi(res.MetaData.Code) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Invalid status code"}) + return + } + + // Map status codes ke HTTP status constants + switch code { + // 1xx Informational + case 100: + c.JSON(http.StatusContinue, res.MetaData) + case 101: + c.JSON(http.StatusSwitchingProtocols, res.MetaData) + case 102: + c.JSON(http.StatusProcessing, res.MetaData) + case 103: + c.JSON(http.StatusEarlyHints, res.MetaData) + + // 2xx Success + case 201: + c.JSON(http.StatusCreated, res.MetaData) + case 202: + c.JSON(http.StatusAccepted, res.MetaData) + case 203: + c.JSON(http.StatusNonAuthoritativeInfo, res.MetaData) + case 204: + c.JSON(http.StatusNoContent, res.MetaData) + case 205: + c.JSON(http.StatusResetContent, res.MetaData) + case 206: + c.JSON(http.StatusPartialContent, res.MetaData) + case 207: + c.JSON(http.StatusMultiStatus, res.MetaData) + case 208: + c.JSON(http.StatusAlreadyReported, res.MetaData) + case 226: + c.JSON(http.StatusIMUsed, res.MetaData) + + // 3xx Redirection + case 300: + c.JSON(http.StatusMultipleChoices, res.MetaData) + case 301: + c.JSON(http.StatusMovedPermanently, res.MetaData) + case 302: + c.JSON(http.StatusFound, res.MetaData) + case 303: + c.JSON(http.StatusSeeOther, res.MetaData) + case 304: + c.JSON(http.StatusNotModified, res.MetaData) + case 305: + c.JSON(http.StatusUseProxy, res.MetaData) + case 307: + c.JSON(http.StatusTemporaryRedirect, res.MetaData) + case 308: + c.JSON(http.StatusPermanentRedirect, res.MetaData) + + // 4xx Client Error + case 400: + c.JSON(http.StatusBadRequest, res.MetaData) + case 401: + c.JSON(http.StatusUnauthorized, res.MetaData) + case 402: + c.JSON(http.StatusPaymentRequired, res.MetaData) + case 403: + c.JSON(http.StatusForbidden, res.MetaData) + case 404: + c.JSON(http.StatusNotFound, res.MetaData) + case 405: + c.JSON(http.StatusMethodNotAllowed, res.MetaData) + case 406: + c.JSON(http.StatusNotAcceptable, res.MetaData) + case 407: + c.JSON(http.StatusProxyAuthRequired, res.MetaData) + case 408: + c.JSON(http.StatusRequestTimeout, res.MetaData) + case 409: + c.JSON(http.StatusConflict, res.MetaData) + case 410: + c.JSON(http.StatusGone, res.MetaData) + case 411: + c.JSON(http.StatusLengthRequired, res.MetaData) + case 412: + c.JSON(http.StatusPreconditionFailed, res.MetaData) + case 413: + c.JSON(http.StatusRequestEntityTooLarge, res.MetaData) + case 414: + c.JSON(http.StatusRequestURITooLong, res.MetaData) + case 415: + c.JSON(http.StatusUnsupportedMediaType, res.MetaData) + case 416: + c.JSON(http.StatusRequestedRangeNotSatisfiable, res.MetaData) + case 417: + c.JSON(http.StatusExpectationFailed, res.MetaData) + case 418: + c.JSON(http.StatusTeapot, res.MetaData) + case 421: + c.JSON(http.StatusMisdirectedRequest, res.MetaData) + case 422: + c.JSON(http.StatusUnprocessableEntity, res.MetaData) + case 423: + c.JSON(http.StatusLocked, res.MetaData) + case 424: + c.JSON(http.StatusFailedDependency, res.MetaData) + case 425: + c.JSON(http.StatusTooEarly, res.MetaData) + case 426: + c.JSON(http.StatusUpgradeRequired, res.MetaData) + case 428: + c.JSON(http.StatusPreconditionRequired, res.MetaData) + case 429: + c.JSON(http.StatusTooManyRequests, res.MetaData) + case 431: + c.JSON(http.StatusRequestHeaderFieldsTooLarge, res.MetaData) + case 451: + c.JSON(http.StatusUnavailableForLegalReasons, res.MetaData) + + // 5xx Server Error + case 500: + c.JSON(http.StatusInternalServerError, res.MetaData) + case 501: + c.JSON(http.StatusNotImplemented, res.MetaData) + case 502: + c.JSON(http.StatusBadGateway, res.MetaData) + case 503: + c.JSON(http.StatusServiceUnavailable, res.MetaData) + case 504: + c.JSON(http.StatusGatewayTimeout, res.MetaData) + case 505: + c.JSON(http.StatusHTTPVersionNotSupported, res.MetaData) + case 506: + c.JSON(http.StatusVariantAlsoNegotiates, res.MetaData) + case 507: + c.JSON(http.StatusInsufficientStorage, res.MetaData) + case 508: + c.JSON(http.StatusLoopDetected, res.MetaData) + case 510: + c.JSON(http.StatusNotExtended, res.MetaData) + case 511: + c.JSON(http.StatusNetworkAuthenticationRequired, res.MetaData) + + // Default case untuk status code yang tidak dikenali + default: + c.JSON(http.StatusInternalServerError, gin.H{"error": "Unknown status code"}) + } +} diff --git a/handlers/bpjs/surat_kontrol/surat_kontrol.go b/handlers/bpjs/surat_kontrol/surat_kontrol.go index 983dfa9..71eb7b3 100644 --- a/handlers/bpjs/surat_kontrol/surat_kontrol.go +++ b/handlers/bpjs/surat_kontrol/surat_kontrol.go @@ -7,6 +7,7 @@ import ( lokasiruang "bridging-rssa/database/satu_data/lokasi_ruang" suratkontrol "bridging-rssa/database/satu_data/surat_kontrol" "bridging-rssa/docs/utils" + "bridging-rssa/handlers/bpjs" sk "bridging-rssa/models/bpjs/surat_kontrol" "bridging-rssa/models/config" logapi "bridging-rssa/models/log_api" @@ -744,6 +745,7 @@ func UpdateSuratKontrolnew(c *gin.Context) { c.JSON(http.StatusGatewayTimeout, res.MetaData) return } + reqInsertLog := &logapi.DataLogAPI{ ID: uuid, DateCreated: logTimeEnd, @@ -771,7 +773,9 @@ func UpdateSuratKontrolnew(c *gin.Context) { return } log.Println(err) - c.JSON(http.StatusInternalServerError, res.MetaData) + + bpjs.HandleResponse(c, res) + return } responJson, err := json.Marshal(res)