@flowerforce/flowerbase 1.2.0 → 1.2.1-beta.11

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 (125) hide show
  1. package/README.md +28 -3
  2. package/dist/auth/controller.d.ts.map +1 -1
  3. package/dist/auth/controller.js +57 -3
  4. package/dist/auth/plugins/jwt.d.ts.map +1 -1
  5. package/dist/auth/plugins/jwt.js +49 -3
  6. package/dist/auth/providers/custom-function/controller.d.ts.map +1 -1
  7. package/dist/auth/providers/custom-function/controller.js +19 -3
  8. package/dist/auth/providers/local-userpass/controller.d.ts.map +1 -1
  9. package/dist/auth/providers/local-userpass/controller.js +125 -71
  10. package/dist/auth/providers/local-userpass/dtos.d.ts +11 -2
  11. package/dist/auth/providers/local-userpass/dtos.d.ts.map +1 -1
  12. package/dist/auth/utils.d.ts +53 -14
  13. package/dist/auth/utils.d.ts.map +1 -1
  14. package/dist/auth/utils.js +46 -63
  15. package/dist/constants.d.ts +14 -0
  16. package/dist/constants.d.ts.map +1 -1
  17. package/dist/constants.js +18 -5
  18. package/dist/features/functions/controller.d.ts.map +1 -1
  19. package/dist/features/functions/controller.js +32 -3
  20. package/dist/features/functions/dtos.d.ts +3 -0
  21. package/dist/features/functions/dtos.d.ts.map +1 -1
  22. package/dist/features/functions/interface.d.ts +3 -0
  23. package/dist/features/functions/interface.d.ts.map +1 -1
  24. package/dist/features/functions/utils.d.ts +2 -1
  25. package/dist/features/functions/utils.d.ts.map +1 -1
  26. package/dist/features/functions/utils.js +19 -7
  27. package/dist/features/rules/utils.d.ts.map +1 -1
  28. package/dist/features/rules/utils.js +11 -2
  29. package/dist/features/triggers/index.d.ts.map +1 -1
  30. package/dist/features/triggers/index.js +48 -7
  31. package/dist/features/triggers/utils.d.ts.map +1 -1
  32. package/dist/features/triggers/utils.js +118 -27
  33. package/dist/index.d.ts +8 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +57 -21
  36. package/dist/services/mongodb-atlas/index.d.ts.map +1 -1
  37. package/dist/services/mongodb-atlas/index.js +605 -478
  38. package/dist/services/mongodb-atlas/model.d.ts +2 -1
  39. package/dist/services/mongodb-atlas/model.d.ts.map +1 -1
  40. package/dist/services/mongodb-atlas/utils.d.ts +9 -2
  41. package/dist/services/mongodb-atlas/utils.d.ts.map +1 -1
  42. package/dist/services/mongodb-atlas/utils.js +113 -23
  43. package/dist/shared/handleUserRegistration.d.ts.map +1 -1
  44. package/dist/shared/handleUserRegistration.js +4 -1
  45. package/dist/shared/models/handleUserRegistration.model.d.ts +6 -2
  46. package/dist/shared/models/handleUserRegistration.model.d.ts.map +1 -1
  47. package/dist/utils/context/helpers.d.ts +7 -6
  48. package/dist/utils/context/helpers.d.ts.map +1 -1
  49. package/dist/utils/context/helpers.js +3 -0
  50. package/dist/utils/context/index.d.ts +1 -1
  51. package/dist/utils/context/index.d.ts.map +1 -1
  52. package/dist/utils/context/index.js +176 -5
  53. package/dist/utils/context/interface.d.ts +1 -1
  54. package/dist/utils/context/interface.d.ts.map +1 -1
  55. package/dist/utils/crypto/index.d.ts +1 -0
  56. package/dist/utils/crypto/index.d.ts.map +1 -1
  57. package/dist/utils/crypto/index.js +6 -2
  58. package/dist/utils/initializer/exposeRoutes.d.ts.map +1 -1
  59. package/dist/utils/initializer/exposeRoutes.js +11 -4
  60. package/dist/utils/initializer/registerPlugins.d.ts +3 -1
  61. package/dist/utils/initializer/registerPlugins.d.ts.map +1 -1
  62. package/dist/utils/initializer/registerPlugins.js +9 -6
  63. package/dist/utils/roles/helpers.js +11 -3
  64. package/dist/utils/roles/machines/commonValidators.d.ts.map +1 -1
  65. package/dist/utils/roles/machines/commonValidators.js +10 -6
  66. package/dist/utils/roles/machines/read/B/validators.d.ts +4 -0
  67. package/dist/utils/roles/machines/read/B/validators.d.ts.map +1 -0
  68. package/dist/utils/roles/machines/read/B/validators.js +8 -0
  69. package/dist/utils/roles/machines/read/C/index.d.ts.map +1 -1
  70. package/dist/utils/roles/machines/read/C/index.js +10 -7
  71. package/dist/utils/roles/machines/read/C/validators.d.ts +5 -0
  72. package/dist/utils/roles/machines/read/C/validators.d.ts.map +1 -0
  73. package/dist/utils/roles/machines/read/C/validators.js +29 -0
  74. package/dist/utils/roles/machines/read/D/index.d.ts.map +1 -1
  75. package/dist/utils/roles/machines/read/D/index.js +13 -11
  76. package/dist/utils/rules.d.ts +1 -1
  77. package/dist/utils/rules.d.ts.map +1 -1
  78. package/dist/utils/rules.js +26 -17
  79. package/jest.config.ts +2 -12
  80. package/jest.setup.ts +28 -0
  81. package/package.json +1 -2
  82. package/src/auth/controller.ts +70 -4
  83. package/src/auth/plugins/jwt.test.ts +93 -0
  84. package/src/auth/plugins/jwt.ts +62 -3
  85. package/src/auth/providers/custom-function/controller.ts +22 -5
  86. package/src/auth/providers/local-userpass/controller.ts +168 -96
  87. package/src/auth/providers/local-userpass/dtos.ts +13 -2
  88. package/src/auth/utils.ts +51 -86
  89. package/src/constants.ts +17 -3
  90. package/src/fastify.d.ts +32 -15
  91. package/src/features/functions/controller.ts +51 -3
  92. package/src/features/functions/dtos.ts +3 -0
  93. package/src/features/functions/interface.ts +3 -0
  94. package/src/features/functions/utils.ts +29 -8
  95. package/src/features/rules/utils.ts +11 -2
  96. package/src/features/triggers/index.ts +43 -1
  97. package/src/features/triggers/utils.ts +146 -38
  98. package/src/index.ts +69 -20
  99. package/src/services/mongodb-atlas/__tests__/findOneAndUpdate.test.ts +95 -0
  100. package/src/services/mongodb-atlas/__tests__/utils.test.ts +141 -0
  101. package/src/services/mongodb-atlas/index.ts +241 -90
  102. package/src/services/mongodb-atlas/model.ts +15 -2
  103. package/src/services/mongodb-atlas/utils.ts +158 -22
  104. package/src/shared/handleUserRegistration.ts +5 -4
  105. package/src/shared/models/handleUserRegistration.model.ts +8 -3
  106. package/src/types/fastify-raw-body.d.ts +22 -0
  107. package/src/utils/__tests__/STEP_B_STATES.test.ts +1 -1
  108. package/src/utils/__tests__/STEP_C_STATES.test.ts +1 -1
  109. package/src/utils/__tests__/STEP_D_STATES.test.ts +2 -2
  110. package/src/utils/__tests__/checkIsValidFieldNameFn.test.ts +9 -4
  111. package/src/utils/__tests__/registerPlugins.test.ts +16 -1
  112. package/src/utils/context/helpers.ts +3 -0
  113. package/src/utils/context/index.ts +238 -13
  114. package/src/utils/context/interface.ts +1 -1
  115. package/src/utils/crypto/index.ts +5 -1
  116. package/src/utils/initializer/exposeRoutes.ts +15 -8
  117. package/src/utils/initializer/registerPlugins.ts +15 -7
  118. package/src/utils/roles/helpers.ts +23 -5
  119. package/src/utils/roles/machines/commonValidators.ts +10 -5
  120. package/src/utils/roles/machines/read/B/validators.ts +8 -0
  121. package/src/utils/roles/machines/read/C/index.ts +11 -7
  122. package/src/utils/roles/machines/read/C/validators.ts +21 -0
  123. package/src/utils/roles/machines/read/D/index.ts +22 -12
  124. package/src/utils/rules.ts +31 -22
  125. package/tsconfig.spec.json +7 -0
