picker-db 3.4.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 (43) hide show
  1. package/.editorconfig +8 -0
  2. package/.eslintignore +9 -0
  3. package/.eslintrc.json +35 -0
  4. package/.nvmrc +1 -0
  5. package/.vscode/settings.json +11 -0
  6. package/README.md +21 -0
  7. package/bitbucket-pipelines.yml +24 -0
  8. package/constants.js +420 -0
  9. package/index.js +5 -0
  10. package/lib/Logger/index.js +45 -0
  11. package/lib/Mongo/index.js +126 -0
  12. package/modules/picker/index.js +259 -0
  13. package/modules/picker/models/identityCounter.js +15 -0
  14. package/modules/picker/models/index.js +50 -0
  15. package/modules/picker/schemas/address.js +74 -0
  16. package/modules/picker/schemas/adminSetting.js +125 -0
  17. package/modules/picker/schemas/balanceTransaction.js +132 -0
  18. package/modules/picker/schemas/bill.js +70 -0
  19. package/modules/picker/schemas/bookingProduct.js +50 -0
  20. package/modules/picker/schemas/bookings.js +699 -0
  21. package/modules/picker/schemas/business.js +231 -0
  22. package/modules/picker/schemas/businessCategory.js +61 -0
  23. package/modules/picker/schemas/customer.js +28 -0
  24. package/modules/picker/schemas/driver.js +162 -0
  25. package/modules/picker/schemas/fareSettings.js +122 -0
  26. package/modules/picker/schemas/fraudBooking.js +21 -0
  27. package/modules/picker/schemas/identityCounter.js +10 -0
  28. package/modules/picker/schemas/kmRange.js +27 -0
  29. package/modules/picker/schemas/massDelivery.js +119 -0
  30. package/modules/picker/schemas/notification.js +76 -0
  31. package/modules/picker/schemas/paymentezCustomer.js +41 -0
  32. package/modules/picker/schemas/paymentezTransaction.js +67 -0
  33. package/modules/picker/schemas/preference.js +40 -0
  34. package/modules/picker/schemas/pricingDetails.js +90 -0
  35. package/modules/picker/schemas/referralUsage.js +33 -0
  36. package/modules/picker/schemas/region.js +75 -0
  37. package/modules/picker/schemas/review.js +42 -0
  38. package/modules/picker/schemas/session.js +25 -0
  39. package/modules/picker/schemas/superRegion.js +41 -0
  40. package/modules/picker/schemas/user.js +337 -0
  41. package/package.json +29 -0
  42. package/playground/testConnection.js +24 -0
  43. package/playground/testService.js +27 -0
