beech-api 3.5.7 → 3.7.0

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.
Files changed (48) hide show
  1. package/README.md +401 -186
  2. package/index.js +2 -3
  3. package/package.json +15 -8
  4. package/packages/cli/beech +2 -2
  5. package/packages/cli/bin/{beech.js → beech-app.js} +105 -43
  6. package/packages/cli/bin/beech-service.js +133 -0
  7. package/packages/cli/core/auth/Credentials.js +76 -35
  8. package/packages/cli/core/auth/Passport.js +318 -184
  9. package/packages/cli/core/auth/_Request.js +12 -0
  10. package/packages/cli/core/configure/_gitignore +9 -1
  11. package/packages/cli/core/configure/app.config-basic.js +10 -10
  12. package/packages/cli/core/configure/app.config-sequelize.js +17 -12
  13. package/packages/cli/core/configure/beech.config.js +8 -0
  14. package/packages/cli/core/configure/global.config-basic.js +4 -4
  15. package/packages/cli/core/configure/global.config-sequelize.js +4 -4
  16. package/packages/cli/core/configure/passport.config.js +5 -15
  17. package/packages/cli/core/databases/mysql.js +53 -29
  18. package/packages/cli/core/databases/sequelize.js +135 -105
  19. package/packages/cli/core/databases/test.js +168 -0
  20. package/packages/cli/core/file-walk/file-walk.js +31 -14
  21. package/packages/cli/core/generator/_add-on +15 -2
  22. package/packages/cli/core/generator/_endpoints +15 -82
  23. package/packages/cli/core/generator/_endpoints_basic +39 -0
  24. package/packages/cli/core/generator/_help +12 -11
  25. package/packages/cli/core/generator/_help_create +11 -0
  26. package/packages/cli/core/generator/_help_service +11 -0
  27. package/packages/cli/core/generator/_models +20 -15
  28. package/packages/cli/core/generator/{_basic-models → _models_basic} +0 -2
  29. package/packages/cli/core/generator/_package +5 -4
  30. package/packages/cli/core/generator/index.js +302 -95
  31. package/packages/cli/core/helpers/math.js +55 -0
  32. package/packages/cli/core/helpers/poolEntity.js +31 -0
  33. package/packages/cli/core/index.js +97 -28
  34. package/packages/cli/core/origin/index.js +2 -0
  35. package/packages/cli/core/origin/whitelist/cors.js +91 -0
  36. package/packages/cli/core/services/http.express.js +338 -201
  37. package/packages/cli/core/test/utils.js +5 -5
  38. package/packages/lib/index.js +4 -0
  39. package/packages/lib/src/endpoint.js +98 -0
  40. package/packages/lib/src/salt.js +3 -0
  41. package/packages/lib/src/schema.js +62 -0
  42. package/packages/lib/src/user.js +196 -0
  43. package/packages/package.json +4 -6
  44. package/packages/public/icon/beech_128.png +0 -0
  45. package/packages/cli/core/generator/_create +0 -7
  46. package/packages/lib/beech.js +0 -136
  47. package/packages/lib/salt.js +0 -3
  48. /package/packages/cli/core/generator/{_basic-helpers → _helpers_basic} +0 -0
@@ -1,173 +1,263 @@
1
1
  const appRoot = require("app-root-path");
2
2
  const fs = require("fs");
3
- const passport_config_file = appRoot + "/passport.config.js";
3
+ const passport_config_file = appRoot + "\\passport.config.js";
4
4
  const md5 = require("md5");
5
- const secret = require("../../../lib/salt").salt;
5
+ const secret = require("../../../lib/src/salt").salt;
6
+ const { findPassportPk } = require("../helpers/poolEntity");
7
+ const { Rand } = require("../helpers/math");
6
8
  const { QueryTypes } = require("sequelize");
7
9
 
