json-object-editor 0.10.220 → 0.10.222
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/grunt/package-lock.json +9105 -9105
- package/package.json +3 -2
- package/pages/template.html +2 -2
- package/plaidTest.js +87 -0
- package/server/modules/Apps.js +16 -0
- package/server/modules/Server.js +6 -2
- package/server/plugins/auth copy.js +103 -0
- package/server/plugins/auth.js +41 -27
- package/server/plugins/money-legacy.js +268 -0
- package/server/plugins/money.js +40 -238
- package/server/schemas/list.js +38 -30
- package/server/schemas/page.js +22 -9
- package/server/schemas/user.js +2 -1
package/server/plugins/money.js
CHANGED
|
@@ -1,257 +1,59 @@
|
|
|
1
|
+
// import { Configuration, PlaidApi, PlaidEnvironments } from 'plaid';
|
|
2
|
+
|
|
1
3
|
function Money() {
|
|
4
|
+
const plaid = require('plaid');
|
|
2
5
|
var self = this;
|
|
3
|
-
const plaid = require("plaid");
|
|
4
|
-
var environment = plaid.environments.development;
|
|
5
6
|
var plaidClient;
|
|
6
7
|
var ACCESS_TOKEN = "";
|
|
7
8
|
var PUBLIC_TOKEN = null;
|
|
8
9
|
|
|
9
|
-
var ACCESS_TOKENS
|
|
10
|
-
//initPlaidClient();
|
|
10
|
+
var ACCESS_TOKENS;
|
|
11
11
|
|
|
12
12
|
function initPlaidClient() {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
public_key,
|
|
26
|
-
environment,
|
|
27
|
-
{ version: "2018-05-22" }
|
|
28
|
-
);
|
|
29
|
-
return true;
|
|
30
|
-
} catch (e) {
|
|
31
|
-
logit("plaid client init error",e);
|
|
32
|
-
return e;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function checkPlaidClient(res){
|
|
36
|
-
var p = initPlaidClient();
|
|
37
|
-
if(!plaidClient){
|
|
38
|
-
res.jsonp(p);
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function getAT(data){
|
|
45
|
-
var AT = ACCESS_TOKENS[data.bank];
|
|
46
|
-
if(!AT){return false;}
|
|
47
|
-
return AT.access_token;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
this.getPublicToken = function(data, request, response){
|
|
51
|
-
var p = initPlaidClient();
|
|
52
|
-
if(!plaidClient){
|
|
53
|
-
return p;
|
|
54
|
-
}
|
|
55
|
-
var AT = ACCESS_TOKENS[data.bank];
|
|
56
|
-
if(!AT)return {error:'bank not found'}
|
|
57
|
-
logit(AT);
|
|
58
|
-
plaidClient.createPublicToken(AT.access_token, (err,data)=>{
|
|
59
|
-
response.jsonp({err,data})
|
|
13
|
+
//console.log('plaidinit',plaidClient);
|
|
14
|
+
if(plaidClient){ return;}
|
|
15
|
+
logit('initializing plaid client')
|
|
16
|
+
try {
|
|
17
|
+
const configuration = new Configuration({
|
|
18
|
+
basePath: PlaidEnvironments.development,
|
|
19
|
+
baseOptions: {
|
|
20
|
+
headers: {
|
|
21
|
+
'PLAID-CLIENT-ID': CLIENT_ID,
|
|
22
|
+
'PLAID-SECRET': SECRET,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
60
25
|
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return p;
|
|
67
|
-
}
|
|
68
|
-
var AT = getAT(data);
|
|
26
|
+
var client_id = JOE.Cache.settings.PLAID_CLIENTID;
|
|
27
|
+
var secret = JOE.Cache.settings.PLAID_SECRET_development;
|
|
28
|
+
var public_key = JOE.Cache.settings.PLAID_PUBLIC_KEY;
|
|
29
|
+
ACCESS_TOKENS = JOE.Cache.settings.PLAID_ACCESS_TOKENS && JSON.parse(JOE.Cache.settings.PLAID_ACCESS_TOKENS);
|
|
30
|
+
//console.log(ACCESS_TOKENS);
|
|
69
31
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
response.jsonp({err,pdata,data})
|
|
74
|
-
});
|
|
75
|
-
return { use_callback: true };
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
this.get_access_token = function(data, request, response) {
|
|
79
|
-
var p = initPlaidClient();
|
|
80
|
-
if(!plaidClient){
|
|
81
|
-
return p;
|
|
82
|
-
}
|
|
83
|
-
console.log(data);
|
|
84
|
-
PUBLIC_TOKEN = (request.query && request.query.public_token)
|
|
85
|
-
||(request.body && request.body.public_token);
|
|
86
|
-
plaidClient.exchangePublicToken(PUBLIC_TOKEN, function(
|
|
87
|
-
error,
|
|
88
|
-
tokenResponse
|
|
89
|
-
) {
|
|
90
|
-
if (error != null) {
|
|
91
|
-
console.log("Could not exchange public_token!" + "\n" + error);
|
|
92
|
-
return response.jsonp({ error });
|
|
93
|
-
}
|
|
94
|
-
ACCESS_TOKEN = tokenResponse.access_token;
|
|
95
|
-
ITEM_ID = tokenResponse.item_id;
|
|
96
|
-
console.log("Access Token: " + ACCESS_TOKEN);
|
|
97
|
-
console.log("Item ID: " + ITEM_ID);
|
|
98
|
-
response.jsonp({ error: false });
|
|
99
|
-
});
|
|
100
|
-
return { use_callback: true };
|
|
101
|
-
};
|
|
102
|
-
this.accounts = function(data, request, response){
|
|
103
|
-
var p = initPlaidClient();
|
|
104
|
-
if(!plaidClient){
|
|
105
|
-
return p;
|
|
106
|
-
}
|
|
107
|
-
var AT = getAT(data);
|
|
108
|
-
if(!AT)return {error:'bank not found'}
|
|
109
|
-
plaidClient.getAccounts(AT, (err, result) => {
|
|
110
|
-
// Handle err
|
|
111
|
-
if(err){
|
|
112
|
-
response.json({error:err});
|
|
113
|
-
}else{
|
|
114
|
-
const accounts = result.accounts;
|
|
115
|
-
response.jsonp(result);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
return { use_callback: true };
|
|
119
|
-
}
|
|
120
|
-
this.accountNumbers = function(data, request, response){
|
|
121
|
-
var p = initPlaidClient();
|
|
122
|
-
if(!plaidClient){
|
|
123
|
-
return p;
|
|
32
|
+
configuration.headers={
|
|
33
|
+
'PLAID-CLIENT-ID': client_id,
|
|
34
|
+
'PLAID-SECRET': secret,
|
|
124
35
|
}
|
|
125
|
-
var AT = getAT(data);
|
|
126
|
-
if(!AT)return {error:'bank not found'}
|
|
127
|
-
plaidClient.getAuth(AT,{}, (err, result) => {
|
|
128
|
-
// Handle err
|
|
129
|
-
if(err){
|
|
130
|
-
response.json({error:err});
|
|
131
|
-
}else{
|
|
132
|
-
var accounts = result.accounts;
|
|
133
|
-
response.jsonp(result);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
return { use_callback: true };
|
|
137
|
-
}
|
|
138
|
-
this.transactions = function(data, request, response,specs={}){
|
|
139
|
-
var p = initPlaidClient();
|
|
140
|
-
if(!plaidClient){
|
|
141
|
-
return p;
|
|
142
|
-
}
|
|
143
|
-
var request = request || (data && data.request);
|
|
144
|
-
console.log('params',data);
|
|
145
|
-
var AT = request.query.at || (data.account && data.account.access_token)|| getAT(data);
|
|
146
|
-
var account_ids = request.query.account_ids && (request.query.account_ids.split(',')) || null;
|
|
147
|
-
console.log('accounts',account_ids);
|
|
148
|
-
console.log('AT',AT)
|
|
149
|
-
var curDate = new Date();
|
|
150
|
-
var start_date = data.start_date || curDate.getFullYear()+'-01-01';
|
|
151
|
-
var end_date = data.end_date || new Date().format('Y-m-d');
|
|
152
|
-
var count = data.count || 500;
|
|
153
|
-
if(!AT){return {error:'access token not found',ACCESS_TOKENS};}
|
|
154
|
-
plaidClient.getTransactions(AT, start_date, end_date, {count,account_ids}, (error,pdata)=>{
|
|
155
|
-
|
|
156
|
-
if(!specs.callback){
|
|
157
|
-
if(error){
|
|
158
|
-
return response.jsonp({error})
|
|
159
|
-
}
|
|
160
|
-
if(!request.query.full){
|
|
161
|
-
return response.jsonp({error,transactions:pdata.transactions})
|
|
162
|
-
}
|
|
163
|
-
response.jsonp({error,pdata,data})
|
|
164
|
-
}else{
|
|
165
|
-
logit('[money] using callback')
|
|
166
|
-
specs.callback(error,pdata,data)
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
36
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
37
|
+
plaidClient = new PlaidApi(configuration);
|
|
38
|
+
return true;
|
|
39
|
+
} catch (e) {
|
|
40
|
+
logit("plaid client init error",e);
|
|
41
|
+
return e;
|
|
174
42
|
}
|
|
175
|
-
|
|
176
|
-
var p = initPlaidClient();
|
|
177
|
-
if(!plaidClient){
|
|
178
|
-
return p;
|
|
179
|
-
}
|
|
180
|
-
var callback = function(err, mfaResponse, response) {
|
|
181
|
-
res.jsonp({
|
|
182
|
-
err: err,
|
|
183
|
-
mfaResponse: mfaResponse,
|
|
184
|
-
response: response,
|
|
185
|
-
environments: plaid.environments
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
if (data["id"]) {
|
|
189
|
-
plaid.getInstitution(data["id"], environment, callback);
|
|
190
|
-
} else {
|
|
191
|
-
plaid.getInstitutions(environment, callback);
|
|
192
|
-
}
|
|
193
|
-
return { use_callback: true };
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
this.authTest = function(data, req, res) {
|
|
197
|
-
if (!plaidClient) {
|
|
198
|
-
initPlaidClient();
|
|
199
|
-
}
|
|
200
|
-
try {
|
|
201
|
-
var user = data["username"] || "plaid_test";
|
|
202
|
-
var pass = data["password"] || "plaid_good";
|
|
203
|
-
|
|
204
|
-
var credentials = { username: user, password: pass };
|
|
205
|
-
var institution_type = "wells"; //wf
|
|
206
|
-
plaidClient.addAuthUser(institution_type, credentials, function(
|
|
207
|
-
err,
|
|
208
|
-
mfaResponse,
|
|
209
|
-
response
|
|
210
|
-
) {
|
|
211
|
-
res.jsonp({ err: err, mfaResponse: mfaResponse, response: response });
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
return { use_callback: true };
|
|
215
|
-
} catch (e) {
|
|
216
|
-
return { error: e };
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
this.connect = function(data, req, res) {
|
|
221
|
-
if (!plaidClient) {
|
|
222
|
-
initPlaidClient();
|
|
223
|
-
}
|
|
224
|
-
try {
|
|
225
|
-
var user = data["username"] || "plaid_test";
|
|
226
|
-
var pass = data["password"] || "plaid_good";
|
|
43
|
+
}
|
|
227
44
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
) {
|
|
235
|
-
res.jsonp({ err: err, mfaResponse: mfaResponse, response: response });
|
|
236
|
-
});
|
|
45
|
+
this.LinkTest = async function(data, request, response){
|
|
46
|
+
initPlaidClient();
|
|
47
|
+
const pResponse = await plaidClient.itemPublicTokenExchange({ public_token });
|
|
48
|
+
const access_token = pResponse.data.access_token;
|
|
49
|
+
const accounts_response = await plaidClient.accountsGet({ access_token });
|
|
50
|
+
const accounts = accounts_response.data.accounts;
|
|
237
51
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
};
|
|
52
|
+
response.jsonp({ error: false,accounts });
|
|
53
|
+
return { use_callback: true };
|
|
54
|
+
}
|
|
243
55
|
|
|
244
|
-
|
|
245
|
-
var public_token = data["token"];
|
|
246
|
-
var callback = function(err, mfaResponse, response) {
|
|
247
|
-
res.jsonp({ err: err, mfaResponse: mfaResponse, response: response });
|
|
248
|
-
};
|
|
249
|
-
try {
|
|
250
|
-
plaidClient.exchangeToken(public_token, callback);
|
|
251
|
-
} catch (e) {
|
|
252
|
-
return { error: e };
|
|
253
|
-
}
|
|
254
|
-
};
|
|
56
|
+
|
|
255
57
|
|
|
256
58
|
this.default = function(data, req, res) {
|
|
257
59
|
res.jsonp({ data: data });
|
package/server/schemas/list.js
CHANGED
|
@@ -89,16 +89,11 @@ var schema = {
|
|
|
89
89
|
fields:function(){
|
|
90
90
|
return [
|
|
91
91
|
'name',
|
|
92
|
-
{section_start:'notes',collapsed:function(){
|
|
93
|
-
return !(i.info || i.description)
|
|
94
|
-
}},
|
|
95
|
-
'info',
|
|
96
|
-
'description',
|
|
97
|
-
{section_end:'notes'},
|
|
98
92
|
|
|
99
93
|
{section_start:'items'},
|
|
100
94
|
{
|
|
101
95
|
name:'items',
|
|
96
|
+
display:"existing items",
|
|
102
97
|
type:'objectReference',
|
|
103
98
|
values:function(list){
|
|
104
99
|
var haystack = [];
|
|
@@ -110,37 +105,50 @@ var schema = {
|
|
|
110
105
|
},
|
|
111
106
|
{name:'addingredient',label:false, type:'create',schema:'ingredient',width:'50%'},
|
|
112
107
|
{name:'addtask',label:false, type:'create',schema:'task',width:'50%'},
|
|
113
|
-
{name:'custom_items',type:"objectList",properties:[
|
|
108
|
+
{name:'custom_items', display:'freeform items',type:"objectList",properties:[
|
|
114
109
|
'name',
|
|
115
|
-
{name:'type',width:'
|
|
116
|
-
|
|
110
|
+
{name:'type',width:'80px'},
|
|
111
|
+
{name:'sub_complete',display:'done',type:'boolean',width:'50px'}
|
|
112
|
+
],
|
|
113
|
+
template:function(obj,subobj){
|
|
114
|
+
var done = (subobj.sub_complete)?'joe-strike':'';
|
|
115
|
+
return`<joe-subtext>${subobj.type ||''}</joe-subtext>
|
|
116
|
+
<joe-title class="${done}">${subobj.name}</joe-title>`
|
|
117
|
+
}},
|
|
117
118
|
{section_end:'items'},
|
|
118
|
-
|
|
119
|
+
{section_start:'notes',collapsed:function(){
|
|
120
|
+
return !(i.info || i.description)
|
|
121
|
+
}},
|
|
122
|
+
'info',
|
|
123
|
+
'description',
|
|
124
|
+
{section_end:'notes'},
|
|
119
125
|
{sidebar_start:'right',collapsed:function(i){
|
|
120
126
|
return (i.list_type || (i.tags || i.tags.length));
|
|
121
127
|
}},
|
|
122
|
-
'
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
128
|
+
{section_start:'activity'},
|
|
129
|
+
'status',
|
|
130
|
+
{name:'date',type:'date',native:true},
|
|
131
|
+
'reports',
|
|
132
|
+
{section_start:'activity'},
|
|
133
|
+
{section_start:'classification'},
|
|
134
|
+
{name:'list_type',display:"List Type",
|
|
135
|
+
autocomplete:{text:true},
|
|
136
|
+
values:function(i){
|
|
137
|
+
//get list list types
|
|
138
|
+
var listTypes = [];
|
|
139
|
+
for(var l=0;l<_joe.Data.list.length;l++){
|
|
140
|
+
let lt = _joe.Data.list[l].list_type;
|
|
141
|
+
if(lt){
|
|
142
|
+
listTypes.push(lt);
|
|
143
|
+
}
|
|
135
144
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
{section_end:'details'},
|
|
145
|
+
listTypes = Array.from(new Set(listTypes));
|
|
146
|
+
return listTypes;
|
|
147
|
+
}},
|
|
148
|
+
'tags',
|
|
149
|
+
{section_end:'classification'},
|
|
142
150
|
{section_start:'access'},
|
|
143
|
-
|
|
151
|
+
'_protected',
|
|
144
152
|
{section_end:'access'},
|
|
145
153
|
{sidebar_end:'right'},
|
|
146
154
|
{section_start:'system',collapsed:true},
|
package/server/schemas/page.js
CHANGED
|
@@ -136,15 +136,21 @@ var page = {
|
|
|
136
136
|
'updated',
|
|
137
137
|
{name:'preview',type:'content',run:function(item){
|
|
138
138
|
if(item.site){
|
|
139
|
-
var site = _joe.
|
|
139
|
+
var site = $J.get(_joe.current.object.site);
|
|
140
|
+
//_joe.Data.site.where({_id:item.site})[0]||{};
|
|
140
141
|
|
|
141
|
-
var path = __jsc.PORT?('/'+site.url+'/'+item.path).replace('//','/'):'//'+location.hostname+':'+__jsc.sitesPort+'/'+(site.url+'/'+item.path).replace('//','/');
|
|
142
|
+
//var path = __jsc.PORT?('/'+site.url+'/'+item.path).replace('//','/'):'//'+location.hostname+':'+__jsc.sitesPort+'/'+(site.url+'/'+item.path).replace('//','/');
|
|
143
|
+
var path = location.origin + (site.path||'')+item.path;
|
|
142
144
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
return `
|
|
146
|
+
<joe-subtext>${location.origin}</joe-subtext>
|
|
147
|
+
<joe-subtitle>${(site.path||'')+item.path}</joe-subtitle>
|
|
148
|
+
<joe-button class="joe-button joe-iconed-button joe-preview-button full-width"
|
|
149
|
+
onclick="window.open('${path}');">Preview</joe-button>
|
|
150
|
+
<joe-button class="joe-button joe-iconed-button full-width"
|
|
151
|
+
onclick="window.open('${path}?editor=true');">Editor</joe-button>`
|
|
152
|
+
|
|
153
|
+
;
|
|
148
154
|
}else{
|
|
149
155
|
return 'no site selected';
|
|
150
156
|
}
|
|
@@ -152,8 +158,15 @@ var page = {
|
|
|
152
158
|
{section_start:'Adv'},
|
|
153
159
|
{extend:'site',specs:{rerender:'preview'}},
|
|
154
160
|
{name:'path',
|
|
155
|
-
onblur:'if(this.value[0] != \'/\'){this.value = \'/\'+this.value;}'
|
|
156
|
-
+'_joe.Fields.rerender(\'preview\');'/*rerender:'preview'*/,
|
|
161
|
+
// onblur:'if(this.value[0] != \'/\'){this.value = \'/\'+this.value;}'
|
|
162
|
+
// +'_joe.Fields.rerender(\'preview\');'/*rerender:'preview'*/,
|
|
163
|
+
// onblur:function(a,b,c){
|
|
164
|
+
// console.log(a,b,c);
|
|
165
|
+
// if(this.value[0] != "/"){this.value = "/"+this.value;};
|
|
166
|
+
// return this.value;
|
|
167
|
+
// //+'_joe.Fields.rerender(\'preview\');'
|
|
168
|
+
// },
|
|
169
|
+
rerender:'preview',
|
|
157
170
|
comment:'use /:reference for dynamic pages'
|
|
158
171
|
},
|
|
159
172
|
|
package/server/schemas/user.js
CHANGED
|
@@ -50,7 +50,8 @@ var user = function(){return{
|
|
|
50
50
|
subs = subs.concat(_joe.Filter.Options.tags());
|
|
51
51
|
subs.push({group_end:'tags'});
|
|
52
52
|
|
|
53
|
-
var roles = _joe.Utils.Settings('CUSTOM_ROLES');
|
|
53
|
+
var roles = _joe.Utils.Settings('CUSTOM_ROLES') || [];
|
|
54
|
+
|
|
54
55
|
ss_roles = roles.map(r=>{
|
|
55
56
|
return{ name:r.name,
|
|
56
57
|
filter:{custom_roles:{$in:[r._id]}}
|