67 lines
2.0 KiB
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)
|
|
}
|