Updat erubhan besar query builder

This commit is contained in:
meninjar
2025-11-02 03:08:38 +00:00
parent 0002cf26be
commit 19324041b8
13 changed files with 2916 additions and 842 deletions
@@ -63,7 +63,11 @@ func NewDynamicValidator(qb *queryUtils.QueryBuilder) *DynamicValidator {
// `data` adalah map yang berisi nilai untuk kolom yang akan diperiksa (biasanya dari request body).
// Mengembalikan `true` jika ada duplikat yang ditemukan (validasi gagal), `false` jika tidak ada duplikat (validasi berhasil).
func (dv *DynamicValidator) Validate(ctx context.Context, db *sqlx.DB, rule ValidationRule, data map[string]interface{}) (bool, error) {
// LOGGING: Log validation start
fmt.Printf("[VALIDATION] Starting validation for table: %s, unique columns: %v, data: %v\n", rule.TableName, rule.UniqueColumns, data)
if len(rule.UniqueColumns) == 0 {
fmt.Printf("[VALIDATION] ERROR: ValidationRule must have at least one UniqueColumn\n")
return false, fmt.Errorf("ValidationRule must have at least one UniqueColumn")
}
@@ -72,12 +76,14 @@ func (dv *DynamicValidator) Validate(ctx context.Context, db *sqlx.DB, rule Vali
// Tambahkan kondisi tambahan (misalnya, status != 'deleted')
allFilters = append(allFilters, rule.Conditions...)
fmt.Printf("[VALIDATION] Added %d condition filters\n", len(rule.Conditions))
// 2. Bangun filter untuk kolom unik berdasarkan data yang diberikan
for _, colName := range rule.UniqueColumns {
value, exists := data[colName]
if !exists {
// Jika data untuk kolom unik tidak ada, ini adalah kesalahan pemrograman.
fmt.Printf("[VALIDATION] ERROR: data for unique column '%s' not found in provided data map\n", colName)
return false, fmt.Errorf("data for unique column '%s' not found in provided data map", colName)
}
allFilters = append(allFilters, queryUtils.DynamicFilter{
@@ -85,6 +91,7 @@ func (dv *DynamicValidator) Validate(ctx context.Context, db *sqlx.DB, rule Vali
Operator: queryUtils.OpEqual,
Value: value,
})
fmt.Printf("[VALIDATION] Added filter for column '%s' with value: %v\n", colName, value)
}
// 3. Tambahkan filter pengecualian ID (untuk operasi UPDATE)
@@ -94,6 +101,7 @@ func (dv *DynamicValidator) Validate(ctx context.Context, db *sqlx.DB, rule Vali
Operator: queryUtils.OpNotEqual,
Value: rule.ExcludeIDValue,
})
fmt.Printf("[VALIDATION] Added exclude filter for column '%s' with value: %v\n", rule.ExcludeIDColumn, rule.ExcludeIDValue)
}
// 4. Bangun dan eksekusi query untuk menghitung jumlah record yang cocok
@@ -102,13 +110,20 @@ func (dv *DynamicValidator) Validate(ctx context.Context, db *sqlx.DB, rule Vali
Filters: []queryUtils.FilterGroup{{Filters: allFilters, LogicOp: "AND"}},
}
fmt.Printf("[VALIDATION] Built query with %d total filters\n", len(allFilters))
count, err := dv.qb.ExecuteCount(ctx, db, query)
if err != nil {
fmt.Printf("[VALIDATION] ERROR: failed to execute validation query for table %s: %v\n", rule.TableName, err)
return false, fmt.Errorf("failed to execute validation query for table %s: %w", rule.TableName, err)
}
fmt.Printf("[VALIDATION] Query executed successfully, count result: %d\n", count)
// 5. Kembalikan hasil
return count > 0, nil
result := count > 0
fmt.Printf("[VALIDATION] Validation result: isDuplicate=%t (count > 0: %d > 0 = %t)\n", result, count, result)
return result, nil
}
// =============================================================================