include-general.go (2654B)
1 package main 2 3 import ( 4 "log" 5 "net/http" 6 "net/url" 7 "strings" 8 ) 9 10 func sanitizeFilename(filename string) string { 11 if filename == "" { 12 return "file" 13 } 14 filename = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(filename, "/", "_"), "\\", "_"), "..", "_") 15 if filename == "" { 16 return "file" 17 } 18 return filename 19 } 20 21 func renderError(w http.ResponseWriter, message string, statusCode int) { 22 http.Error(w, message, statusCode) 23 } 24 25 func renderTemplate(w http.ResponseWriter, tmplName string, data PageData) { 26 if err := tmpl.ExecuteTemplate(w, tmplName, data); err != nil { 27 log.Printf("Error: renderTemplate: failed to execute template %s: %v", tmplName, err) 28 renderError(w, "Template rendering failed", http.StatusInternalServerError) 29 } 30 } 31 32 func redirectWithWarning(w http.ResponseWriter, r *http.Request, baseURL, warningMsg string) { 33 redirectURL := baseURL 34 if warningMsg != "" { 35 redirectURL += "?warning=" + url.QueryEscape(warningMsg) 36 } 37 http.Redirect(w, r, redirectURL, http.StatusSeeOther) 38 } 39 40 func errorString(err error) string { 41 if err != nil { 42 return err.Error() 43 } 44 return "" 45 } 46 47 func successString(err error, msg string) string { 48 if err == nil { 49 return msg 50 } 51 return "" 52 } 53 54 func buildPageData(title string, data interface{}) PageData { 55 tagMap, err := getTagData() 56 if err != nil { 57 log.Printf("Warning: buildPageData: failed to load tag data for page %q: %v", title, err) 58 } 59 propMap, err := getPropertyNav() 60 if err != nil { 61 log.Printf("Warning: buildPageData: failed to load property nav for page %q: %v", title, err) 62 } 63 return PageData{ 64 Title: title, 65 Data: data, 66 Tags: tagMap, 67 Properties: propMap, 68 GallerySize: config.GallerySize, 69 } 70 } 71 72 func getTagData() (map[string][]TagDisplay, error) { 73 rows, err := db.Query(` 74 SELECT c.name, t.value, COUNT(ft.file_id) 75 FROM tags t 76 JOIN categories c ON c.id = t.category_id 77 LEFT JOIN file_tags ft ON ft.tag_id = t.id 78 GROUP BY t.id 79 HAVING COUNT(ft.file_id) > 0 80 ORDER BY c.name, t.value`) 81 if err != nil { 82 return nil, err 83 } 84 defer rows.Close() 85 86 tagMap := make(map[string][]TagDisplay) 87 for rows.Next() { 88 var cat, val string 89 var count int 90 if err := rows.Scan(&cat, &val, &count); err != nil { 91 log.Printf("Warning: getTagData: failed to scan row: %v", err) 92 continue 93 } 94 tagMap[cat] = append(tagMap[cat], TagDisplay{Value: val, Count: count}) 95 } 96 if err := rows.Err(); err != nil { 97 return tagMap, err 98 } 99 return tagMap, nil 100 } 101 102 func tagsHandler(w http.ResponseWriter, r *http.Request) { 103 pageData := buildPageData("All Tags", nil) 104 pageData.Data = pageData.Tags 105 renderTemplate(w, "tags.html", pageData) 106 }