feat: search

This commit is contained in:
2025-03-15 18:54:09 +07:00
parent 33b0eaca3d
commit 9a7c5ca1fe
6 changed files with 21 additions and 19 deletions

View File

@@ -10,6 +10,7 @@ tasks:
- ../dal/*.go - ../dal/*.go
cmds: cmds:
- go run gen.go - go run gen.go
method: none
go:gen:crudgen: go:gen:crudgen:
summary: Runs crudgen for crud generating summary: Runs crudgen for crud generating
@@ -21,6 +22,7 @@ tasks:
- go:gen:dal - go:gen:dal
cmds: cmds:
- crudgen -p internal - crudgen -p internal
method: none
go:mod:tidy: go:mod:tidy:
summary: Runs `go mod tidy` summary: Runs `go mod tidy`

View File

@@ -64,3 +64,6 @@ func (service *AuthorService) Count() (int64, error) {
func (service *AuthorService) SortedByOrder(fieldsSortingOrder []utils.SortField) ([]*Author, error) { func (service *AuthorService) SortedByOrder(fieldsSortingOrder []utils.SortField) ([]*Author, error) {
return utils.SortByOrder(fieldsSortingOrder, Author{}) return utils.SortByOrder(fieldsSortingOrder, Author{})
} }
func (service *AuthorService) SearchByAllTextFields(phrase string) ([]*Author, error) {
return utils.FindPhraseByStringFields[Author](phrase, Author{})
}

View File

@@ -61,6 +61,9 @@ func (service *CommentService) Count() (int64, error) {
amount, err := dal.Comment.Count() amount, err := dal.Comment.Count()
return amount, err return amount, err
} }
func (service *CommentService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*Comment, error) { func (service *CommentService) SortedByOrder(fieldsSortingOrder []utils.SortField) ([]*Comment, error) {
return utils.SortByOrder(fieldsSortOrder, Comment{}) return utils.SortByOrder(fieldsSortingOrder, Comment{})
}
func (service *CommentService) SearchByAllTextFields(phrase string) ([]*Comment, error) {
return utils.FindPhraseByStringFields[Comment](phrase, Comment{})
} }

View File

@@ -64,3 +64,6 @@ func (service *PostService) Count() (int64, error) {
func (service *PostService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*Post, error) { func (service *PostService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*Post, error) {
return utils.SortByOrder(fieldsSortOrder, Post{}) return utils.SortByOrder(fieldsSortOrder, Post{})
} }
func (service *PostService) SearchByAllTextFields(phrase string) ([]*Post, error) {
return utils.FindPhraseByStringFields[Post](phrase, Post{})
}

View File

@@ -63,3 +63,6 @@ func (service *PostTypeService) Count() (int64, error) {
func (service *PostTypeService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*PostType, error) { func (service *PostTypeService) SortedByOrder(fieldsSortOrder []utils.SortField) ([]*PostType, error) {
return utils.SortByOrder(fieldsSortOrder, PostType{}) return utils.SortByOrder(fieldsSortOrder, PostType{})
} }
func (service *PostTypeService) SearchByAllTextFields(phrase string) ([]*PostType, error) {
return utils.FindPhraseByStringFields[PostType](phrase, PostType{})
}

View File

@@ -3,39 +3,27 @@ package utils
import ( import (
"app/internal/database" "app/internal/database"
"fmt" "fmt"
"github.com/kuzgoga/fogg"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
"reflect" "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) db := database.GetInstance().Preload(clause.Associations)
structType := reflect.TypeOf(entity) structType := reflect.TypeOf(entity)
for i := 0; i < structType.NumField(); i++ { for i := 0; i < structType.NumField(); i++ {
field := structType.Field(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 { if field.Type.Kind() == reflect.Pointer {
field.Type = field.Type.Elem() field.Type = field.Type.Elem()
} }
if field.Type.Kind() == reflect.String { if field.Type.Kind() == reflect.String {
db.Where(fmt.Sprintf("`%s` like ?", field.Name), "%"+phrase+"%") 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
} }