Files
satusehat-service/internal/interfaces/bpjs/factory.go
T
2026-04-14 01:23:34 +00:00

109 lines
3.6 KiB
Go

package bpjs
import (
"service/internal/infrastructure/config"
"strings"
)
const (
// Konstanta Base Service Name (Lingkungan Production)
ServiceNameAntreanRS = "antreanrs"
ServiceNameAntreanFKTP = "antreanfktp"
ServiceNameApotek = "apotek-rest"
ServiceNamePCare = "pcare-rest"
ServiceNameICare = "ihs"
ServiceNameERekamMedis = "erekammedis"
ServiceNameAplicare = "aplicaresws"
ServiceNameVClaim = "vclaim-rest"
)
// Factory menyediakan akses tersentralisasi ke berbagai layanan HTTP Client BPJS yang Fleksibel.
type Factory struct {
baseConfig config.BpjsConfig
}
// NewBPJSFactory membuat instance factory baru dengan konfigurasi utama.
func NewBPJSFactory(cfg config.BpjsConfig) *Factory {
return &Factory{
baseConfig: cfg,
}
}
func (f *Factory) resolveServiceName(baseName string) string {
name := baseName
// Auto-detect environment berdasarkan BaseURL (jika URL mengandung kata 'dev')
if strings.Contains(f.baseConfig.BaseURL, "dev") {
if baseName == ServiceNameVClaim || baseName == ServiceNameApotek || baseName == ServiceNamePCare {
name = baseName + "-dev"
} else if baseName == ServiceNameAplicare {
name = baseName // Pengecualian: Aplicares sama sekali tidak menggunakan akhiran -dev atau _dev
} else {
name = baseName + "_dev" // AntreanRS, dll menggunakan underscore
}
}
return name
}
func (f *Factory) createClient(serviceName string, customConsID string, customSecretKey string, customUserKey string) BpjsClient {
svcConfig := f.baseConfig
// Timpa kredensial Default dengan kredensial spesifik layanan (Khusus Apotek)
if customConsID != "" {
svcConfig.ConsID = customConsID
}
if customSecretKey != "" {
svcConfig.SecretKey = customSecretKey
}
// Timpa Active UserKey
svcConfig.UserKey = customUserKey
// [HOTFIX] Penyesuaian Base URL khusus untuk Aplicares
// Karena Aplicares BPJS (Ketersediaan Tempat Tidur) BELUM dimigrasikan ke API Gateway Kong (apijkn).
// Aplicares masih menggunakan server lamanya yaitu dvlp (Dev) dan new-api (Prod).
if serviceName == ServiceNameAplicare {
if strings.Contains(svcConfig.BaseURL, "apijkn-dev") {
svcConfig.BaseURL = "https://dvlp.bpjs-kesehatan.go.id:8888"
} else if strings.Contains(svcConfig.BaseURL, "apijkn.bpjs-kesehatan.go.id") {
svcConfig.BaseURL = "https://new-api.bpjs-kesehatan.go.id"
}
}
svcConfig.ServiceName = f.resolveServiceName(serviceName)
return NewBpjsClient(svcConfig)
}
// --- Kumpulan Instance Client untuk Masing-masing Layanan BPJS ---
func (f *Factory) VClaim() BpjsClient {
// Gunakan "" agar otomatis memakai kredensial Default (VClaim)
return f.createClient(ServiceNameVClaim, "", "", f.baseConfig.VclaimUserKey)
}
func (f *Factory) AntreanRS() BpjsClient {
return f.createClient(ServiceNameAntreanRS, "", "", f.baseConfig.AntrolUserKey)
}
func (f *Factory) AntreanFKTP() BpjsClient {
return f.createClient(ServiceNameAntreanFKTP, "", "", f.baseConfig.AntrolUserKey)
}
func (f *Factory) Aplicare() BpjsClient {
return f.createClient(ServiceNameAplicare, "", "", f.baseConfig.AplicareUserKey)
}
func (f *Factory) Apotek() BpjsClient {
// Apotek menggunakan ConsID dan SecretKey nya sendiri!
return f.createClient(ServiceNameApotek, f.baseConfig.ApotekConsID, f.baseConfig.ApotekSecretKey, f.baseConfig.ApotekUserKey)
}
func (f *Factory) PCare() BpjsClient {
return f.createClient(ServiceNamePCare, "", "", "")
}
func (f *Factory) ICare() BpjsClient {
return f.createClient(ServiceNameICare, "", "", f.baseConfig.IhsUserKey)
}
func (f *Factory) ERekamMedis() BpjsClient {
return f.createClient(ServiceNameERekamMedis, "", "", f.baseConfig.IhsUserKey)
}