Files
vibesonic/internal/web/shares_handlers.go

67 lines
2.0 KiB
Go

package web
import (
"database/sql"
"net/http"
"git.noroutes.net/NoRoutes/vibetunes/internal/auth"
"git.noroutes.net/NoRoutes/vibetunes/internal/database"
"git.noroutes.net/NoRoutes/vibetunes/internal/idgen"
)
func (h *Web) handleShares(w http.ResponseWriter, r *http.Request) {
user := auth.UserFromContext(r.Context())
var shares []*database.Share
var err error
if user.IsAdmin {
shares, err = database.ListAllShares(h.DB)
} else {
shares, err = database.ListSharesByOwner(h.DB, user.ID)
}
if err != nil {
http.Error(w, "internal error", http.StatusInternalServerError)
return
}
h.page(w, r, "shares", "shares", "Shares", shares)
}
// handleShareCreateForAlbum creates a public share link for an entire
// album, reachable from the album page.
func (h *Web) handleShareCreateForAlbum(w http.ResponseWriter, r *http.Request) {
user := auth.UserFromContext(r.Context())
albumID := r.PathValue("id")
if _, err := database.GetAlbum(h.DB, albumID); err != nil {
http.NotFound(w, r)
return
}
share, err := database.CreateShare(h.DB, user.ID, idgen.New(""), "", sql.NullString{})
if err != nil {
http.Error(w, "internal error", http.StatusInternalServerError)
return
}
if err := database.AddShareItem(h.DB, share.ID, sql.NullString{}, sql.NullString{String: albumID, Valid: true}, 0); err != nil {
http.Error(w, "internal error", http.StatusInternalServerError)
return
}
http.Redirect(w, r, "/shares", http.StatusFound)
}
func (h *Web) handleShareDelete(w http.ResponseWriter, r *http.Request) {
user := auth.UserFromContext(r.Context())
id := r.PathValue("id")
share, err := database.GetShare(h.DB, id)
if err != nil {
http.NotFound(w, r)
return
}
if share.OwnerID != user.ID && !user.IsAdmin {
http.Error(w, "403 Forbidden", http.StatusForbidden)
return
}
if err := database.DeleteShare(h.DB, id); err != nil {
http.Error(w, "internal error", http.StatusInternalServerError)
return
}
http.Redirect(w, r, "/shares", http.StatusFound)
}