123 lines
3.0 KiB
Go
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
|
|
}
|