@flowerforce/flowerbase 1.7.6-beta.1 → 1.7.6-beta.10

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 (70) hide show
  1. package/dist/auth/providers/anon-user/controller.d.ts.map +1 -1
  2. package/dist/auth/providers/anon-user/controller.js +1 -0
  3. package/dist/auth/providers/custom-function/controller.d.ts.map +1 -1
  4. package/dist/auth/providers/custom-function/controller.js +3 -1
  5. package/dist/auth/providers/local-userpass/controller.d.ts.map +1 -1
  6. package/dist/auth/providers/local-userpass/controller.js +58 -18
  7. package/dist/auth/providers/local-userpass/dtos.d.ts +5 -1
  8. package/dist/auth/providers/local-userpass/dtos.d.ts.map +1 -1
  9. package/dist/auth/utils.d.ts +1 -0
  10. package/dist/auth/utils.d.ts.map +1 -1
  11. package/dist/auth/utils.js +1 -0
  12. package/dist/features/endpoints/utils.d.ts.map +1 -1
  13. package/dist/features/endpoints/utils.js +3 -0
  14. package/dist/features/functions/controller.d.ts +2 -0
  15. package/dist/features/functions/controller.d.ts.map +1 -1
  16. package/dist/features/functions/controller.js +7 -1
  17. package/dist/features/rules/interface.d.ts +6 -5
  18. package/dist/features/rules/interface.d.ts.map +1 -1
  19. package/dist/features/triggers/interface.d.ts +1 -1
  20. package/dist/features/triggers/interface.d.ts.map +1 -1
  21. package/dist/features/triggers/utils.d.ts.map +1 -1
  22. package/dist/features/triggers/utils.js +60 -0
  23. package/dist/services/mongodb-atlas/index.d.ts +3 -0
  24. package/dist/services/mongodb-atlas/index.d.ts.map +1 -1
  25. package/dist/services/mongodb-atlas/index.js +128 -37
  26. package/dist/utils/context/helpers.d.ts.map +1 -1
  27. package/dist/utils/context/helpers.js +3 -2
  28. package/dist/utils/context/index.d.ts.map +1 -1
  29. package/dist/utils/context/index.js +4 -2
  30. package/dist/utils/roles/helpers.d.ts.map +1 -1
  31. package/dist/utils/roles/helpers.js +6 -3
  32. package/dist/utils/roles/machines/fieldPermissions.d.ts.map +1 -1
  33. package/dist/utils/roles/machines/fieldPermissions.js +19 -10
  34. package/dist/utils/rules-matcher/interface.d.ts +2 -0
  35. package/dist/utils/rules-matcher/interface.d.ts.map +1 -1
  36. package/dist/utils/rules-matcher/interface.js +1 -0
  37. package/dist/utils/rules-matcher/utils.d.ts.map +1 -1
  38. package/dist/utils/rules-matcher/utils.js +23 -6
  39. package/package.json +1 -1
  40. package/src/auth/providers/anon-user/controller.ts +1 -0
  41. package/src/auth/providers/custom-function/controller.ts +6 -1
  42. package/src/auth/providers/local-userpass/__tests__/controller.test.ts +200 -0
  43. package/src/auth/providers/local-userpass/controller.ts +87 -34
  44. package/src/auth/providers/local-userpass/dtos.ts +6 -1
  45. package/src/auth/utils.ts +1 -0
  46. package/src/features/endpoints/__tests__/utils.test.ts +65 -0
  47. package/src/features/endpoints/utils.ts +3 -0
  48. package/src/features/functions/__tests__/watch-filter.test.ts +11 -1
  49. package/src/features/functions/controller.ts +8 -0
  50. package/src/features/rules/interface.ts +18 -17
  51. package/src/features/triggers/__tests__/index.test.ts +6 -4
  52. package/src/features/triggers/interface.ts +1 -1
  53. package/src/features/triggers/utils.ts +60 -0
  54. package/src/monitoring/ui.events.js +1 -1
  55. package/src/services/mongodb-atlas/__tests__/realmCompatibility.test.ts +205 -7
  56. package/src/services/mongodb-atlas/__tests__/utils.test.ts +27 -0
  57. package/src/services/mongodb-atlas/__tests__/watch-filter.test.ts +78 -0
  58. package/src/services/mongodb-atlas/index.ts +371 -171
  59. package/src/utils/__tests__/checkIsValidFieldNameFn.test.ts +74 -5
  60. package/src/utils/__tests__/contextExecuteCompatibility.test.ts +27 -1
  61. package/src/utils/__tests__/evaluateExpression.test.ts +33 -0
  62. package/src/utils/__tests__/generateContextData.test.ts +5 -1
  63. package/src/utils/__tests__/rule.test.ts +38 -0
  64. package/src/utils/context/helpers.ts +3 -2
  65. package/src/utils/context/index.ts +4 -3
  66. package/src/utils/roles/helpers.ts +10 -5
  67. package/src/utils/roles/machines/fieldPermissions.ts +17 -8
  68. package/src/utils/rules-matcher/interface.ts +2 -0
  69. package/src/utils/rules-matcher/utils.ts +33 -17
  70. package/src/utils/__tests__/readFileContent.test.ts +0 -35
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/anon-user/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAOzC;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,eAAe,iBAwE5D"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/anon-user/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAOzC;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,eAAe,iBAyE5D"}
@@ -54,6 +54,7 @@ function anonUserController(app) {
54
54
  email: anonEmail,
55
55
  status: 'confirmed',
56
56
  createdAt: now,
57
+ lastLoginAt: now,
57
58
  custom_data: {},
58
59
  identities: [
59
60
  {
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/custom-function/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAUzC;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,eAAe,iBAqIlE"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/custom-function/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAUzC;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,eAAe,iBA0IlE"}
@@ -111,15 +111,17 @@ function customFunctionController(app) {
111
111
  user_data: Object.assign(Object.assign({}, (user || {})), { id: authUser._id.toString(), email: authUser.email }),
112
112
  custom_data: Object.assign({}, (user || {}))
113
113
  };
114
+ const now = new Date();
114
115
  const refreshToken = this.createRefreshToken(currentUserData);
115
116
  const refreshTokenHash = (0, crypto_1.hashToken)(refreshToken);
116
117
  yield authDb.collection(refreshTokensCollection).insertOne({
117
118
  userId: authUser._id,
118
119
  tokenHash: refreshTokenHash,
119
- createdAt: new Date(),
120
+ createdAt: now,
120
121
  expiresAt: new Date(Date.now() + refreshTokenTtlMs),
121
122
  revokedAt: null
122
123
  });
124
+ yield authDb.collection(authCollection).updateOne({ _id: authUser._id }, { $set: { lastLoginAt: now } });
123
125
  return {
124
126
  access_token: this.createAccessToken(currentUserData),
125
127
  refresh_token: refreshToken,
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAqCzC;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,iBAqXjE"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AA4CzC;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,iBAmajE"}
@@ -49,14 +49,22 @@ function localUserPassController(app) {
49
49
  const resetMaxAttempts = constants_1.DEFAULT_CONFIG.AUTH_RESET_MAX_ATTEMPTS;
50
50
  const refreshTokenTtlMs = constants_1.DEFAULT_CONFIG.REFRESH_TOKEN_TTL_DAYS * 24 * 60 * 60 * 1000;
51
51
  const resolveLocalUserpassProvider = () => { var _a; return (_a = constants_1.AUTH_CONFIG.authProviders) === null || _a === void 0 ? void 0 : _a['local-userpass']; };
52
+ const invalidPasswordError = {
53
+ error: 'unauthorized',
54
+ error_code: 'InvalidPassword'
55
+ };
52
56
  try {
53
- yield authDb.collection(resetPasswordCollection).createIndex({ createdAt: 1 }, { expireAfterSeconds: resetPasswordTtlSeconds });
57
+ yield authDb
58
+ .collection(resetPasswordCollection)
59
+ .createIndex({ createdAt: 1 }, { expireAfterSeconds: resetPasswordTtlSeconds });
54
60
  }
55
61
  catch (error) {
56
62
  console.error('Failed to ensure reset password TTL index', error);
57
63
  }
58
64
  try {
59
- yield authDb.collection(refreshTokensCollection).createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 });
65
+ yield authDb
66
+ .collection(refreshTokensCollection)
67
+ .createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 });
60
68
  }
