d765fde6cd
* Private forums: CanBeSeenBy moderators, approved followers, its owner and admin users. * Note: the endpoint to subscribe to the forum won't allow users to follow the private forum, so approved followers can not be created at this time, except by adding them as moderators. * Admins: when creating a forum they can choose "no category" to create it as an unofficial community forum. * Code cleanup * More feature flag checking
85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
package forum
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"regexp"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/config"
|
|
"code.nonshy.com/nonshy/website/pkg/models"
|
|
"code.nonshy.com/nonshy/website/pkg/session"
|
|
"code.nonshy.com/nonshy/website/pkg/templates"
|
|
)
|
|
|
|
// Regular expressions
|
|
var (
|
|
FragmentPattern = `[a-z0-9._-]{1,30}`
|
|
FragmentRegexp = regexp.MustCompile(
|
|
fmt.Sprintf(`^(%s)$`, FragmentPattern),
|
|
)
|
|
)
|
|
|
|
// Landing page for forums.
|
|
func Landing() http.HandlerFunc {
|
|
tmpl := templates.Must("forum/index.html")
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// Get the current user.
|
|
currentUser, err := session.CurrentUser(r)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Couldn't get current user: %s", err)
|
|
templates.Redirect(w, "/")
|
|
return
|
|
}
|
|
|
|
// Get all the categorized index forums.
|
|
// XXX: we get a large page size to get ALL official forums
|
|
var pager = &models.Pagination{
|
|
Page: 1,
|
|
PerPage: config.PageSizeForums,
|
|
Sort: "title asc",
|
|
}
|
|
pager.ParsePage(r)
|
|
|
|
forums, err := models.PaginateForums(currentUser, config.ForumCategories, nil, false, pager)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Couldn't paginate forums: %s", err)
|
|
templates.Redirect(w, "/")
|
|
return
|
|
}
|
|
|
|
// Bucket the forums into their categories for easy front-end.
|
|
categorized := models.CategorizeForums(forums, config.ForumCategories)
|
|
|
|
// Inject the "My List" Category if the user subscribes to forums.
|
|
if config.UserForumsEnabled {
|
|
myList, err := models.PaginateForums(currentUser, nil, nil, true, pager)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Couldn't get your followed forums: %s", err)
|
|
} else {
|
|
forums = append(forums, myList...)
|
|
categorized = append([]*models.CategorizedForum{
|
|
{
|
|
Category: "My List",
|
|
Forums: myList,
|
|
},
|
|
}, categorized...)
|
|
}
|
|
}
|
|
|
|
// Map statistics for these forums.
|
|
forumMap := models.MapForumStatistics(forums)
|
|
followMap := models.MapForumMemberships(currentUser, forums)
|
|
|
|
var vars = map[string]interface{}{
|
|
"Pager": pager,
|
|
"Categories": categorized,
|
|
"ForumMap": forumMap,
|
|
"FollowMap": followMap,
|
|
}
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
})
|
|
}
|