From 13775b9722c09bebd2f5bd796c5aca63f550218f Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Thu, 21 Dec 2023 14:59:41 -0800 Subject: [PATCH] Admin view for User Notes page --- pkg/controller/account/user_note.go | 38 ++++++++++++++----- pkg/models/user.go | 14 +++++++ pkg/models/user_note.go | 47 ++++++++++++++++++++++++ web/templates/account/my_user_notes.html | 29 +++++++++++++++ web/templates/base.html | 4 ++ 5 files changed, 122 insertions(+), 10 deletions(-) diff --git a/pkg/controller/account/user_note.go b/pkg/controller/account/user_note.go index 4bb8bdd..6f76811 100644 --- a/pkg/controller/account/user_note.go +++ b/pkg/controller/account/user_note.go @@ -177,9 +177,10 @@ func MyNotes() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Filter parameters. var ( - search = r.FormValue("search") - sort = r.FormValue("sort") - sortOK bool + search = r.FormValue("search") + sort = r.FormValue("sort") + adminNotes = r.FormValue("admin_notes") == "true" + sortOK bool ) // Sort options. @@ -206,6 +207,11 @@ func MyNotes() http.HandlerFunc { return } + // Admin notes? + if adminNotes && !currentUser.IsAdmin { + adminNotes = false + } + // Are we deleting a note? if r.Method == http.MethodPost { var ( @@ -253,11 +259,21 @@ func MyNotes() http.HandlerFunc { PerPage: config.PageSizeAdminUserNotes, Sort: sort, } - userIDs = []uint64{} + userIDs = []uint64{} + notes []*models.UserNote + adminUserMap models.UserMap ) pager.ParsePage(r) - notes, err := models.PaginateMyUserNotes(currentUser, search, pager) + if adminNotes { + notes, err = models.PaginateAdminUserNotes(search, pager) + if userMap, err := models.MapAdminUsers(currentUser); err == nil { + adminUserMap = userMap + } + } else { + notes, err = models.PaginateMyUserNotes(currentUser, search, pager) + } + if err != nil { session.FlashError(w, r, "Error getting your user notes: %s", err) templates.Redirect(w, "/") @@ -274,13 +290,15 @@ func MyNotes() http.HandlerFunc { } vars := map[string]interface{}{ - "Notes": notes, - "Pager": pager, - "UserMap": userMap, + "Notes": notes, + "Pager": pager, + "UserMap": userMap, // users talked about on this page + "AdminUserMap": adminUserMap, // other admin note authors for AdminNotes view // Search filters - "Search": search, - "Sort": sort, + "Search": search, + "Sort": sort, + "AdminNotes": adminNotes, } if err := tmpl.Execute(w, r, vars); err != nil { diff --git a/pkg/models/user.go b/pkg/models/user.go index f4f66e8..4586561 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -451,6 +451,20 @@ func MapUsers(user *User, userIDs []uint64) (UserMap, error) { return usermap, result.Error } +// MapAdminUsers returns a MapUsers result for all admin user accounts on the site. +func MapAdminUsers(user *User) (UserMap, error) { + adminUsers, err := ListAdminUsers() + if err != nil { + return nil, err + } + + var userIDs = []uint64{} + for _, user := range adminUsers { + userIDs = append(userIDs, user.ID) + } + return MapUsers(user, userIDs) +} + // Has a user ID in the map? func (um UserMap) Has(id uint64) bool { _, ok := um[id] diff --git a/pkg/models/user_note.go b/pkg/models/user_note.go index a69f929..b6c217a 100644 --- a/pkg/models/user_note.go +++ b/pkg/models/user_note.go @@ -2,6 +2,7 @@ package models import ( "errors" + "fmt" "strings" "time" @@ -134,6 +135,52 @@ func PaginateMyUserNotes(currentUser *User, search string, pager *Pagination) ([ return notes, result.Error } +// PaginateAdminUserNotes shows all notes written by any admin user account on nonshy. +func PaginateAdminUserNotes(search string, pager *Pagination) ([]*UserNote, error) { + var ( + adminUserIDs = []uint64{} + notes = []*UserNote{} + wheres = []string{} + placeholders = []interface{}{} + ilike = "%" + search + "%" + ) + + // Get all the admin users. + adminUsers, err := ListAdminUsers() + if err != nil { + return nil, fmt.Errorf("couldn't get admin users: %s", err) + } + + for _, user := range adminUsers { + adminUserIDs = append(adminUserIDs, user.ID) + } + + // Filter to notes written by admin users. + wheres = append(wheres, "user_notes.user_id IN ?") + placeholders = append(placeholders, adminUserIDs) + + // Searching? + if search != "" { + wheres = append(wheres, "(users.username ILIKE ? OR user_notes.message ILIKE ?)") + placeholders = append(placeholders, ilike, ilike) + } + + query := DB.Joins("JOIN users ON users.id = user_notes.about_user_id").Where( + strings.Join(wheres, " AND "), + placeholders..., + ).Order( + pager.Sort, + ) + + query.Model(&UserNote{}).Count(&pager.Total) + + result := query.Offset( + pager.GetOffset(), + ).Limit(pager.PerPage).Find(¬es) + + return notes, result.Error +} + // Save the note. func (p *UserNote) Save() error { if p.ID == 0 { diff --git a/web/templates/account/my_user_notes.html b/web/templates/account/my_user_notes.html index 25f659b..cc66489 100644 --- a/web/templates/account/my_user_notes.html +++ b/web/templates/account/my_user_notes.html @@ -51,6 +51,22 @@ + + {{if .CurrentUser.IsAdmin}} +
+
+ + +
+
+ {{end}} +
@@ -113,6 +129,15 @@ {{end}} + + {{if $Root.AdminNotes}} + + Written by: + {{$AdminUser := $Root.AdminUserMap.Get .UserID}} + {{$AdminUser.Username}} + + {{end}} +
{{.Message}}
@@ -126,11 +151,13 @@ + {{if eq $Root.CurrentUser.ID .UserID}} + {{end}}
@@ -138,6 +165,8 @@
{{end}} + + {{SimplePager .Pager}} diff --git a/web/templates/base.html b/web/templates/base.html index 9e65a54..2003775 100644 --- a/web/templates/base.html +++ b/web/templates/base.html @@ -181,6 +181,10 @@ Private Photos + + + My User Notes + {{if .CurrentUser.IsInnerCircle}}