package controllers import ( "fmt" "net/http" "strings" "git.aiterp.net/gisle/wrouter/response" "git.aiterp.net/AiteRP/aitestory/model" "git.aiterp.net/AiteRP/aitestory/view" "git.aiterp.net/AiteRP/aitestory/viewmodel" "git.aiterp.net/gisle/wrouter" "git.aiterp.net/gisle/wrouter/auth" ) // ListController serves the front page's list, with and without filters var ListController = wrouter.Router{} func listIndex(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool { var err error if req.Method != "GET" || len(req.URL.Path) > len(path) { return false } vm := viewmodel.PageList{} vm.Headers, err = model.ListHeaders() vm.Categories = model.PageCategories vm.Setup(user) if err != nil { response.Text(w, 500, err.Error()) return true } view.Render(w, "index", 200, vm) return true } func listFiltered(category model.PageCategory) wrouter.FunctionHandlerFunc { return func(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 } tagName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1) vm := viewmodel.PageList{} if tagName != "" { tag, err := model.FindTag("name", tagName, "") if err != nil { response.Text(w, 404, err.Error()) return true } vm.ActiveTag = *tag vm.Headers, err = model.ListHeadersByTag(category.Key, tag) } else { vm.Headers, err = model.ListHeadersByCategory(category.Key) } vm.Categories = model.PageCategories vm.ActiveCategory = category vm.Setup(user) if err != nil { response.Text(w, 500, err.Error()) return true } view.Render(w, "index", 200, vm) return true } } func listTagged(tagType string) wrouter.FunctionHandlerFunc { return func(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 } tagName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1) vm := viewmodel.PageList{} if tagName == "" { return false } tag, err := model.FindTag("name", tagName, tagType) if err != nil { response.Text(w, 404, err.Error()) return true } vm.ActiveTag = *tag vm.Headers, err = model.ListHeadersByTag("", tag) vm.Categories = model.PageCategories vm.Setup(user) if err != nil { response.Text(w, 500, err.Error()) return true } view.Render(w, "index", 200, vm) return true } } func init() { ListController.Function("/", listIndex) for _, category := range model.PageCategories { ListController.Function(fmt.Sprintf("/%s/", strings.ToLower(category.Plural)), listFiltered(category)) } for _, tagType := range model.TagTypes { ListController.Function(fmt.Sprintf("/%s/", strings.ToLower(tagType)), listTagged(tagType)) } }