package user import ( "log" "net/http" "github.com/go-playground/validator/v10" "gitlab.com/alexkavon/newsstand/src/server" "gitlab.com/alexkavon/newsstand/src/sessions" ) var Routes = server.Routes{ server.Route{ Name: "Create", Method: "GET", Path: "/u/create", HandlerFunc: Create, Middlewares: server.NewMiddlewares(sessions.GuestSession), }, server.Route{ Name: "Store", Method: "POST", Path: "/u", HandlerFunc: Store, Middlewares: server.NewMiddlewares(sessions.GuestSession), }, server.Route{ Name: "LoginForm", Method: "GET", Path: "/u/auth", HandlerFunc: LoginForm, Middlewares: server.NewMiddlewares(sessions.GuestSession), }, server.Route{ Name: "Authenticate", Method: "POST", Path: "/u/auth", HandlerFunc: Login, Middlewares: server.NewMiddlewares(sessions.GuestSession), }, server.Route{ Name: "Logout", Method: "GET", Path: "/u/logout", HandlerFunc: Logout, Middlewares: server.NewMiddlewares(sessions.AuthSession), }, server.Route{ Name: "Me", Method: "GET", Path: "/u/me", HandlerFunc: Show, Middlewares: server.NewMiddlewares(sessions.AuthSession), }, } func Create(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { s.Ui.Render(w, r, "user/create", nil) } } func Store(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { r.ParseForm() user := &User{ Db: s.Db, Username: r.PostFormValue("username"), Secret: r.PostFormValue("secret"), Email: r.PostFormValue("email"), } // Validate User Input v := validator.New() err := v.Struct(user) if err != nil { log.Println("Validator failed", err.(validator.ValidationErrors)) } // Hash secret err = user.HashSecret() if err != nil { log.Println("Hash failure", err) } // Store user err = user.Insert() if err != nil { log.Println("Insert Error", err) } // Send email validation // Create cookie session sessions.NewSession(w, sessions.SessionValues{"uid": user.Id, "username": user.Username}) // Redirect to user profile http.Redirect(w, r, "/u/me", http.StatusSeeOther) } } func LoginForm(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { s.Ui.Render(w, r, "user/login", nil) } } func Login(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // look up the user from the db // hash the form secret // compare form hash to db hash // login or dont } } func Logout(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if session := r.Context().Value(sessions.SessionCtxKey("session")); session != nil { session.(*sessions.Session).Destroy(w) } http.Redirect(w, r, "/u/auth", http.StatusSeeOther) } } func Show(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { pageData := map[string]any{"message": "Congrats on getting this far!"} s.Ui.Render(w, r, "user/me", pageData) } }