// GetClaims returns the claims on req.Permanode signed by sh.owner. func (sh *Handler) GetClaims(req *ClaimsRequest) (*ClaimsResponse, error) { if !req.Permanode.Valid() { return nil, errors.New("Error getting claims: nil permanode.") } var claims []camtypes.Claim claims, err := sh.index.AppendClaims(claims, req.Permanode, sh.owner, req.AttrFilter) if err != nil { return nil, fmt.Errorf("Error getting claims of %s: %v", req.Permanode.String(), err) } sort.Sort(camtypes.ClaimsByDate(claims)) var jclaims []*ClaimsItem for _, claim := range claims { jclaim := &ClaimsItem{ BlobRef: claim.BlobRef, Signer: claim.Signer, Permanode: claim.Permanode, Date: types.Time3339(claim.Date), Type: claim.Type, Attr: claim.Attr, Value: claim.Value, } jclaims = append(jclaims, jclaim) } res := &ClaimsResponse{ Claims: jclaims, } return res, nil }
func (dr *DescribeRequest) populatePermanodeFields(pi *DescribedPermanode, pn, signer blob.Ref, depth int) { pi.Attr = make(url.Values) attr := pi.Attr claims, err := dr.sh.index.AppendClaims(nil, pn, signer, "") if err != nil { log.Printf("Error getting claims of %s: %v", pn.String(), err) dr.addError(pn, fmt.Errorf("Error getting claims of %s: %v", pn.String(), err)) return } sort.Sort(camtypes.ClaimsByDate(claims)) claimLoop: for _, cl := range claims { if !dr.At.IsZero() { if cl.Date.After(dr.At.Time()) { continue } } switch cl.Type { default: continue case "del-attribute": if cl.Value == "" { delete(attr, cl.Attr) } else { sl := attr[cl.Attr] filtered := make([]string, 0, len(sl)) for _, val := range sl { if val != cl.Value { filtered = append(filtered, val) } } attr[cl.Attr] = filtered } case "set-attribute": delete(attr, cl.Attr) fallthrough case "add-attribute": if cl.Value == "" { continue } sl, ok := attr[cl.Attr] if ok { for _, exist := range sl { if exist == cl.Value { continue claimLoop } } } else { sl = make([]string, 0, 1) attr[cl.Attr] = sl } attr[cl.Attr] = append(sl, cl.Value) } pi.ModTime = cl.Date } // Descend into any references in current attributes. for key, vals := range attr { dr.describeRefs(key, depth) for _, v := range vals { dr.describeRefs(v, depth) } } }
func (dr *DescribeRequest) populatePermanodeFields(pi *DescribedPermanode, pn, signer blob.Ref, depth int) { pi.Attr = make(url.Values) attr := pi.Attr claims, err := dr.sh.index.AppendClaims(nil, pn, signer, "") if err != nil { log.Printf("Error getting claims of %s: %v", pn.String(), err) dr.addError(pn, fmt.Errorf("Error getting claims of %s: %v", pn.String(), err)) return } sort.Sort(camtypes.ClaimsByDate(claims)) claimLoop: for _, cl := range claims { switch cl.Type { default: continue case "del-attribute": if cl.Value == "" { delete(attr, cl.Attr) } else { sl := attr[cl.Attr] filtered := make([]string, 0, len(sl)) for _, val := range sl { if val != cl.Value { filtered = append(filtered, val) } } attr[cl.Attr] = filtered } case "set-attribute": delete(attr, cl.Attr) fallthrough case "add-attribute": if cl.Value == "" { continue } sl, ok := attr[cl.Attr] if ok { for _, exist := range sl { if exist == cl.Value { continue claimLoop } } } else { sl = make([]string, 0, 1) attr[cl.Attr] = sl } attr[cl.Attr] = append(sl, cl.Value) } pi.ModTime = cl.Date } // If the content permanode is now known, look up its type if content, ok := attr["camliContent"]; ok && len(content) > 0 { if cbr, ok := blob.Parse(content[len(content)-1]); ok { dr.Describe(cbr, depth-1) } } // Resolve children if members, ok := attr["camliMember"]; ok { for _, member := range members { if membr, ok := blob.Parse(member); ok { dr.Describe(membr, depth-1) } } } // Resolve path elements for k, vv := range attr { if !strings.HasPrefix(k, "camliPath:") { continue } for _, brs := range vv { if br, ok := blob.Parse(brs); ok { dr.Describe(br, depth-1) } } } }