package controllers
import (
"net/http"
"theskyscape.com/repo/skykit"
"theskyscape.com/repo/skykit/example/models"
)
func Home() (string, skykit.Handler) {
return "home", &HomeController{}
}
type HomeController struct {
skykit.Controller
}
func (c *HomeController) Setup(app *skykit.Application) {
c.Controller.Setup(app)
http.Handle("/", c.Serve("homepage.html", nil))
http.Handle("POST /count", c.Protect(c.increment, nil))
// Example of a protected route that requires authentication
http.Handle("GET /profile", c.Serve("profile.html", c.requireAuth))
}
// requireAuth is middleware that requires authentication
func (c *HomeController) requireAuth(app *skykit.Application, w http.ResponseWriter, r *http.Request) bool {
user, err := c.Users.Authenticate(r)
if err != nil || user == nil {
// Redirect to signin
c.Redirect(w, r, "/auth/signin")
return false
}
return true
}
func (c HomeController) Handle(r *http.Request) skykit.Handler {
c.Request = r
return &c
}
func (c *HomeController) CurrentCount() int {
counter, err := models.Counters.Get("main")
if err != nil {
counter, err = models.Counters.Insert(&models.Counter{
Model: skykit.Model{ID: "main"},
Count: 0,
})
}
if err != nil {
return 0
}
return counter.Count
}
func (c *HomeController) increment(w http.ResponseWriter, r *http.Request) {
counter, err := models.Counters.Get("main")
if err != nil {
if counter, err = models.Counters.Insert(&models.Counter{
Model: skykit.Model{ID: "main"},
Count: 0,
}); err != nil {
w.Write([]byte("Failed to get or insert counter"))
return
}
}
counter.Count++
go models.Counters.Update(counter)
c.Render(w, r, "counter", nil)
}