package/.editorconfig ADDED
@@ -0,0 +1,8 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ charset = utf-8
7
+ trim_trailing_whitespace = true
8
+ insert_final_newline = true
package/.eslintignore ADDED
@@ -0,0 +1,9 @@
1
+ # /node_modules/* and /bower_components/* in the project root are ignored by default
2
+ # Ignore built files except build/index.js
3
+
4
+ build/*
5
+ !build/index.js
6
+ dist/*
7
+ bundle.js
8
+ .*/*
9
+ .*
package/.eslintrc.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "extends": [
3
+ "standard"
4
+ ],
5
+ "parserOptions": {
6
+ "ecmaVersion": 2018
7
+ },
8
+ "env": {
9
+ "es6": true,
10
+ "node": true,
11
+ "mocha": true
12
+ },
13
+ "parser": "babel-eslint",
14
+ "rules": {
15
+ "no-console": "warn",
16
+ "no-use-before-define": "warn",
17
+ "spaced-comment": "warn",
18
+ "comma-dangle": [
19
+ "error",
20
+ {
21
+ "arrays": "always-multiline",
22
+ "objects": "always-multiline",
23
+ "imports": "always-multiline",
24
+ "exports": "always-multiline",
25
+ "functions": "always-multiline"
26
+ }
27
+ ],
28
+ "quotes": ["error", "double"],
29
+ "semi": ["error", "always"],
30
+ "capitalized-comments": ["error", "always"],
31
+ "no-var": "error",
32
+ "prefer-const": "error"
33
+ }
34
+ }
35
+
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ v16.13.1
@@ -0,0 +1,11 @@
1
+ {
2
+ "eslint.codeAction.showDocumentation": {
3
+ "enable": true
4
+ },
5
+ "editor.formatOnSave": false,
6
+ "editor.codeActionsOnSave": {
7
+ "source.fixAll.eslint": true
8
+ },
9
+ "eslint.alwaysShowStatus": true,
10
+ }
11
+
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # picker-db
2
+
3
+ [![npm version](https://img.shields.io/npm/v/picker-db.svg)](https://www.npmjs.com/package/picker-db)
4
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ `picker-db` is a JavaScript library that provides models and schemas for connecting to various Picker databases. It enables code reuse across microservices by providing a common interface and reusable components for database interactions.
7
+
8
+ ## Installation
9
+
10
+ ```shell
11
+ npm install picker-db
12
+ ```
13
+
14
+ ## Features
15
+
16
+ * Common database models and schemas for Picker databases.
17
+ * Simplified API for connecting to and interacting with databases.
18
+ * Promotes code reuse and consistency across microservices.
19
+
20
+ ## Contributing
21
+ Contributions are welcome! Please see the contribution guidelines for more information.
@@ -0,0 +1,24 @@
1
+ # Template NodeJS build
2
+
3
+ # This template allows you to validate your NodeJS code.
4
+ # The workflow allows running tests and code linting on the default branch.
5
+
6
+ image: node:16.13.1
7
+
8
+ pipelines:
9
+ pull-requests:
10
+ '**':
11
+ - step:
12
+ name: Install
13
+ caches:
14
+ - node
15
+ script:
16
+ - npm install
17
+ tags:
18
+ 'v*':
19
+ - step:
20
+ name: NPM publish
21
+ script:
22
+ - pipe: atlassian/npm-publish:0.3.3
23
+ variables:
24
+ NPM_TOKEN: $NPM_TOKEN
package/constants.js ADDED
@@ -0,0 +1,420 @@
1
+ module.exports = {
2
+ MONGO_DB: {
3
+ RECONNECT_INTERVAL: 500,
4
+ RECONECT_TRIES: Number.MAX_VALUE,
5
+ USE_MONGO_CLIENT: true,
6
+ },
7
+ VEHICLE_TYPES: {
8
+ LITE: {
9
+ INDEX: 0,
10
+ TEXT: "LITE",
11
+ },
12
+ BIKE: {
13
+ INDEX: 1,
14
+ TEXT: "BIKE",
15
+ },
16
+ NONE: {
17
+ INDEX: 2,
18
+ TEXT: "NONE",
19
+ },
20
+ BOTH: {
21
+ INDEX: 3,
22
+ TEXT: "BOTH",
23
+ },
24
+ },
25
+ PAYMENT_METHODS: {
26
+ BOTH: {
27
+ INDEX: 0,
28
+ TEXT: "BOTH",
29
+ },
30
+ CARD: {
31
+ INDEX: 1,
32
+ TEXT: "CARD",
33
+ },
34
+ CASH: {
35
+ INDEX: 2,
36
+ TEXT: "CASH",
37
+ },
38
+ NONE: {
39
+ INDEX: 3,
40
+ TEXT: "NONE",
41
+ },
42
+ BILLING_CARD: {
43
+ INDEX: 4,
44
+ TEXT: "BILLING_CARD",
45
+ },
46
+ BILLING_TRANSFER: {
47
+ INDEX: 5,
48
+ TEXT: "BILLING_TRANSFER",
49
+ },
50
+ },
51
+ BOOKING_TYPES: {
52
+ PICKUP_AND_DELIVER: {
53
+ INDEX: 0,
54
+ TEXT: "PICKUP_AND_DELIVER",
55
+ },
56
+ BUY_AND_DELIVER: {
57
+ INDEX: 1,
58
+ TEXT: "BUY_AND_DELIVER",
59
+ },
60
+ MARKETPLACE: {
61
+ INDEX: 2,
62
+ TEXT: "MARKETPLACE",
63
+ },
64
+ SHOP_ORDER: {
65
+ INDEX: 3,
66
+ TEXT: "SHOP_ORDER",
67
+ },
68
+ CORPORATE: {
69
+ INDEX: 4,
70
+ TEXT: "CORPORATE",
71
+ },
72
+ WHITE_LABEL: {
73
+ INDEX: 5,
74
+ TEXT: "WHITE_LABEL",
75
+ },
76
+ MASS_DELIVERY: {
77
+ INDEX: 6,
78
+ TEXT: "MASS_DELIVERY",
79
+ },
80
+ },
81
+ BOOKING_STATUS: {
82
+ PENDING: {
83
+ INDEX: 0,
84
+ TEXT: "PENDING",
85
+ },
86
+ ACCEPTED: {
87
+ INDEX: 1,
88
+ TEXT: "ACCEPTED",
89
+ },
90
+ ARRIVED_AT_PICKUP: {
91
+ INDEX: 2,
92
+ TEXT: "ARRIVED_AT_PICKUP",
93
+ },
94
+ AMOUNT_REQUESTED: {
95
+ INDEX: 0,
96
+ TEXT: "AMOUNT_REQUESTED",
97
+ },
98
+ AMOUNT_ACCEPTED: {
99
+ INDEX: 1,
100
+ TEXT: "AMOUNT_ACCEPTED",
101
+ },
102
+ AMOUNT_REJECTED: {
103
+ INDEX: 2,
104
+ TEXT: "AMOUNT_REJECTED",
105
+ },
106
+ WAY_TO_DELIVER: {
107
+ INDEX: 3,
108
+ TEXT: "WAY_TO_DELIVER",
109
+ },
110
+ ARRIVED_AT_DELIVERY: {
111
+ INDEX: 4,
112
+ TEXT: "ARRIVED_AT_DELIVERY",
113
+ },
114
+ COMPLETED: {
115
+ INDEX: 5,
116
+ TEXT: "COMPLETED",
117
+ },
118
+ CANCELLED_BY_ADMIN: {
119
+ INDEX: 6,
120
+ TEXT: "CANCELLED_BY_ADMIN",
121
+ },
122
+ CANCELLED: {
123
+ INDEX: 7,
124
+ TEXT: "CANCELLED",
125
+ },
126
+ CANCELLED_BY_DRIVER: {
127
+ INDEX: 8,
128
+ TEXT: "CANCELLED_BY_DRIVER",
129
+ },
130
+ REJECTED_BY_DRIVER: {
131
+ INDEX: 9,
132
+ TEXT: "REJECTED_BY_DRIVER",
133
+ },
134
+ CANCELLED_REQUEST: {
135
+ INDEX: 10,
136
+ TEXT: "CANCELLED_REQUEST",
137
+ },
138
+ NOT_DELIVERED: {
139
+ INDEX: 11,
140
+ TEXT: "NOT_DELIVERED",
141
+ },
142
+ NOT_FOUND: {
143
+ INDEX: 12,
144
+ TEXT: "DRIVER_NOT_FOUND",
145
+ },
146
+ NO_PICKERS_IN_AREA: {
147
+ INDEX: 13,
148
+ TEXT: "NO_PICKERS_IN_AREA",
149
+ },
150
+ EXPIRED: {
151
+ INDEX: 14,
152
+ TEXT: "EXPIRED",
153
+ },
154
+ ADMIN_NOTIFICATION: {
155
+ INDEX: 15,
156
+ TEXT: "ADMIN_NOTIFICATION",
157
+ },
158
+ CANCEL_BOOKING: {
159
+ INDEX: 16,
160
+ TEXT: "CANCEL_BOOKING",
161
+ },
162
+ RE_ASSIGN_DRIVER: {
163
+ INDEX: 17,
164
+ TEXT: "RE_ASSIGN_DRIVER",
165
+ },
166
+ RE_ASSIGN_BOOKING: {
167
+ INDEX: 18,
168
+ TEXT: "RE_ASSIGN_BOOKING",
169
+ },
170
+ OUT_OF_REGIONS: {
171
+ INDEX: 19,
172
+ TEXT: "OUT_OF_REGIONS",
173
+ },
174
+ ON_HOLD: {
175
+ INDEX: 20,
176
+ TEXT: "ON_HOLD",
177
+ },
178
+ ON_DECK: {
179
+ INDEX: 21,
180
+ TEXT: "ON_DECK",
181
+ },
182
+ READY_FOR_PICKUP: {
183
+ INDEX: 22,
184
+ TEXT: "READY_FOR_PICKUP",
185
+ },
186
+ CANCELLED_BY_BUSINESS: {
187
+ INDEX: 23,
188
+ TEXT: "CANCELLED_BY_BUSINESS",
189
+ },
190
+ BUSINESS_NOT_FOUND: {
191
+ INDEX: 24,
192
+ TEXT: "BUSINESS_NOT_FOUND",
193
+ },
194
+ NOT_SHOW: {
195
+ INDEX: 25,
196
+ TEXT: "NOT_SHOW",
197
+ },
198
+ REJECTED_BY_BUSINESS: {
199
+ INDEX: 27,
200
+ TEXT: "REJECTED_BY_BUSINESS",
201
+ },
202
+ REJECTED_BY_ADMIN: {
203
+ INDEX: 28,
204
+ TEXT: "REJECTED_BY_ADMIN",
205
+ },
206
+ PAYMENT_FAILED: {
207
+ INDEX: 29,
208
+ TEXT: "PAYMENT_FAILED",
209
+ },
210
+ CANCELLED_BY_DELIVERY_PROVIDER: {
211
+ INDEX: 30,
212
+ TEXT: "CANCELLED_BY_DELIVERY_PROVIDER",
213
+ },
214
+ PROVIDER_NOT_FOUND: {
215
+ INDEX: 31,
216
+ TEXT: "PROVIDER_NOT_FOUND",
217
+ },
218
+ RETURNING: {
219
+ index: 32,
220
+ text: "RETURNING",
221
+ },
222
+ RETURNED: {
223
+ index: 33,
224
+ text: "RETURNED",
225
+ },
226
+ RETURNED_TO_PICKUP: {
227
+ INDEX: 34,
228
+ TEXT: "RETURNED_TO_PICKUP",
229
+ },
230
+ },
231
+ SOCIAL_ACCOUNTS: {
232
+ FACEBOOK: "facebook",
233
+ GOOGLE: "google",
234
+ APPLE: "apple",
235
+ },
236
+ API_USER: {
237
+ BILLING_METHOD: {
238
+ CARD: "BILLING_CARD",
239
+ TRANSFER: "BILLING_TRANSFER",
240
+ },
241
+ },
242
+ USER: {
243
+ DEVICE_TYPES: {
244
+ IOS: "IOS",
245
+ ANDROID: "ANDROID",
246
+ WEB: "WEB",
247
+ },
248
+ },
249
+ BUSINESS: {
250
+ TYPES: {
251
+ MARKETPLACE: "MARKETPLACE",
252
+ SHOP_ORDER: "SHOP_ORDER",
253
+ EXTERNAL: "EXTERNAL",
254
+ },
255
+ },
256
+ DRIVER: {
257
+ PAYMENT: {
258
+ PERCENTAGE: "PERCENTAGE",
259
+ ABSOLUTE: "ABSOLUTE",
260
+ OVER_MINIMUM: "OVER_MINIMUM",
261
+ PERCENTAGE_MINIMUM: "PERCENTAGE_MINIMUM",
262
+ ABSOLUTE_MINIMUM: "ABSOLUTE_MINIMUM",
263
+ },
264
+ TYPE: {
265
+ STARTER: "STARTER",
266
+ SENIOR: "SENIOR",
267
+ MCGYVER: "MCGYVER",
268
+ PREMIUM: "PREMIUM",
269
+ },
270
+ ACCOUNTING_TYPE: {
271
+ OLD: "OLD",
272
+ NEW: "NEW",
273
+ },
274
+ },
275
+ NOTIFICATION: {
276
+ VIA: {
277
+ SMS: "SMS",
278
+ EMAIL: "EMAIL",
279
+ PUSH: "PUSH",
280
+ WHATSAPP: "WHATSAPP",
281
+ },
282
+ PROVIDERS: {
283
+ FCM: "FCM",
284
+ APNS: "APNS",
285
+ TWILIO: "TWILIO",
286
+ NODEMAILER: "NODEMAILER",
287
+ AWS_SES: "AWS_SES",
288
+ },
289
+ },
290
+ TRANSACTION: {
291
+ TYPE: {
292
+ BONUS: "BONUS",
293
+ PENALTY: "PENALTY",
294
+ RESIDUE: "RESIDUE",
295
+ DELIVERY: "DELIVERY",
296
+ ITEM: "ITEM",
297
+ DEPOSIT: "DEPOSIT",
298
+ PAYMENT: "PAYMENT",
299
+ BILL: "BILL",
300
+ BALANCE_ADJUSTMENT: "BALANCE_ADJUSTMENT",
301
+ ADVANCE_PAYMENT: "ADVANCE_PAYMENT",
302
+ ALL: "ALL",
303
+ MARKETPLACE: "MARKETPLACE",
304
+ RECHARGE: "RECHARGE",
305
+ RECHARGE_EARNINGS: "RECHARGE_EARNINGS",
306
+ RECHARGE_CARD: "RECHARGE_CARD",
307
+ RECHARGE_BANK: "RECHARGE_BANK",
308
+ CORPORATE: "CORPORATE",
309
+ CORPORATE_PAYMENT: "CORPORATE_PAYMENT",
310
+ MARKETPLACE_PAYMENT: "MARKETPLACE_PAYMENT",
311
+ ITEM_REFUND: "ITEM_REFUND",
312
+ DELIVERY_REFUND: "DELIVERY_REFUND",
313
+ },
314
+ STATUS: {
315
+ REALIZED: "REALIZED",
316
+ APPROVED: "APPROVED",
317
+ PAID: "PAID",
318
+ FAILED: "FAILED",
319
+ },
320
+ SELECTED_REASONS: {
321
+ MANUAL_BOOKING: "MANUAL_BOOKING",
322
+ PAYMENT_ERROR: "PAYMENT_ERROR",
323
+ SPECIAL_BOOKING: "SPECIAL_BOOKING",
324
+ BAD_ORDER_CHARGE: "BAD_ORDER_CHARGE",
325
+ FRAUD: "FRAUD",
326
+ THEFT: "THEFT",
327
+ BAD_SERVICE: "BAD_SERVICE",
328
+ },
329
+ },
330
+ RIDE_TYPES: {
331
+ NOW: {
332
+ INDEX: 1,
333
+ TEXT: "RIDE NOW",
334
+ },
335
+ LATER: {
336
+ INDEX: 2,
337
+ TEXT: "RIDE LATER",
338
+ },
339
+ BOTH: {
340
+ INDEX: 3,
341
+ TEXT: "BOTH",
342
+ },
343
+ },
344
+ ADDRESS_TYPES: {
345
+ SELF: "SELF",
346
+ PICKUP: "PICKUP",
347
+ DELIVERY: "DELIVERY",
348
+ HOME: "HOME",
349
+ OFFICE: "OFFICE",
350
+ OTHERS: "OTHERS",
351
+ },
352
+ MASS_DELIVERY: {
353
+ STATUSES: {
354
+ PENDING: {
355
+ INDEX: 0,
356
+ TEXT: "PENDING",
357
+ },
358
+ ONGOING: {
359
+ INDEX: 1,
360
+ TEXT: "ONGOING",
361
+ },
362
+ COMPLETED: {
363
+ INDEX: 2,
364
+ TEXT: "COMPLETED",
365
+ },
366
+ CANCELLED: {
367
+ INDEX: 3,
368
+ TEXT: "CANCELLED",
369
+ },
370
+ },
371
+ },
372
+ BILL: {
373
+ TYPE: {
374
+ DRIVER: "DRIVER",
375
+ BUSINESS: "BUSINESS",
376
+ CUSTOMER: "CUSTOMER",
377
+ },
378
+ STATUS: {
379
+ CREATED: "CREATED",
380
+ APPROVED: "APPROVED",
381
+ SENT: "SENT",
382
+ ERROR: "ERROR",
383
+ AUTHORIZED: "AUTHORIZED",
384
+ NOT_AUTHORIZED: "NOT_AUTHORIZED",
385
+ RETURNED: "RETURNED",
386
+ },
387
+ },
388
+ FARE: {
389
+ RUSH_HOUR_INCREASE_TYPES: {
390
+ PERCENTAGE: "PERCENTAGE",
391
+ FIXED: "FIXED",
392
+ },
393
+ },
394
+ CALIFICATION: {
395
+ RUDE: {
396
+ index: -1,
397
+ text: "RUDE",
398
+ },
399
+ LATE: {
400
+ index: -2,
401
+ text: "LATE",
402
+ },
403
+ INEFFICIENT: {
404
+ index: -3,
405
+ text: "INEFFICIENT",
406
+ },
407
+ KIND: {
408
+ index: 1,
409
+ text: "KIND",
410
+ },
411
+ FAST: {
412
+ index: 2,
413
+ text: "FAST",
414
+ },
415
+ EFFICIENT: {
416
+ index: 3,
417
+ text: "EFFICIENT",
418
+ },
419
+ },
420
+ };
package/index.js ADDED
@@ -0,0 +1,5 @@
1
+ const PickerMongoDBService = require("./modules/picker");
2
+
3
+ module.exports = {
4
+ PickerMongoDBService,
5
+ };
@@ -0,0 +1,45 @@
1
+ const fs = require("fs");
2
+ const winston = require("winston");
3
+ const _ = require("lodash");
4
+
5
+ const { printf, combine, timestamp, colorize, errors } = winston.format;
6
+
7
+ const logDir = "log";
8
+ if (!fs.existsSync(logDir)) {
9
+ fs.mkdirSync(logDir);
10
+ }
11
+
12
+ // Converts the date object to local time string
13
+ const myFormat = printf(({ message, level, label, timestamp, stack }) => {
14
+ if (!_.isEmpty(stack)) {
15
+ return `${timestamp} ${level} - ${stack}`;
16
+ }
17
+ if (_.isObject(message)) {
18
+ message = JSON.stringify(message, null, 2);
19
+ }
20
+ return `${timestamp} [${label}] ${level} - ${message}`;
21
+ });
22
+
23
+ const logger = winston.createLogger({
24
+ level: "debug",
25
+ format: combine(
26
+ errors({ stack: true }),
27
+ timestamp(),
28
+ myFormat,
29
+ ),
30
+ transports: [
31
+ new winston.transports.Console({
32
+ format: combine(
33
+ errors({ stack: true }),
34
+ colorize(),
35
+ timestamp(),
36
+ myFormat,
37
+ ),
38
+ }),
39
+ new winston.transports.File({ filename: "log/error.log", level: "error" }),
40
+ new winston.transports.File({ filename: "log/info.log", level: "info" }),
41
+ new winston.transports.File({ filename: "log/debug.log", level: "debug" }),
42
+ ],
43
+ });
44
+
45
+ module.exports = logger;
@@ -0,0 +1,126 @@
1
+ const mongoose = require("mongoose");
2
+ const _ = require("lodash");
3
+
4
+ const logger = require("../Logger");
5
+
6
+ /**
7
+ * Class representing a connection to any mongoDB database
8
+ */
9
+ class MongoDB {
10
+ /**
11
+ * Sets up the configuration for the mongo connection
12
+ * @param {object} config
13
+ * @param {string} config.dbName
14
+ * @param {boolean} [config.isLoggingEnabled]
15
+ * @param {boolean} [config.isDebugEnabled]
16
+ * @param {object} config.auth
17
+ * @param {string} config.auth.username
18
+ * @param {string} config.auth.password
19
+ * @param {string} [config.auth.host]
20
+ * @param {string} [config.auth.port]
21
+ * @param {string} [config.auth.environment]
22
+ * @param {boolean} [config.useMongoClient]
23
+ * @param {boolean} [config.useUnifiedTopology]
24
+ */
25
+ constructor (config = {}) {
26
+ this.config = _.defaults(
27
+ _.pick(config, ["isLoggingEnabled", "dbName", "isDebugEnabled"]),
28
+ {
29
+ isLoggingEnabled: false,
30
+ },
31
+ );
32
+ this.options = _.defaults(
33
+ _.pick(config, ["useMongoClient", "useUnifiedTopology"]),
34
+ {
35
+ useNewUrlParser: true,
36
+ useUnifiedTopology: true,
37
+ },
38
+ );
39
+ const auth = _.defaults(config.auth, {
40
+ host: "localhost",
41
+ port: "27017",
42
+ });
43
+ this.uri = this.getUri(auth);
44
+ }
45
+
46
+ /**
47
+ * Returns connection uri based on environment
48
+ * @param {object} auth
49
+ * @param {string} auth.username
50
+ * @param {string} auth.password
51
+ * @param {string} [auth.host]
52
+ * @param {string} [auth.port]
53
+ */
54
+ getUri (auth) {
55
+ let uri = "";
56
+ switch (auth.environment) {
57
+ case "local":
58
+ uri = `mongodb://${auth.host}:${auth.port}/${this.config.dbName}`;
59
+ break;
60
+ default:
61
+ uri = `mongodb://${auth.username}:${auth.password}@${auth.host}:${auth.port}/${this.config.dbName}`;
62
+ break;
63
+ }
64
+ return uri;
65
+ }
66
+
67
+ /**
68
+ * Create a connection to the database selected in the constructor
69
+ */
70
+ connect () {
71
+ return new Promise((resolve, reject) => {
72
+ if (this.isConnected) {
73
+ return resolve(this.connection);
74
+ }
75
+ this.connection = mongoose.createConnection(this.uri, this.options);
76
+
77
+ if (this.config.isDebugEnabled) {
78
+ mongoose.set("debug", true);
79
+ }
80
+
81
+ this.connection.on("error", (err) => {
82
+ if (this.config.isLoggingEnabled) {
83
+ logger.error({ message: `Connection error: ${JSON.stringify(err, null, 2)}`, label: this.config.dbName.toUpperCase() });
84
+ }
85
+ this.isConnected = false;
86
+ return reject(err);
87
+ });
88
+ this.connection.on("connected", () => {
89
+ if (this.config.isLoggingEnabled) {
90
+ logger.info({ message: "Connection open", label: this.config.dbName.toUpperCase() });
91
+ }
92
+ this.isConnected = true;
93
+ return resolve(this.connection);
94
+ });
95
+ this.connection.on("disconnected", () => {
96
+ if (this.config.isLoggingEnabled) {
97
+ logger.info({ message: "Disconnected", label: this.config.dbName.toUpperCase() });
98
+ }
99
+ this.isConnected = false;
100
+ });
101
+ this.connection.on("reconnected", () => {
102
+ if (this.config.isLoggingEnabled) {
103
+ logger.info({ message: "Reconnected", label: this.config.dbName.toUpperCase() });
104
+ }
105
+ this.isConnected = true;
106
+ });
107
+ });
108
+ }
109
+
110
+ async getConnection () {
111
+ await this.connect();
112
+ if (this.isConnected) {
113
+ return this.connection;
114
+ }
115
+ return null;
116
+ }
117
+
118
+ /**
119
+ * Closes the connection to the selected database
120
+ */
121
+ disconnect () {
122
+ return this.connection.close();
123
+ }
124
+ };
125
+
126
+ module.exports = MongoDB;