8
10
  module.exports = {
9
11
  init() {
10
- try {
11
- if (fs.existsSync(passport_config_file)) {
12
- var passport = require("passport"),
13
- LocalStrategy = require("passport-local").Strategy,
14
- GoogleStrategy = require("passport-google-oauth").OAuth2Strategy,
15
- FacebookStrategy = require('passport-facebook').Strategy;
16
- var passportJWT = require("passport-jwt"),
17
- JWTStrategy = passportJWT.Strategy,
18
- ExtractJWT = passportJWT.ExtractJwt;
19
- const auth = require("./Credentials");
20
- var passport_config = require(passport_config_file);
21
- if (passport_config.jwt_allow) {
22
- global.Credentials = auth.credentials;
23
- } else {
24
- global.Credentials = [];
25
- return;
26
- }
27
- } else {
28
- global.Credentials = [];
29
- return;
30
- }
31
- // declare constant
32
- let passportUsernameField = passport_config.model.username_field || "username";
33
- let passportPasswordField = passport_config.model.password_field || "password";
34
- let passportTable = passport_config.model.table || "users";
35
- let passportFields = (passport_config.model.fields.length) ? passport_config.model.fields : [ "id", "name", "email" ];
36
- // passport initial with token (encoder)
37
- passport.use(new LocalStrategy({
38
- usernameField: passportUsernameField,
39
- passwordField: passportPasswordField
40
- }, async (username, password, done) => {
41
- let pool = eval("sql." + passport_config.model.name);
42
- if (pool) {
43
- if (pool_base == "basic") {
44
- // pool base is MySQL
45
- pool.query("SELECT " + passportFields + " FROM ?? WHERE ?? = ? AND ?? = ?", [
46
- passportTable,
47
- passportUsernameField,
48
- username,
49
- passportPasswordField,
50
- md5(password + secret)
51
- ], (err, result) => {
52
- if (err) {
53
- return done(err, null);
54
- } else {
55
- return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
56
- }
57
- });
58
- } else if (pool_base == "sequelize") {
59
- // pool base is Sequelize
60
- try {
61
- let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + passportUsernameField + " = :username AND " + passportPasswordField + " = :password", {
62
- replacements: {
63
- fields: passportFields,
64
- username: username,
65
- password: md5(password + secret)
66
- },
67
- type: QueryTypes.SELECT
12
+ return new Promise((resolve) => {
13
+ try {
14
+ var passport_config;
15
+ const p1 = new Promise((resolve, reject) => {
16
+ /**
17
+ * Resolve ref:
18
+ * [0=passport_file_exists, 1=jwt_allow, 2=db_passport_map_is_connect]
19
+ *
20
+ */
21
+ if (fs.existsSync(passport_config_file)) {
22
+ const auth = require("./Credentials");
23
+ passport_config = require(passport_config_file);
24
+ if (passport_config.jwt_allow) {
25
+ global.Credentials = auth.credentials;
26
+ // loop check db connect is true
27
+ fs.readFile("./app.config.js", "utf-8", (err, data) => {
28
+ if(err) {
29
+ reject(err);
30
+ } else {
31
+ let mineConfDb = eval(data).database_config;
32
+ mineConfDb.filter((e, k) => {
33
+ if(e.name == passport_config.model.name) {
34
+ if(e.is_connect) {
35
+ resolve([true, true, true]);
36
+ } else {
37
+ // Database of Passport mapped is closed.
38
+ resolve([true, true, false]);
39
+ }
40
+ } else {
41
+ if(mineConfDb.length == k+1) {
42
+ // Database of Passport mapped is Name not match.
43
+ resolve([true, true, null]);
44
+ }
45
+ }
46
+ });
47
+ }
68
48
  });
69
- return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
70
- } catch (error) {
71
- return done(error, null);
49
+ } else {
50
+ global.Credentials = [];
51
+ resolve([true, false, null]);
72
52
  }
73
53
  } else {
74
- return done({ error: "Base pool SQL error." }, null);
54
+ global.Credentials = [];
55
+ //const Requests = require("./_Request");
56
+ //global.Credentials = Requests.requests; ----> // [Closed] TODO check passport.config file if not exists show error when file src/ using the JWT (maybe for show JWT is ON/OFF)
57
+ resolve([false, null, null]);
75
58
  }
76
- } else {
77
- return done(null, null, true);
78
- }
79
- }));
80
- // passport jwt payload (decoder)
81
- passport.use(new JWTStrategy({
82
- jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
83
- secretOrKey: passport_config.secret
84
- }, async (jwtPayload, done) => {
85
- let pool = eval("sql." + passport_config.model.name);
86
- if (pool) {
87
- if (pool_base == "basic") {
88
- // pool base is MySQL
89
- pool.query("SELECT " + passportFields + " FROM ?? WHERE id = ?", [
90
- passportTable,
91
- jwtPayload.id
92
- ], (err, result) => {
93
- if (err) {
94
- return done(err, null);
59
+ });
60
+ Promise.all([p1]).then(final => {
61
+ // Checking passport file, allow, mapped
62
+ if(final[0][0] && final[0][1] && final[0][2]) {
63
+ var passport = require("passport")
64
+ LocalStrategy = require("passport-local").Strategy,
65
+ GoogleStrategy = require("passport-google-oauth").OAuth2Strategy,
66
+ FacebookStrategy = require('passport-facebook').Strategy;
67
+ var passportJWT = require("passport-jwt"),
68
+ JWTStrategy = passportJWT.Strategy,
69
+ ExtractJWT = passportJWT.ExtractJwt;
70
+ // declare constant
71
+ var passportUsernameField = passport_config.model.username_field || "username";
72
+ var passportPasswordField = passport_config.model.password_field || "password";
73
+ var passportTable = passport_config.model.table || "users";
74
+ var pool = eval("sql." + passport_config.model.name);
75
+ // find passport primary key
76
+ findPassportPk(pool_base, pool, passportTable, passport_config.model.fields, (err, passportFields) => {
77
+ if(err) {
78
+ resolve([err, true, true, true]);
95
79
  } else {
96
- return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
97
- }
98
- });
99
- } else if (pool_base == "sequelize") {
100
- // pool base is Sequelize
101
- try {
102
- let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE id = :id", {
103
- replacements: {
104
- id: jwtPayload.id
105
- },
106
- type: QueryTypes.SELECT
107
- });
108
- return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
109
- } catch (error) {
110
- return done(error, null);
111
- }
112
- } else {
113
- return done({ error: "Base pool SQL error." }, null);
114
- }
115
- } else {
116
- return done(null, null, true);
117
- }
118
- }));
119
-
120
- // declare head authentication enpoint for all strategy
121
- let auth_endpoint = (passport_config.auth_endpoint) ? (passport_config.auth_endpoint[ 0 ] === "/" ? passport_config.auth_endpoint : "/" + passport_config.auth_endpoint) : "/authentication";
122
-
123
- /**
124
- * Passport Google Strategy
125
- *
126
- */
127
- let google_callbackURL = (passport_config.strategy.google.callbackURL) ? (passport_config.strategy.google.callbackURL[ 0 ] === "/" ? passport_config.strategy.google.callbackURL : "/" + passport_config.strategy.google.callbackURL) : "/google/callback";
128
- passport.use(new GoogleStrategy({
129
- clientID: passport_config.strategy.google.client_id,
130
- clientSecret: passport_config.strategy.google.client_secret,
131
- callbackURL: auth_endpoint + google_callbackURL
132
- }, (accessToken, refreshToken, profile, done) => {
133
- // find google user
134
- let googleIdField = (passport_config.strategy.google.local_profile_fields.google_id) ? passport_config.strategy.google.local_profile_fields.google_id : "google_id";
135
- this.findOrCreate(passport_config, "google", passportFields, passportTable, accessToken, refreshToken, profile, googleIdField, (err, res, dbFailed) => {
136
- if (err) {
137
- return done(err);
80
+ // Passport initial with token (encoder)
81
+ passport.use(new LocalStrategy({
82
+ usernameField: passportUsernameField,
83
+ passwordField: passportPasswordField
84
+ }, async (username, password, done) => {
85
+ if (pool) {
86
+ if (pool_base == "basic") {
87
+ // pool base is MySQL
88
+ pool.query("SELECT " + passportFields + " FROM ?? WHERE ?? = ? AND ?? = ?", [
89
+ passportTable,
90
+ passportUsernameField,
91
+ username,
92
+ passportPasswordField,
93
+ md5(password + secret)
94
+ ], (err, result) => {
95
+ if (err) {
96
+ return done(err, null);
97
+ } else {
98
+ return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
99
+ }
100
+ });
101
+ } else if (pool_base == "sequelize") {
102
+ // pool base is Sequelize
103
+ try {
104
+ let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + passportUsernameField + " = :username AND " + passportPasswordField + " = :password", {
105
+ replacements: {
106
+ fields: passportFields,
107
+ username: username,
108
+ password: md5(password + secret)
109
+ },
110
+ type: QueryTypes.SELECT
111
+ });
112
+ return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
113
+ } catch (error) {
114
+ return done(error, null);
115
+ }
116
+ } else {
117
+ return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
118
+ }
119
+ } else {
120
+ return done(null, null, true);
121
+ }
122
+ }));
123
+
124
+ // Passport jwt payload (decoder)
125
+ passport.use(new JWTStrategy({
126
+ jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
127
+ secretOrKey: passport_config.secret
128
+ }, async (jwtPayload, done) => {
129
+ let pool = eval("sql." + passport_config.model.name);
130
+ if (pool) {
131
+ if (pool_base == "basic") {
132
+ pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", (err, pk) => {
133
+ if(err) {
134
+ return done(err, null);
135
+ } else {
136
+ let fieldPk = pk[0].Column_name;
137
+ // pool base is MySQL
138
+ pool.query("SELECT " + passportFields + " FROM ?? WHERE " + fieldPk + " = ?", [
139
+ passportTable,
140
+ jwtPayload[fieldPk]
141
+ ], (err, result) => {
142
+ if (err) {
143
+ return done(err, null);
144
+ } else {
145
+ return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
146
+ }
147
+ });
148
+ }
149
+ });
150
+ } else if (pool_base == "sequelize") {
151
+ // pool base is Sequelize
152
+ try {
153
+ pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", { type: QueryTypes.SELECT }).then((pk) => {
154
+ let fieldPk = pk[0].Column_name;
155
+ pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + fieldPk + " = :pk", {
156
+ replacements: {
157
+ pk: + jwtPayload[fieldPk]
158
+ },
159
+ type: QueryTypes.SELECT,
160
+ }).then((result) => {
161
+ return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
162
+ }).catch((err) => {
163
+ return done(err, null);
164
+ });
165
+ }).catch((err) => {
166
+ return done(err, null);
167
+ });
168
+ } catch (error) {
169
+ return done(error, null);
170
+ }
171
+ } else {
172
+ return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
173
+ }
174
+ } else {
175
+ return done(null, null, true);
176
+ }
177
+ }));
178
+
179
+ // Declare head authentication enpoint for all strategy
180
+ let auth_endpoint = (passport_config.auth_endpoint) ? (passport_config.auth_endpoint[ 0 ] === "/" ? passport_config.auth_endpoint : "/" + passport_config.auth_endpoint) : "/authentication";
181
+
182
+ /**
183
+ * Passport Google Strategy
184
+ *
185
+ */
186
+ let google_callbackURL = (passport_config.strategy.google.callbackURL) ? (passport_config.strategy.google.callbackURL[ 0 ] === "/" ? passport_config.strategy.google.callbackURL : "/" + passport_config.strategy.google.callbackURL) : "/google/callback";
187
+ passport.use(new GoogleStrategy({
188
+ clientID: passport_config.strategy.google.client_id,
189
+ clientSecret: passport_config.strategy.google.client_secret,
190
+ callbackURL: auth_endpoint + google_callbackURL
191
+ }, (accessToken, refreshToken, profile, done) => {
192
+ // find google user
193
+ let googleIdField = (passport_config.strategy.google.local_profile_fields.google_id) ? passport_config.strategy.google.local_profile_fields.google_id : "google_id";
194
+ this.findOrCreate(passport_config, "google", passportFields, passportTable, accessToken, refreshToken, profile, googleIdField, (err, res, dbFailed) => {
195
+ if (err) {
196
+ return done(err);
197
+ } else {
198
+ return done(err, res, dbFailed);
199
+ }
200
+ });
201
+ }));
202
+
203
+ /**
204
+ * Passport Facebook Strategy
205
+ *
206
+ */
207
+ let facebook_callbackURL = (passport_config.strategy.facebook.callbackURL) ? (passport_config.strategy.facebook.callbackURL[ 0 ] === "/" ? passport_config.strategy.facebook.callbackURL : "/" + passport_config.strategy.facebook.callbackURL) : "/facebook/callback";
208
+ // merge fields permisions
209
+ let allow_permisions_fields = [ ...new Set([ ...[ 'id', 'displayName', 'name', 'photos', 'email', 'location' ], ...(passport_config.strategy.facebook.profileFieldsAllow || []) ]) ];
210
+ passport.use(new FacebookStrategy({
211
+ clientID: passport_config.strategy.facebook.app_id,
212
+ clientSecret: passport_config.strategy.facebook.app_secret,
213
+ callbackURL: auth_endpoint + facebook_callbackURL,
214
+ profileFields: allow_permisions_fields
215
+ }, (accessToken, refreshToken, profile, done) => {
216
+ // Check if the email permission is granted
217
+ /**
218
+ * Update : Permissions Reference for Meta Technologies APIs.
219
+ * Starting on or after October 27, 2023, if your app requests permission to use an endpoint to access an app user’s data
220
+ * Learn more : https://developers.facebook.com/docs/permissions
221
+ *
222
+ * From now! Disabled check if email permission granted
223
+ */
224
+ //if (!profile.emails || profile.emails.length === 0) {
225
+ // return done(new Error('Email permission not granted.'));
226
+ //}
227
+ // find facebook user
228
+ let faecbookIdField = (passport_config.strategy.facebook.local_profile_fields.facebook_id) ? passport_config.strategy.facebook.local_profile_fields.facebook_id : "facebook_id";
229
+ this.findOrCreate(passport_config, "facebook", passportFields, passportTable, accessToken, refreshToken, profile, faecbookIdField, (err, res, dbFailed) => {
230
+ if (err) {
231
+ return done(err);
232
+ } else {
233
+ return done(err, res, dbFailed);
234
+ }
235
+ });
236
+ }));
237
+ // Everything is Perfectly
238
+ resolve([null, true, true, true]);
239
+ } // end if check err findPassportPk
240
+ }); // end findPassportPk
241
+ } else if(final[0][0] && final[0][1] && final[0][2] === false) {
242
+ // Database connection mapped is Closed.
243
+ resolve([`Database connection name \`${passport_config.model.name}\` is CLOSED. Checking ON/OFF inside app.conifg.js file.`, true, true, false]);
244
+ } else if(final[0][0] && final[0][1] && !final[0][2]) {
245
+ // Passport Database connection name is NOT MATCH.
246
+ resolve([`Connection name \`${passport_config.model.name}\` with Passport model name mapped is NOT MATCH. Checking name to match it.`, true, true, false]);
247
+ } else if(final[0][0] && !final[0][1] && final[0][2] === null) {
248
+ // JWT not allow
249
+ resolve([null, true, false, null]);
138
250
  } else {
139
- return done(err, res, dbFailed);
140
- }
141
- });
142
- }));
143
-
144
- /**
145
- * Passport Facebook Strategy
146
- *
147
- */
148
- let facebook_callbackURL = (passport_config.strategy.facebook.callbackURL) ? (passport_config.strategy.facebook.callbackURL[ 0 ] === "/" ? passport_config.strategy.facebook.callbackURL : "/" + passport_config.strategy.facebook.callbackURL) : "/facebook/callback";
149
- // merge fields permisions
150
- let allow_permisions_fields = [ ...new Set([ ...[ 'id', 'email' ], ...passport_config.strategy.facebook.profileFieldsAllow ]) ];
151
- passport.use(new FacebookStrategy({
152
- clientID: passport_config.strategy.facebook.app_id,
153
- clientSecret: passport_config.strategy.facebook.app_secret,
154
- callbackURL: auth_endpoint + facebook_callbackURL,
155
- profileFields: allow_permisions_fields
156
- }, (accessToken, refreshToken, profile, done) => {
157
- // find facebook user
158
- let faecbookIdField = (passport_config.strategy.facebook.local_profile_fields.facebook_id) ? passport_config.strategy.facebook.local_profile_fields.facebook_id : "facebook_id";
159
- this.findOrCreate(passport_config, "facebook", passportFields, passportTable, accessToken, refreshToken, profile, faecbookIdField, (err, res, dbFailed) => {
160
- if (err) {
161
- return done(err);
162
- } else {
163
- return done(err, res, dbFailed);
164
- }
251
+ // JWT file not found, Or JWT not intitialize.
252
+ resolve([null, false, null, null]);
253
+ } // end if check Resolve ref:
254
+ }).catch(err => {
255
+ throw err;
165
256
  });
257
+ } catch (error) {
258
+ throw error;
166
259
  }
167
- ));
168
- } catch (error) {
169
- throw error;
170
- }
260
+ });
171
261
  },
