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/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.IndexList{} vm.Headers, err = model.ListHeaders() vm.Categories = model.PageCategories vm.Setup(user, req.URL.Path, "Index") 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.IndexList{} 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, path, category.Plural) 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.IndexList{} 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, tag.Path(), tag.Name) if err != nil { response.Text(w, 500, err.Error()) return true } view.Render(w, "index", 200, vm) return true } } 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(category.Path, listFiltered(category)) } for _, tagType := range model.TagTypes { ListController.Function(fmt.Sprintf("/%s/", strings.ToLower(tagType)), listTagged(tagType)) } }