perubahan

This commit is contained in:
meninjar
2025-10-24 12:33:10 +00:00
parent f1c2628ca8
commit 416d553a69
18 changed files with 2799 additions and 2707 deletions

View File

@@ -23,6 +23,7 @@ type Config struct {
Bpjs BpjsConfig
SatuSehat SatuSehatConfig
Swagger SwaggerConfig
WebSocket WebSocketConfig // Tambahkan ini
Validator *validator.Validate
}
@@ -90,6 +91,38 @@ type SatuSehatConfig struct {
Timeout time.Duration `json:"timeout"`
}
type WebSocketConfig struct {
// Timeout configurations
ReadTimeout time.Duration `json:"read_timeout"`
WriteTimeout time.Duration `json:"write_timeout"`
PingInterval time.Duration `json:"ping_interval"`
PongTimeout time.Duration `json:"pong_timeout"`
HandshakeTimeout time.Duration `json:"handshake_timeout"`
// Buffer sizes
ReadBufferSize int `json:"read_buffer_size"`
WriteBufferSize int `json:"write_buffer_size"`
ChannelBufferSize int `json:"channel_buffer_size"`
MessageQueueSize int `json:"message_queue_size"`
// Connection limits
MaxMessageSize int `json:"max_message_size"`
QueueWorkers int `json:"queue_workers"`
// Monitoring
ActivityLogSize int `json:"activity_log_size"`
CleanupInterval time.Duration `json:"cleanup_interval"`
InactiveTimeout time.Duration `json:"inactive_timeout"`
// Server info
ServerID string `json:"server_id"`
// Features
EnableCompression bool `json:"enable_compression"`
EnableMetrics bool `json:"enable_metrics"`
EnableMonitoring bool `json:"enable_monitoring"`
}
// SetHeader generates required headers for BPJS VClaim API
// func (cfg BpjsConfig) SetHeader() (string, string, string, string, string) {
// timenow := time.Now().UTC()
@@ -150,18 +183,23 @@ func (cfg ConfigBpjs) SetHeader() (string, string, string, string, string) {
func LoadConfig() *Config {
config := &Config{
// Configuration for the server
Server: ServerConfig{
Port: getEnvAsInt("PORT", 8080),
Mode: getEnv("GIN_MODE", "debug"),
},
Databases: make(map[string]DatabaseConfig),
// Configuration for the database
Databases: make(map[string]DatabaseConfig),
// Configuration for read replicas
ReadReplicas: make(map[string][]DatabaseConfig),
// Configuration for Keycloak authentication and authorization
Keycloak: KeycloakConfig{
Issuer: getEnv("KEYCLOAK_ISSUER", "https://keycloak.example.com/auth/realms/yourrealm"),
Audience: getEnv("KEYCLOAK_AUDIENCE", "your-client-id"),
JwksURL: getEnv("KEYCLOAK_JWKS_URL", "https://keycloak.example.com/auth/realms/yourrealm/protocol/openid-connect/certs"),
Enabled: getEnvAsBool("KEYCLOAK_ENABLED", true),
},
// Configuration for BPJS service bridging API
Bpjs: BpjsConfig{
BaseURL: getEnv("BPJS_BASEURL", "https://apijkn.bpjs-kesehatan.go.id"),
ConsID: getEnv("BPJS_CONSID", ""),
@@ -169,6 +207,7 @@ func LoadConfig() *Config {
SecretKey: getEnv("BPJS_SECRETKEY", ""),
Timeout: parseDuration(getEnv("BPJS_TIMEOUT", "30s")),
},
// Configuration for Satu Sehat service bridging API
SatuSehat: SatuSehatConfig{
OrgID: getEnv("BRIDGING_SATUSEHAT_ORG_ID", ""),
FasyakesID: getEnv("BRIDGING_SATUSEHAT_FASYAKES_ID", ""),
@@ -180,6 +219,39 @@ func LoadConfig() *Config {
KFAURL: getEnv("BRIDGING_SATUSEHAT_KFA_URL", "https://api-satusehat.kemkes.go.id/kfa-v2"),
Timeout: parseDuration(getEnv("BRIDGING_SATUSEHAT_TIMEOUT", "30s")),
},
// Configuration for WebSocket server
WebSocket: WebSocketConfig{ // Tambahkan ini
// Timeout configurations
ReadTimeout: parseDuration(getEnv("WS_READ_TIMEOUT", "300s")),
WriteTimeout: parseDuration(getEnv("WS_WRITE_TIMEOUT", "30s")),
PingInterval: parseDuration(getEnv("WS_PING_INTERVAL", "60s")),
PongTimeout: parseDuration(getEnv("WS_PONG_TIMEOUT", "70s")),
HandshakeTimeout: parseDuration(getEnv("WS_HANDSHAKE_TIMEOUT", "45s")),
// Buffer sizes
ReadBufferSize: getEnvAsInt("WS_READ_BUFFER_SIZE", 8192),
WriteBufferSize: getEnvAsInt("WS_WRITE_BUFFER_SIZE", 8192),
ChannelBufferSize: getEnvAsInt("WS_CHANNEL_BUFFER_SIZE", 512),
MessageQueueSize: getEnvAsInt("WS_MESSAGE_QUEUE_SIZE", 5000),
// Connection limits
MaxMessageSize: getEnvAsInt("WS_MAX_MESSAGE_SIZE", 8192),
QueueWorkers: getEnvAsInt("WS_QUEUE_WORKERS", 10),
// Monitoring
ActivityLogSize: getEnvAsInt("WS_ACTIVITY_LOG_SIZE", 1000),
CleanupInterval: parseDuration(getEnv("WS_CLEANUP_INTERVAL", "2m")),
InactiveTimeout: parseDuration(getEnv("WS_INACTIVE_TIMEOUT", "5m")),
// Server info
ServerID: getEnv("WS_SERVER_ID", "api-service-v1"),
// Features
EnableCompression: getEnvAsBool("WS_ENABLE_COMPRESSION", true),
EnableMetrics: getEnvAsBool("WS_ENABLE_METRICS", true),
EnableMonitoring: getEnvAsBool("WS_ENABLE_MONITORING", true),
},
// Configuration for Swagger
Swagger: SwaggerConfig{
Title: getEnv("SWAGGER_TITLE", "SERVICE API"),
Description: getEnv("SWAGGER_DESCRIPTION", "CUSTUM SERVICE API"),
@@ -735,5 +807,193 @@ func (c *Config) Validate() error {
log.Fatal("SatuSehat Base URL is required")
}
// Validate WebSocket configuration
if c.WebSocket.ReadTimeout <= 0 {
log.Fatal("WebSocket Read Timeout must be greater than 0")
}
if c.WebSocket.WriteTimeout <= 0 {
log.Fatal("WebSocket Write Timeout must be greater than 0")
}
if c.WebSocket.PingInterval <= 0 {
log.Fatal("WebSocket Ping Interval must be greater than 0")
}
if c.WebSocket.PongTimeout <= 0 {
log.Fatal("WebSocket Pong Timeout must be greater than 0")
}
if c.WebSocket.ReadBufferSize <= 0 {
log.Fatal("WebSocket Read Buffer Size must be greater than 0")
}
if c.WebSocket.WriteBufferSize <= 0 {
log.Fatal("WebSocket Write Buffer Size must be greater than 0")
}
if c.WebSocket.ChannelBufferSize <= 0 {
log.Fatal("WebSocket Channel Buffer Size must be greater than 0")
}
if c.WebSocket.MessageQueueSize <= 0 {
log.Fatal("WebSocket Message Queue Size must be greater than 0")
}
if c.WebSocket.MaxMessageSize <= 0 {
log.Fatal("WebSocket Max Message Size must be greater than 0")
}
if c.WebSocket.QueueWorkers <= 0 {
log.Fatal("WebSocket Queue Workers must be greater than 0")
}
if c.WebSocket.ActivityLogSize <= 0 {
log.Fatal("WebSocket Activity Log Size must be greater than 0")
}
if c.WebSocket.CleanupInterval <= 0 {
log.Fatal("WebSocket Cleanup Interval must be greater than 0")
}
if c.WebSocket.InactiveTimeout <= 0 {
log.Fatal("WebSocket Inactive Timeout must be greater than 0")
}
if c.WebSocket.ServerID == "" {
log.Fatal("WebSocket Server ID is required")
}
return nil
}
//** WebSocket **//
// DefaultWebSocketConfig mengembalikan konfigurasi default untuk WebSocket
func DefaultWebSocketConfig() WebSocketConfig {
return WebSocketConfig{
// Timeout configurations
ReadTimeout: 300 * time.Second,
WriteTimeout: 30 * time.Second,
PingInterval: 60 * time.Second,
PongTimeout: 70 * time.Second,
HandshakeTimeout: 45 * time.Second,
// Buffer sizes
ReadBufferSize: 8192,
WriteBufferSize: 8192,
ChannelBufferSize: 512,
MessageQueueSize: 5000,
// Connection limits
MaxMessageSize: 8192,
QueueWorkers: 10,
// Monitoring
ActivityLogSize: 1000,
CleanupInterval: 2 * time.Minute,
InactiveTimeout: 5 * time.Minute,
// Server info
ServerID: "api-service-v1",
// Features
EnableCompression: true,
EnableMetrics: true,
EnableMonitoring: true,
}
}
// HighPerformanceWebSocketConfig mengembalikan konfigurasi untuk performa tinggi
func HighPerformanceWebSocketConfig() WebSocketConfig {
return WebSocketConfig{
// Timeout configurations
ReadTimeout: 300 * time.Second,
WriteTimeout: 30 * time.Second,
PingInterval: 30 * time.Second,
PongTimeout: 40 * time.Second,
HandshakeTimeout: 30 * time.Second,
// Buffer sizes
ReadBufferSize: 16384,
WriteBufferSize: 16384,
ChannelBufferSize: 1024,
MessageQueueSize: 10000,
// Connection limits
MaxMessageSize: 16384,
QueueWorkers: 20,
// Monitoring
ActivityLogSize: 2000,
CleanupInterval: 1 * time.Minute,
InactiveTimeout: 3 * time.Minute,
// Server info
ServerID: "api-service-hp",
// Features
EnableCompression: true,
EnableMetrics: true,
EnableMonitoring: true,
}
}
// LowResourceWebSocketConfig mengembalikan konfigurasi untuk sumber daya terbatas
func LowResourceWebSocketConfig() WebSocketConfig {
return WebSocketConfig{
// Timeout configurations
ReadTimeout: 300 * time.Second,
WriteTimeout: 30 * time.Second,
PingInterval: 120 * time.Second,
PongTimeout: 130 * time.Second,
HandshakeTimeout: 60 * time.Second,
// Buffer sizes
ReadBufferSize: 4096,
WriteBufferSize: 4096,
ChannelBufferSize: 256,
MessageQueueSize: 2500,
// Connection limits
MaxMessageSize: 4096,
QueueWorkers: 5,
// Monitoring
ActivityLogSize: 500,
CleanupInterval: 5 * time.Minute,
InactiveTimeout: 10 * time.Minute,
// Server info
ServerID: "api-service-lr",
// Features
EnableCompression: false,
EnableMetrics: false,
EnableMonitoring: true,
}
}
// CustomWebSocketConfig memungkinkan kustomisasi konfigurasi
func CustomWebSocketConfig(
readTimeout, writeTimeout, pingInterval, pongTimeout time.Duration,
readBufferSize, writeBufferSize, channelBufferSize, messageQueueSize int,
maxMessageSize, queueWorkers int,
activityLogSize int,
cleanupInterval, inactiveTimeout time.Duration,
serverID string,
enableCompression, enableMetrics, enableMonitoring bool,
) WebSocketConfig {
return WebSocketConfig{
ReadTimeout: readTimeout,
WriteTimeout: writeTimeout,
PingInterval: pingInterval,
PongTimeout: pongTimeout,
HandshakeTimeout: 45 * time.Second,
ReadBufferSize: readBufferSize,
WriteBufferSize: writeBufferSize,
ChannelBufferSize: channelBufferSize,
MessageQueueSize: messageQueueSize,
MaxMessageSize: maxMessageSize,
QueueWorkers: queueWorkers,
ActivityLogSize: activityLogSize,
CleanupInterval: cleanupInterval,
InactiveTimeout: inactiveTimeout,
ServerID: serverID,
EnableCompression: enableCompression,
EnableMetrics: enableMetrics,
EnableMonitoring: enableMonitoring,
}
}