172
262
  findOrCreate(passport_config, strategy_name, passportFields, passportTable, accessToken, refreshToken, profile, idField, cb) {
173
263
  let pool = eval("sql." + passport_config.model.name);
@@ -181,7 +271,7 @@ module.exports = {
181
271
  // prepare data for store
182
272
  let usr = passport_config.model.username_field || "username";
183
273
  let psw = passport_config.model.password_field || "password";
184
- let profileEmail = profile.emails[ 0 ].value.split("@")[ 0 ];
274
+ let usrProfile = Rand(10);
185
275
  let md5Psw = md5(profile.id + secret);
186
276
  // check strategy name for store
187
277
  if (strategy_name == "google") {
@@ -202,34 +292,51 @@ module.exports = {
202
292
  ].filter((el) => el != null));
203
293
  // Store google profile
204
294
  if (pool_base == "basic") {
205
- // pool base is MySQL
206
- pool.query("INSERT INTO ??(??,??,??,??) VALUES(?,?,?,?)", [
295
+ // check null and remove it.
296
+ let basicReplacement = new Set([
207
297
  passportTable,
208
298
  usr,
209
299
  psw,
210
300
  idField,
211
301
  fields,
212
- profileEmail,
302
+ usrProfile,
213
303
  md5Psw,
214
304
  profile.id,
215
305
  values
216
- ], (err, result) => {
306
+ ]);
307
+ delete basicReplacement.delete(null);
308
+ basicReplacement = Array.from(basicReplacement).filter(e => JSON.stringify(e) !== '[]');
309
+ // pool base is MySQL
310
+ pool.query("INSERT INTO ??(??,??,??" + (fields.length ? ",??)" : ")") + " VALUES(?,?,?" + (values.length ? ",?)" : ")"), basicReplacement, (err, result) => {
217
311
  data.result = result;
218
312
  data.google = profile;
219
313
  cb(err, data);
220
314
  });
221
315
  } else if (pool_base == "sequelize") {
316
+ // check null and remove it.
317
+ let sequelizeReplacement = new Set([
318
+ passportTable,
319
+ usr,
320
+ psw,
321
+ idField,
322
+ fields,
323
+ usrProfile,
324
+ md5Psw,
325
+ profile.id,
326
+ values
327
+ ]);
328
+ sequelizeReplacement = Array.from(sequelizeReplacement).filter(e => JSON.stringify(e) !== '[]');
222
329
  // pool base is Sequelize
223
330
  try {
224
- let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField},${fields}) VALUES(:profileEmail,:md5Psw,:profileId,:values)`, {
331
+ let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}${fields.length ? ',' + fields + ')' : ')'} VALUES(:usrProfile,:md5Psw,:profileId${values.length ? ',:values)' : ')'}`, {
225
332
  replacements: {
226
- usr: usr,
227
- psw: psw,
228
- idField: idField,
229
- profileEmail: profileEmail,
333
+ usr: sequelizeReplacement[1],
334
+ psw: sequelizeReplacement[2],
335
+ idField: sequelizeReplacement[3],
336
+ usrProfile: usrProfile,
230
337
  md5Psw: md5Psw,
231
338
  profileId: profile.id,
232
- values: values
339
+ values: values.length ? values : []
233
340
  },
234
341
  type: QueryTypes.INSERT
235
342
  });
@@ -240,7 +347,7 @@ module.exports = {
240
347
  cb(error, null);
241
348
  }
242
349
  } else {
243
- cb({ error: "Base pool SQL error." }, null);
350
+ cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
244
351
  }
245
352
  } else { // find found
246
353
  let users = {};
@@ -251,7 +358,18 @@ module.exports = {
251
358
  cb(err, users);
252
359
  }
253
360
  } else if (strategy_name == "facebook") {
254
- if (!result[ 0 ]) { // find not found and create
361
+ // STEP 1: check email empty for username
362
+ if(passport_config.strategy.facebook.local_profile_fields.email) { // Now support only Google, Because Facebook requests permission: https://developers.facebook.com/docs/permissions
363
+ if(!profile.emails) {
364
+ return cb(JSON.stringify({
365
+ code: 500,
366
+ status: "ERR_FACEBOOK_PROFILE_PERMISSIONS",
367
+ error: "Facebook needed allow `email` and `public_profile` permisions: https://developers.facebook.com/docs/permissions"
368
+ }), null);
369
+ }
370
+ }
371
+ // STEP 2: find not found and create
372
+ if (!result[ 0 ]) {
255
373
  // filter fields
256
374
  let fields = [].concat.apply([], [
257
375
  (passport_config.strategy.facebook.local_profile_fields.name) ? passport_config.strategy.facebook.local_profile_fields.name : null,
@@ -262,40 +380,57 @@ module.exports = {
262
380
  // fileter values
263
381
  let values = [].concat.apply([], [
264
382
  (passport_config.strategy.facebook.local_profile_fields.name) ? profile.displayName : null,
265
- (passport_config.strategy.facebook.local_profile_fields.email) ? profile.emails[ 0 ].value : null,
383
+ (passport_config.strategy.facebook.local_profile_fields.email) ? (profile.emails) ? profile.emails[ 0 ].value : null : null,
266
384
  (passport_config.strategy.facebook.local_profile_fields.photos) ? profile.photos[ 0 ].value : null,
267
385
  (passport_config.strategy.facebook.local_profile_fields.locate) ? profile._json.location.name : null
268
386
  ].filter((el) => el != null));
269
387
  // Store facebook profile
270
388
  if (pool_base == "basic") {
271
- // pool base is MySQL
272
- pool.query("INSERT INTO ??(??,??,??,??) VALUES(?,?,?,?)", [
389
+ // check null and remove it.
390
+ let basicReplacement = new Set([
273
391
  passportTable,
274
392
  usr,
275
393
  psw,
276
394
  idField,
277
395
  fields,
278
- profileEmail,
396
+ usrProfile,
279
397
  md5Psw,
280
398
  profile.id,
281
399
  values
282
- ], (err, result) => {
400
+ ]);
401
+ delete basicReplacement.delete(null);
402
+ basicReplacement = Array.from(basicReplacement).filter(e => JSON.stringify(e) !== '[]');
403
+ // pool base is MySQL
404
+ pool.query("INSERT INTO ??(??,??,??" + (fields.length ? ",??)" : ")") + " VALUES(?,?,?" + (values.length ? ",?)" : ")"), basicReplacement, (err, result) => {
283
405
  data.result = result;
284
406
  data.facebook = profile;
285
407
  cb(err, data);
286
408
  });
287
409
  } else if (pool_base == "sequelize") {
410
+ // check null and remove it.
411
+ let sequelizeReplacement = new Set([
412
+ passportTable,
413
+ usr,
414
+ psw,
415
+ idField,
416
+ fields,
417
+ usrProfile,
418
+ md5Psw,
419
+ profile.id,
420
+ values
421
+ ]);
422
+ sequelizeReplacement = Array.from(sequelizeReplacement).filter(e => JSON.stringify(e) !== '[]');
288
423
  // pool base is Sequelize
289
424
  try {
290
- let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField},${fields}) VALUES(:profileEmail,:md5Psw,:profileId,:values)`, {
425
+ let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}${fields.length ? ',' + fields + ')' : ')'} VALUES(:usrProfile,:md5Psw,:profileId${values.length ? ',:values)' : ')'}`, {
291
426
  replacements: {
292
- usr: usr,
293
- psw: psw,
294
- idField: idField,
295
- profileEmail: profileEmail,
427
+ usr: sequelizeReplacement[1],
428
+ psw: sequelizeReplacement[2],
429
+ idField: sequelizeReplacement[3],
430
+ usrProfile: usrProfile,
296
431
  md5Psw: md5Psw,
297
432
  profileId: profile.id,
298
- values: values
433
+ values: values.length ? values : []
299
434
  },
300
435
  type: QueryTypes.INSERT
301
436
  });
@@ -306,7 +441,7 @@ module.exports = {
306
441
  cb(error, null);
307
442
  }
308
443
  } else {
309
- cb({ error: "Base pool SQL error." }, null);
444
+ cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
310
445
  }
311
446
  } else { // find found
312
447
  let users = {};
@@ -348,11 +483,10 @@ module.exports = {
348
483
  return cb(error, null);
349
484
  }
350
485
  } else {
351
- return done({ error: "Base pool SQL error." }, null);
486
+ return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
352
487
  }
353
488
  } catch (error) {
354
489
  cb(error, null);
355
490
  }
356
- }
357
-
358
- }
491
+ },
492
+ }
@@ -0,0 +1,12 @@
1
+ module.exports = {
2
+ requests: (req, res, next) => {
3
+ console.log(res.statusCode);
4
+ console.log(req.url, req.method);
5
+ return res.status(401).json({
6
+ code: 404,
7
+ status: "404_NOT_FOUND",
8
+ error: "Passport config file not found.",
9
+ });
10
+ next();
11
+ },
12
+ };
@@ -2,6 +2,14 @@
2
2
  .git
3
3
  .vscode
4
4
  __tests__
5
+ beech
5
6
  node_modules
6
7
  package-lock.json
7
- yarn.lock
8
+ yarn.lock
9
+
10
+ # config
11
+ app.config.js
12
+ passport.config.js
13
+
14
+ # sequelize-cli
15
+ databases