From f957ef5d78c8d430ade767a6e972577efbd73434 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Wed, 17 Jan 2024 22:16:04 -0500 Subject: [PATCH] feat: implement /s5/metadata/:cid --- api/s5.go | 3 ++- api/s5/http.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/api/s5.go b/api/s5.go index c494d60..d84f443 100644 --- a/api/s5.go +++ b/api/s5.go @@ -42,7 +42,8 @@ func getRoutes(h *s5.HttpHandler, portal interfaces.Portal) map[string]jape.Hand "POST /s5/upload/directory": s5.AuthMiddleware(h.DirectoryUpload, portal), // Download API - "GET /s5/blob/:cid": s5.AuthMiddleware(h.DownloadBlob, portal), + "GET /s5/blob/:cid": s5.AuthMiddleware(h.DownloadBlob, portal), + "GET /s5/metadata/:cid": s5.AuthMiddleware(h.DownloadMetadata, portal), // Pins API "POST /s5/pin/:cid": s5.AuthMiddleware(h.AccountPin, portal), diff --git a/api/s5/http.go b/api/s5/http.go index ca520d9..c6a3a61 100644 --- a/api/s5/http.go +++ b/api/s5/http.go @@ -1238,6 +1238,44 @@ func (h *HttpHandler) DebugStorageLocations(jc jape.Context) { }) } +func (h *HttpHandler) DownloadMetadata(jc jape.Context) { + var cid string + + if jc.DecodeParam("cid", &cid) != nil { + return + } + + cidDecoded, err := encoding.CIDFromString(cid) + if jc.Check("error decoding cid", err) != nil { + return + } + + switch cidDecoded.Type { + case types.CIDTypeRaw: + _ = jc.Error(errors.New("Raw CIDs do not have metadata"), http.StatusBadRequest) + return + + case types.CIDTypeResolver: + _ = jc.Error(errors.New("Resolver CIDs not yet supported"), http.StatusBadRequest) + return + } + + meta, err := h.getNode().GetMetadataByCID(cidDecoded) + + if jc.Check("error getting metadata", err) != nil { + return + } + + if cidDecoded.Type != types.CIDTypeBridge { + jc.ResponseWriter.Header().Set("Cache-Control", "public, max-age=31536000") + } else { + jc.ResponseWriter.Header().Set("Cache-Control", "public, max-age=60") + } + + jc.Encode(&meta) + +} + func setAuthCookie(jwt string, jc jape.Context) { authCookie := http.Cookie{ Name: "s5-auth-token",