diff --git a/dbHandler.go b/dbHandler.go index 9547300..303a378 100644 --- a/dbHandler.go +++ b/dbHandler.go @@ -245,7 +245,9 @@ 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) + if !dH.Exists(model, "id", ids, false) { + return errors.New("no matching id(s) found") + } // 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 { @@ -283,26 +285,7 @@ func (dH *DBHandler) DeleteByKey(model any, key string, value any, LikeSearch bo return dH.db.Where(key+" = ?", value).Delete(model).Error } -// exists -// -// Description: -// -// Checks whether a record exists matching the specified key/value filter. -// -// Behavior: -// - Performs a `First` query on the database. -// - If `LikeSearch` is true, performs a LIKE query. -// - Returns an error if the record does not exist or query fails. -// -// Parameters: -// - model: Model struct type to search. -// - key: Column name to filter by. -// - value: Value to match. -// - LikeSearch: Whether to use wildcard search. -// -// Returns: -// - error: “no record found” or DB error. -func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool) error { +func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool) (found bool) { var query string var args any @@ -313,7 +296,8 @@ func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool) e switch { case isSlice: if val.Len() == 0 { - return fmt.Errorf("empty slice for %s", key) + dH.logger.Error("Exists", fmt.Sprintf("empty slice for %s", key)) + return false } query = fmt.Sprintf("%s IN ?", key) args = value @@ -330,15 +314,16 @@ func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool) e dH.logger.Debug("exists", "checking existence for key "+query+" value "+fmt.Sprint(args)) - var count int64 - tx := dH.db.Model(model).Where(query, args).Count(&count) + t := reflect.TypeOf(model) + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + + tx := dH.db.Where(query, args).Find(model) + if tx.Error != nil { - return fmt.Errorf("query failed: %w", tx.Error) + dH.logger.Error("Exists", fmt.Sprintf("query failed: %w", tx.Error)) + return false } - - if count == 0 { - return fmt.Errorf("no record found for %s %v", key, value) - } - - return nil + return tx.RowsAffected > 0 }