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) }