Page is done

This commit is contained in:
2017-10-08 15:18:38 +02:00
parent d15e4e967e
commit f471aed610
18 changed files with 453 additions and 43 deletions
+1
View File
@@ -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)
+170 -1
View File
@@ -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)
}
+1 -1
View File
@@ -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
}