summaryrefslogtreecommitdiff
path: root/internal/api/handlers_share.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-17 15:25:52 +0300
committerPaul Buetow <paul@buetow.org>2026-05-17 15:25:52 +0300
commit914bd7cd6aa14e839332a98d91c30b19865b0cf2 (patch)
tree02b11537237a204048589e14ed24938b805e42f7 /internal/api/handlers_share.go
parent3b24f0e1be832584d6550e8cc3e5d24329f66f90 (diff)
Restructure repo: move Go server into player-server/
Diffstat (limited to 'internal/api/handlers_share.go')
-rw-r--r--internal/api/handlers_share.go215
1 files changed, 0 insertions, 215 deletions
diff --git a/internal/api/handlers_share.go b/internal/api/handlers_share.go
deleted file mode 100644
index 5c7db83..0000000
--- a/internal/api/handlers_share.go
+++ /dev/null
@@ -1,215 +0,0 @@
-package api
-
-import (
- "encoding/json"
- "errors"
- "fmt"
- "io"
- "net/http"
- "strings"
- "time"
-
- "codeberg.org/snonux/player/internal/service"
-)
-
-// ------------------------------------------------------------------
-// Share routes
-// ------------------------------------------------------------------
-
-func (s *Server) handleCreateShare(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- id := pathID(r, "id")
- if id == 0 {
- badRequest(w, "invalid media id")
- return
- }
- expiresAt := time.Now().Add(time.Duration(s.cfg.ShareDefaultExpiryDays) * 24 * time.Hour)
- share, err := s.shareSvc.CreateShare(r.Context(), userIDFromContext(r), id, expiresAt)
- if err != nil {
- handleError(w, err)
- return
- }
- writeJSON(w, http.StatusOK, share)
-}
-
-func (s *Server) handleListShares(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- id := pathID(r, "id")
- if id == 0 {
- badRequest(w, "invalid media id")
- return
- }
- shares, err := s.shareSvc.ListShares(r.Context(), id, userIDFromContext(r))
- if err != nil {
- handleError(w, err)
- return
- }
- writeJSON(w, http.StatusOK, shares)
-}
-
-func (s *Server) handleRevokeShare(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- token := r.PathValue("token")
- if token == "" {
- badRequest(w, "token required")
- return
- }
- if err := s.shareSvc.RevokeShare(r.Context(), token, userIDFromContext(r)); err != nil {
- handleError(w, err)
- return
- }
- writeJSON(w, http.StatusOK, map[string]string{"status": "ok"})
-}
-
-func (s *Server) handleSharePage(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- token := r.PathValue("token")
- res, err := s.shareSvc.GetSharedMedia(r.Context(), token)
- if err != nil || res == nil {
- if err != nil && errors.Is(err, service.ErrShareExpired) {
- http.Error(w, "gone", http.StatusGone)
- return
- }
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
-
- w.Header().Set("Cache-Control", "no-store")
- w.Header().Set("Vary", "Accept")
-
- accept := r.Header.Get("Accept")
- if strings.Contains(accept, "application/json") {
- writeJSON(w, http.StatusOK, res)
- return
- }
-
- // Serve HTML page with media metadata injected.
- f, err := s.staticFS.Open("share.html")
- if err != nil {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- defer f.Close()
- stat, err := f.Stat()
- if err != nil {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- var buf strings.Builder
- if _, err := io.Copy(&buf, f); err != nil {
- http.Error(w, "internal error", http.StatusInternalServerError)
- return
- }
- html, err := injectShareMedia(buf.String(), res)
- if err != nil {
- s.logger.Error("marshal share page metadata", "err", err)
- http.Error(w, "internal error", http.StatusInternalServerError)
- return
- }
- w.Header().Set("Content-Type", "text/html; charset=utf-8")
- http.ServeContent(w, r, "share.html", stat.ModTime(), strings.NewReader(html))
-}
-
-func injectShareMedia(html string, data any) (string, error) {
- encoded, err := json.Marshal(data)
- if err != nil {
- return "", fmt.Errorf("marshal share metadata: %w", err)
- }
- return strings.Replace(html, "<!--SHARE_MEDIA-->", string(encoded), 1), nil
-}
-
-func (s *Server) handleShareThumbnail(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- token := r.PathValue("token")
- fr, err := s.shareSvc.GetSharedThumbnail(r.Context(), token)
- if err != nil {
- if errors.Is(err, service.ErrShareExpired) {
- http.Error(w, "gone", http.StatusGone)
- return
- }
- if errors.Is(err, service.ErrShareNotFound) || errors.Is(err, service.ErrMediaNotFound) {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- if fr == nil {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- w.Header().Set("Cache-Control", "no-cache")
- s.serveFileResult(w, r, fr, false)
-}
-
-func (s *Server) handleShareStream(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- token := r.PathValue("token")
- res, err := s.shareSvc.StreamSharedMedia(r.Context(), token)
- if err != nil {
- if errors.Is(err, service.ErrShareExpired) {
- http.Error(w, "gone", http.StatusGone)
- return
- }
- if errors.Is(err, service.ErrShareNotFound) || errors.Is(err, service.ErrMediaNotFound) {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- if res == nil {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- s.serveFileResult(w, r, res, false)
-}
-
-func (s *Server) handleShareDownload(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- token := r.PathValue("token")
- fr, err := s.shareSvc.StreamSharedMedia(r.Context(), token)
- if err != nil {
- if errors.Is(err, service.ErrShareExpired) {
- http.Error(w, "gone", http.StatusGone)
- return
- }
- if errors.Is(err, service.ErrShareNotFound) || errors.Is(err, service.ErrMediaNotFound) {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
- if fr == nil {
- http.Error(w, "not found", http.StatusNotFound)
- return
- }
- s.serveFileResult(w, r, fr, true)
-}
-
-func (s *Server) handleMyShares(w http.ResponseWriter, r *http.Request) {
- if !requireService(w, s.shareSvc) {
- return
- }
- shares, err := s.shareSvc.ListMyShares(r.Context(), userIDFromContext(r))
- if err != nil {
- handleError(w, err)
- return
- }
- writeJSON(w, http.StatusOK, shares)
-}