Perbaikan Service Satu sehat

This commit is contained in:
meninjar
2026-04-14 05:01:09 +00:00
parent 4e59b96c99
commit 0adf9ef073
38 changed files with 7 additions and 2438 deletions
+2 -58
View File
@@ -10,18 +10,10 @@ import (
"syscall"
"service/internal/auth"
antrol "service/internal/bpjs/antrol/reference"
aplicareBed "service/internal/bpjs/aplicare/bed"
apotekDpho "service/internal/bpjs/apotek/reference/dpho"
apotekPoli "service/internal/bpjs/apotek/reference/poli"
"service/internal/bpjs/vclaim/peserta"
"service/internal/bpjs/vclaim/sep"
"service/internal/infrastructure/cache"
"service/internal/infrastructure/config"
"service/internal/infrastructure/database"
grpcHandlers "service/internal/infrastructure/transport/grpc/handlers"
httpServer "service/internal/infrastructure/transport/http/servers"
bpjsFactory "service/internal/interfaces/bpjs"
"service/internal/interfaces/minio"
satuSehatFactory "service/internal/interfaces/satusehat"
@@ -170,40 +162,6 @@ func main() {
// roleComponentQueryRepo := roleComponent.NewQueryRepository(dbService, "postgres")
// roleComponentService := roleComponent.NewService(roleComponentCmdRepo, roleComponentQueryRepo)
// --- [NEW] Inisialisasi Modul CQRS Baru (Memanfaatkan DB Service) ---
// Contoh ketika mengimplementasikan entity "Province" atau "Person":
// provinceCmdRepo := province.NewCommandRepository(dbService, "default")
// provinceQueryRepo := province.NewQueryRepository(dbService, "default")
// provinceSvc := province.NewService(provinceCmdRepo, provinceQueryRepo)
// --- [NEW] Inisialisasi Factory BPJS ---
bpjsServices := bpjsFactory.NewBPJSFactory(cfg.Bpjs)
// 1. Modul VClaim (Lama)
vclaimServiceEngine := bpjsServices.VClaim()
sepRepo := sep.NewRepository(vclaimServiceEngine)
sepService := sep.NewService(sepRepo)
pesertaRepo := peserta.NewRepository(vclaimServiceEngine)
pesertaService := peserta.NewService(pesertaRepo)
// 2. Modul Antrean RS (Baru)
antreanClient := bpjsServices.AntreanRS()
antrolRepo := antrol.NewRepository(antreanClient)
antrolService := antrol.NewService(antrolRepo)
// 3. Modul Aplicares (Bed Ketersediaan Tempat Tidur)
aplicareClient := bpjsServices.Aplicare()
bedRepo := aplicareBed.NewRepository(aplicareClient)
bedService := aplicareBed.NewService(bedRepo)
// 4. Modul Apotek (Referensi DPHO dan Poli)
apotekClient := bpjsServices.Apotek()
dphoRepo := apotekDpho.NewRepository(apotekClient)
dphoService := apotekDpho.NewService(dphoRepo)
poliApotekRepo := apotekPoli.NewRepository(apotekClient)
poliApotekService := apotekPoli.NewService(poliApotekRepo)
// --- [NEW] Inisialisasi Modul Satu Sehat ---
satusehatFact := satuSehatFactory.NewSatuSehatFactory(cfg.SatuSehat)
satusehatClient := satusehatFact.Client()
@@ -273,20 +231,6 @@ func main() {
RolePermission: rolePermissionService,
RoleMaster: roleMasterService,
},
VClaim: &httpServer.VClaimServices{
Sep: sepService,
Peserta: pesertaService,
},
Antrol: &httpServer.AntrolServices{
Reference: antrolService,
},
Aplicare: &httpServer.AplicaresServices{
Bed: bedService,
},
Apotek: &httpServer.ApotekServices{
DPHO: dphoService,
Poli: poliApotekService,
},
SatuSehat: &httpServer.SatuSehatServices{
Auth: satuSehatAuthSvc,
Patient: satuSehatPatientSvc,
@@ -334,10 +278,10 @@ func main() {
serverCount++
// 1. Buat gRPC handlers
permissionHandler := grpcHandlers.NewPermissionHandler(rolePermissionService)
// permissionHandler := grpcHandlers.NewPermissionHandler(rolePermissionService)
// 2. Buat dan isi gRPC service registry
grpcRegistry := &grpcServers.ServiceRegistry{
PermissionHandler: permissionHandler,
// PermissionHandler: permissionHandler,
}
// 3. Buat gRPC server dengan registry yang sudah diisi
-141
View File
@@ -1,141 +0,0 @@
package main
import (
"context"
"net/http"
"os"
"os/signal"
"syscall"
"service/internal/infrastructure/cache"
"service/internal/infrastructure/config"
"service/internal/infrastructure/database"
httpServer "service/internal/infrastructure/transport/http/servers"
satuSehatFactory "service/internal/interfaces/satusehat"
"service/pkg/logger"
satuSehatAuth "service/internal/satusehat/reference/auth"
satuSehatKfa "service/internal/satusehat/reference/kfa"
satuSehatLocation "service/internal/satusehat/reference/location"
satuSehatOrganization "service/internal/satusehat/reference/organization"
satuSehatPatient "service/internal/satusehat/reference/patient"
satuSehatPractitioner "service/internal/satusehat/reference/practitioner"
satuSehatCondition "service/internal/satusehat/usecase/condition"
satuSehatEncounter "service/internal/satusehat/usecase/encounter"
satuSehatProcedure "service/internal/satusehat/usecase/procedure"
_ "service/docs/swagger" // Import swagger docs
"golang.org/x/sync/errgroup"
)
func main() {
// 1. Load Config
cfg := config.LoadConfig()
// 2. Init Logger khusus untuk service Satu Sehat
loggerConfig := logger.Config{
Level: cfg.Logger.Level,
Format: cfg.Logger.Format,
Output: "both",
ServiceName: "service-satusehat", // Penanda log
EnableCaller: cfg.Server.Mode != "production",
Environment: cfg.Server.Mode,
}
logger.Init(loggerConfig)
logger.Default().Info("SatuSehat Microservice starting...",
logger.String("environment", cfg.Server.Mode),
logger.String("log_level", cfg.Logger.Level),
)
if err := cfg.Validate(); err != nil {
logger.Default().Fatal("Config validation failed", logger.ErrorField(err))
}
// 3. Init Database Manager
dbService := database.New(cfg)
defer dbService.Close()
gormDB, err := dbService.GetGormDB("default")
if err != nil {
logger.Default().Fatal("Failed to get primary database", logger.ErrorField(err))
}
// 4. Init Cache
cacheFactory := cache.NewFactory(cfg.Cache)
cacheManager, err := cacheFactory.CreateManager()
if err != nil {
logger.Default().Fatal("Failed to initialize cache manager", logger.ErrorField(err))
}
defer cacheManager.Close()
// 5. Init Layers (Hanya Modul Satu Sehat)
satusehatFact := satuSehatFactory.NewSatuSehatFactory(cfg.SatuSehat)
satusehatClient := satusehatFact.Client()
// - Reference Services
satuSehatAuthSvc := satuSehatAuth.NewService(satusehatClient, cacheManager)
satuSehatPatientSvc := satuSehatPatient.NewService(satuSehatPatient.NewRepository(satusehatClient))
satuSehatPractitionerSvc := satuSehatPractitioner.NewService(satuSehatPractitioner.NewRepository(satusehatClient))
satuSehatOrganizationSvc := satuSehatOrganization.NewService(satuSehatOrganization.NewRepository(satusehatClient))
satuSehatLocationSvc := satuSehatLocation.NewService(satuSehatLocation.NewRepository(satusehatClient))
satuSehatKfaSvc := satuSehatKfa.NewService(satuSehatKfa.NewRepository(satusehatClient))
// - Usecase Services
satuSehatEncounterSvc := satuSehatEncounter.NewService(satuSehatEncounter.NewRepository(satusehatClient, dbService))
satuSehatProcedureSvc := satuSehatProcedure.NewService(satuSehatProcedure.NewRepository(satusehatClient))
satuSehatConditionSvc := satuSehatCondition.NewService(satuSehatCondition.NewRepository(satusehatClient))
// 6. Server Orchestration
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
g, ctx := errgroup.WithContext(ctx)
// --- Start REST Server (Hanya me-load endpoint Satu Sehat & Health) ---
if cfg.Server.REST.Enabled {
registry := &httpServer.ServiceRegistry{
Config: cfg,
DBManager: dbService,
PrimaryDB: gormDB,
CacheManager: cacheManager,
SatuSehat: &httpServer.SatuSehatServices{
Auth: satuSehatAuthSvc,
Patient: satuSehatPatientSvc,
Practitioner: satuSehatPractitionerSvc,
Organization: satuSehatOrganizationSvc,
Location: satuSehatLocationSvc,
KFA: satuSehatKfaSvc,
Encounter: satuSehatEncounterSvc,
Procedure: satuSehatProcedureSvc,
Condition: satuSehatConditionSvc,
},
}
restSrv := httpServer.NewHTTPServer(&cfg.Server.REST, registry)
g.Go(func() error {
logger.Default().Info("SatuSehat REST API running", logger.Int("port", cfg.Server.REST.Port))
if err := restSrv.Start(&cfg.Server); err != nil && err != http.ErrServerClosed {
return err
}
return nil
})
}
// --- Graceful Shutdown Listener ---
g.Go(func() error {
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
logger.Default().Warn("Signal received, shutting down SatuSehat service...")
cancel()
return nil
})
if err := g.Wait(); err != nil {
logger.Default().Error("SatuSehat service shutdown with error", logger.ErrorField(err))
} else {
logger.Default().Info("SatuSehat service shutdown successful")
}
}
-63
View File
@@ -1,63 +0,0 @@
package main
import (
"context"
"os"
"os/signal"
"syscall"
"service/internal/infrastructure/config"
"service/internal/infrastructure/database"
satuSehatFactory "service/internal/interfaces/satusehat"
"service/internal/worker"
"service/pkg/logger"
)
func main() {
// 1. Load Configuration
cfg := config.LoadConfig()
// 2. Initialize Logger khusus untuk Worker
loggerConfig := logger.Config{
Level: cfg.Logger.Level,
Format: cfg.Logger.Format,
Output: "both",
ServiceName: "service-worker", // Penanda log khusus worker
EnableCaller: cfg.Server.Mode != "production",
Environment: cfg.Server.Mode,
}
logger.Init(loggerConfig)
logger.Default().Info("Background Worker Microservice starting...",
logger.String("environment", cfg.Server.Mode),
logger.String("log_level", cfg.Logger.Level),
)
if err := cfg.Validate(); err != nil {
logger.Default().Fatal("Config validation failed", logger.ErrorField(err))
}
// 3. Initialize Database Manager
dbService := database.New(cfg)
defer dbService.Close()
// 4. Initialize SatuSehat Client (Dibutuhkan oleh worker manager)
satusehatFact := satuSehatFactory.NewSatuSehatFactory(cfg.SatuSehat)
satusehatClient := satusehatFact.Client()
// 5. Setup Context untuk Graceful Shutdown
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 6. Initialize dan Jalankan Worker Manager
workerManager := worker.NewManager(cfg, dbService, satusehatClient)
workerManager.Start(ctx)
// 7. Listener untuk OS Signals (Ctrl+C / SIGTERM)
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit // Block aplikasi sampai signal diterima
logger.Default().Warn("Signal received, shutting down worker service...")
cancel() // Batalkan context, trigger penghentian semua worker
}