From 0c88e80a66dbce25056c25f507a5172456952a25 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Wed, 17 Jan 2024 21:23:33 -0500 Subject: [PATCH] feat: implement /s5/blob/:cid --- api/s5.go | 3 +++ api/s5/http.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/api/s5.go b/api/s5.go index 98a68ab..6e7df44 100644 --- a/api/s5.go +++ b/api/s5.go @@ -41,6 +41,9 @@ func getRoutes(h *s5.HttpHandler, portal interfaces.Portal) map[string]jape.Hand "POST /s5/upload": s5.AuthMiddleware(h.SmallFileUpload, portal), "POST /s5/upload/directory": s5.AuthMiddleware(h.DirectoryUpload, portal), + // Download API + "GET /s5/blob/:cid": s5.AuthMiddleware(h.DownloadBlob, portal), + // Pins API "POST /s5/pin/:cid": s5.AuthMiddleware(h.AccountPin, portal), "DELETE /s5/delete/:cid": s5.AuthMiddleware(h.AccountPinDelete, portal), diff --git a/api/s5/http.go b/api/s5/http.go index b46488d..d530212 100644 --- a/api/s5/http.go +++ b/api/s5/http.go @@ -1107,6 +1107,36 @@ func (h *HttpHandler) getNode() s5interfaces.Node { return protoInstance.Node() } +func (h *HttpHandler) DownloadBlob(jc jape.Context) { + var cid string + + if jc.DecodeParam("cid", &cid) != nil { + return + } + + cid = strings.Split(cid, ".")[0] + + cidDecoded, err := encoding.CIDFromString(cid) + if jc.Check("error decoding cid", err) != nil { + return + } + + dlUriProvider := s5storage.NewStorageLocationProvider(h.getNode(), &cidDecoded.Hash, types.StorageLocationTypeFull, types.StorageLocationTypeFile, types.StorageLocationTypeBridge) + + err = dlUriProvider.Start() + + if jc.Check("error starting search", err) != nil { + return + } + + next, err := dlUriProvider.Next() + if jc.Check("error fetching blob", err) != nil { + return + } + + http.Redirect(jc.ResponseWriter, jc.Request, next.Location().BytesURL(), http.StatusFound) +} + func setAuthCookie(jwt string, jc jape.Context) { authCookie := http.Cookie{ Name: "s5-auth-token",