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