61
69
  catch (error) {
62
70
  console.error('Failed to ensure refresh token TTL index', error);
@@ -80,8 +88,10 @@ function localUserPassController(app) {
80
88
  const services = state_1.StateManager.select('services');
81
89
  const currentFunction = functionsList[resetPasswordConfig.resetFunctionName];
82
90
  const baseArgs = { token, tokenId, email, password, username: email };
83
- const args = Array.isArray(extraArguments) ? [baseArgs, ...extraArguments] : [baseArgs];
84
- yield (0, context_1.GenerateContext)({
91
+ const args = Array.isArray(extraArguments)
92
+ ? [baseArgs, ...extraArguments]
93
+ : [baseArgs];
94
+ const response = (yield (0, context_1.GenerateContext)({
85
95
  args,
86
96
  app,
87
97
  rules: {},
@@ -89,10 +99,32 @@ function localUserPassController(app) {
89
99
  currentFunction,
90
100
  functionName: resetPasswordConfig.resetFunctionName,
91
101
  functionsList,
92
- services
93
- });
94
- return;
102
+ services,
103
+ runAsSystem: true
104
+ }));
105
+ const resetStatus = response === null || response === void 0 ? void 0 : response.status;
106
+ if (resetStatus === 'success') {
107
+ if (!password) {
108
+ throw new Error(utils_1.AUTH_ERRORS.INVALID_RESET_FUNCTION_RESPONSE);
109
+ }
110
+ const hashedPassword = yield (0, crypto_1.hashPassword)(password);
111
+ yield authDb.collection(authCollection).updateOne({ email }, {
112
+ $set: {
113
+ password: hashedPassword
114
+ }
115
+ });
116
+ yield (authDb === null || authDb === void 0 ? void 0 : authDb.collection(resetPasswordCollection).deleteOne({ email }));
117
+ return { status: 'success' };
118
+ }
119
+ if (resetStatus === 'pending') {
120
+ return { status: 'pending' };
121
+ }
122
+ if (resetStatus === 'fail') {
123
+ throw new Error(utils_1.AUTH_ERRORS.INVALID_RESET_PARAMS);
124
+ }
125
+ throw new Error(utils_1.AUTH_ERRORS.INVALID_RESET_FUNCTION_RESPONSE);
95
126
  }
127
+ return { status: 'pending' };
96
128
  });
