Files
2026-02-13 15:57:28 +07:00

123 lines
3.0 KiB
Go

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
}