beech-api 3.5.12 → 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 (66) hide show
  1. package/README.md +400 -185
  2. package/index.js +2 -3
  3. package/package.json +9 -6
  4. package/packages/cli/beech +2 -2
  5. package/packages/cli/bin/{beech.js → beech-app.js} +86 -28
  6. package/packages/cli/bin/beech-service.js +40 -212
  7. package/packages/cli/core/auth/Credentials.js +76 -35
  8. package/packages/cli/core/auth/Passport.js +318 -188
  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 +12 -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 -107
  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/{_service → _help_service} +4 -1
  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 +4 -3
  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 +96 -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 -203
  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 -7
  44. package/packages/cli/core/generator/_create +0 -7
  45. package/packages/lib/beech.js +0 -136
  46. package/packages/lib/salt.js +0 -3
  47. package/packages/src-/Add-on.js +0 -9
  48. package/packages/src-/endpoints/hello-endpoints.js +0 -118
  49. package/packages/src-/endpoints/test2-endpoints.js +0 -75
  50. package/packages/src-/endpoints/testSequalize-endpoints.js +0 -23
  51. package/packages/src-/helpers/Test2.js +0 -11
  52. package/packages/src-/helpers/my/Test.js +0 -11
  53. package/packages/src-/helpers/my/Test2.js +0 -11
  54. package/packages/src-/helpers/my/Test3.js +0 -11
  55. package/packages/src-/helpers/my/Test4.js +0 -11
  56. package/packages/src-/models/Jubu.js +0 -29
  57. package/packages/src-/models/Jubu2.js +0 -20
  58. package/packages/src-/models/Map_master.js +0 -22
  59. package/packages/src-/models/Test.js +0 -29
  60. package/packages/src-/models/Test2.js +0 -29
  61. package/packages/src-/models/User2Sequelize.js +0 -23
  62. package/packages/src-/models/Users-sqlite.js +0 -21
  63. package/packages/src-/models/Users.js +0 -53
  64. package/packages/src-/models/Uuuuuxxx.js +0 -23
  65. package/packages/src-/models/xxx/Uuuuuxxx.js +0 -23
  66. /package/packages/cli/core/generator/{_basic-helpers → _helpers_basic} +0 -0
@@ -1,177 +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
68
- });
69
- return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
70
- } catch (error) {
71
- return done(error, null);
72
- }
73
- } else {
74
- return done({ error: "Base pool SQL error." }, null);
75
- }
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);
95
- } 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
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
+ }
107
48
  });
108
- return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
109
- } catch (error) {
110
- return done(error, null);
49
+ } else {
50
+ global.Credentials = [];
51
+ resolve([true, false, null]);
111
52
  }
112
53
  } 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);
138
- } else {
139
- return done(err, res, dbFailed);
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]);
140
58
  }
141
59
  });
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
- // Check if the email permission is granted
158
- if (!profile.emails || profile.emails.length === 0) {
159
- return done(new Error('Email permission not granted.'));
160
- }
161
- // find facebook user
162
- let faecbookIdField = (passport_config.strategy.facebook.local_profile_fields.facebook_id) ? passport_config.strategy.facebook.local_profile_fields.facebook_id : "facebook_id";
163
- this.findOrCreate(passport_config, "facebook", passportFields, passportTable, accessToken, refreshToken, profile, faecbookIdField, (err, res, dbFailed) => {
164
- if (err) {
165
- return done(err);
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]);
79
+ } else {
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]);
166
250
  } else {
167
- return done(err, res, dbFailed);
168
- }
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;
169
256
  });
257
+ } catch (error) {
258
+ throw error;
170
259
  }
171
- ));
172
- } catch (error) {
173
- throw error;
174
- }
260
+ });
175
261
  },
