a simple url shortener in Go (check it out at qurl.org)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

84 lines
1.7 KiB

package pages
import (
"bytes"
"fmt"
"html/template"
"net/http"
"qurl/qurl"
"qurl/static"
"qurl/storage"
"time"
)
type SubmitHandler struct {
Storage storage.Storage
template *template.Template
}
type submitPage struct {
Message string
URL string
}
func (ctx *SubmitHandler) Init() error {
ctx.template = template.New("submit.html")
_, err := ctx.template.Parse(string(static.Assets["submit.html"]))
if err != nil {
return err
}
return nil
}
func (ctx *SubmitHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var pg submitPage
u := r.FormValue("url")
if u == "" {
pg.Message = "Not a valid URL."
} else {
q, err := ctx.Storage.GetQURLByURL(u)
if err != nil {
http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
http.StatusInternalServerError)
return
}
if q != nil {
pg.Message = "URL already exists."
pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
} else {
q = &qurl.QURL{
URL: u,
Created: time.Now(),
}
err := q.CheckValid()
if err != nil {
pg.Message = err.Error()
} else {
err := ctx.Storage.AddQURL(q)
if err != nil {
http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
http.StatusInternalServerError)
return
}
pg.Message = "URL Added."
pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
}
}
}
var buf bytes.Buffer
err := ctx.template.Execute(&buf, pg)
if err != nil {
http.Error(w, fmt.Sprintf("Template execute error: %s", err.Error()),
http.StatusInternalServerError)
return
}
w.Header().Set("Content-Length", fmt.Sprintf("%d", buf.Len()))
w.Header().Set("Content-Type", "text/html")
w.Write(buf.Bytes())
}