f2e847922f
* Profile pictures on profile pages now link to the gallery when clicked. * Admins can no longer automatically see the default profile pic on profile pages unless they have photo moderator ability. * Photo view counts are not added when an admin with photo moderator ability should not have otherwise been able to see the photo.
114 lines
3.3 KiB
Go
114 lines
3.3 KiB
Go
package photo
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"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/templates"
|
|
)
|
|
|
|
// View photo controller to see the comment thread.
|
|
func View() http.HandlerFunc {
|
|
tmpl := templates.Must("photo/permalink.html")
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// Required query param: the photo ID.
|
|
var photo *models.Photo
|
|
if idStr := r.FormValue("id"); idStr == "" {
|
|
session.FlashError(w, r, "Missing photo ID parameter.")
|
|
templates.Redirect(w, "/")
|
|
return
|
|
} else {
|
|
if idInt, err := strconv.Atoi(idStr); err != nil {
|
|
session.FlashError(w, r, "Invalid ID parameter.")
|
|
templates.Redirect(w, "/")
|
|
return
|
|
} else {
|
|
if found, err := models.GetPhoto(uint64(idInt)); err != nil {
|
|
templates.NotFoundPage(w, r)
|
|
return
|
|
} else {
|
|
photo = found
|
|
}
|
|
}
|
|
}
|
|
|
|
// Load the current user in case they are viewing their own page.
|
|
currentUser, err := session.CurrentUser(r)
|
|
if err != nil {
|
|
session.FlashError(w, r, "Unexpected error: couldn't get CurrentUser")
|
|
}
|
|
|
|
// Find the photo's owner.
|
|
user, err := models.GetUser(photo.UserID)
|
|
if err != nil {
|
|
templates.NotFoundPage(w, r)
|
|
return
|
|
}
|
|
|
|
if ok, err := photo.CanBeSeenBy(currentUser); !ok {
|
|
log.Error("Photo %d can't be seen by %s: %s", photo.ID, currentUser.Username, err)
|
|
session.FlashError(w, r, "Photo Not Found")
|
|
templates.Redirect(w, "/")
|
|
return
|
|
}
|
|
|
|
// Get Likes information about these photos.
|
|
likeMap := models.MapLikes(currentUser, "photos", []uint64{photo.ID})
|
|
commentMap := models.MapCommentCounts("photos", []uint64{photo.ID})
|
|
|
|
// Get all the comments.
|
|
comments, err := models.ListComments(currentUser, "photos", photo.ID)
|
|
if err != nil {
|
|
log.Error("Couldn't list comments for photo %d: %s", photo.ID, err)
|
|
}
|
|
|
|
// Get the like map for these comments.
|
|
commentIDs := []uint64{}
|
|
for _, com := range comments {
|
|
commentIDs = append(commentIDs, com.ID)
|
|
}
|
|
commentLikeMap := models.MapLikes(currentUser, "comments", commentIDs)
|
|
|
|
// Get the summary of WHO liked this picture.
|
|
likeExample, likeRemainder, err := models.WhoLikes(currentUser, "photos", photo.ID)
|
|
if err != nil {
|
|
log.Error("WhoLikes(photo %d): %s", photo.ID, err)
|
|
}
|
|
|
|
// Populate the user relationships in these comments.
|
|
models.SetUserRelationshipsInComments(currentUser, comments)
|
|
|
|
// Is the current user subscribed to notifications on this thread?
|
|
_, isSubscribed := models.IsSubscribed(currentUser, "photos", photo.ID)
|
|
|
|
// Mark this photo as "Viewed" by the user.
|
|
if err := photo.View(currentUser); err != nil {
|
|
log.Error("Update photo(%d) views: %s", photo.ID, err)
|
|
}
|
|
|
|
var vars = map[string]interface{}{
|
|
"IsOwnPhoto": currentUser.ID == user.ID,
|
|
"User": user,
|
|
"Photo": photo,
|
|
"LikeMap": likeMap,
|
|
"CommentMap": commentMap,
|
|
"Comments": comments,
|
|
"CommentLikeMap": commentLikeMap,
|
|
"IsSubscribed": isSubscribed,
|
|
|
|
// Details on who likes the photo.
|
|
"LikeExample": likeExample,
|
|
"LikeRemainder": likeRemainder,
|
|
"LikeTableName": "photos",
|
|
"LikeTableID": photo.ID,
|
|
}
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
})
|
|
}
|