176
262
  findOrCreate(passport_config, strategy_name, passportFields, passportTable, accessToken, refreshToken, profile, idField, cb) {
177
263
  let pool = eval("sql." + passport_config.model.name);
@@ -185,7 +271,7 @@ module.exports = {
185
271
  // prepare data for store
186
272
  let usr = passport_config.model.username_field || "username";
187
273
  let psw = passport_config.model.password_field || "password";
188
- let profileEmail = profile.emails[ 0 ].value.split("@")[ 0 ];
274
+ let usrProfile = Rand(10);
189
275
  let md5Psw = md5(profile.id + secret);
190
276
  // check strategy name for store
191
277
  if (strategy_name == "google") {
@@ -206,34 +292,51 @@ module.exports = {
206
292
  ].filter((el) => el != null));
207
293
  // Store google profile
208
294
  if (pool_base == "basic") {
209
- // pool base is MySQL
210
- pool.query("INSERT INTO ??(??,??,??,??) VALUES(?,?,?,?)", [
295
+ // check null and remove it.
296
+ let basicReplacement = new Set([
211
297
  passportTable,
212
298
  usr,
213
299
  psw,
214
300
  idField,
215
301
  fields,
216
- profileEmail,
302
+ usrProfile,
217
303
  md5Psw,
218
304
  profile.id,
219
305
  values
220
- ], (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) => {
221
311
  data.result = result;
222
312
  data.google = profile;
223
313
  cb(err, data);
224
314
  });
225
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) !== '[]');
226
329
  // pool base is Sequelize
227
330
  try {
228
- 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)' : ')'}`, {
229
332
  replacements: {
230
- usr: usr,
231
- psw: psw,
232
- idField: idField,
233
- profileEmail: profileEmail,
333
+ usr: sequelizeReplacement[1],
334
+ psw: sequelizeReplacement[2],
335
+ idField: sequelizeReplacement[3],
336
+ usrProfile: usrProfile,
234
337
  md5Psw: md5Psw,
235
338
  profileId: profile.id,
236
- values: values
339
+ values: values.length ? values : []
237
340
  },
238
341
  type: QueryTypes.INSERT
239
342
  });
@@ -244,7 +347,7 @@ module.exports = {
244
347
  cb(error, null);
245
348
  }
246
349
  } else {
247
- cb({ error: "Base pool SQL error." }, null);
350
+ cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
248
351
  }
249
352
  } else { // find found
250
353
  let users = {};
@@ -255,7 +358,18 @@ module.exports = {
255
358
  cb(err, users);
256
359
  }
257
360
  } else if (strategy_name == "facebook") {
258
- 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 ]) {
259
373
  // filter fields
260
374
  let fields = [].concat.apply([], [
261
375
  (passport_config.strategy.facebook.local_profile_fields.name) ? passport_config.strategy.facebook.local_profile_fields.name : null,
@@ -266,40 +380,57 @@ module.exports = {
266
380
  // fileter values
267
381
  let values = [].concat.apply([], [
268
382
  (passport_config.strategy.facebook.local_profile_fields.name) ? profile.displayName : null,
269
- (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,
270
384
  (passport_config.strategy.facebook.local_profile_fields.photos) ? profile.photos[ 0 ].value : null,
271
385
  (passport_config.strategy.facebook.local_profile_fields.locate) ? profile._json.location.name : null
272
386
  ].filter((el) => el != null));
273
387
  // Store facebook profile
274
388
  if (pool_base == "basic") {
275
- // pool base is MySQL
276
- pool.query("INSERT INTO ??(??,??,??,??) VALUES(?,?,?,?)", [
389
+ // check null and remove it.
390
+ let basicReplacement = new Set([
277
391
  passportTable,
278
392
  usr,
279
393
  psw,
280
394
  idField,
281
395
  fields,
282
- profileEmail,
396
+ usrProfile,
283
397
  md5Psw,
284
398
  profile.id,
285
399
  values
286
- ], (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) => {
287
405
  data.result = result;
288
406
  data.facebook = profile;
289
407
  cb(err, data);
290
408
  });
291
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) !== '[]');
292
423
  // pool base is Sequelize
293
424
  try {
294
- 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)' : ')'}`, {
295
426
  replacements: {
296
- usr: usr,
297
- psw: psw,
298
- idField: idField,
299
- profileEmail: profileEmail,
427
+ usr: sequelizeReplacement[1],
428
+ psw: sequelizeReplacement[2],
429
+ idField: sequelizeReplacement[3],
430
+ usrProfile: usrProfile,
300
431
  md5Psw: md5Psw,
301
432
  profileId: profile.id,
302
- values: values
433
+ values: values.length ? values : []
303
434
  },
304
435
  type: QueryTypes.INSERT
305
436
  });
@@ -310,7 +441,7 @@ module.exports = {
310
441
  cb(error, null);
311
442
  }
312
443
  } else {
313
- cb({ error: "Base pool SQL error." }, null);
444
+ cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
314
445
  }
315
446
  } else { // find found
316
447
  let users = {};
@@ -352,11 +483,10 @@ module.exports = {
352
483
  return cb(error, null);
353
484
  }
354
485
  } else {
355
- return done({ error: "Base pool SQL error." }, null);
486
+ return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
356
487
  }
357
488
  } catch (error) {
358
489
  cb(error, null);
359
490
  }
360
- }
361
-
362
- }
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