97
129
  /**
98
130
  * Endpoint for user registration.
@@ -116,13 +148,17 @@ function localUserPassController(app) {
116
148
  }
117
149
  let result;
118
150
  try {
119
- result = yield (0, handleUserRegistration_1.default)(app, { run_as_system: true, provider: handleUserRegistration_model_1.PROVIDER.LOCAL_USERPASS })({
151
+ result = yield (0, handleUserRegistration_1.default)(app, {
152
+ run_as_system: true,
153
+ provider: handleUserRegistration_model_1.PROVIDER.LOCAL_USERPASS
154
+ })({
120
155
  email: req.body.email.toLowerCase(),
121
156
  password: req.body.password
122
157
  });
123
158
  }
124
159
  catch (error) {
125
- if (error instanceof Error && error.message === 'This email address is already used') {
160
+ if (error instanceof Error &&
161
+ error.message === 'This email address is already used') {
126
162
  res.status(409).send({
127
163
  error: 'name already in use',
128
164
  error_code: 'AccountNameInUse'
@@ -157,10 +193,10 @@ function localUserPassController(app) {
157
193
  res.status(429).send({ message: 'Too many requests' });
158
194
  return;
159
195
  }
160
- const existing = yield authDb.collection(authCollection).findOne({
196
+ const existing = (yield authDb.collection(authCollection).findOne({
161
197
  confirmationToken: req.body.token,
162
198
  confirmationTokenId: req.body.tokenId
163
- });
199
+ }));
164
200
  if (!existing) {
165
201
  res.status(500);
166
202
  throw new Error(utils_1.AUTH_ERRORS.INVALID_TOKEN);
@@ -198,11 +234,13 @@ function localUserPassController(app) {
198
234
  email: req.body.username
199
235
  });
200
236
  if (!authUser) {
201
- throw new Error(utils_1.AUTH_ERRORS.INVALID_CREDENTIALS);
237
+ res.status(401);
238
+ return invalidPasswordError;
202
239
  }
203
240
  const passwordMatches = yield (0, crypto_1.comparePassword)(req.body.password, authUser.password);
204
241
  if (!passwordMatches) {
205
- throw new Error(utils_1.AUTH_ERRORS.INVALID_CREDENTIALS);
242
+ res.status(401);
243
+ return invalidPasswordError;
206
244
  }
207
245
  const user = user_id_field && userCollection
208
246
  ? yield customUserDb
@@ -214,15 +252,19 @@ function localUserPassController(app) {
214
252
  if (authUser && authUser.status !== 'confirmed') {
215
253
  throw new Error(utils_1.AUTH_ERRORS.USER_NOT_CONFIRMED);
216
254
  }
255
+ const now = new Date();
217
256
  const refreshToken = this.createRefreshToken(userWithCustomData);
218
257
  const refreshTokenHash = (0, crypto_1.hashToken)(refreshToken);
219
258
  yield authDb.collection(refreshTokensCollection).insertOne({
220
259
  userId: authUser._id,
221
260
  tokenHash: refreshTokenHash,
222
- createdAt: new Date(),
261
+ createdAt: now,
223
262
  expiresAt: new Date(Date.now() + refreshTokenTtlMs),
224
263
  revokedAt: null
225
264
  });
265
+ yield authDb
266
+ .collection(authCollection)
267
+ .updateOne({ _id: authUser._id }, { $set: { lastLoginAt: now } });
226
268
  return {
227
269
  access_token: this.createAccessToken(userWithCustomData),
228
270
  refresh_token: refreshToken,
@@ -271,11 +313,9 @@ function localUserPassController(app) {
271
313
  res.status(429);
272
314
  return { message: 'Too many requests' };
273
315
  }
274
- yield handleResetPasswordRequest(req.body.email, req.body.password, req.body.arguments);
316
+ const result = yield handleResetPasswordRequest(req.body.email, req.body.password, req.body.arguments);
275
317
  res.status(202);
276
- return {
277
- status: 'ok'
278
- };
318
+ return result;
279
319
  });
280
320
  });
281
321
  /**
@@ -15,12 +15,16 @@ export type LoginSuccessDto = {
15
15
  export type ErrorResponseDto = {
16
16
  message: string;
17
17
  };
18
+ export type InvalidPasswordResponseDto = {
19
+ error: 'unauthorized';
20
+ error_code: 'InvalidPassword';
21
+ };
18
22
  export interface RegistrationDto {
19
23
  Body: RegisterUserDto;
20
24
  }
21
25
  export interface LoginDto {
22
26
  Body: LoginUserDto;
23
- Reply: LoginSuccessDto | ErrorResponseDto;
27
+ Reply: LoginSuccessDto | ErrorResponseDto | InvalidPasswordResponseDto;
24
28
  }
25
29
  export interface ResetPasswordSendDto {
26
30
  Body: {
@@ -1 +1 @@
1
- {"version":3,"file":"dtos.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/dtos.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAAA;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;KACtB,CAAA;CACF;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF"}
1
+ {"version":3,"file":"dtos.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/dtos.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,iBAAiB,CAAA;CAC9B,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,0BAA0B,CAAA;CACvE;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;KACtB,CAAA;CACF;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF"}
@@ -146,6 +146,7 @@ export declare enum AUTH_ERRORS {
146
146
  INVALID_TOKEN = "Invalid refresh token provided",
147
147
  INVALID_RESET_PARAMS = "Invalid token or tokenId provided",
148
148
  MISSING_RESET_FUNCTION = "Missing reset function",
149
+ INVALID_RESET_FUNCTION_RESPONSE = "Invalid reset function response",
149
150
  USER_NOT_CONFIRMED = "User not confirmed"
150
151
  }
151
152
  export interface AuthConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc;;;CAA4C,CAAC;AACxE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;CAexB,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAc7B,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;CAgB7B,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;CAWhC,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;CAU/B,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;CAAoB,CAAA;AAE7C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;CAe/B,CAAA;AAED,oBAAY,cAAc;IACxB,KAAK,WAAW;IAChB,YAAY,cAAc;IAC1B,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,KAAK,gBAAgB;IACrB,UAAU,gBAAgB;IAC1B,aAAa,WAAW;IACxB,UAAU,sBAAsB;CACjC;AAED,oBAAY,WAAW;IACrB,mBAAmB,wBAAwB;IAC3C,aAAa,mCAAmC;IAChD,oBAAoB,sCAAsC;IAC1D,sBAAsB,2BAA2B;IACjD,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,aAAa,CAAA;IAC/B,iBAAiB,EAAE,cAAc,CAAA;IACjC,WAAW,CAAC,EAAE,QAAQ,CAAA;CACvB;AAED,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;CAClB;AACD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE;QACN,kBAAkB,EAAE,MAAM,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,OAAO,CAAA;IAChC,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B,EAAE,MAAM,CAAA;CACvC;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,UAuCjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,oBAarC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,eAAW,WAG3C,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc;;;CAA4C,CAAC;AACxE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;CAexB,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAc7B,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;CAgB7B,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;CAWhC,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;CAU/B,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;CAAoB,CAAA;AAE7C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;CAe/B,CAAA;AAED,oBAAY,cAAc;IACxB,KAAK,WAAW;IAChB,YAAY,cAAc;IAC1B,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,KAAK,gBAAgB;IACrB,UAAU,gBAAgB;IAC1B,aAAa,WAAW;IACxB,UAAU,sBAAsB;CACjC;AAED,oBAAY,WAAW;IACrB,mBAAmB,wBAAwB;IAC3C,aAAa,mCAAmC;IAChD,oBAAoB,sCAAsC;IAC1D,sBAAsB,2BAA2B;IACjD,+BAA+B,oCAAoC;IACnE,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,aAAa,CAAA;IAC/B,iBAAiB,EAAE,cAAc,CAAA;IACjC,WAAW,CAAC,EAAE,QAAQ,CAAA;CACvB;AAED,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;CAClB;AACD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE;QACN,kBAAkB,EAAE,MAAM,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,OAAO,CAAA;IAChC,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B,EAAE,MAAM,CAAA;CACvC;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,UAuCjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,oBAarC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,eAAW,WAG3C,CAAA"}
@@ -115,6 +115,7 @@ var AUTH_ERRORS;
115
115
  AUTH_ERRORS["INVALID_TOKEN"] = "Invalid refresh token provided";
116
116
  AUTH_ERRORS["INVALID_RESET_PARAMS"] = "Invalid token or tokenId provided";
117
117
  AUTH_ERRORS["MISSING_RESET_FUNCTION"] = "Missing reset function";
118
+ AUTH_ERRORS["INVALID_RESET_FUNCTION_RESPONSE"] = "Invalid reset function response";
118
119
  AUTH_ERRORS["USER_NOT_CONFIRMED"] = "User not confirmed";
119
120
  })(AUTH_ERRORS || (exports.AUTH_ERRORS = AUTH_ERRORS = {}));
120
121
  const resolveAppPath = () => { var _a, _b, _c; return (_c = (_a = process.env.FLOWERBASE_APP_PATH) !== null && _a !== void 0 ? _a : (_b = require.main) === null || _b === void 0 ? void 0 : _b.path) !== null && _c !== void 0 ? _c : process.cwd(); };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/endpoints/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAKvE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAU,gBAAuB,KAAG,OAAO,CAAC,SAAS,CA+B9E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,eAAe,EACpB,SAAS,UAAU,CAAC,OAAO,eAAe,CAAC,EAC3C,UAAU,MAAM;;;;;;;CAkDhB,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,kEAM7B,qBAAqB,MACR,KAAK,cAAc,EAAE,KAAK,YAAY,gBA6CrD,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/endpoints/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAKvE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAU,gBAAuB,KAAG,OAAO,CAAC,SAAS,CA+B9E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,eAAe,EACpB,SAAS,UAAU,CAAC,OAAO,eAAe,CAAC,EAC3C,UAAU,MAAM;;;;;;;CAkDhB,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,kEAM7B,qBAAqB,MACR,KAAK,cAAc,EAAE,KAAK,YAAY,gBAgDrD,CAAA"}
@@ -135,6 +135,9 @@ const generateHandler = ({ app, currentFunction, functionName, functionsList, ru
135
135
  setStatusCode: (code) => {
136
136
  res.status(code);
137
137
  },
138
+ setHeader: (name, value) => {
139
+ res.header(name, value);
140
+ },
138
141
  setBody: (body) => {
139
142
  customResponseBody.data = body;
140
143
  }
@@ -1,6 +1,8 @@
1
+ import type { Document } from 'mongodb';
1
2
  import { FunctionController } from './interface';
2
3
  export declare const mapWatchFilterToChangeStreamMatch: (value: unknown) => unknown;
3
4
  export declare const mapWatchFilterToDocumentQuery: (value: unknown) => unknown;
5
+ export declare const shouldSkipReadabilityLookupForChange: (change: Document) => boolean;
4
6
  /**
5
7
  * > Creates a pre handler for every query
6
8
  * @param app -> the fastify instance
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/features/functions/controller.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAmHhD,eAAO,MAAM,iCAAiC,GAAI,OAAO,OAAO,KAAG,OA0BlE,CAAA;AAID,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,OAgD9D,CAAA;AAqHD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,kBAoRjC,CAAA"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/features/functions/controller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAmHhD,eAAO,MAAM,iCAAiC,GAAI,OAAO,OAAO,KAAG,OA0BlE,CAAA;AAID,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,OAgD9D,CAAA;AAqHD,eAAO,MAAM,oCAAoC,GAAI,QAAQ,QAAQ,YAClC,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,kBAyRjC,CAAA"}
@@ -20,7 +20,7 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  return t;
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.functionsController = exports.mapWatchFilterToDocumentQuery = exports.mapWatchFilterToChangeStreamMatch = void 0;
23
+ exports.functionsController = exports.shouldSkipReadabilityLookupForChange = exports.mapWatchFilterToDocumentQuery = exports.mapWatchFilterToChangeStreamMatch = void 0;
24
24
  const bson_1 = require("bson");
25
25
  const services_1 = require("../../services");
26
26
  const context_1 = require("../../utils/context");
@@ -262,6 +262,8 @@ const isReadableDocumentResult = (value) => !!value &&
262
262
  typeof value === 'object' &&
263
263
  !Array.isArray(value) &&
264
264
  Object.keys(value).length > 0;
265
+ const shouldSkipReadabilityLookupForChange = (change) => change.operationType === 'delete';
266
+ exports.shouldSkipReadabilityLookupForChange = shouldSkipReadabilityLookupForChange;
265
267
  /**
266
268
  * > Creates a pre handler for every query
267
269
  * @param app -> the fastify instance
@@ -431,6 +433,10 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
431
433
  const docId = (_b = (_a = change === null || change === void 0 ? void 0 : change.documentKey) === null || _a === void 0 ? void 0 : _a._id) !== null && _b !== void 0 ? _b : (_c = change === null || change === void 0 ? void 0 : change.fullDocument) === null || _c === void 0 ? void 0 : _c._id;
432
434
  if (typeof docId === 'undefined')
433
435
  return;
436
+ if ((0, exports.shouldSkipReadabilityLookupForChange)(change)) {
437
+ subscriberRes.write(`data: ${serializeEjson(change)}\n\n`);
438
+ return;
439
+ }
434
440
  const readQuery = subscriber.documentFilter
435
441
  ? { $and: [subscriber.documentFilter, { _id: docId }] }
436
442
  : { _id: docId };
@@ -1,4 +1,5 @@
1
1
  import { Document } from 'mongodb';
2
+ export type PermissionExpression = boolean | Record<string, unknown>;
2
3
  export interface Filter {
3
4
  name: string;
4
5
  query: Record<string, unknown>;
@@ -9,11 +10,11 @@ export type Projection = Record<string, 0 | 1>;
9
10
  export interface Role {
10
11
  name: string;
11
12
  apply_when: Record<string, unknown>;
12
- insert: boolean;
13
- delete: boolean;
14
- search: boolean;
15
- read: boolean;
16
- write: boolean;
13
+ insert: PermissionExpression;
14
+ delete: PermissionExpression;
15
+ search: PermissionExpression;
16
+ read: PermissionExpression;
17
+ write: PermissionExpression;
17
18
  }
18
19
  export interface RulesConfig {
19
20
  database: string;
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/features/rules/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AACD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,EAAE,IAAI,EAAE,CAAA;CAEd;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAE/C,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACnC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACrC;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAA;CAAE,GACtD;IAAE,UAAU,EAAE,cAAc,CAAA;CAAE,CAAA;AAElC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACvC;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,EAAE,CAAA;AAE5C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,oBAAoB,CAAA;AAC1D,KAAK,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,wBAAwB,EAAE,CAAA;CAAE,CAAA;AAElF,oBAAY,gBAAgB;IAC1B,MAAM,YAAY;IAClB,UAAU,eAAe;IACzB,KAAK,WAAW;CACjB"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/features/rules/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEpE,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AACD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,KAAK,EAAE,oBAAoB,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,EAAE,IAAI,EAAE,CAAA;CACd;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAE/C,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACnC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACrC;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAA;CAAE,GACtD;IAAE,UAAU,EAAE,cAAc,CAAA;CAAE,CAAA;AAElC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAA;CACtC;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,EAAE,CAAA;AAE5C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,oBAAoB,CAAA;AAC1D,KAAK,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,wBAAwB,EAAE,CAAA;CAAE,CAAA;AAElF,oBAAY,gBAAgB;IAC1B,MAAM,YAAY;IAClB,UAAU,eAAe;IACzB,KAAK,WAAW;CACjB"}
@@ -22,7 +22,7 @@ type Config = {
22
22
  isAutoTrigger?: boolean;
23
23
  match: Record<string, unknown>;
24
24
  operation_types: string[];
25
- operation_type?: 'CREATE' | 'DELETE' | 'LOGOUT';
25
+ operation_type?: 'CREATE' | 'DELETE' | 'LOGIN' | 'LOGOUT';
26
26
  providers?: string[];
27
27
  project: Record<string, unknown>;
28
28
  service_name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/features/triggers/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAE5D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE;QAChB,QAAQ,EAAE;YACR,MAAM,EAAE;gBACN,aAAa,EAAE,MAAM,CAAA;aACtB,CAAA;SACF,CAAA;KACF,CAAA;CACF;AAED,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,OAAO,CAAA;IACtB,2BAA2B,EAAE,OAAO,CAAA;IACpC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC/C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAAA;AACrE,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,CAAA;AAE/D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,QAAQ,CAAA;IACxB,GAAG,EAAE,eAAe,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,SAAS,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/features/triggers/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAE5D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE;QAChB,QAAQ,EAAE;YACR,MAAM,EAAE;gBACN,aAAa,EAAE,MAAM,CAAA;aACtB,CAAA;SACF,CAAA;KACF,CAAA;CACF;AAED,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,OAAO,CAAA;IACtB,2BAA2B,EAAE,OAAO,CAAA;IACpC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;IACzD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAAA;AACrE,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,CAAA;AAE/D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,QAAQ,CAAA;IACxB,GAAG,EAAE,eAAe,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,SAAS,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/triggers/utils.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAW,QAAQ,EAAE,MAAM,aAAa,CAAA;AA0E9D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAU,gBAAuB,KAAG,OAAO,CAAC,QAAQ,CAkB5E,CAAA;AA+mBD,eAAO,MAAM,gBAAgB;kHAxlB1B,aAAa;iHAggBb,aAAa;uHA/Yb,aAAa;CA2ef,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/triggers/utils.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAW,QAAQ,EAAE,MAAM,aAAa,CAAA;AA0E9D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAU,gBAAuB,KAAG,OAAO,CAAC,QAAQ,CAkB5E,CAAA;AA2qBD,eAAO,MAAM,gBAAgB;kHAppB1B,aAAa;iHA4jBb,aAAa;uHA1cb,aAAa;CAsiBf,CAAA"}
@@ -170,6 +170,7 @@ const handleCronTrigger = (_a) => __awaiter(void 0, [_a], void 0, function* ({ c
170
170
  const mapOpInverse = {
171
171
  CREATE: ['insert', 'update', 'replace'],
172
172
  DELETE: ['delete'],
173
+ LOGIN: ['insert', 'update'],
173
174
  LOGOUT: ['update'],
174
175
  };
175
176
  const normalizeOperationTypes = (operationTypes = []) => operationTypes.map((op) => op.toLowerCase());
@@ -270,6 +271,8 @@ const handleAuthenticationTrigger = (_a) => __awaiter(void 0, [_a], void 0, func
270
271
  const isUpdate = operationType === 'update';
271
272
  const isReplace = operationType === 'replace';
272
273
  const isDelete = operationType === 'delete';
274
+ const isLoginInsert = isInsert && !!(fullDocument === null || fullDocument === void 0 ? void 0 : fullDocument.lastLoginAt);
275
+ const isLoginUpdate = isUpdate && !!updatedFields && 'lastLoginAt' in updatedFields;
273
276
  const isLogoutUpdate = isUpdate && !!updatedFields && 'lastLogoutAt' in updatedFields;
274
277
  let confirmedCandidate = false;
275
278
  let confirmedDocument = fullDocument;
@@ -353,6 +356,63 @@ const handleAuthenticationTrigger = (_a) => __awaiter(void 0, [_a], void 0, func
353
356
  }
354
357
  return;
355
358
  }
359
+ if (operation_type === 'LOGIN') {
360
+ if (!isLoginInsert && !isLoginUpdate) {
361
+ return;
362
+ }
363
+ let loginDocument = fullDocument !== null && fullDocument !== void 0 ? fullDocument : confirmedDocument;
364
+ if (!loginDocument && (documentKey === null || documentKey === void 0 ? void 0 : documentKey._id)) {
365
+ loginDocument = (yield collection.findOne({
366
+ _id: documentKey._id
367
+ }));
368
+ }
369
+ if (!matchesProviderFilter(loginDocument, providerFilter)) {
370
+ return;
371
+ }
372
+ const userData = buildUserData(loginDocument);
373
+ if (!userData) {
374
+ return;
375
+ }
376
+ const op = {
377
+ operationType: 'LOGIN',
378
+ fullDocument,
379
+ fullDocumentBeforeChange,
380
+ documentKey,
381
+ updateDescription
382
+ };
383
+ try {
384
+ emitTriggerEvent({
385
+ status: 'fired',
386
+ triggerName,
387
+ triggerType,
388
+ functionName,
389
+ meta: Object.assign(Object.assign({}, baseMeta), { event: 'LOGIN' })
390
+ });
391
+ yield (0, context_1.GenerateContext)({
392
+ args: [Object.assign({ user: userData }, op)],
393
+ app,
394
+ rules: state_1.StateManager.select("rules"),
395
+ user: {}, // TODO from currentUser ??
396
+ currentFunction: triggerHandler,
397
+ functionName,
398
+ functionsList,
399
+ services,
400
+ runAsSystem: true
401
+ });
402
+ }
403
+ catch (error) {
404
+ emitTriggerEvent({
405
+ status: 'error',
406
+ triggerName,
407
+ triggerType,
408
+ functionName,
409
+ meta: Object.assign(Object.assign({}, baseMeta), { event: 'LOGIN' }),
410
+ error
411
+ });
412
+ console.log("🚀 ~ handleAuthenticationTrigger ~ error:", error);
413
+ }
414
+ return;
415
+ }
356
416
  if (isDelete) {
357
417
  if (isAutoTrigger || operation_type !== 'DELETE') {
358
418
  return;
@@ -1,4 +1,7 @@
1
+ import { Document } from 'mongodb';
1
2
  import { MongodbAtlasFunction } from './model';
3
+ export declare const toWatchMatchFilter: (value: unknown) => unknown;
4
+ export declare const watchPipelineRequestsDelete: (pipeline: Document[]) => boolean;
2
5
  declare const MongodbAtlas: MongodbAtlasFunction;
3
6
  export default MongodbAtlas;
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAGL,oBAAoB,EAErB,MAAM,SAAS,CAAA;AAq0ChB,QAAA,MAAM,YAAY,EAAE,oBAwBlB,CAAA;AAEF,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,QAAQ,EAQT,MAAM,SAAS,CAAA;AAOhB,OAAO,EAGL,oBAAoB,EAErB,MAAM,SAAS,CAAA;AA6JhB,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,KAAG,OA0BnD,CAAA;AA8BD,eAAO,MAAM,2BAA2B,GAAI,UAAU,QAAQ,EAAE,YAK5D,CAAA;AAmzCJ,QAAA,MAAM,YAAY,EAAE,oBAwBlB,CAAA;AAEF,eAAe,YAAY,CAAA"}