Massive overhaul, fixing menus and changing template engine. Added /month/ and /author/ filters

This commit is contained in:
2017-10-29 17:41:40 +01:00
parent b05f53308e
commit fb9e43ba12
44 changed files with 862 additions and 519 deletions
+87 -7
View File
@@ -4,6 +4,7 @@ import (
"fmt"
"net/http"
"strings"
"time"
"git.aiterp.net/gisle/wrouter/response"
@@ -24,10 +25,10 @@ func listIndex(path string, w http.ResponseWriter, req *http.Request, user *auth
return false
}
vm := viewmodel.PageList{}
vm := viewmodel.IndexList{}
vm.Headers, err = model.ListHeaders()
vm.Categories = model.PageCategories
vm.Setup(user)
vm.Setup(user, req.URL.Path, "Index")
if err != nil {
response.Text(w, 500, err.Error())
@@ -49,7 +50,7 @@ func listFiltered(category model.PageCategory) wrouter.FunctionHandlerFunc {
tagName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1)
vm := viewmodel.PageList{}
vm := viewmodel.IndexList{}
if tagName != "" {
tag, err := model.FindTag("name", tagName, "")
@@ -66,7 +67,7 @@ func listFiltered(category model.PageCategory) wrouter.FunctionHandlerFunc {
vm.Categories = model.PageCategories
vm.ActiveCategory = category
vm.Setup(user)
vm.Setup(user, path, category.Plural)
if err != nil {
response.Text(w, 500, err.Error())
@@ -89,7 +90,7 @@ func listTagged(tagType string) wrouter.FunctionHandlerFunc {
tagName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1)
vm := viewmodel.PageList{}
vm := viewmodel.IndexList{}
if tagName == "" {
return false
@@ -105,7 +106,7 @@ func listTagged(tagType string) wrouter.FunctionHandlerFunc {
vm.Headers, err = model.ListHeadersByTag("", tag)
vm.Categories = model.PageCategories
vm.Setup(user)
vm.Setup(user, tag.Path(), tag.Name)
if err != nil {
response.Text(w, 500, err.Error())
@@ -118,11 +119,90 @@ func listTagged(tagType string) wrouter.FunctionHandlerFunc {
}
}
func tagList(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
//var err error
if (req.Method != "GET" && req.Method != "POST") || len(req.URL.Path) > len(path) {
return false
}
tl := viewmodel.IndexTags{}
tl.Tags, _ = model.ListTags()
tl.Setup(user, path)
view.Render(w, "tags", 200, tl)
return true
}
func listAuthor(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
var err error
if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) {
return false
}
authorName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1)
vm := viewmodel.IndexList{}
vm.ActiveAuthor = authorName
vm.Headers, err = model.ListHeadersByAuthor(authorName)
if err != nil {
response.Text(w, 500, err.Error())
return true
}
if len(vm.Headers) > 0 {
authorName = vm.Headers[0].Author
}
vm.Categories = model.PageCategories
vm.Setup(user, "/author/"+authorName, authorName)
view.Render(w, "index", 200, vm)
return true
}
func listDate(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
var err error
if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) {
return false
}
date, err := time.Parse("2006-01", req.URL.Path[len(path):])
if err != nil {
response.Text(w, 400, "Invalid date")
return true
}
vm := viewmodel.IndexList{}
vm.ActiveDate = date.Format("January 2006")
vm.ActiveDatePath = "/month/" + date.Format("2006-01")
vm.Headers, err = model.ListHeadersByMonth(date.Year(), int(date.Month()))
if err != nil {
response.Text(w, 500, err.Error())
return true
}
vm.Categories = model.PageCategories
vm.Setup(user, "/month/"+date.Format("2006-01"), vm.ActiveDate)
view.Render(w, "index", 200, vm)
return true
}
func init() {
ListController.Function("/", listIndex)
ListController.Function("/tags/", tagList)
ListController.Function("/author/", listAuthor)
ListController.Function("/month/", listDate)
for _, category := range model.PageCategories {
ListController.Function(fmt.Sprintf("/%s/", strings.ToLower(category.Plural)), listFiltered(category))
ListController.Function(category.Path, listFiltered(category))
}
for _, tagType := range model.TagTypes {
+32 -12
View File
@@ -25,9 +25,8 @@ func pageCreate(path string, w http.ResponseWriter, req *http.Request, user *aut
return false
}
pc := viewmodel.PageForm{}
pc := viewmodel.PageCreate{}
pc.Setup(user)
pc.Operation = "Create"
// Make sure the user is logged in
if user == nil {
@@ -110,7 +109,7 @@ func pageCreate(path string, w http.ResponseWriter, req *http.Request, user *aut
pc.TagInput = req.Form.Get("tags")
}
view.Render(w, "page/create", 200, pc)
view.Render(w, "create", 200, pc)
return true
}
@@ -137,6 +136,28 @@ func pageView(path string, w http.ResponseWriter, req *http.Request, user *auth.
return true
}
func pageSource(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.PageSource{}
pv.Page = page
pv.Setup(user)
view.Render(w, "page/source", 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
@@ -150,12 +171,12 @@ func pageDelete(path string, w http.ResponseWriter, req *http.Request, user *aut
return false
}
pv := viewmodel.PageView{}
pv := viewmodel.PageDelete{}
pv.Page = page
pv.Setup(user)
if user == nil || user.FullID() != page.Author {
view.Render(w, "message/error-access", http.StatusForbidden, path)
view.Render(w, "message", http.StatusForbidden, viewmodel.NewMessage(user, "Access Denied", true, "You are not allowed to delete this page."))
return true
}
@@ -164,7 +185,7 @@ func pageDelete(path string, w http.ResponseWriter, req *http.Request, user *aut
// Catch sneaky shenanigans
if req.Form.Get("aft") != user.Session.ID {
view.Render(w, "message/error-forgery", http.StatusForbidden, path)
view.Render(w, "message", http.StatusForbidden, viewmodel.NewMessage(user, "Forgery Detected", true, "The server thinks something nasty is afoot. Try again if it is your page, and prod me on IRC if it still doesn't work."))
return true
}
@@ -172,12 +193,12 @@ func pageDelete(path string, w http.ResponseWriter, req *http.Request, user *aut
err := page.Delete()
if err != nil {
// It wasn't done D:
view.Render(w, "message/error-internal", http.StatusInternalServerError, err)
view.Render(w, "message", http.StatusInternalServerError, viewmodel.NewMessage(user, "Internal Server Error", true, err.Error()))
return true
}
// It has been done
view.Render(w, "message/page-deleted", 200, pv)
view.Render(w, "message", 200, viewmodel.NewMessage(user, "Deletion Successful", false, "The page has been deleted."))
return true
}
@@ -198,12 +219,10 @@ func pageEdit(path string, w http.ResponseWriter, req *http.Request, user *auth.
return false
}
pf := viewmodel.PageForm{}
pf := viewmodel.PageEdit{}
pf.Page = page
pf.Setup(user)
pf.Operation = "Edit"
pf.Page = *page
if user == nil {
pf.Error = "You are not logged in"
}
@@ -285,5 +304,6 @@ func init() {
PageController.Function("/create", pageCreate)
PageController.Function("/edit/", pageEdit)
PageController.Function("/delete/", pageDelete)
PageController.Function("/source/", pageSource)
PageController.Function("/", pageView)
}
-34
View File
@@ -1,34 +0,0 @@
package controllers
import (
"net/http"
"git.aiterp.net/AiteRP/aitestory/view"
"git.aiterp.net/AiteRP/aitestory/viewmodel"
"git.aiterp.net/AiteRP/aitestory/model"
"git.aiterp.net/gisle/wrouter"
"git.aiterp.net/gisle/wrouter/auth"
)
// TagController serves and handles the tag managment pages
var TagController = wrouter.Router{}
func tagList(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
//var err error
if (req.Method != "GET" && req.Method != "POST") || len(req.URL.Path) > len(path) {
return false
}
tl := viewmodel.TagList{}
tl.Tags, _ = model.ListTags()
tl.Setup(user)
view.Render(w, "tags/list", 200, tl)
return true
}
func init() {
TagController.Function("/", tagList)
}