42 lines
986 B
Go
42 lines
986 B
Go
package utils
|
|
|
|
import (
|
|
"app/internal/database"
|
|
"fmt"
|
|
"github.com/kuzgoga/fogg"
|
|
"gorm.io/gorm/clause"
|
|
"reflect"
|
|
)
|
|
|
|
func FindPhraseByAllFields[T any](phrase string, entity T) ([]*T, error) {
|
|
db := database.GetInstance().Preload(clause.Associations)
|
|
structType := reflect.TypeOf(entity)
|
|
|
|
for i := 0; i < structType.NumField(); i++ {
|
|
field := structType.Field(i)
|
|
|
|
tag, err := fogg.Parse(string(field.Tag))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("ошибка при разборе тэга '%s': %w", field.Name, err)
|
|
}
|
|
|
|
if field.Type.Kind() == reflect.Pointer {
|
|
field.Type = field.Type.Elem()
|
|
}
|
|
|
|
if field.Type.Kind() == reflect.String {
|
|
db.Where(fmt.Sprintf("`%s` like ?", field.Name), "%"+phrase+"%")
|
|
} else {
|
|
if tag.HasTag("ui") {
|
|
uiTag := tag.GetTag("ui")
|
|
nestedFieldPath := uiTag.GetParamOr("field", "")
|
|
if nestedFieldPath != "" {
|
|
db.Preload(fmt.Sprintf("%s.%s", field.Name, nestedFieldPath))
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
return nil, nil
|
|
}
|