func (sh *Handler) serveSignerAttrValue(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) signer := httputil.MustGetBlobRef(req, "signer") attr := httputil.MustGet(req, "attr") value := httputil.MustGet(req, "value") pn, err := sh.index.PermanodeOfSignerAttrValue(signer, attr, value) if err != nil { httputil.ServeJSONError(rw, err) return } dr := sh.NewDescribeRequest() dr.Describe(pn, 2) metaMap, err := dr.metaMap() if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, &SignerAttrValueResponse{ Permanode: pn, Meta: metaMap, }) }
func (sh *Handler) serveClaims(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var cr ClaimsRequest cr.fromHTTP(req) res, err := sh.GetClaims(&cr) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, res) }
// servePermanodesWithAttr uses the indexer to search for the permanodes matching // the request. // The valid values for the "attr" key in the request (i.e the only attributes // for a permanode which are actually indexed as such) are "tag" and "title". func (sh *Handler) servePermanodesWithAttr(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var wr WithAttrRequest wr.fromHTTP(req) res, err := sh.GetPermanodesWithAttr(&wr) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, res) }
func (sh *Handler) serveRecentPermanodes(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var rr RecentRequest rr.fromHTTP(req) res, err := sh.GetRecentPermanodes(&rr) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, res) }
// Unlike the index interface's EdgesTo method, the "edgesto" Handler // here additionally filters out since-deleted permanode edges. func (sh *Handler) serveEdgesTo(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var er EdgesRequest er.fromHTTP(req) res, err := sh.EdgesTo(&er) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, res) }
func (sh *Handler) serveSignerPaths(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var sr SignerPathsRequest sr.fromHTTP(req) res, err := sh.GetSignerPaths(&sr) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, res) }
func (sh *Handler) serveDescribe(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var dr DescribeRequest dr.fromHTTP(req) res, err := sh.Describe(&dr) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, res) }
func (sh *Handler) serveDescribe(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) br := httputil.MustGetBlobRef(req, "blobref") dr := sh.NewDescribeRequest() dr.Describe(br, 4) metaMap, err := dr.metaMapThumbs(thumbnailSize(req)) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, &DescribeResponse{metaMap}) }
func (sh *Handler) serveQuery(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var sq SearchQuery if err := sq.fromHTTP(req); err != nil { httputil.ServeJSONError(rw, err) return } sr, err := sh.Query(&sq) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, sr) }
func (sh *Handler) serveDescribe(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) var dr DescribeRequest dr.fromHTTP(req) sh.initDescribeRequest(&dr) if dr.BlobRef.Valid() { dr.Describe(dr.BlobRef, dr.depth()) } for _, br := range dr.BlobRefs { dr.Describe(br, dr.depth()) } metaMap, err := dr.metaMapThumbs(thumbnailSize(req)) if err != nil { httputil.ServeJSONError(rw, err) return } httputil.ReturnJSON(rw, &DescribeResponse{metaMap}) }
// Unlike the index interface's EdgesTo method, the "edgesto" Handler // here additionally filters out since-deleted permanode edges. func (sh *Handler) serveEdgesTo(rw http.ResponseWriter, req *http.Request) { defer httputil.RecoverJSON(rw, req) ret := jsonMap() toRef := httputil.MustGetBlobRef(req, "blobref") toRefStr := toRef.String() blobInfo := jsonMap() ret[toRefStr] = blobInfo jsonEdges := jsonMapList() edges, err := sh.index.EdgesTo(toRef, nil) if err != nil { panic(err) } type mapOrError struct { m map[string]interface{} // nil if no map err error } resc := make(chan mapOrError) verify := func(edge *Edge) { fromStr := edge.From.String() db, err := sh.NewDescribeRequest().DescribeSync(edge.From) if err != nil { resc <- mapOrError{err: err} return } found := false if db.Permanode != nil { for attr, vv := range db.Permanode.Attr { if IsBlobReferenceAttribute(attr) { for _, v := range vv { if v == toRefStr { found = true } } } } } var em map[string]interface{} if found { em = jsonMap() em["from"] = fromStr em["fromType"] = "permanode" } resc <- mapOrError{m: em} } verifying := 0 for _, edge := range edges { if edge.FromType == "permanode" { verifying++ go verify(edge) continue } em := jsonMap() em["from"] = edge.From.String() em["fromType"] = edge.FromType jsonEdges = append(jsonEdges, em) } for i := 0; i < verifying; i++ { res := <-resc if res.err != nil { panic(res.err) // caught and put in JSON response } if res.m != nil { jsonEdges = append(jsonEdges, res.m) } } blobInfo["edgesTo"] = jsonEdges httputil.ReturnJSON(rw, ret) }