backend/internal/services/bookmark_service.go
@@ -7,2 +7,3 @@
"strconv"
+ "strings"
@@ -196,2 +197,7 @@
+ type Tag struct {
+ Name string `json:"name"`
+ }
+ var tags []Tag
+
query := s.db.Model(&models.BookmarkView{})
@@ -205,3 +211,3 @@
} else if tag != "" {
- query = query.Where("tags_json::jsonb @> ?", fmt.Sprintf(`[{"name":"%s"}]`, tag))
+ tags = append(tags, Tag{Name: tag})
}
@@ -210,4 +216,20 @@
if search != "" {
- query = query.Where("full_text ILIKE ? OR name ILIKE ? OR screen_name ILIKE ?",
- "%"+search+"%", "%"+search+"%", "%"+search+"%")
+ words := strings.Fields(search)
+ for _, word := range words {
+ if strings.HasPrefix(word, "#") {
+ tags = append(tags, Tag{Name: strings.TrimPrefix(word, "#")})
+ } else if strings.HasPrefix(word, "-#") {
+ query = query.Not("tags_json::jsonb @> ?", fmt.Sprintf(`[{"name":"%s"}]`, strings.TrimPrefix(word, "-#")))
+ } else {
+ query = query.Where("full_text ILIKE ? OR name ILIKE ? OR screen_name ILIKE ?",
+ "%"+word+"%", "%"+word+"%", "%"+word+"%")
+ }
+ }
+ }
+ if len(tags) != 0 {
+ jsonData, err := json.Marshal(tags)
+ if err != nil {
+ return nil, 0, err
+ }
+ query = query.Where("tags_json::jsonb @> ?", jsonData)
}