ribbit/endpoints_user.go

142 lines
3.0 KiB
Go

package main
import (
"errors"
"fmt"
"net/http"
"strings"
"github.com/gorilla/mux"
)
func handleUserRequest(w http.ResponseWriter, req *http.Request) {
page := initPageData(w, req)
vars := mux.Vars(req)
f, fOk := vars["function"]
if fOk && f == "login" {
handleUserLogin(page)
return
}
if !page.LoggedIn {
page.SubTitle = "ribbit login"
page.show("login.html")
return
}
switch f {
case "feeds":
handleUserFeeds(page)
case "updatesubscriptions":
handleUpdateUserSubs(page)
default:
handleUserDashboard(page)
}
}
func handleUserLoginForm(page *pageData) {
page.SubTitle = "ribbit login"
page.show("login.html")
}
func handleUserLogin(page *pageData) {
var err error
var u *User
if page.LoggedIn {
redirect("/", page.session.w, page.session.req)
}
email := page.session.req.FormValue("email")
if u, err = m.GetUserByEmail(email); err != nil {
page.session.setFlashMessage("Invalid Login", "error")
redirect("/", page.session.w, page.session.req)
return
}
password := page.session.req.FormValue("password")
fmt.Println("Hitting func")
if err := doLogin(u.Uuid, password); err != nil {
fmt.Println("Login Failure: ", err.Error())
page.session.setFlashMessage("Invalid Login", "error")
} else {
page.session.setStringValue("id", u.Uuid)
}
redirect("/", page.session.w, page.session.req)
}
// doLogin attempts to log in with the given email/password
// If it can't, it returns an error
func doLogin(uid, password string) error {
if strings.TrimSpace(uid) != "" && strings.TrimSpace(password) != "" {
return m.checkCredentials(uid, password)
}
return errors.New("Invalid Credentials")
}
func handleUserDashboard(page *pageData) {
page.SubTitle = "dashboard"
var err error
id, err := page.session.getStringValue("id")
if err != nil {
userError(page.session.w)
return
}
page.TemplateData, err = m.GetUser(id)
if err != nil {
userError(page.session.w)
return
}
page.show("user_dashboard.html")
}
func handleUserFeeds(page *pageData) {
page.SubTitle = "feeds"
type feedsPageData struct {
User *User
FeedSources []FeedSource
}
fpd := new(feedsPageData)
fpd.FeedSources = m.FeedSources
id, err := page.session.getStringValue("id")
if err != nil {
userError(page.session.w)
return
}
fpd.User, err = m.GetUser(id)
if err != nil {
userError(page.session.w)
return
}
page.TemplateData = fpd
page.show("user_feeds.html")
}
func handleUpdateUserSubs(page *pageData) {
subs := page.session.req.FormValue("user_feeds")
fmt.Println(subs)
subPts := strings.Split(subs, ",")
var userSubs []string
for i := range subPts {
subPts[i] = strings.TrimSpace(subPts[i])
if subPts[i] != "" {
userSubs = append(userSubs, subPts[i])
}
}
id, err := page.session.getStringValue("id")
if err != nil {
userError(page.session.w)
return
}
var u *User
u, err = m.GetUser(id)
u.SubSlugs = userSubs
m.SaveUser(u)
for k := range m.Users {
if m.Users[k].Uuid == id {
m.Users[k].SubSlugs = userSubs
}
}
redirect("/user/dashboard", page.session.w, page.session.req)
}