feat: search
This commit is contained in:
@@ -64,3 +64,6 @@ func (service *AuthorService) Count() (int64, error) {
|
||||
func (service *AuthorService) SortedByOrder(fieldsSortingOrder []utils.SortField) ([]*Author, error) {
|
||||
return utils.SortByOrder(fieldsSortingOrder, Author{})
|
||||
}
|
||||
func (service *AuthorService) SearchByAllTextFields(phrase string) ([]*Author, error) {
|
||||
return utils.FindPhraseByStringFields[Author](phrase, Author{})
|
||||
}
|
||||
|
||||
@@ -61,6 +61,9 @@ func (service *CommentService) Count() (int64, error) {
|
||||
amount, err := dal.Comment.Count()
|
||||
return amount, err
|
||||
}
|
||||
func (service *CommentService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*Comment, error) {
|
||||
return utils.SortByOrder(fieldsSortOrder, Comment{})
|
||||
func (service *CommentService) SortedByOrder(fieldsSortingOrder []utils.SortField) ([]*Comment, error) {
|
||||
return utils.SortByOrder(fieldsSortingOrder, Comment{})
|
||||
}
|
||||
func (service *CommentService) SearchByAllTextFields(phrase string) ([]*Comment, error) {
|
||||
return utils.FindPhraseByStringFields[Comment](phrase, Comment{})
|
||||
}
|
||||
|
||||
@@ -64,3 +64,6 @@ func (service *PostService) Count() (int64, error) {
|
||||
func (service *PostService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*Post, error) {
|
||||
return utils.SortByOrder(fieldsSortOrder, Post{})
|
||||
}
|
||||
func (service *PostService) SearchByAllTextFields(phrase string) ([]*Post, error) {
|
||||
return utils.FindPhraseByStringFields[Post](phrase, Post{})
|
||||
}
|
||||
|
||||
@@ -63,3 +63,6 @@ func (service *PostTypeService) Count() (int64, error) {
|
||||
func (service *PostTypeService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*PostType, error) {
|
||||
return utils.SortByOrder(fieldsSortOrder, PostType{})
|
||||
}
|
||||
func (service *PostTypeService) SearchByAllTextFields(phrase string) ([]*PostType, error) {
|
||||
return utils.FindPhraseByStringFields[PostType](phrase, PostType{})
|
||||
}
|
||||
|
||||
@@ -3,39 +3,27 @@ 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) {
|
||||
func FindPhraseByStringFields[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
|
||||
|
||||
var items []*T
|
||||
db.Find(&items)
|
||||
return items, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user