ictgj-voting/adminEndpoints.go

191 lines
5.5 KiB
Go

package main
import (
"net/http"
"github.com/gorilla/mux"
"github.com/gorilla/sessions"
)
func initAdminRequest(w http.ResponseWriter, req *http.Request) *pageData {
if site.DevMode {
w.Header().Set("Cache-Control", "no-cache")
}
p := new(pageData)
// Get session
var err error
var s *sessions.Session
if s, err = sessionStore.Get(req, site.SessionName); err != nil {
http.Error(w, err.Error(), 500)
return p
}
p.session = new(pageSession)
p.session.session = s
p.session.req = req
p.session.w = w
// First check if we're logged in
userEmail, _ := p.session.getStringValue("email")
// With a valid account
p.LoggedIn = dbIsValidUserEmail(userEmail)
p.Site = site
p.SubTitle = ""
p.Stylesheets = make([]string, 0, 0)
p.Stylesheets = append(p.Stylesheets, "/assets/css/pure-min.css")
p.Stylesheets = append(p.Stylesheets, "/assets/css/grids-responsive-min.css")
p.Stylesheets = append(p.Stylesheets, "/assets/font-awesome/css/font-awesome.min.css")
p.Stylesheets = append(p.Stylesheets, "/assets/css/gjvote.css")
p.Stylesheets = append(p.Stylesheets, "/assets/css/admin.css")
p.HeaderScripts = make([]string, 0, 0)
p.HeaderScripts = append(p.HeaderScripts, "/assets/js/snack-min.js")
p.Scripts = make([]string, 0, 0)
p.Scripts = append(p.Scripts, "/assets/js/admin.js")
p.FlashMessage, p.FlashClass = p.session.getFlashMessage()
if p.FlashClass == "" {
p.FlashClass = "hidden"
}
// Build the menu
if p.LoggedIn {
p.Menu = append(p.Menu, menuItem{"Votes", "/admin/votes", "fa-sticky-note"})
p.Menu = append(p.Menu, menuItem{"Teams", "/admin/teams", "fa-users"})
p.Menu = append(p.Menu, menuItem{"Games", "/admin/games", "fa-gamepad"})
p.BottomMenu = append(p.BottomMenu, menuItem{"Users", "/admin/users", "fa-user"})
p.BottomMenu = append(p.BottomMenu, menuItem{"Logout", "/admin/dologout", "fa-sign-out"})
}
return p
}
// handleAdmin
// Main admin handler, routes the request based on the category
func handleAdmin(w http.ResponseWriter, req *http.Request) {
page := initAdminRequest(w, req)
if !page.LoggedIn {
page.SubTitle = "Admin Login"
page.show("admin-login.html", w)
} else {
vars := mux.Vars(req)
adminCategory := vars["category"]
switch adminCategory {
case "users":
handleAdminUsers(w, req, page)
case "teams":
handleAdminTeams(w, req, page)
case "games":
handleAdminGames(w, req, page)
default:
page.show("admin-main.html", w)
}
}
}
// handleAdminDoLogin
// Verify the provided credentials, set up a cookie (if requested)
// and redirect back to /admin
func handleAdminDoLogin(w http.ResponseWriter, req *http.Request) {
page := initAdminRequest(w, req)
// Fetch the login credentials
email := req.FormValue("email")
password := req.FormValue("password")
if email != "" && password != "" {
if err := dbCheckCredentials(email, password); err != nil {
page.session.setFlashMessage("Invalid Login", "error")
} else {
page.session.setStringValue("email", email)
}
} else {
page.session.setFlashMessage("Invalid Login", "error")
}
redirect("/admin", w, req)
}
// handleAdminDoLogout
// Expire the session
func handleAdminDoLogout(w http.ResponseWriter, req *http.Request) {
page := initAdminRequest(w, req)
page.session.expireSession()
page.session.setFlashMessage("Logged Out", "success")
redirect("/admin", w, req)
}
// handleAdminUsers
func handleAdminUsers(w http.ResponseWriter, req *http.Request, page *pageData) {
vars := mux.Vars(req)
page.SubTitle = "Admin Users"
email := vars["id"]
if email == "new" {
switch vars["function"] {
case "save":
email = req.FormValue("email")
if dbIsValidUserEmail(email) {
// User already exists
page.session.setFlashMessage("A user with email address "+email+" already exists!", "error")
} else {
password := req.FormValue("password")
if err := dbUpdateUserPassword(email, string(password)); err != nil {
page.session.setFlashMessage(err.Error(), "error")
} else {
page.session.setFlashMessage("User "+email+" created!", "success")
}
}
redirect("/admin/users", w, req)
default:
page.SubTitle = "Add Admin User"
page.show("admin-adduser.html", w)
}
} else if email != "" {
switch vars["function"] {
case "save":
var err error
if dbIsValidUserEmail(email) {
password := req.FormValue("password")
if password != "" {
if err = dbUpdateUserPassword(email, password); err != nil {
page.session.setFlashMessage(err.Error(), "error")
} else {
page.session.setFlashMessage("User "+email+" created!", "success")
}
}
redirect("/admin/users", w, req)
}
case "delete":
var err error
if dbIsValidUserEmail(email) {
if err = dbDeleteUser(email); err != nil {
page.session.setFlashMessage(err.Error(), "error")
} else {
page.session.setFlashMessage("User "+email+" deleted!", "success")
}
}
redirect("/admin/users", w, req)
default:
page.SubTitle = "Edit Admin User"
if !dbIsValidUserEmail(email) {
page.session.setFlashMessage("Couldn't find the requested user, please try again.", "error")
redirect("/admin/users", w, req)
}
page.TemplateData = email
page.show("admin-edituser.html", w)
}
} else {
type usersPageData struct {
Users []string
}
page.TemplateData = usersPageData{Users: dbGetAllUsers()}
page.SubTitle = "Admin Users"
page.show("admin-users.html", w)
}
}
// handleAdminTeams
func handleAdminTeams(w http.ResponseWriter, req *http.Request, page *pageData) {
}
// handleAdminGames
func handleAdminGames(w http.ResponseWriter, req *http.Request, page *pageData) {
}