2023-05-24 03:04:17 +00:00
|
|
|
package account
|
|
|
|
|
|
|
|
import (
|
2023-10-14 18:37:01 +00:00
|
|
|
"fmt"
|
2023-05-24 03:04:17 +00:00
|
|
|
"net/http"
|
|
|
|
|
2023-05-24 18:35:22 +00:00
|
|
|
"code.nonshy.com/nonshy/website/pkg/config"
|
2023-05-24 03:32:51 +00:00
|
|
|
"code.nonshy.com/nonshy/website/pkg/log"
|
2023-05-24 03:04:17 +00:00
|
|
|
"code.nonshy.com/nonshy/website/pkg/models"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/session"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/templates"
|
|
|
|
)
|
|
|
|
|
|
|
|
// InnerCircle is the landing page for inner circle members only.
|
|
|
|
func InnerCircle() http.HandlerFunc {
|
|
|
|
tmpl := templates.Must("account/inner_circle.html")
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
currentUser, err := session.CurrentUser(r)
|
|
|
|
if err != nil || !currentUser.IsInnerCircle() {
|
|
|
|
templates.NotFoundPage(w, r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-05-24 18:35:22 +00:00
|
|
|
var vars = map[string]interface{}{
|
|
|
|
"InnerCircleMinimumPublicPhotos": config.InnerCircleMinimumPublicPhotos,
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
2023-05-24 03:04:17 +00:00
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// InviteCircle is the landing page to invite a user into the circle.
|
|
|
|
func InviteCircle() http.HandlerFunc {
|
|
|
|
tmpl := templates.Must("account/invite_circle.html")
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
currentUser, err := session.CurrentUser(r)
|
|
|
|
if err != nil || !currentUser.IsInnerCircle() {
|
|
|
|
templates.NotFoundPage(w, r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Invite whom?
|
|
|
|
username := r.FormValue("to")
|
|
|
|
user, err := models.FindUser(username)
|
|
|
|
if err != nil {
|
|
|
|
templates.NotFoundPage(w, r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if currentUser.ID == user.ID && currentUser.InnerCircle {
|
|
|
|
session.FlashError(w, r, "You are already part of the inner circle.")
|
|
|
|
templates.Redirect(w, "/inner-circle")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Any blocking?
|
|
|
|
if models.IsBlocking(currentUser.ID, user.ID) && !currentUser.IsAdmin {
|
|
|
|
session.FlashError(w, r, "You are blocked from inviting this user to the circle.")
|
|
|
|
templates.Redirect(w, "/inner-circle")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// POSTing?
|
|
|
|
if r.Method == http.MethodPost {
|
|
|
|
var (
|
|
|
|
confirm = r.FormValue("intent") == "confirm"
|
|
|
|
)
|
|
|
|
|
|
|
|
if !confirm {
|
|
|
|
templates.Redirect(w, "/u/"+username)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add them!
|
|
|
|
if err := models.AddToInnerCircle(user); err != nil {
|
|
|
|
session.FlashError(w, r, "Couldn't add to the inner circle: %s", err)
|
2024-01-07 04:07:36 +00:00
|
|
|
} else {
|
|
|
|
session.Flash(w, r, "%s has been added to the inner circle!", user.Username)
|
2023-05-24 03:04:17 +00:00
|
|
|
}
|
|
|
|
|
2023-05-24 03:32:51 +00:00
|
|
|
log.Info("InnerCircle: %s adds %s to the inner circle", currentUser.Username, user.Username)
|
|
|
|
|
2023-05-24 03:04:17 +00:00
|
|
|
templates.Redirect(w, "/photo/u/"+user.Username)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var vars = map[string]interface{}{
|
|
|
|
"User": user,
|
|
|
|
}
|
|
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// RemoveCircle is the admin-only page to remove a member from the circle.
|
|
|
|
func RemoveCircle() http.HandlerFunc {
|
|
|
|
tmpl := templates.Must("account/remove_circle.html")
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
currentUser, err := session.CurrentUser(r)
|
|
|
|
if err != nil || !currentUser.IsInnerCircle() {
|
|
|
|
templates.NotFoundPage(w, r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove whom?
|
|
|
|
username := r.FormValue("to")
|
|
|
|
user, err := models.FindUser(username)
|
|
|
|
if err != nil {
|
|
|
|
templates.NotFoundPage(w, r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// POSTing?
|
|
|
|
if r.Method == http.MethodPost {
|
|
|
|
var (
|
|
|
|
confirm = r.FormValue("intent") == "confirm"
|
|
|
|
)
|
|
|
|
|
|
|
|
if !confirm {
|
|
|
|
templates.Redirect(w, "/u/"+username)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-10-14 18:37:01 +00:00
|
|
|
// Admin (with the correct scope): remove them now.
|
|
|
|
if currentUser.HasAdminScope(config.ScopeCircleModerator) {
|
|
|
|
if err := models.RemoveFromInnerCircle(user); err != nil {
|
|
|
|
session.FlashError(w, r, "Couldn't remove from the inner circle: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
session.Flash(w, r, "%s has been removed from the inner circle!", user.Username)
|
|
|
|
} else {
|
|
|
|
// Non-admin user: request removal only.
|
|
|
|
fb := &models.Feedback{
|
|
|
|
Intent: "report.circle",
|
|
|
|
Subject: "Inner Circle Removal Request",
|
|
|
|
TableName: "users",
|
|
|
|
TableID: user.ID,
|
|
|
|
Message: fmt.Sprintf(
|
|
|
|
"An inner circle member has flagged that **%s** no longer qualifies to be a part of the inner circle and should be removed.",
|
|
|
|
user.Username,
|
|
|
|
),
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := models.CreateFeedback(fb); err != nil {
|
|
|
|
session.FlashError(w, r, "Couldn't create admin notification: %s", err)
|
|
|
|
} else {
|
|
|
|
session.Flash(w, r, "A request to remove %s from the inner circle has been sent to the site admin.", user.Username)
|
|
|
|
}
|
2023-05-24 03:04:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
templates.Redirect(w, "/u/"+user.Username)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var vars = map[string]interface{}{
|
|
|
|
"User": user,
|
|
|
|
}
|
|
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|