110 lines
2.1 KiB
Go
110 lines
2.1 KiB
Go
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
|
|
}
|