tagliatelle

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 }