@@ -17,6 +17,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
17
17
  };
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.activateTriggers = void 0;
20
+ const constants_1 = require("../../constants");
20
21
  const services_1 = require("../../services");
21
22
  const utils_1 = require("./utils");
22
23
  /**
@@ -27,15 +28,55 @@ const utils_1 = require("./utils");
27
28
  * @param functionsList -> the list of all functions
28
29
  */
29
30
  const activateTriggers = (_a) => __awaiter(void 0, [_a], void 0, function* ({ fastify, triggersList, functionsList }) {
30
- var _b, triggersList_1, triggersList_1_1;
31
- var _c, e_1, _d, _e;
31
+ var _b, e_1, _c, _d;
32
+ var _e;
32
33
  console.log('START ACTIVATION TRIGGERS');
33
34
  try {
35
+ const triggersToActivate = [...triggersList];
36
+ if (constants_1.AUTH_CONFIG.on_user_creation_function_name) {
37
+ const alreadyDeclared = triggersToActivate.some((trigger) => {
38
+ var _a, _b, _c;
39
+ return trigger.content.type === 'AUTHENTICATION' &&
40
+ ((_c = (_b = (_a = trigger.content.event_processors) === null || _a === void 0 ? void 0 : _a.FUNCTION) === null || _b === void 0 ? void 0 : _b.config) === null || _c === void 0 ? void 0 : _c.function_name) ===
41
+ constants_1.AUTH_CONFIG.on_user_creation_function_name;
42
+ });
43
+ if (!alreadyDeclared) {
44
+ triggersToActivate.push({
45
+ fileName: '__auto_on_user_creation_trigger__.json',
46
+ content: {
47
+ name: 'onUserCreation',
48
+ type: 'AUTHENTICATION',
49
+ disabled: false,
50
+ config: {
51
+ collection: (_e = constants_1.AUTH_CONFIG.authCollection) !== null && _e !== void 0 ? _e : 'auth_users',
52
+ database: constants_1.DB_NAME,
53
+ full_document: true,
54
+ full_document_before_change: false,
55
+ match: {},
56
+ operation_types: ['insert', 'update', 'replace'],
57
+ project: {},
58
+ service_name: 'mongodb-atlas',
59
+ skip_catchup_events: false,
60
+ tolerate_resume_errors: false,
61
+ unordered: false,
62
+ schedule: ''
63
+ },
64
+ event_processors: {
65
+ FUNCTION: {
66
+ config: {
67
+ function_name: constants_1.AUTH_CONFIG.on_user_creation_function_name
68
+ }
69
+ }
70
+ }
71
+ }
72
+ });
73
+ }
74
+ }
34
75
  try {
35
- for (_b = true, triggersList_1 = __asyncValues(triggersList); triggersList_1_1 = yield triggersList_1.next(), _c = triggersList_1_1.done, !_c; _b = true) {
36
- _e = triggersList_1_1.value;
37
- _b = false;
38
- const trigger = _e;
76
+ for (var _f = true, triggersToActivate_1 = __asyncValues(triggersToActivate), triggersToActivate_1_1; triggersToActivate_1_1 = yield triggersToActivate_1.next(), _b = triggersToActivate_1_1.done, !_b; _f = true) {
77
+ _d = triggersToActivate_1_1.value;
78
+ _f = false;
79
+ const trigger = _d;
39
80
  const { content } = trigger;
40
81
  const { type, config, event_processors } = content;
41
82
  const functionName = event_processors.FUNCTION.config.function_name;
@@ -52,7 +93,7 @@ const activateTriggers = (_a) => __awaiter(void 0, [_a], void 0, function* ({ fa
52
93
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
53
94
  finally {
54
95
  try {
55
- if (!_b && !_c && (_d = triggersList_1.return)) yield _d.call(triggersList_1);
96
+ if (!_f && !_b && (_c = triggersToActivate_1.return)) yield _c.call(triggersToActivate_1);
56
97
  }
57
98
  finally { if (e_1) throw e_1.error; }
58
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/triggers/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAW,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAU,gBAAuB,KAAG,OAAO,CAAC,QAAQ,CAkB5E,CAAA;AA4JD,eAAO,MAAM,gBAAgB;0EAxI1B,aAAa;yEA6Fb,aAAa;+EAzEb,aAAa;CAwHf,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/triggers/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAW,QAAQ,EAAE,MAAM,aAAa,CAAA;AAqC9D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAU,gBAAuB,KAAG,OAAO,CAAC,QAAQ,CAkB5E,CAAA;AAqOD,eAAO,MAAM,gBAAgB;0EAjN1B,aAAa;yEA4Jb,aAAa;+EAvIb,aAAa;CAgMf,CAAA"}
@@ -31,6 +31,40 @@ const constants_1 = require("../../constants");
31
31
  const state_1 = require("../../state");
32
32
  const utils_1 = require("../../utils");
33
33
  const context_1 = require("../../utils/context");
34
+ const registerOnClose = (app, handler, label) => {
35
+ if (app.server) {
36
+ app.server.once('close', () => {
37
+ Promise.resolve(handler()).catch((error) => {
38
+ console.error(`${label} close error`, error);
39
+ });
40
+ });
41
+ return;
42
+ }
43
+ try {
44
+ app.addHook('onClose', () => __awaiter(void 0, void 0, void 0, function* () {
45
+ try {
46
+ yield handler();
47
+ }
48
+ catch (error) {
49
+ console.error(`${label} close error`, error);
50
+ }
51
+ }));
52
+ }
53
+ catch (error) {
54
+ console.error(`${label} hook registration error`, error);
55
+ }
56
+ };
57
+ const shouldIgnoreStreamError = (error) => {
58
+ var _a, _b;
59
+ const err = error;
60
+ if ((err === null || err === void 0 ? void 0 : err.name) === 'MongoClientClosedError')
61
+ return true;
62
+ if ((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('client was closed'))
63
+ return true;
64
+ if ((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Client is closed'))
65
+ return true;
66
+ return false;
67
+ };
34
68
  /**
35
69
  * Loads trigger files from the specified directory and returns them as an array of objects.
36
70
  * Each object contains the file name and the parsed JSON content.
@@ -70,7 +104,7 @@ exports.loadTriggers = loadTriggers;
70
104
  * @param {Object} params.app - The app instance for context.
71
105
  */
72
106
  const handleCronTrigger = (_a) => __awaiter(void 0, [_a], void 0, function* ({ config, triggerHandler, functionsList, services, app }) {
73
- node_cron_1.default.schedule(config.schedule, () => __awaiter(void 0, void 0, void 0, function* () {
107
+ const task = node_cron_1.default.schedule(config.schedule, () => __awaiter(void 0, void 0, void 0, function* () {
74
108
  yield (0, context_1.GenerateContext)({
75
109
  args: [],
76
110
  app,
@@ -81,47 +115,97 @@ const handleCronTrigger = (_a) => __awaiter(void 0, [_a], void 0, function* ({ c
81
115
  services
82
116
  });
83
117
  }));
118
+ registerOnClose(app, () => task.stop(), 'Scheduled trigger');
84
119
  });
85
120
  const handleAuthenticationTrigger = (_a) => __awaiter(void 0, [_a], void 0, function* ({ config, triggerHandler, functionsList, services, app }) {
121
+ var _b;
86
122
  const { database } = config;
123
+ const authCollection = (_b = constants_1.AUTH_CONFIG.authCollection) !== null && _b !== void 0 ? _b : 'auth_users';
124
+ const collection = app.mongo.client.db(database || constants_1.DB_NAME).collection(authCollection);
87
125
  const pipeline = [
88
126
  {
89
127
  $match: {
90
- operationType: { $in: ['insert'] }
128
+ operationType: { $in: ['insert', 'update', 'replace'] }
91
129
  }
92
130
  }
93
131
  ];
94
- const changeStream = app.mongo.client
95
- .db(database || constants_1.DB_NAME)
96
- .collection(constants_1.AUTH_CONFIG.authCollection)
97
- .watch(pipeline, {
132
+ const changeStream = collection.watch(pipeline, {
98
133
  fullDocument: 'whenAvailable'
99
134
  });
135
+ changeStream.on('error', (error) => {
136
+ if (shouldIgnoreStreamError(error))
137
+ return;
138
+ console.error('Authentication trigger change stream error', error);
139
+ });
100
140
  changeStream.on('change', function (change) {
101
141
  return __awaiter(this, void 0, void 0, function* () {
102
- const document = change['fullDocument']; //TODO -> define user type
103
- if (document) {
104
- delete document.password;
105
- const currentUser = Object.assign({}, document);
106
- delete currentUser.password;
107
- yield (0, context_1.GenerateContext)({
108
- args: [{
109
- user: Object.assign(Object.assign({}, currentUser), { id: currentUser._id.toString(), data: {
110
- _id: currentUser._id.toString(),
111
- email: currentUser.email
112
- } })
113
- }],
114
- app,
115
- rules: state_1.StateManager.select("rules"),
116
- user: {}, // TODO from currentUser ??
117
- currentFunction: triggerHandler,
118
- functionsList,
119
- services,
120
- runAsSystem: true
121
- });
142
+ var _a, _b;
143
+ const operationType = change['operationType'];
144
+ const documentKey = change['documentKey'];
145
+ const fullDocument = change['fullDocument'];
146
+ if (!(documentKey === null || documentKey === void 0 ? void 0 : documentKey._id)) {
147
+ return;
122
148
  }
149
+ const updateDescription = change['updateDescription'];
150
+ const updatedStatus = (_a = updateDescription === null || updateDescription === void 0 ? void 0 : updateDescription.updatedFields) === null || _a === void 0 ? void 0 : _a.status;
151
+ let confirmedCandidate = false;
152
+ let confirmedDocument = fullDocument;
153
+ if (operationType === 'update') {
154
+ if (updatedStatus === 'confirmed') {
155
+ confirmedCandidate = true;
156
+ }
157
+ else if (updatedStatus === undefined) {
158
+ const fetched = yield collection.findOne({
159
+ _id: documentKey._id
160
+ });
161
+ confirmedDocument = fetched !== null && fetched !== void 0 ? fetched : confirmedDocument;
162
+ confirmedCandidate = (confirmedDocument === null || confirmedDocument === void 0 ? void 0 : confirmedDocument.status) === 'confirmed';
163
+ }
164
+ }
165
+ else {
166
+ confirmedCandidate = (confirmedDocument === null || confirmedDocument === void 0 ? void 0 : confirmedDocument.status) === 'confirmed';
167
+ }
168
+ if (!confirmedCandidate) {
169
+ return;
170
+ }
171
+ const updateResult = yield collection.findOneAndUpdate({
172
+ _id: documentKey._id,
173
+ status: 'confirmed',
174
+ on_user_creation_triggered_at: { $exists: false }
175
+ }, {
176
+ $set: {
177
+ on_user_creation_triggered_at: new Date()
178
+ }
179
+ }, {
180
+ returnDocument: 'after'
181
+ });
182
+ const document = (_b = updateResult === null || updateResult === void 0 ? void 0 : updateResult.value) !== null && _b !== void 0 ? _b : confirmedDocument;
183
+ if (!document) {
184
+ return;
185
+ }
186
+ delete document.password;
187
+ const currentUser = Object.assign({}, document);
188
+ delete currentUser.password;
189
+ yield (0, context_1.GenerateContext)({
190
+ args: [{
191
+ user: Object.assign(Object.assign({}, currentUser), { id: currentUser._id.toString(), data: {
192
+ _id: currentUser._id.toString(),
193
+ email: currentUser.email
194
+ } })
195
+ }],
196
+ app,
197
+ rules: state_1.StateManager.select("rules"),
198
+ user: {}, // TODO from currentUser ??
199
+ currentFunction: triggerHandler,
200
+ functionsList,
201
+ services,
202
+ runAsSystem: true
203
+ });
123
204
  });
124
205
  });
206
+ registerOnClose(app, () => __awaiter(void 0, void 0, void 0, function* () {
207
+ yield changeStream.close();
208
+ }), 'Authentication trigger');
125
209
  });
126
210
  /**
127
211
  * Handles a database trigger by watching changes in a specified collection and triggering the appropriate handler.
@@ -160,6 +244,11 @@ const handleDataBaseTrigger = (_a) => __awaiter(void 0, [_a], void 0, function*
160
244
  ? 'whenAvailable'
161
245
  : undefined
162
246
  });
247
+ changeStream.on('error', (error) => {
248
+ if (shouldIgnoreStreamError(error))
249
+ return;
250
+ console.error('Database trigger change stream error', error);
251
+ });
163
252
  changeStream.on('change', function (_a) {
164
253
  return __awaiter(this, void 0, void 0, function* () {
165
254
  var { clusterTime } = _a, change = __rest(_a, ["clusterTime"]);
@@ -174,7 +263,9 @@ const handleDataBaseTrigger = (_a) => __awaiter(void 0, [_a], void 0, function*
174
263
  });
175
264
  });
176
265
  });
177
- // TODO -> gestire close dello stream
266
+ registerOnClose(app, () => __awaiter(void 0, void 0, void 0, function* () {
267
+ yield changeStream.close();
268
+ }), 'Database trigger');
178
269
  });
179
270
  exports.TRIGGER_HANDLERS = {
180
271
  SCHEDULED: handleCronTrigger,
package/dist/index.d.ts CHANGED
@@ -1,11 +1,18 @@
1
1
  import 'dotenv/config';
2
2
  export * from './model';
3
+ export type ALLOWED_METHODS = "GET" | "POST" | "PUT" | "DELETE";
4
+ export type CorsConfig = {
5
+ origin: string;
6
+ methods: ALLOWED_METHODS[];
7
+ };
3
8
  export type InitializeConfig = {
4
9
  projectId: string;
5
10
  mongodbUrl?: string;
6
11
  jwtSecret?: string;
7
12
  port?: number;
8
13
  host?: string;
14
+ corsConfig?: CorsConfig;
15
+ basePath?: string;
9
16
  };
10
17
  /**
11
18
  * > Used to initialize fastify app
@@ -15,5 +22,5 @@ export type InitializeConfig = {
15
22
  * @param port -> the serve port number
16
23
  * @param mongodbUrl -> the database connection string
17
24
  */
18
- export declare function initialize({ projectId, host, jwtSecret, port, mongodbUrl }: InitializeConfig): Promise<void>;
25
+ export declare function initialize({ projectId, host, jwtSecret, port, mongodbUrl, corsConfig, basePath }: InitializeConfig): Promise<void>;
19
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AActB,cAAc,SAAS,CAAA;AAEvB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,EAC/B,SAAS,EACT,IAA0B,EAC1B,SAAqC,EACrC,IAA0B,EAC1B,UAAuC,EACxC,EAAE,gBAAgB,iBAwElB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AActB,cAAc,SAAS,CAAA;AAGvB,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,eAAe,EAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,EAC/B,SAAS,EACT,IAA0B,EAC1B,SAAqC,EACrC,IAA0B,EAC1B,UAAuC,EACvC,UAAwC,EACxC,QAAQ,EACT,EAAE,gBAAgB,iBA6GlB"}
package/dist/index.js CHANGED
@@ -73,23 +73,32 @@ __exportStar(require("./model"), exports);
73
73
  * @param mongodbUrl -> the database connection string
74
74
  */
75
75
  function initialize(_a) {
76
- return __awaiter(this, arguments, void 0, function* ({ projectId, host = constants_1.DEFAULT_CONFIG.HOST, jwtSecret = constants_1.DEFAULT_CONFIG.JWT_SECRET, port = constants_1.DEFAULT_CONFIG.PORT, mongodbUrl = constants_1.DEFAULT_CONFIG.MONGODB_URL }) {
77
- var _b;
76
+ return __awaiter(this, arguments, void 0, function* ({ projectId, host = constants_1.DEFAULT_CONFIG.HOST, jwtSecret = constants_1.DEFAULT_CONFIG.JWT_SECRET, port = constants_1.DEFAULT_CONFIG.PORT, mongodbUrl = constants_1.DEFAULT_CONFIG.MONGODB_URL, corsConfig = constants_1.DEFAULT_CONFIG.CORS_OPTIONS, basePath }) {
77
+ var _b, _c;
78
+ if (!jwtSecret || jwtSecret.trim().length === 0) {
79
+ throw new Error('JWT secret missing: set JWT_SECRET or pass jwtSecret to initialize()');
80
+ }
81
+ const resolvedBasePath = (_c = basePath !== null && basePath !== void 0 ? basePath : (_b = require.main) === null || _b === void 0 ? void 0 : _b.path) !== null && _c !== void 0 ? _c : process.cwd();
78
82
  const fastify = (0, fastify_1.default)({
79
83
  logger: !!constants_1.DEFAULT_CONFIG.ENABLE_LOGGER
80
84
  });
81
- const basePath = (_b = require.main) === null || _b === void 0 ? void 0 : _b.path;
82
- console.log("BASE PATH", basePath);
83
- console.log("CURRENT PORT", port);
84
- console.log("CURRENT HOST", host);
85
- const functionsList = yield (0, utils_2.loadFunctions)(basePath);
86
- console.log("Functions LOADED");
87
- const triggersList = yield (0, utils_4.loadTriggers)(basePath);
88
- console.log("Triggers LOADED");
89
- const endpointsList = yield (0, utils_1.loadEndpoints)(basePath);
90
- console.log("Endpoints LOADED");
91
- const rulesList = yield (0, utils_3.loadRules)(basePath);
92
- console.log("Rules LOADED");
85
+ const isTest = process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined;
86
+ const logInfo = (...args) => {
87
+ if (!isTest) {
88
+ console.log(...args);
89
+ }
90
+ };
91
+ logInfo("BASE PATH", resolvedBasePath);
92
+ logInfo("CURRENT PORT", port);
93
+ logInfo("CURRENT HOST", host);
94
+ const functionsList = yield (0, utils_2.loadFunctions)(resolvedBasePath);
95
+ logInfo("Functions LOADED");
96
+ const triggersList = yield (0, utils_4.loadTriggers)(resolvedBasePath);
97
+ logInfo("Triggers LOADED");
98
+ const endpointsList = yield (0, utils_1.loadEndpoints)(resolvedBasePath);
99
+ logInfo("Endpoints LOADED");
100
+ const rulesList = yield (0, utils_3.loadRules)(resolvedBasePath);
101
+ logInfo("Rules LOADED");
93
102
  const stateConfig = {
94
103
  functions: functionsList,
95
104
  triggers: triggersList,
@@ -107,7 +116,33 @@ function initialize(_a) {
107
116
  deepLinking: false
108
117
  },
109
118
  uiHooks: {
110
- onRequest: function (request, reply, next) { next(); },
119
+ onRequest: function (request, reply, next) {
120
+ const swaggerUser = constants_1.DEFAULT_CONFIG.SWAGGER_UI_USER;
121
+ const swaggerPassword = constants_1.DEFAULT_CONFIG.SWAGGER_UI_PASSWORD;
122
+ if (!swaggerUser && !swaggerPassword) {
123
+ next();
124
+ return;
125
+ }
126
+ const authHeader = request.headers.authorization;
127
+ if (!authHeader || !authHeader.startsWith('Basic ')) {
128
+ reply
129
+ .code(401)
130
+ .header('WWW-Authenticate', 'Basic realm="Swagger UI"')
131
+ .send({ message: 'Unauthorized' });
132
+ return;
133
+ }
134
+ const encoded = authHeader.slice('Basic '.length);
135
+ const decoded = Buffer.from(encoded, 'base64').toString('utf8');
136
+ const [user, pass] = decoded.split(':');
137
+ if (user !== swaggerUser || pass !== swaggerPassword) {
138
+ reply
139
+ .code(401)
140
+ .header('WWW-Authenticate', 'Basic realm="Swagger UI"')
141
+ .send({ message: 'Unauthorized' });
142
+ return;
143
+ }
144
+ next();
145
+ },
111
146
  preHandler: function (request, reply, next) { next(); }
112
147
  },
113
148
  staticCSP: true,
@@ -119,17 +154,18 @@ function initialize(_a) {
119
154
  register: fastify.register,
120
155
  mongodbUrl,
121
156
  jwtSecret,
122
- functionsList
157
+ functionsList,
158
+ corsConfig
123
159
  });
124
- console.log('Plugins registration COMPLETED');
160
+ logInfo('Plugins registration COMPLETED');
125
161
  yield (0, exposeRoutes_1.exposeRoutes)(fastify);
126
- console.log('APP Routes registration COMPLETED');
162
+ logInfo('APP Routes registration COMPLETED');
127
163
  yield (0, functions_1.registerFunctions)({ app: fastify, functionsList, rulesList });
128
- console.log('Functions registration COMPLETED');
164
+ logInfo('Functions registration COMPLETED');
129
165
  yield (0, endpoints_1.generateEndpoints)({ app: fastify, functionsList, endpointsList, rulesList });
130
- console.log('HTTP Endpoints registration COMPLETED');
166
+ logInfo('HTTP Endpoints registration COMPLETED');
131
167
  fastify.ready(() => {
132
- console.log("FASTIFY IS READY");
168
+ logInfo("FASTIFY IS READY");
133
169
  if ((triggersList === null || triggersList === void 0 ? void 0 : triggersList.length) > 0)
134
170
  (0, triggers_1.activateTriggers)({ fastify, triggersList, functionsList });
135
171
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyC,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAqpBrF,QAAA,MAAM,YAAY,EAAE,oBAmBlB,CAAA;AAEF,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAyC,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAkyBrF,QAAA,MAAM,YAAY,EAAE,oBAsBlB,CAAA;AAEF,eAAe,YAAY,CAAA"}