Web UI: podcasts, radio, shares, bookmarks pages; admin podcast/jukebox management; per-user Subsonic permission editor
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user