package controllers
import (
"errors"
"net/http"
"strings"
"theskyscape.com/repo/skykit"
"theskyscape.com/repo/skylinks/models"
)
func Redirects() (string, skykit.Handler) {
return "redirects", &RedirectController{}
}
type RedirectController struct {
skykit.Controller
}
func (c *RedirectController) Setup(app *skykit.Application) {
c.Controller.Setup(app)
http.HandleFunc("/{short}", c.handleRedirect)
}
func (c RedirectController) Handle(r *http.Request) skykit.Handler {
c.Request = r
return &c
}
func (c *RedirectController) handleRedirect(w http.ResponseWriter, r *http.Request) {
code := strings.ToLower(strings.TrimSpace(r.PathValue("short")))
if code == "" {
http.NotFound(w, r)
return
}
link, err := models.Links.First("WHERE ShortCode = ?", code)
if err != nil {
if errors.Is(err, skykit.ErrNotFound) {
http.NotFound(w, r)
return
}
http.Error(w, "Unable to lookup link", http.StatusInternalServerError)
return
}
http.Redirect(w, r, link.TargetURL, http.StatusFound)
}