20d04fc370
* Add a transparency page where regular user accounts can list the roles and permissions that an admin user has access to. It is available by clicking on the "Admin" badge on that user's profile page. * Add additional admin scopes to lock down more functionality: * User feedback and reports * Change logs * User notes and admin notes * Add friendly descriptions to what all the scopes mean in practice. * Don't show admin notification badges to admins who aren't allowed to act on those notifications. * Update the admin dashboard page and documentation for admins.
132 lines
3.7 KiB
Go
132 lines
3.7 KiB
Go
package templates
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/config"
|
|
"code.nonshy.com/nonshy/website/pkg/log"
|
|
"code.nonshy.com/nonshy/website/pkg/models"
|
|
"code.nonshy.com/nonshy/website/pkg/session"
|
|
"code.nonshy.com/nonshy/website/pkg/worker"
|
|
)
|
|
|
|
// MergeVars mixes in globally available template variables. The http.Request is optional.
|
|
func MergeVars(r *http.Request, m map[string]interface{}) {
|
|
m["Title"] = config.Title
|
|
m["BuildHash"] = config.RuntimeBuild
|
|
m["BuildDate"] = config.RuntimeBuildDate
|
|
m["Subtitle"] = config.Subtitle
|
|
m["YYYY"] = time.Now().Year()
|
|
m["WebsiteTheme"] = ""
|
|
|
|
if r == nil {
|
|
return
|
|
}
|
|
|
|
m["Request"] = r
|
|
}
|
|
|
|
// MergeUserVars mixes in global template variables: LoggedIn and CurrentUser. The http.Request is optional.
|
|
func MergeUserVars(r *http.Request, m map[string]interface{}) {
|
|
// Defaults
|
|
m["LoggedIn"] = false
|
|
m["CurrentUser"] = nil
|
|
m["SessionImpersonated"] = false
|
|
|
|
// User notification counts for nav bar.
|
|
m["NavUnreadMessages"] = 0 // New messages
|
|
m["NavFriendRequests"] = 0 // Friend requests
|
|
m["NavUnreadNotifications"] = 0 // general notifications
|
|
m["NavTotalNotifications"] = 0 // Total of above
|
|
m["NavChatStatistics"] = worker.GetChatStatistics()
|
|
|
|
// Admin notification counts for nav bar.
|
|
m["NavCertificationPhotos"] = 0 // Cert. photos needing approval
|
|
m["NavAdminFeedback"] = 0 // Unacknowledged feedback
|
|
m["NavAdminNotifications"] = 0 // Total of above
|
|
|
|
if r == nil {
|
|
return
|
|
}
|
|
|
|
m["SessionImpersonated"] = session.Impersonated(r)
|
|
|
|
if user, err := session.CurrentUser(r); err == nil {
|
|
m["LoggedIn"] = true
|
|
m["CurrentUser"] = user
|
|
|
|
// User website preferences
|
|
m["WebsiteTheme"] = user.GetProfileField("website-theme")
|
|
|
|
// Get user recent notifications.
|
|
/*notifPager := &models.Pagination{
|
|
Page: 1,
|
|
PerPage: 10,
|
|
}
|
|
if notifs, err := models.PaginateNotifications(user, notifPager); err == nil {
|
|
m["Notifications"] = notifs
|
|
}*/
|
|
|
|
// Collect notification counts.
|
|
var (
|
|
// For users
|
|
countMessages int64
|
|
countFriendReqs int64
|
|
countNotifications int64
|
|
|
|
// For admins
|
|
countCertPhotos int64
|
|
countFeedback int64
|
|
)
|
|
|
|
// Get unread message count.
|
|
if count, err := models.CountUnreadMessages(user); err == nil {
|
|
m["NavUnreadMessages"] = count
|
|
countMessages = count
|
|
} else {
|
|
log.Error("MergeUserVars: couldn't CountUnreadMessages for %d: %s", user.ID, err)
|
|
}
|
|
|
|
// Get friend request count.
|
|
if count, err := models.CountFriendRequests(user.ID); err == nil {
|
|
m["NavFriendRequests"] = count
|
|
countFriendReqs = count
|
|
} else {
|
|
log.Error("MergeUserVars: couldn't CountFriendRequests for %d: %s", user.ID, err)
|
|
}
|
|
|
|
// Count other notifications.
|
|
if count, err := models.CountUnreadNotifications(user); err == nil {
|
|
m["NavUnreadNotifications"] = count
|
|
countNotifications = count
|
|
} else {
|
|
log.Error("MergeUserVars: couldn't CountFriendRequests for %d: %s", user.ID, err)
|
|
}
|
|
|
|
// Are we admin? Add notification counts if the current admin can respond to them.
|
|
if user.IsAdmin {
|
|
var countCertPhotos, countFeedback int64
|
|
|
|
// Any pending certification photos or feedback?
|
|
if user.HasAdminScope(config.ScopeCertificationApprove) {
|
|
countCertPhotos = models.CountCertificationPhotosNeedingApproval()
|
|
}
|
|
|
|
// Admin feedback available?
|
|
if user.HasAdminScope(config.ScopeFeedbackAndReports) {
|
|
countFeedback = models.CountUnreadFeedback()
|
|
}
|
|
|
|
m["NavCertificationPhotos"] = countCertPhotos
|
|
m["NavAdminFeedback"] = countFeedback
|
|
|
|
// Total notification count for admin actions.
|
|
m["NavAdminNotifications"] = countCertPhotos + countFeedback
|
|
}
|
|
|
|
// Total count for user notifications.
|
|
m["NavTotalNotifications"] = countMessages + countFriendReqs + countNotifications + countCertPhotos + countFeedback
|
|
}
|
|
}
|