redirect.go
go
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)
}
No comments yet.