44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package webpublic
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
|
|
webutils "git.mstar.dev/mstar/goutils/http"
|
|
"github.com/rs/zerolog/hlog"
|
|
|
|
"git.mstar.dev/mstar/linstrom/media"
|
|
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
|
)
|
|
|
|
func downloadMediaHander(w http.ResponseWriter, r *http.Request) {
|
|
mediaId := r.PathValue("id")
|
|
log := hlog.FromRequest(r)
|
|
mm := dbgen.MediaMetadata
|
|
fileReader, err := media.GlobalServer.ReadFileId(mediaId)
|
|
switch err {
|
|
case nil:
|
|
case media.ErrFileNotFound:
|
|
_ = webutils.ProblemDetailsStatusOnly(w, http.StatusNotFound)
|
|
return
|
|
default:
|
|
log.Error().Err(err).Str("file-id", mediaId).Msg("Failed to get file")
|
|
_ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer func() { _ = fileReader.Close() }()
|
|
meta, err := mm.Where(mm.ID.Eq(mediaId)).Select(mm.Type).First()
|
|
if err != nil {
|
|
log.Error().
|
|
Err(err).
|
|
Str("file-id", mediaId).
|
|
Msg("Failed to get file metadata after already getting file")
|
|
_ = webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
w.Header().Add("Content-Type", meta.Type)
|
|
_, err = io.Copy(w, fileReader)
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("Failed to copy file to request")
|
|
}
|
|
}
|