package web import ( "database/sql" "io" "net/http" "strconv" "codeberg.org/u1f320/filer/db/queries" "emperror.dev/errors" "github.com/go-chi/chi/v5" "github.com/rs/zerolog/log" ) func (app *App) showFile(w http.ResponseWriter, r *http.Request) { ctx := r.Context() hash := chi.URLParam(r, "hash") filename := chi.URLParam(r, "filename") file, err := app.db.GetFileByName(ctx, queries.GetFileByNameParams{ Filename: filename, Hash: hash, }) if err != nil { if errors.Is(err, sql.ErrNoRows) { http.Error(w, "File not found", http.StatusNotFound) return } log.Err(err).Str("hash", hash).Str("name", filename).Msg("getting file from database") http.Error(w, "Internal server error", http.StatusInternalServerError) return } data, err := app.db.Store.GetFile(file.ID) if err != nil { log.Err(err).Str("hash", hash).Str("name", filename).Msg("getting file data") http.Error(w, "Internal server error", http.StatusInternalServerError) return } w.Header().Add("Content-Type", file.ContentType) w.Header().Add("Content-Length", strconv.FormatInt(file.Size, 10)) _, err = io.Copy(w, data) if err != nil { log.Err(err).Str("hash", hash).Str("name", filename).Msg("writing file data") return } }