From 2b18549f021271195091abc270dbf2b0eb2c5b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Z=C3=BCrcher?= Date: Wed, 29 Oct 2025 22:14:07 +0100 Subject: [PATCH] fix exist function for array of values and error handling delete --- dbHandler.go | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/dbHandler.go b/dbHandler.go index 619336f..9547300 100644 --- a/dbHandler.go +++ b/dbHandler.go @@ -245,13 +245,14 @@ func (dH *DBHandler) DeleteById(model any, ids ...uint) error { } dH.logger.Debug("deleteById", "delete ids "+fmt.Sprint(ids)) + err := dH.Exists(model, "id", ids, false) // Always use Model() to avoid GORM’s “limit 1” safeguard if err := dH.db.Model(model).Where("id IN ?", ids).Delete(nil).Error; err != nil { return fmt.Errorf("delete failed: %w", err) } - return nil + return err } // deleteByKey @@ -301,33 +302,42 @@ func (dH *DBHandler) DeleteByKey(model any, key string, value any, LikeSearch bo // // Returns: // - error: “no record found” or DB error. -func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool) (err error) { +func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool) error { var query string + var args any - switch v := value.(type) { - case []string, []int, []uint, []int64, []uint64, []float64: - // Handle slice case — use IN clause - query = fmt.Sprintf("%s IN ?", key) - case string: - if likeSearch { - v = strings.ReplaceAll(v, "*", "%") - query = fmt.Sprintf("%s LIKE ?", key) - value = v - } else { - query = fmt.Sprintf("%s = ?", key) + // Detect LIKE and IN behavior + val := reflect.ValueOf(value) + isSlice := val.Kind() == reflect.Slice + + switch { + case isSlice: + if val.Len() == 0 { + return fmt.Errorf("empty slice for %s", key) } + query = fmt.Sprintf("%s IN ?", key) + args = value + + case likeSearch: + str := strings.ReplaceAll(fmt.Sprint(value), "*", "%") + query = fmt.Sprintf("%s LIKE ?", key) + args = str + default: - // Handle any other single value (numbers, bools, etc.) query = fmt.Sprintf("%s = ?", key) + args = value } - dH.logger.Debug("exists", "check if exists key "+query+" value "+fmt.Sprint(value)) + dH.logger.Debug("exists", "checking existence for key "+query+" value "+fmt.Sprint(args)) - err = dH.db.Where(query, value).First(model).Error - if errors.Is(err, gorm.ErrRecordNotFound) { + var count int64 + tx := dH.db.Model(model).Where(query, args).Count(&count) + if tx.Error != nil { + return fmt.Errorf("query failed: %w", tx.Error) + } + + if count == 0 { return fmt.Errorf("no record found for %s %v", key, value) - } else if err != nil { - return fmt.Errorf("query failed: %w", err) } return nil