arnaucube
arnaucube/padArchiverPublic Self-hosted repository
padArchiver/webServer/main.go
webServer/main.goRaw
 1package main
 2
 3import (
 4	"html/template"
 5	"log"
 6	"net/http"
 7	"os"
 8	"path/filepath"
 9	"strings"
10
11	padArchiver ".."
12	"github.com/gorilla/mux"
13)
14
15type ItemModel struct {
16	Name    string
17	Path    string
18	IsDir   bool
19	Content template.HTML
20}
21type MenuModel struct {
22	PageTitle string
23	Items     []ItemModel
24}
25
26func main() {
27
28	router := mux.NewRouter()
29	router.HandleFunc("/", getDir).Methods("GET")
30	router.HandleFunc("/dir/{path}", getDir).Methods("GET")
31	router.HandleFunc("/page/{path}", getPage).Methods("GET")
32
33	log.Println("padArchiver web server running")
34	log.Print("port: 8080")
35	log.Fatal(http.ListenAndServe(":8080", router))
36}
37
38func generateMenu(dirpath string) MenuModel {
39	var menuPage MenuModel
40	menuPage.PageTitle = "padArchiver - Menu"
41	_ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error {
42		if path != padArchiver.Storage {
43			path = strings.Replace(path, padArchiver.Storage, "", -1)
44			var item ItemModel
45			item.Name = path
46			path = strings.Replace(path, "/", "%", -1)
47			if f.IsDir() {
48				item.Path = "/dir/" + path
49			} else {
50				item.Path = "/page/" + path
51			}
52			item.IsDir = f.IsDir()
53			menuPage.Items = append(menuPage.Items, item)
54		}
55		return nil
56	})
57	return menuPage
58}
59func getDir(w http.ResponseWriter, r *http.Request) {
60	vars := mux.Vars(r)
61	var dirpath string
62	if _, ok := vars["path"]; ok {
63		dirpath = vars["path"]
64		dirpath = strings.Replace(dirpath, "%", "/", -1)
65	}
66
67	menuPage := generateMenu(dirpath)
68
69	tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html"))
70	tmpl.Execute(w, menuPage)
71}
72
73func getPage(w http.ResponseWriter, r *http.Request) {
74	vars := mux.Vars(r)
75	path := vars["path"]
76	path = strings.Replace(path, "%", "/", -1)
77	path = padArchiver.Storage + path
78
79	content, err := fileToHTML(path)
80	check(err)
81
82	var item ItemModel
83	item.Name = path
84	item.Content = template.HTML(content)
85
86	tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
87	tmpl.Execute(w, item)
88}