This commit is contained in:
@@ -142,16 +142,41 @@ func Register(mux *http.ServeMux, d Deps) {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
rc, meta, err := d.Blob.Open(r.Context(), id)
|
||||
|
||||
// 1) lokal versuchen
|
||||
if rc, meta, err := d.Blob.Open(r.Context(), id); err == nil {
|
||||
defer rc.Close()
|
||||
w.Header().Set("Content-Type", meta.ContentType)
|
||||
w.Header().Set("Content-Length", strconv.FormatInt(meta.Size, 10))
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, meta.Name))
|
||||
_, _ = io.Copy(w, rc)
|
||||
return
|
||||
}
|
||||
|
||||
// 2) Remote über Mesh holen
|
||||
rrc, name, _, _, err := d.Mesh.FetchBlobAny(r.Context(), id)
|
||||
if err != nil {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
defer rc.Close()
|
||||
defer rrc.Close()
|
||||
|
||||
// 3) lokal cachen (Save konsumiert den Stream)
|
||||
if _, err := d.Blob.Save(r.Context(), id, name, rrc); err != nil {
|
||||
http.Error(w, "cache failed: "+err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
// 4) aus lokalem Store ausliefern (saubere Größe/CT)
|
||||
lrc, meta, err := d.Blob.Open(r.Context(), id)
|
||||
if err != nil {
|
||||
http.Error(w, "open failed", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer lrc.Close()
|
||||
w.Header().Set("Content-Type", meta.ContentType)
|
||||
w.Header().Set("Content-Length", strconv.FormatInt(meta.Size, 10))
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, meta.Name))
|
||||
_, _ = io.Copy(w, rc)
|
||||
_, _ = io.Copy(w, lrc)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/admin/peers", func(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -198,6 +223,7 @@ func Register(mux *http.ServeMux, d Deps) {
|
||||
}
|
||||
if id, err := strconv.ParseInt(r.FormValue("id"), 10, 64); err == nil {
|
||||
_, _ = d.Store.Delete(r.Context(), filesvc.ID(id))
|
||||
_ = d.Blob.Delete(r.Context(), int64(id))
|
||||
_ = d.Mesh.SyncNow(r.Context())
|
||||
}
|
||||
http.Redirect(w, r, "/admin/items", http.StatusSeeOther)
|
||||
|
||||
Reference in New Issue
Block a user