b8146ae485
Add minimum quotas for users to earn the ability to create custom forums. The entry requirements that could earn the first forum include: 1. Having a Certified account status for at least 45 days. 2. Having written 10 posts or replies in the forums. Additional quota is granted in increasing difficulty based on the count of forum posts created. Other changes: * Admin view of Manage Forums can filter for official/community. * "Certified Since" now shown on profile pages. * Update FAQ page for Forums feature.
94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package forum
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"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"
|
|
)
|
|
|
|
// Manage page for forums -- admin only for now but may open up later.
|
|
func Manage() http.HandlerFunc {
|
|
tmpl := templates.Must("forum/admin.html")
|
|
|
|
// Whitelist for ordering options.
|
|
var sortWhitelist = []string{
|
|
"updated_at desc",
|
|
"created_at desc",
|
|
}
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var (
|
|
searchTerm = r.FormValue("q")
|
|
show = r.FormValue("show")
|
|
categories = []string{}
|
|
sort = r.FormValue("sort")
|
|
sortOK bool
|
|
)
|
|
|
|
// Sort options.
|
|
for _, v := range sortWhitelist {
|
|
if sort == v {
|
|
sortOK = true
|
|
break
|
|
}
|
|
}
|
|
if !sortOK {
|
|
sort = sortWhitelist[0]
|
|
}
|
|
|
|
// Show options.
|
|
if show == "official" {
|
|
categories = config.ForumCategories
|
|
} else if show == "community" {
|
|
categories = []string{""}
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|
|
// Parse their search term.
|
|
var search = models.ParseSearchString(searchTerm)
|
|
|
|
// Get forums the user owns or can manage.
|
|
var pager = &models.Pagination{
|
|
Page: 1,
|
|
PerPage: config.PageSizeForumAdmin,
|
|
Sort: sort,
|
|
}
|
|
pager.ParsePage(r)
|
|
|
|
forums, err := models.PaginateOwnedForums(currentUser.ID, currentUser.IsAdmin, categories, search, pager)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Couldn't paginate owned forums: %s", err)
|
|
templates.Redirect(w, "/")
|
|
return
|
|
}
|
|
|
|
var vars = map[string]interface{}{
|
|
"Pager": pager,
|
|
"Forums": forums,
|
|
|
|
// Quote settings.
|
|
"QuotaLimit": models.ComputeForumQuota(currentUser),
|
|
"QuotaCount": models.CountOwnedUserForums(currentUser),
|
|
|
|
// Search filters.
|
|
"SearchTerm": searchTerm,
|
|
"Show": show,
|
|
"Sort": sort,
|
|
}
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
})
|
|
}
|