Skip to content

Commit 005814e

Browse files
ramfoxb5
authored andcommitted
feat(PeerID): add PeerID to datasetRef
1) add PeerID to datasetRef 2) adjust all functions that compare datasetRefs to match 3) Alter CanonicalizePeername to CanonicalizePeer (doesn’t just canonicalize Peername, also matched PeerID and Peername) 4) Fix any spots that use CanonicalizePeername to now use CanonicalizePeer 5) Add CanonicalizePeer tests 6) fix any tests that change now that we have PeerID in the mix!
1 parent 2ef413a commit 005814e

File tree

7 files changed

+258
-112
lines changed

7 files changed

+258
-112
lines changed

api/testdata/listResponse.json

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -24020,81 +24020,6 @@
2402024020
}
2402124021
}
2402224022
},
24023-
{
24024-
"peername": "peer",
24025-
"name": "flourinated_compounds_in_fast_food_packaging",
24026-
"path": "/map/QmU9YD3gLZjBLHhe9MEftyBtMEW6tky2XczTbCVq2q84cY",
24027-
"dataset": {
24028-
"abstract": "/map/QmPUAqhiqdGDZUourgARtmMqNKWmuTPcy5JSxasvRPdvor",
24029-
"commit": {
24030-
"qri": "cm:0",
24031-
"signature": "5LB6oyPr5VjMbTcwGRTqxmBkULqoJf3uYFM7ovoHkSLdfA94hPGa8uMveXE6YAxZYAB5kaKNWcEXg1oSwCKuXqVzvmjkPJPZs6J3LBYP1GdogZNMUxz9btrYAaS6qEcu4WwnTrhfr77wKc6mTDEzgnTR6tai78AjceXeEFpBppQ1xKXX3vn5ofmeRpoFVAKUN52FZra5x6swzncPaD8TzpFb4u59kHhVy9iKZ9xUKBmAAYPvSwJBJafYgSF5fR5sEYfjCbs6GXSDgpsRhdpGgqFpezUJL4u6ghCH5HbFtjEVGCiHFq5WRATDQMQSv1YNogKo9fhLPLkvKRqipRwsswSwTdEVXS",
24032-
"timestamp": "2001-01-01T01:01:01.000000001Z",
24033-
"title": "initial commit"
24034-
},
24035-
"dataPath": "/map/QmcN7FHgCbP9MfUmurGuNh3X1DNU4B9LbjXg3r2b3VBrQZ",
24036-
"meta": {
24037-
"description": "Paper samples, paper extracts (known), paper extracts (unknown). \n\nThis dataset is associated with the following publication:\nSchaider, L., S. Balan, A. Blum, D. Andrews, M. Strynar, M. Dickinson, D. Lunderberg, J. Lang, and G. Peaslee. Fluorinated Compounds in U.S. Fast Food Packaging. Environmental Science \u0026amp; Technology Letters. American Chemical Society, Washington, DC, USA, 4(3): 105\u0026ndash;111, (2017).",
24038-
"qri": "md:0",
24039-
"title": "Fluorinated Compounds in U.S. Fast Food Packaging"
24040-
},
24041-
"qri": "ds:0",
24042-
"structure": {
24043-
"checksum": "QmcN7FHgCbP9MfUmurGuNh3X1DNU4B9LbjXg3r2b3VBrQZ",
24044-
"entries": 25,
24045-
"errCount": 1,
24046-
"format": "cbor",
24047-
"length": 1785,
24048-
"qri": "st:0",
24049-
"schema": {
24050-
"items": {
24051-
"items": [
24052-
{
24053-
"title": "sample",
24054-
"type": "string"
24055-
},
24056-
{
24057-
"title": "comments",
24058-
"type": "string"
24059-
},
24060-
{
24061-
"description": "length of sample in cm",
24062-
"title": "length_cm",
24063-
"type": "integer"
24064-
},
24065-
{
24066-
"description": "width of sample in cm",
24067-
"title": "width_cm",
24068-
"type": "integer"
24069-
},
24070-
{
24071-
"description": "area of sample in cm2",
24072-
"title": "area_cm",
24073-
"type": "integer"
24074-
},
24075-
{
24076-
"description": "vial tare in grams",
24077-
"title": "vial_tare_g",
24078-
"type": "number"
24079-
},
24080-
{
24081-
"description": "mass of vial tare with paper in grams",
24082-
"title": "vial_with_paper_g",
24083-
"type": "number"
24084-
},
24085-
{
24086-
"description": "mass of paper in grams",
24087-
"title": "mass_g",
24088-
"type": "number"
24089-
}
24090-
],
24091-
"type": "array"
24092-
},
24093-
"type": "array"
24094-
}
24095-
}
24096-
}
24097-
},
2409824023
{
2409924024
"peername": "peer",
2410024025
"name": "movies",

api/testdata/profileResponse.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"data": {
3-
"id": "",
3+
"id": "QmZePf5LeXow3RW5U1AgEiNbW46YnRGhZ7HPvm1UmPFPwt",
44
"created": "0001-01-01T00:00:00Z",
55
"updated": "0001-01-01T00:00:00Z",
66
"peername": "peer",

core/datasets.go

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/qri-io/jsonschema"
2626
"github.com/qri-io/qri/p2p"
2727
"github.com/qri-io/qri/repo"
28-
"github.com/qri-io/qri/repo/profile"
2928
"github.com/qri-io/varName"
3029
)
3130

@@ -66,28 +65,25 @@ func (r *DatasetRequests) List(p *ListParams, res *[]repo.DatasetRef) error {
6665
return r.cli.Call("DatasetRequests.List", p, res)
6766
}
6867

69-
if err := repo.CanonicalizePeername(r.repo, &p.Peername); err != nil {
70-
return fmt.Errorf("error canonicalizing peername: %s", err.Error())
68+
ds := &repo.DatasetRef{
69+
Peername: p.Peername,
70+
PeerID: p.PeerID,
7171
}
7272

73-
if p.PeerID != "" {
74-
if pid, err := profile.NewB58PeerID(p.PeerID); err == nil {
75-
if peer, err := r.repo.Peers().GetPeer(pid); err == nil {
76-
p.Peername = peer.Peername
77-
}
78-
}
73+
if err := repo.CanonicalizePeer(r.repo, ds); err != nil {
74+
return fmt.Errorf("error canonicalizing peer: %s", err.Error())
7975
}
8076

81-
if p.Peername != "" && r.Node != nil {
82-
replies, err := r.Node.RequestDatasetsList(p.Peername)
77+
if ds.Peername != "" && r.Node != nil {
78+
replies, err := r.Node.RequestDatasetsList(ds.Peername)
8379
*res = replies
8480
return err
85-
} else if p.Peername != "" {
81+
} else if ds.Peername != "" {
8682
pro, err := r.repo.Profile()
8783
if err != nil {
8884
return err
8985
}
90-
if pro.Peername != p.Peername && r.Node == nil {
86+
if pro.Peername != ds.Peername && r.Node == nil {
9187
return fmt.Errorf("cannot list remote datasets without p2p connection")
9288
}
9389
}
@@ -224,10 +220,6 @@ func (r *DatasetRequests) Init(p *InitParams, res *repo.DatasetRef) error {
224220
filename = p.DataFilename
225221
)
226222

227-
if err := repo.CanonicalizePeername(r.repo, &p.Peername); err != nil {
228-
return fmt.Errorf("error canonicalizing peername: %s", err.Error())
229-
}
230-
231223
if p.URL != "" {
232224
res, err := http.Get(p.URL)
233225
if err != nil {
@@ -323,6 +315,11 @@ func (r *DatasetRequests) Init(p *InitParams, res *repo.DatasetRef) error {
323315
}
324316

325317
ref := repo.DatasetRef{Peername: p.Peername, Name: name, Path: dskey.String(), Dataset: ds}
318+
319+
if err := repo.CanonicalizePeer(r.repo, &ref); err != nil {
320+
return fmt.Errorf("error canonicalizing peername: %s", err.Error())
321+
}
322+
326323
if err = r.repo.PutRef(ref); err != nil {
327324
return fmt.Errorf("error adding dataset name to repo: %s", err.Error())
328325
}

core/datasets_test.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func TestDatasetRequestsInit(t *testing.T) {
6868

6969
func TestDatasetRequestsList(t *testing.T) {
7070
var (
71-
movies, counter, cities, craigslist, flourinated repo.DatasetRef
71+
movies, counter, cities, craigslist repo.DatasetRef
7272
)
7373

7474
mr, err := testrepo.NewTestRepo()
@@ -93,8 +93,6 @@ func TestDatasetRequestsList(t *testing.T) {
9393
cities = ref
9494
case "craigslist":
9595
craigslist = ref
96-
case "flourinated_compounds_in_fast_food_packaging":
97-
flourinated = ref
9896
}
9997
}
10098

@@ -105,9 +103,9 @@ func TestDatasetRequestsList(t *testing.T) {
105103
}{
106104
{&ListParams{OrderBy: "", Limit: 1, Offset: 0}, nil, ""},
107105
{&ListParams{OrderBy: "chaos", Limit: 1, Offset: -50}, nil, ""},
108-
{&ListParams{OrderBy: "", Limit: 30, Offset: 0}, []repo.DatasetRef{cities, counter, craigslist, flourinated, movies}, ""},
109-
{&ListParams{OrderBy: "timestamp", Limit: 30, Offset: 0}, []repo.DatasetRef{cities, counter, craigslist, flourinated, movies}, ""},
110-
{&ListParams{Peername: "me", OrderBy: "timestamp", Limit: 30, Offset: 0}, []repo.DatasetRef{cities, counter, craigslist, flourinated, movies}, ""},
106+
{&ListParams{OrderBy: "", Limit: 30, Offset: 0}, []repo.DatasetRef{cities, counter, craigslist, movies}, ""},
107+
{&ListParams{OrderBy: "timestamp", Limit: 30, Offset: 0}, []repo.DatasetRef{cities, counter, craigslist, movies}, ""},
108+
{&ListParams{Peername: "me", OrderBy: "timestamp", Limit: 30, Offset: 0}, []repo.DatasetRef{cities, counter, craigslist, movies}, ""},
111109
// TODO: re-enable {&ListParams{OrderBy: "name", Limit: 30, Offset: 0}, []*repo.DatasetRef{cities, counter, movies}, ""},
112110
}
113111

repo/ref.go

Lines changed: 98 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/mr-tron/base58/base58"
99
"github.com/multiformats/go-multihash"
1010
"github.com/qri-io/dataset"
11+
"github.com/qri-io/qri/repo/profile"
1112
)
1213

1314
// Refstore keeps a collection of dataset references
@@ -29,6 +30,8 @@ type Refstore interface {
2930
// keep in mind that if the information is important at all, it should
3031
// be stored as metadata within the dataset itself.
3132
type DatasetRef struct {
33+
// PeerID of dataset owner
34+
PeerID string `json:"peerID,omitempty"`
3235
// Peername of dataset owner
3336
Peername string `json:"peername,omitempty"`
3437
// Unique name reference for this dataset
@@ -42,6 +45,9 @@ type DatasetRef struct {
4245
// String implements the Stringer interface for DatasetRef
4346
func (r DatasetRef) String() (s string) {
4447
s = r.Peername
48+
if s == "" {
49+
s = r.PeerID
50+
}
4551
if r.Name != "" {
4652
s += "/" + r.Name
4753
}
@@ -56,17 +62,17 @@ func (r DatasetRef) String() (s string) {
5662
func (r DatasetRef) Match(b DatasetRef) bool {
5763
// fmt.Printf("\nr.Peername: %s b.Peername: %s\n", r.Peername, b.Peername)
5864
// fmt.Printf("\nr.Name: %s b.Name: %s\n", r.Name, b.Name)
59-
return r.Peername == b.Peername && r.Name == b.Name || r.Path == b.Path
65+
return (r.PeerID == b.PeerID || r.Peername == b.Peername) && r.Name == b.Name || r.Path == b.Path
6066
}
6167

6268
// Equal returns true only if Peername Name and Path are equal
6369
func (r DatasetRef) Equal(b DatasetRef) bool {
64-
return r.Peername == b.Peername && r.Name == b.Name && r.Path == b.Path
70+
return r.Peername == b.Peername && r.PeerID == b.PeerID && r.Name == b.Name && r.Path == b.Path
6571
}
6672

6773
// IsPeerRef returns true if only Peername is set
6874
func (r DatasetRef) IsPeerRef() bool {
69-
return r.Peername != "" && r.Name == "" && r.Path == "" && r.Dataset == nil
75+
return (r.Peername != "" || r.PeerID != "") && r.Name == "" && r.Path == "" && r.Dataset == nil
7076
}
7177

7278
// IsEmpty returns true if none of it's fields are set
@@ -137,6 +143,7 @@ func ParseDatasetRef(ref string) (DatasetRef, error) {
137143
pathRefString string
138144
path string
139145
peername string
146+
peerID string
140147
datasetname string
141148
)
142149
// if there is an @ symbol, we are dealing with a DatasetRef
@@ -181,17 +188,26 @@ func ParseDatasetRef(ref string) (DatasetRef, error) {
181188
if nameRefString != "" {
182189
if fullnameRegex.MatchString(nameRefString) {
183190
matches := fullnameRegex.FindStringSubmatch(nameRefString)
184-
peername = matches[1]
191+
if isBase58Multihash(matches[1]) {
192+
peerID = matches[1]
193+
} else {
194+
peername = matches[1]
195+
}
185196
datasetname = matches[2]
186197
} else if simpleRegex.MatchString(nameRefString) {
187198
matches := simpleRegex.FindStringSubmatch(nameRefString)
188-
peername = matches[1]
199+
if isBase58Multihash(matches[1]) {
200+
peerID = matches[1]
201+
} else {
202+
peername = matches[1]
203+
}
189204
} else {
190205
return DatasetRef{}, fmt.Errorf("malformed DatasetRef string: %s", ref)
191206
}
192207
}
193208

194209
return DatasetRef{
210+
PeerID: peerID,
195211
Peername: peername,
196212
Name: datasetname,
197213
Path: path,
@@ -233,7 +249,7 @@ func CanonicalizeDatasetRef(r Repo, ref *DatasetRef) error {
233249
return nil
234250
}
235251

236-
if err := CanonicalizePeername(r, &ref.Peername); err != nil {
252+
if err := CanonicalizePeer(r, ref); err != nil {
237253
return err
238254
}
239255

@@ -247,22 +263,92 @@ func CanonicalizeDatasetRef(r Repo, ref *DatasetRef) error {
247263
return nil
248264
}
249265

250-
// CanonicalizePeername uses a repo to replace aliases with
266+
// CanonicalizePeer uses a repo to replace aliases with
251267
// canonical peernames. basically, this thing replaces "me" with the proper peername.
252-
func CanonicalizePeername(r Repo, peername *string) error {
253-
if *peername == "me" {
254-
p, err := r.Profile()
268+
func CanonicalizePeer(r Repo, ref *DatasetRef) error {
269+
if ref.Peername == "" && ref.PeerID == "" {
270+
return nil
271+
}
272+
273+
p, err := r.Profile()
274+
if err != nil {
275+
return err
276+
}
277+
278+
if ref.Peername == "me" || ref.Peername == p.Peername || ref.PeerID == p.ID {
279+
if ref.Peername == "me" {
280+
ref.Peername = p.Peername
281+
}
282+
283+
if ref.Peername != "" && ref.PeerID != "" {
284+
if ref.Peername == p.Peername && ref.PeerID != p.ID {
285+
return fmt.Errorf("Peername and PeerID combination not valid: Peername = %s, PeerID = %s, but was given PeerID = %s", p.Peername, p.ID, ref.PeerID)
286+
}
287+
if ref.PeerID == p.ID && ref.Peername != p.Peername {
288+
return fmt.Errorf("Peername and PeerID combination not valid: PeerID = %s, Peername = %s, but was given Peername = %s", p.ID, p.Peername, ref.Peername)
289+
}
290+
if ref.Peername == p.Peername && ref.PeerID == p.ID {
291+
return nil
292+
}
293+
}
294+
295+
if ref.Peername != "" {
296+
if ref.Peername != p.Peername {
297+
return nil
298+
}
299+
}
300+
301+
if ref.PeerID != "" {
302+
if ref.PeerID != p.ID {
303+
return nil
304+
}
305+
}
306+
307+
ref.Peername = p.Peername
308+
ref.PeerID = p.ID
309+
return nil
310+
}
311+
if ref.PeerID != "" {
312+
pid, err := profile.NewB58PeerID(ref.PeerID)
255313
if err != nil {
256-
return err
314+
return fmt.Errorf("error converting PeerID to base58 hash: %s", err)
315+
}
316+
317+
peer, err := r.Peers().GetPeer(pid)
318+
if err != nil {
319+
return fmt.Errorf("error fetching peers from store: %s", err)
320+
}
321+
322+
if ref.Peername == "" {
323+
ref.Peername = peer.Peername
324+
return nil
325+
}
326+
if ref.Peername != peer.Peername {
327+
return fmt.Errorf("Peername and PeerID combination not valid: PeerID = %s, Peername = %s, but was given Peername = %s", peer.ID, peer.Peername, ref.Peername)
328+
}
329+
}
330+
if ref.Peername != "" {
331+
id, err := r.Peers().GetID(ref.Peername)
332+
if err != nil {
333+
return fmt.Errorf("error fetching peers from store: %s", err)
334+
}
335+
if ref.PeerID == "" {
336+
ref.PeerID = id.String()
337+
return nil
338+
}
339+
if ref.PeerID != id.String() {
340+
return fmt.Errorf("Peername and PeerID combination not valid: Peername = %s, PeerID = %s, but was given PeerID = %s", ref.Peername, id.String(), ref.PeerID)
257341
}
258-
*peername = p.Peername
259342
}
260343
return nil
261344
}
262345

263346
// CompareDatasetRef compares two Dataset References, returning an error
264347
// describing any difference between the two references
265348
func CompareDatasetRef(a, b DatasetRef) error {
349+
if a.PeerID != b.PeerID {
350+
return fmt.Errorf("peerID mismatch. %s != %s", a.PeerID, b.PeerID)
351+
}
266352
if a.Peername != b.Peername {
267353
return fmt.Errorf("peername mismatch. %s != %s", a.Peername, b.Peername)
268354
}

0 commit comments

Comments
 (0)