package user
import (
"log"
"net/http"
"git.sr.ht/~evanj/cms/internal/c"
"git.sr.ht/~evanj/cms/internal/m/user"
"git.sr.ht/~evanj/cms/internal/s/tmpl"
)
var (
indexHTML = tmpl.MustParse("html/index.html")
)
type User struct {
*c.Controller
log *log.Logger
db dber
}
type dber interface {
UserNew(username, password, verifyPassword string) (user.User, error)
UserGet(username, password string) (user.User, error)
UserGetFromToken(token string) (user.User, error)
}
func New(log *log.Logger, db dber) *User {
return &User{
c.New(log, db),
log,
db,
}
}
func (l *User) logout(w http.ResponseWriter, r *http.Request) {
l.SetCookieUser(w, r, nil)
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
}
func (l *User) login(w http.ResponseWriter, r *http.Request) {
username := r.FormValue("username")
password := r.FormValue("password")
user, err := l.db.UserGet(username, password)
if err != nil {
l.Error(w, r, http.StatusBadRequest, "incorrect user credentials")
return
}
l.SetCookieUser(w, r, user)
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
}
func (l *User) signup(w http.ResponseWriter, r *http.Request) {
username := r.FormValue("username")
password := r.FormValue("password")
verify := r.FormValue("verify")
user, err := l.db.UserNew(username, password, verify)
if err != nil {
l.log.Println(err)
l.Error(w, r, http.StatusBadRequest, "invalid user credentials")
return
}
l.SetCookieUser(w, r, user)
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
}
func (l *User) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/":
user, _ := l.GetCookieUser(w, r)
l.HTML(w, r, indexHTML, map[string]interface{}{
"User": user,
})
return
case "/user/login":
l.login(w, r)
return
case "/user/logout":
l.logout(w, r)
return
case "/user/signup":
l.signup(w, r)
return
}
http.NotFound(w, r)
}