Page is done
This commit is contained in:
@@ -58,6 +58,7 @@ func listFiltered(category model.PageCategory) wrouter.FunctionHandlerFunc {
|
||||
return true
|
||||
}
|
||||
|
||||
vm.ActiveTag = *tag
|
||||
vm.Headers, err = model.ListHeadersByTag(category.Key, tag)
|
||||
} else {
|
||||
vm.Headers, err = model.ListHeadersByCategory(category.Key)
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.aiterp.net/gisle/wrouter/response"
|
||||
|
||||
"git.aiterp.net/AiteRP/aitestory/model"
|
||||
"git.aiterp.net/AiteRP/aitestory/viewmodel"
|
||||
|
||||
@@ -99,22 +102,188 @@ func pageCreate(path string, w http.ResponseWriter, req *http.Request, user *aut
|
||||
return true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Losing input makes the user sad, let's see to it
|
||||
// that it doesn't happen.
|
||||
req.ParseForm()
|
||||
pc.Page.ParseForm(req.Form)
|
||||
pc.TagInput = req.Form.Get("tags")
|
||||
}
|
||||
|
||||
view.Render(w, "create", 200, pc)
|
||||
view.Render(w, "page/create", 200, pc)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func pageView(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
|
||||
if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") > len(path) {
|
||||
return false
|
||||
}
|
||||
|
||||
page, err := model.FindPage(req.URL.Path[len(path):])
|
||||
if err != nil {
|
||||
response.Text(w, 500, err.Error())
|
||||
return true
|
||||
} else if page == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
pv := viewmodel.PageView{}
|
||||
pv.Page = page
|
||||
pv.Setup(user)
|
||||
|
||||
view.Render(w, "page/view", 200, pv)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func pageDelete(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
|
||||
if (req.Method != "GET" && req.Method != "POST") || strings.LastIndex(req.URL.Path, "/") > len(path) {
|
||||
return false
|
||||
}
|
||||
|
||||
page, err := model.FindPage(req.URL.Path[len(path):])
|
||||
if err != nil {
|
||||
response.Text(w, 500, err.Error())
|
||||
return true
|
||||
} else if page == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
pv := viewmodel.PageView{}
|
||||
pv.Page = page
|
||||
pv.Setup(user)
|
||||
|
||||
if user == nil || user.FullID() != page.Author {
|
||||
view.Render(w, "message/error-access", http.StatusForbidden, path)
|
||||
return true
|
||||
}
|
||||
|
||||
if req.Method == "POST" {
|
||||
req.ParseForm()
|
||||
|
||||
// Catch sneaky shenanigans
|
||||
if req.Form.Get("aft") != user.Session.ID {
|
||||
view.Render(w, "message/error-forgery", http.StatusForbidden, path)
|
||||
return true
|
||||
}
|
||||
|
||||
// Thy will be done
|
||||
err := page.Delete()
|
||||
if err != nil {
|
||||
// It wasn't done D:
|
||||
view.Render(w, "message/error-internal", http.StatusInternalServerError, err)
|
||||
return true
|
||||
}
|
||||
|
||||
// It has been done
|
||||
view.Render(w, "message/page-deleted", 200, pv)
|
||||
return true
|
||||
}
|
||||
|
||||
view.Render(w, "page/delete", 200, pv)
|
||||
return true
|
||||
}
|
||||
|
||||
func pageEdit(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
|
||||
if (req.Method != "GET" && req.Method != "POST") || strings.LastIndex(req.URL.Path, "/") > len(path) {
|
||||
return false
|
||||
}
|
||||
|
||||
page, err := model.FindPage(req.URL.Path[len(path):])
|
||||
if err != nil {
|
||||
response.Text(w, 500, err.Error())
|
||||
return true
|
||||
} else if page == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
pf := viewmodel.PageForm{}
|
||||
pf.Setup(user)
|
||||
|
||||
pf.Operation = "Edit"
|
||||
pf.Page = *page
|
||||
|
||||
if user == nil {
|
||||
pf.Error = "You are not logged in"
|
||||
}
|
||||
|
||||
if user != nil && user.FullID() != page.Author {
|
||||
pf.Error = "Permission denied"
|
||||
}
|
||||
|
||||
if req.Method == "POST" {
|
||||
req.ParseForm()
|
||||
|
||||
errs := pf.Page.ParseForm(req.Form)
|
||||
if len(errs) > 0 {
|
||||
pf.Error = "Validation failed: " + errs[0].Error()
|
||||
}
|
||||
|
||||
if len(errs) == 0 && pf.Error == "" {
|
||||
pf.TagInput = req.Form.Get("tags")
|
||||
pf.Page.Tags = make([]model.Tag, 0, strings.Count(pf.TagInput, "\n"))
|
||||
tagLines := strings.Split(pf.TagInput, "\n")
|
||||
for _, line := range tagLines {
|
||||
var tagType, tagName string
|
||||
|
||||
// Skip empty lines, and allow some accidental letters
|
||||
if len(line) < 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
// Parse tokens
|
||||
tokens := strings.SplitN(line, ":", 2)
|
||||
if len(tokens) == 2 {
|
||||
tagType = strings.Trim(tokens[0], " \t\r")
|
||||
tagName = strings.Trim(tokens[1], " \t\r")
|
||||
} else {
|
||||
tagType = "*" // Permit untyped tags if it exists.
|
||||
tagName = strings.Trim(tokens[0], " \t\r")
|
||||
}
|
||||
|
||||
// Grab the tag
|
||||
tag, err := model.EnsureTag(tagType, tagName)
|
||||
if err != nil {
|
||||
pf.Error = "Check your tags: " + err.Error()
|
||||
break
|
||||
}
|
||||
|
||||
// Take a copy of it
|
||||
pf.Page.Tags = append(pf.Page.Tags, *tag)
|
||||
}
|
||||
|
||||
if pf.Error == "" {
|
||||
pf.Page.EditDate = time.Now()
|
||||
|
||||
err := pf.Page.Update()
|
||||
if err != nil {
|
||||
pf.Error = "Edit failed: " + err.Error()
|
||||
} else {
|
||||
http.Redirect(w, req, "/page/"+pf.Page.ID, 302)
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, tag := range page.Tags {
|
||||
line := fmt.Sprintf("%s: %s\n", tag.Type, tag.Name)
|
||||
|
||||
if page.PrimaryTag().ID == tag.ID {
|
||||
pf.TagInput = line + pf.TagInput
|
||||
} else {
|
||||
pf.TagInput += line
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
view.Render(w, "page/edit", 200, pf)
|
||||
return true
|
||||
}
|
||||
|
||||
func init() {
|
||||
PageController.Function("/create", pageCreate)
|
||||
PageController.Function("/edit/", pageEdit)
|
||||
PageController.Function("/delete/", pageDelete)
|
||||
PageController.Function("/", pageView)
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ func userLogin(path string, w http.ResponseWriter, req *http.Request, user *auth
|
||||
}
|
||||
|
||||
ul.Setup(user)
|
||||
view.Render(w, "login", 200, ul)
|
||||
view.Render(w, "user/login", 200, ul)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user