-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathSearch.js
116 lines (86 loc) · 3.5 KB
/
Search.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class Search {
constructor(discovery, identityManager) {
if (!discovery) throw new Error('The discovery component is a needed parameter');
if (!identityManager) throw new Error('The identityManager component is a needed parameter');
let _this = this;
_this.discovery = discovery;
_this.identityManager = identityManager;
}
myIdentity() {
let _this = this;
return new Promise(function(resolve, reject) {
_this.identityManager.discoverUserRegistered().then((result) => {
resolve(result);
}).catch((reason) => {
reject(reason);
});
});
}
hyperties(users, schemes, resources, globalFlag = false) {
//TODO: reuse users or the other way around
}
/**
* List of usersURL to search
* @param {array<URL.userURL>} users List of UserUR, like this format user://<ipddomain>/<user-identifier>
* @return {Promise}
*/
users(usersURLs, providedDomains, schemes, resources, globalFlag = false) {
if (!usersURLs) throw new Error('You need to provide a list of users');
if (!providedDomains) throw new Error('You need to provide a list of domains');
if (!resources) throw new Error('You need to provide a list of resources');
if (!schemes) throw new Error('You need to provide a list of schemes');
let _this = this;
return new Promise(function(resolve, reject) {
console.info('[Search] Users: ', usersURLs, usersURLs.length);
console.info('[Search] Domains: ', providedDomains, providedDomains.length);
if (usersURLs.length === 0) {
console.info('Don\'t have users to discovery');
resolve(usersURLs);
} else {
let getUsers = [];
usersURLs.forEach((userURL, index) => {
let currentDomain = providedDomains[index];
console.info('[Search] Search user ' + userURL + ' for provided domain:', currentDomain);
if (!globalFlag) {
getUsers.push(_this.discovery.discoverHyperties(userURL, schemes, resources, currentDomain));
} else {
getUsers.push(_this.discovery.discoverHypertiesPerUserProfileData(userURL, schemes, resources));
}
});
console.info('Requests promises: ', getUsers);
Promise.all(getUsers.map((promise) => {
return promise.then((hyperty) => { return hyperty; }, (error) => { return error; });
})).then((hyperties) => {
console.info('[Search] Hyperties from new Discovery', hyperties);
let result = hyperties.map(function(hyperty) {
if (hyperty.hasOwnProperty('hypertyID'))
return hyperty;
let recent = Object.keys(hyperty).reduceRight(function(a, b) {
let hypertyDate = new Date(hyperty[b].lastModified);
let hypertyDateP = new Date(hyperty[a].lastModified);
if (hypertyDateP.getTime() < hypertyDate.getTime()) {
return b;
}
return a;
});
return hyperty[recent];
});
let clean = result.filter((hyperty) => {
return hyperty.hasOwnProperty('hypertyID');
});
console.log('Requests result: ', clean);
hyperties.forEach(function(entry) {
if (entry !== 'No Hyperty was found') {
return resolve(clean);
}
});
reject('No Hyperty was found');
}).catch((reason) => {
console.error(reason);
resolve(usersURLs);
});
}
});
}
}
export default Search;