1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-13 22:00:27 +00:00
mycorrhiza/main.go

109 lines
2.9 KiB
Go
Raw Normal View History

2020-06-12 16:22:02 +00:00
package main
import (
"fmt"
2020-06-13 11:18:11 +00:00
"log"
"net/http"
2020-06-12 16:22:02 +00:00
"os"
"path/filepath"
2020-06-13 11:18:11 +00:00
"time"
2020-06-19 14:30:19 +00:00
2020-06-23 17:53:05 +00:00
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/fs"
2020-07-03 19:20:56 +00:00
"github.com/bouncepaw/mycorrhiza/mycelium"
2020-06-19 14:30:19 +00:00
"github.com/gorilla/mux"
2020-06-12 16:22:02 +00:00
)
// RevInMap finds value of `rev` (the one from URL queries like) in the passed map that is usually got from `mux.Vars(*http.Request)`.
// If there is no `rev`, return "0".
func RevInMap(m map[string]string) string {
if id, ok := m["rev"]; ok {
return id
}
return "0"
}
func IdempotentRouterBoiler(router *mux.Router, action string, handler func(w http.ResponseWriter, rq *http.Request)) {
router.
Queries("action", action, "rev", cfg.RevQuery).
Path(cfg.MyceliumUrl + cfg.HyphaUrl).
HandlerFunc(handler)
router.
Queries("action", action).
Path(cfg.MyceliumUrl + cfg.HyphaUrl).
HandlerFunc(handler)
router.
Queries("action", action, "rev", cfg.RevQuery).
Path(cfg.HyphaUrl).
HandlerFunc(handler)
router.
Queries("action", action).
Path(cfg.HyphaUrl).
HandlerFunc(handler)
}
2020-06-12 16:22:02 +00:00
func main() {
if len(os.Args) == 1 {
panic("Expected a root wiki pages directory")
}
2020-06-23 17:53:05 +00:00
wikiDir, err := filepath.Abs(os.Args[1])
2020-06-12 16:22:02 +00:00
if err != nil {
panic(err)
}
2020-06-17 09:40:51 +00:00
log.Println("Welcome to MycorrhizaWiki α")
2020-06-23 17:53:05 +00:00
cfg.InitConfig(wikiDir)
2020-06-17 09:40:51 +00:00
log.Println("Indexing hyphae...")
2020-07-03 19:20:56 +00:00
mycelium.Init()
fs.InitStorage()
2020-06-12 16:22:02 +00:00
// Start server code. See handlers.go for handlers' implementations.
2020-06-13 11:18:11 +00:00
r := mux.NewRouter()
r.HandleFunc("/favicon.ico", func(w http.ResponseWriter, rq *http.Request) {
http.ServeFile(w, rq, filepath.Join(filepath.Dir(cfg.WikiDir), "favicon.ico"))
})
IdempotentRouterBoiler(r, "binary", HandlerBinary)
IdempotentRouterBoiler(r, "raw", HandlerRaw)
IdempotentRouterBoiler(r, "zen", HandlerZen)
IdempotentRouterBoiler(r, "view", HandlerView)
r.Queries("action", "edit").Path(cfg.MyceliumUrl + cfg.HyphaUrl).
HandlerFunc(HandlerEdit)
2020-06-25 20:31:58 +00:00
r.Queries("action", "edit").Path(cfg.HyphaUrl).
HandlerFunc(HandlerEdit)
r.Queries("action", "update").Path(cfg.MyceliumUrl + cfg.HyphaUrl).
Methods("POST").HandlerFunc(HandlerUpdate)
r.Queries("action", "update").Path(cfg.HyphaUrl).
Methods("POST").HandlerFunc(HandlerUpdate)
2020-07-03 19:20:56 +00:00
r.HandleFunc(cfg.MyceliumUrl+cfg.HyphaUrl, HandlerView)
r.HandleFunc(cfg.HyphaUrl, HandlerView)
// Debug page that renders all hyphae.
// TODO: make it redirect to home page.
// TODO: make a home page.
r.HandleFunc("/", func(w http.ResponseWriter, rq *http.Request) {
2020-06-13 11:18:11 +00:00
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, `
<p>Check out <a href="/Fruit">Fruit</a> maybe.</p>
<p><strong>TODO:</strong> make this page usable</p>
`)
2020-06-13 11:18:11 +00:00
})
2020-06-13 11:18:11 +00:00
http.Handle("/", r)
srv := &http.Server{
Handler: r,
2020-06-23 17:53:05 +00:00
Addr: cfg.Address,
2020-06-13 11:18:11 +00:00
// Good practice: enforce timeouts for servers you create!
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
log.Fatal(srv.ListenAndServe())
2020-06-12 16:22:02 +00:00
}