taggart

Simple golang tagging filesystem webapp
Log | Files | Refs

commit 3f2bfbfd6272d86d3737f3d6f886d76426573833
parent b1d25a7c9c2adfe70bf5cc5c7afbc4b0e8b65a7b
Author: breadcat <breadcat@users.noreply.github.com>
Date:   Mon, 29 Sep 2025 16:34:18 +0100

Search includes tag values now

Diffstat:
Mmain.go | 57++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 50 insertions(+), 7 deletions(-)

diff --git a/main.go b/main.go @@ -212,16 +212,59 @@ func searchHandler(w http.ResponseWriter, r *http.Request) { if query != "" { sqlPattern := strings.ReplaceAll(query, "*", "%") sqlPattern = strings.ReplaceAll(sqlPattern, "?", "_") - - var err error - files, err = queryFilesWithTags( - "SELECT id, filename, path, COALESCE(description, '') as description FROM files WHERE filename LIKE ? OR description LIKE ? ORDER BY filename", - sqlPattern, sqlPattern, - ) + sqlPattern = strings.ToLower(sqlPattern) + + // Query: join files → file_tags → tags → categories + rows, err := db.Query(` + SELECT f.id, f.filename, f.path, COALESCE(f.description, '') AS description, + c.name AS category, t.value AS tag + FROM files f + LEFT JOIN file_tags ft ON ft.file_id = f.id + LEFT JOIN tags t ON t.id = ft.tag_id + LEFT JOIN categories c ON c.id = t.category_id + WHERE LOWER(f.filename) LIKE ? OR LOWER(f.description) LIKE ? OR LOWER(t.value) LIKE ? + ORDER BY f.filename + `, sqlPattern, sqlPattern, sqlPattern) if err != nil { - renderError(w, "Search failed", http.StatusInternalServerError) + renderError(w, "Search failed: "+err.Error(), http.StatusInternalServerError) return } + defer rows.Close() + + // Aggregate tags per file + fileMap := make(map[int]*File) + for rows.Next() { + var id int + var filename, path, description, category, tag sql.NullString + + if err := rows.Scan(&id, &filename, &path, &description, &category, &tag); err != nil { + renderError(w, "Failed to read search results: "+err.Error(), http.StatusInternalServerError) + return + } + + f, exists := fileMap[id] + if !exists { + f = &File{ + ID: id, + Filename: filename.String, + Path: path.String, + EscapedFilename: url.PathEscape(filename.String), + Description: description.String, + Tags: make(map[string][]string), // initialize map + } + fileMap[id] = f + } + + if category.Valid && tag.Valid && tag.String != "" { + f.Tags[category.String] = append(f.Tags[category.String], tag.String) + } + } + + // Convert map to slice + for _, f := range fileMap { + files = append(files, *f) + } + searchTitle = fmt.Sprintf("Search Results for: %s", query) } else { searchTitle = "Search Files"