155 lines
3.7 KiB
Go
155 lines
3.7 KiB
Go
package controllers
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"git.kealoha.me/lks/lenslocked/models"
|
|
"git.kealoha.me/lks/lenslocked/templates"
|
|
"git.kealoha.me/lks/lenslocked/views"
|
|
)
|
|
|
|
type Users struct {
|
|
Templates struct {
|
|
Signup Template
|
|
Signin Template
|
|
}
|
|
UserService *models.UserService
|
|
SessionService *models.SessionService
|
|
}
|
|
|
|
func (u Users) GetSignup(w http.ResponseWriter, r *http.Request) {
|
|
var data struct {
|
|
Email string
|
|
}
|
|
data.Email = r.FormValue("email")
|
|
u.Templates.Signup.Execute(w, r, data)
|
|
}
|
|
|
|
func (u Users) PostSignup(w http.ResponseWriter, r *http.Request) {
|
|
email := r.FormValue("email")
|
|
password := r.FormValue("password")
|
|
user, err := u.UserService.Create(email, password)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
session, err := u.SessionService.Create(user.ID)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Redirect(w, r, "/signin", http.StatusFound)
|
|
return
|
|
}
|
|
|
|
cookie := http.Cookie{
|
|
Name: "session",
|
|
Value: session.Token,
|
|
Path: "/",
|
|
HttpOnly: true,
|
|
}
|
|
http.SetCookie(w, &cookie)
|
|
|
|
http.Redirect(w, r, "/users/me", http.StatusFound)
|
|
}
|
|
|
|
func (u Users) GetSignin(w http.ResponseWriter, r *http.Request) {
|
|
var data struct {
|
|
Email string
|
|
}
|
|
data.Email = r.FormValue("email")
|
|
u.Templates.Signin.Execute(w, r, data)
|
|
}
|
|
func (u Users) PostSignin(w http.ResponseWriter, r *http.Request) {
|
|
var data struct {
|
|
Email string
|
|
Password string
|
|
}
|
|
data.Email = r.FormValue("email")
|
|
data.Password = r.FormValue("password")
|
|
user, err := u.UserService.Authenticate(data.Email, data.Password)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Error(w, "Something went wrong.", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
session, err := u.SessionService.Create(user.ID)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
cookie := http.Cookie{
|
|
Name: "session",
|
|
Value: session.Token,
|
|
Path: "/",
|
|
HttpOnly: true,
|
|
}
|
|
http.SetCookie(w, &cookie)
|
|
|
|
fmt.Fprintf(w, "User authenticated: %+v", user)
|
|
}
|
|
|
|
func (u Users) GetSignout(w http.ResponseWriter, r *http.Request) {
|
|
sessionCookie, err := r.Cookie("session")
|
|
if err != nil {
|
|
http.Redirect(w, r, "/signin", http.StatusFound)
|
|
return
|
|
}
|
|
err = u.SessionService.Delete(sessionCookie.Value)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
c := http.Cookie{
|
|
Name: "session",
|
|
MaxAge: -1,
|
|
}
|
|
http.SetCookie(w, &c)
|
|
http.Redirect(w, r, "/signin", http.StatusFound)
|
|
}
|
|
|
|
func (u Users) CurrentUser(w http.ResponseWriter, r *http.Request) {
|
|
seshCookie, err := r.Cookie("session")
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Redirect(w, r, "/signin", http.StatusFound)
|
|
return
|
|
}
|
|
user, err := u.SessionService.User(seshCookie.Value)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
http.Redirect(w, r, "/signin", http.StatusFound)
|
|
return
|
|
}
|
|
fmt.Fprintf(w, "Current user: %s\n", user.Email)
|
|
}
|
|
|
|
func WithTemplates(user_service *models.UserService, session_service *models.SessionService, signup Template, signin Template) Users {
|
|
u := Users{}
|
|
u.Templates.Signup = signup
|
|
u.Templates.Signin = signin
|
|
u.UserService = user_service
|
|
u.SessionService = session_service
|
|
return u
|
|
}
|
|
|
|
func Default(user_service *models.UserService, session_service *models.SessionService) Users {
|
|
signup_tpl := views.Must(views.FromFS(templates.FS, "signup.gohtml", "tailwind.gohtml"))
|
|
signin_tpl := views.Must(views.FromFS(templates.FS, "signin.gohtml", "tailwind.gohtml"))
|
|
|
|
err := signup_tpl.TestTemplate(nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = signin_tpl.TestTemplate(nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return WithTemplates(user_service, session_service, signup_tpl, signin_tpl)
|
|
}
|