Update Penggunaan Gorm
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -90,7 +91,7 @@ func (h *RetribusiHandler) GetRetribusi(c *gin.Context) {
|
||||
includeAggregation := c.Query("include_summary") == "true"
|
||||
|
||||
// Get database connection
|
||||
dbConn, err := h.db.GetDB("postgres_satudata")
|
||||
gormDB, err := h.db.GetGormDB("postgres_satudata")
|
||||
if err != nil {
|
||||
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
|
||||
return
|
||||
@@ -103,18 +104,25 @@ func (h *RetribusiHandler) GetRetribusi(c *gin.Context) {
|
||||
// Execute concurrent operations
|
||||
var (
|
||||
retribusis []retribusi.Retribusi
|
||||
total int
|
||||
total int64
|
||||
aggregateData *models.AggregateData
|
||||
wg sync.WaitGroup
|
||||
errChan = make(chan error, 3)
|
||||
mu sync.Mutex
|
||||
)
|
||||
|
||||
// Get underlying SQL DB from GORM
|
||||
sqlDB, err := gormDB.DB()
|
||||
if err != nil {
|
||||
h.logAndRespondError(c, "Failed to get SQL DB from GORM", err, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Fetch total count
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
if err := h.getTotalCount(ctx, dbConn, filter, &total); err != nil {
|
||||
if err := h.getTotalCount(ctx, gormDB, filter, &total); err != nil {
|
||||
mu.Lock()
|
||||
errChan <- fmt.Errorf("failed to get total count: %w", err)
|
||||
mu.Unlock()
|
||||
@@ -125,7 +133,7 @@ func (h *RetribusiHandler) GetRetribusi(c *gin.Context) {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
result, err := h.fetchRetribusis(ctx, dbConn, filter, limit, offset)
|
||||
result, err := h.fetchRetribusis(ctx, sqlDB, filter, limit, offset)
|
||||
mu.Lock()
|
||||
if err != nil {
|
||||
errChan <- fmt.Errorf("failed to fetch data: %w", err)
|
||||
@@ -140,7 +148,7 @@ func (h *RetribusiHandler) GetRetribusi(c *gin.Context) {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
result, err := h.getAggregateData(ctx, dbConn, filter)
|
||||
result, err := h.getAggregateData(ctx, sqlDB, filter)
|
||||
mu.Lock()
|
||||
if err != nil {
|
||||
errChan <- fmt.Errorf("failed to get aggregate data: %w", err)
|
||||
@@ -164,7 +172,7 @@ func (h *RetribusiHandler) GetRetribusi(c *gin.Context) {
|
||||
}
|
||||
|
||||
// Build response
|
||||
meta := h.calculateMeta(limit, offset, total)
|
||||
meta := h.calculateMeta(limit, offset, int(total))
|
||||
response := retribusi.RetribusiGetResponse{
|
||||
Message: "Data retribusi berhasil diambil",
|
||||
Data: retribusis,
|
||||
@@ -199,7 +207,7 @@ func (h *RetribusiHandler) GetRetribusiByID(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
dbConn, err := h.db.GetDB("postgres_satudata")
|
||||
gormDB, err := h.db.GetGormDB("postgres_satudata")
|
||||
if err != nil {
|
||||
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
|
||||
return
|
||||
@@ -208,7 +216,7 @@ func (h *RetribusiHandler) GetRetribusiByID(c *gin.Context) {
|
||||
ctx, cancel := context.WithTimeout(c.Request.Context(), 15*time.Second)
|
||||
defer cancel()
|
||||
|
||||
dataretribusi, err := h.getRetribusiByID(ctx, dbConn, id)
|
||||
dataretribusi, err := h.getRetribusiByID(ctx, gormDB, id)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
h.respondError(c, "Retribusi not found", err, http.StatusNotFound)
|
||||
@@ -739,33 +747,13 @@ func (h *RetribusiHandler) GetRetribusiStats(c *gin.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
// Get retribusi by ID
|
||||
func (h *RetribusiHandler) getRetribusiByID(ctx context.Context, dbConn *sql.DB, id string) (*retribusi.Retribusi, error) {
|
||||
query := `
|
||||
SELECT
|
||||
id, status, sort, user_created, date_created, user_updated, date_updated,
|
||||
"Jenis", "Pelayanan", "Dinas", "Kelompok_obyek", "Kode_tarif",
|
||||
"Tarif", "Satuan", "Tarif_overtime", "Satuan_overtime",
|
||||
"Rekening_pokok", "Rekening_denda", "Uraian_1", "Uraian_2", "Uraian_3"
|
||||
FROM data_retribusi
|
||||
WHERE id = $1 AND status != 'deleted'`
|
||||
|
||||
row := dbConn.QueryRowContext(ctx, query, id)
|
||||
|
||||
// Get retribusi by ID using GORM
|
||||
func (h *RetribusiHandler) getRetribusiByID(ctx context.Context, gormDB *gorm.DB, id string) (*retribusi.Retribusi, error) {
|
||||
var retribusi retribusi.Retribusi
|
||||
err := row.Scan(
|
||||
&retribusi.ID, &retribusi.Status, &retribusi.Sort, &retribusi.UserCreated,
|
||||
&retribusi.DateCreated, &retribusi.UserUpdated, &retribusi.DateUpdated,
|
||||
&retribusi.Jenis, &retribusi.Pelayanan, &retribusi.Dinas, &retribusi.KelompokObyek,
|
||||
&retribusi.KodeTarif, &retribusi.Tarif, &retribusi.Satuan, &retribusi.TarifOvertime,
|
||||
&retribusi.SatuanOvertime, &retribusi.RekeningPokok, &retribusi.RekeningDenda,
|
||||
&retribusi.Uraian1, &retribusi.Uraian2, &retribusi.Uraian3,
|
||||
)
|
||||
|
||||
err := gormDB.WithContext(ctx).Where("id = ? AND status != ?", id, "deleted").First(&retribusi).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &retribusi, nil
|
||||
}
|
||||
|
||||
@@ -1258,11 +1246,39 @@ func (h *RetribusiHandler) getAggregateData(ctx context.Context, dbConn *sql.DB,
|
||||
}
|
||||
|
||||
// Get total count dengan filter support
|
||||
func (h *RetribusiHandler) getTotalCount(ctx context.Context, dbConn *sql.DB, filter retribusi.RetribusiFilter, total *int) error {
|
||||
whereClause, args := h.buildWhereClause(filter)
|
||||
countQuery := fmt.Sprintf(`SELECT COUNT(*) FROM data_retribusi WHERE %s`, whereClause)
|
||||
func (h *RetribusiHandler) getTotalCount(ctx context.Context, db *gorm.DB, filter retribusi.RetribusiFilter, total *int64) error {
|
||||
query := db.Model(&retribusi.Retribusi{}).Where("status != ?", "deleted")
|
||||
|
||||
if err := dbConn.QueryRowContext(ctx, countQuery, args...).Scan(total); err != nil {
|
||||
if filter.Status != nil {
|
||||
query = query.Where("status = ?", *filter.Status)
|
||||
}
|
||||
|
||||
if filter.Jenis != nil {
|
||||
query = query.Where("\"Jenis\" ILIKE ?", "%"+*filter.Jenis+"%")
|
||||
}
|
||||
|
||||
if filter.Dinas != nil {
|
||||
query = query.Where("\"Dinas\" ILIKE ?", "%"+*filter.Dinas+"%")
|
||||
}
|
||||
|
||||
if filter.KelompokObyek != nil {
|
||||
query = query.Where("\"Kelompok_obyek\" ILIKE ?", "%"+*filter.KelompokObyek+"%")
|
||||
}
|
||||
|
||||
if filter.Search != nil {
|
||||
searchTerm := "%" + *filter.Search + "%"
|
||||
query = query.Where("\"Jenis\" ILIKE ? OR \"Pelayanan\" ILIKE ? OR \"Dinas\" ILIKE ? OR \"Kode_tarif\" ILIKE ? OR \"Uraian_1\" ILIKE ? OR \"Uraian_2\" ILIKE ? OR \"Uraian_3\" ILIKE ?", searchTerm, searchTerm, searchTerm, searchTerm, searchTerm, searchTerm, searchTerm)
|
||||
}
|
||||
|
||||
if filter.DateFrom != nil {
|
||||
query = query.Where("date_created >= ?", *filter.DateFrom)
|
||||
}
|
||||
|
||||
if filter.DateTo != nil {
|
||||
query = query.Where("date_created <= ?", filter.DateTo.Add(24*time.Hour-time.Nanosecond))
|
||||
}
|
||||
|
||||
if err := query.Count(total).Error; err != nil {
|
||||
return fmt.Errorf("total count query failed: %w", err)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user