package pages import ( "fmt" "html/template" "net/http" "qurl/static" "qurl/storage" "qurl/qurl" ) type RootHandler struct { Storage storage.Storage index *static.StaticContent css *static.StaticContent favi *static.StaticContent usage *static.StaticContent submit *template.Template } func (ctx *RootHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fname := r.URL.Path switch fname { case "/index.html": fallthrough case "/": ctx.index.ServeHTTP(w, r) case "/submit.html": ctx.ServeSubmit(w, r) case "/qurl.css": ctx.css.ServeHTTP(w, r) case "/favicon.ico": ctx.favi.ServeHTTP(w, r) case "/api/usage.html": ctx.usage.ServeHTTP(w, r) case "/api/url": ctx.ServeAPI(w, r) default: id, err := qurl.FromString(fname[1:len(fname)]) if err != nil { http.Redirect(w, r, "/", http.StatusTemporaryRedirect) return } q, err := ctx.Storage.GetQURLByID(id) if err != nil { http.Error(w, fmt.Sprintf("Database error: %s", err.Error()), http.StatusInternalServerError) return } if q == nil { http.Redirect(w, r, "/", http.StatusTemporaryRedirect) return } http.Redirect(w, r, q.URL, http.StatusPermanentRedirect) } } func (ctx *RootHandler) Init() error { // Initialize the static content object for the index page index := &static.StaticContent{Content: "index.html"} err := index.Init() if err != nil { return err } ctx.index = index // Initialize the static content object for the css css := &static.StaticContent{Content: "qurl.css"} err = css.Init() if err != nil { return err } ctx.css = css // Initialize the static content object favicon favi := &static.StaticContent{Content: "favicon.ico"} err = favi.Init() if err != nil { return err } ctx.favi = favi // Initialize the api usage instructions usage := &static.StaticContent{Content: "usage.html"} err = usage.Init() if err != nil { return err } ctx.usage = usage // Initialize submit page template ctx.submit = template.New("submit.html") _, err = ctx.submit.Parse(string(static.Assets["submit.html"])) if err != nil { return err } return nil }