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.
71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package api
|
|
|
|
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"
|
|
)
|
|
|
|
// ViewPhoto API pings a view count on a photo, e.g. from the lightbox modal.
|
|
func ViewPhoto() http.HandlerFunc {
|
|
// Response JSON schema.
|
|
type Response struct {
|
|
OK bool `json:"OK"`
|
|
Error string `json:"error,omitempty"`
|
|
Likes int64 `json:"likes"`
|
|
}
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// Get the current user.
|
|
currentUser, err := session.CurrentUser(r)
|
|
if err != nil {
|
|
SendJSON(w, http.StatusBadRequest, Response{
|
|
Error: "Couldn't get current user!",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Photo ID from path parameter.
|
|
var photoID uint64
|
|
if id, err := strconv.Atoi(r.PathValue("photo_id")); err == nil && id > 0 {
|
|
photoID = uint64(id)
|
|
} else {
|
|
SendJSON(w, http.StatusBadRequest, Response{
|
|
Error: "Invalid photo ID",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Find this photo.
|
|
photo, err := models.GetPhoto(photoID)
|
|
if err != nil {
|
|
SendJSON(w, http.StatusNotFound, Response{
|
|
Error: "Photo Not Found",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Check permission to have seen this photo.
|
|
if ok, err := photo.ShouldBeSeenBy(currentUser); !ok {
|
|
log.Error("Photo %d can't be seen by %s: %s", photo.ID, currentUser.Username, err)
|
|
SendJSON(w, http.StatusNotFound, Response{
|
|
Error: "Photo Not Found",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Mark a view.
|
|
if err := photo.View(currentUser); err != nil {
|
|
log.Error("Update photo(%d) views: %s", photo.ID, err)
|
|
}
|
|
|
|
// Send success response.
|
|
SendJSON(w, http.StatusOK, Response{
|
|
OK: true,
|
|
})
|
|
})
|
|
}
|