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