package reference import ( "api-service/internal/config" "api-service/internal/database" "api-service/internal/models" modelsReference "api-service/internal/models/reference" "api-service/pkg/logger" "context" "database/sql" "fmt" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" "github.com/jmoiron/sqlx" "net/http" "sync" "time" ) var ( db database.Service once sync.Once validate *validator.Validate ) func init() { once.Do(func() { db = database.New(config.LoadConfig()) validate = validator.New() // Register custom validations if needed validate.RegisterValidation("retribusi_status", validateRetribusiStatus) if db == nil { logger.Fatal("Failed to initialize database connection") } }) } func validateRetribusiStatus(fl validator.FieldLevel) bool { return models.IsValidStatus(fl.Field().String()) } type referenceHandler struct { db database.Service } func NewreferenceHandler() *referenceHandler { return &referenceHandler{ db: db, } } func (h *referenceHandler) Getvisitpasien(c *gin.Context) { ctx, cancel := context.WithTimeout(c.Request.Context(), 120*time.Second) defer cancel() dbAntrean, err := h.db.GetSQLXDB("postgres_antrean") if err != nil { logger.Error("Failed to connect postgres_antrean", map[string]interface{}{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": "Database connection failed"}) return } Listvisit, err := h.Getrefvisitpasien(ctx, dbAntrean) if err != nil { if err == sql.ErrNoRows { c.JSON(http.StatusOK, modelsReference.VisitStatusResponse{ Message: "Data visit status tidak ditemukan", Data: []*modelsReference.VisitStatus{}, Meta: map[string]interface{}{ "total": 0, }, }) return } logger.Error("Failed to get visit status", map[string]interface{}{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve data"}) return } c.JSON(http.StatusOK, modelsReference.VisitStatusResponse{ Message: "Data visit status berhasil diambil", Data: Listvisit, Meta: map[string]interface{}{ "total": len(Listvisit), }, }) } func (h *referenceHandler) Getrefvisitpasien(ctx context.Context, dbConn *sqlx.DB) ([]*modelsReference.VisitStatus, error) { query := ` SELECT rvs.id as idvisit, rvs.name as namastatus, rvs.description as deskripsistatus, rhs.id as idklinikstatus, rhs.name as namastatusklinik FROM reference.ref_visit_status rvs LEFT JOIN reference.ref_healthcare_status rhs ON rvs.fk_ref_healthcare_status_id = rhs.id ORDER BY rvs.id ASC ` var visitStatusList []*modelsReference.VisitStatus err := dbConn.SelectContext(ctx, &visitStatusList, query) if err != nil { return nil, fmt.Errorf("failed to get visit status: %w", err) } if len(visitStatusList) == 0 { return nil, sql.ErrNoRows } logger.Info("Visit status retrieved successfully", map[string]interface{}{ "total": len(visitStatusList), }) return visitStatusList, nil }