package space
import (
"fmt"
"log"
"net/http"
"strings"
"git.sr.ht/~evanj/cms/internal/c"
"git.sr.ht/~evanj/cms/internal/m/space"
"git.sr.ht/~evanj/cms/internal/m/user"
"git.sr.ht/~evanj/cms/internal/s/tmpl"
)
var (
spaceHTML = tmpl.MustParse("html/space.html")
)
type Space struct {
*c.Controller
log *log.Logger
db dber
}
type dber interface {
UserGetFromToken(token string) (user.User, error)
SpaceNew(user user.User, name, desc string) (space.Space, error)
SpaceGet(user user.User, spaceID string) (space.Space, error)
}
func New(log *log.Logger, db dber) *Space {
return &Space{
c.New(log, db),
log,
db,
}
}
func (s *Space) serve(w http.ResponseWriter, r *http.Request, spaceID string) {
user, err := s.GetCookieUser(w, r)
if err != nil {
s.Error(w, r, http.StatusBadRequest, "must be logged in to create space")
return
}
space, err := s.db.SpaceGet(user, spaceID)
if err != nil {
s.Error(w, r, http.StatusNotFound, "failed to find space")
return
}
s.HTML(w, r, spaceHTML, map[string]interface{}{
"User": user,
"Space": space,
})
}
func (s *Space) create(w http.ResponseWriter, r *http.Request) {
name := r.FormValue("name")
desc := r.FormValue("desc")
user, err := s.GetCookieUser(w, r)
if err != nil {
s.Error(w, r, http.StatusBadRequest, "must be logged in to create space")
return
}
space, err := s.db.SpaceNew(user, name, desc)
if err != nil {
s.log.Println(err)
s.Error(w, r, http.StatusBadRequest, err.Error())
return
}
url := fmt.Sprintf("/space/%s", space.ID())
s.log.Println("successfully created new space for user", user.Name(), "redirecting to", url)
http.Redirect(w, r, url, http.StatusTemporaryRedirect)
}
func (s *Space) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/space/new":
s.create(w, r)
return
}
parts := strings.Split(r.URL.Path, "/")
if len(parts) > 2 {
s.serve(w, r, parts[2])
return
}
http.NotFound(w, r)
}