@flowerforce/flowerbase 1.2.1-beta.2 → 1.2.1-beta.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAuBzC;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,iBAqOjE"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAyBzC;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,iBA+PjE"}
@@ -32,6 +32,48 @@ function localUserPassController(app) {
32
32
  const functionsList = state_1.StateManager.select('functions');
33
33
  const { authCollection, userCollection, user_id_field, on_user_creation_function_name } = constants_1.AUTH_CONFIG;
34
34
  const db = app.mongo.client.db(constants_1.DB_NAME);
35
+ const handleResetPasswordRequest = (email, password, extraArguments) => __awaiter(this, void 0, void 0, function* () {
36
+ const { resetPasswordCollection, resetPasswordConfig } = constants_1.AUTH_CONFIG;
37
+ const authUser = yield db.collection(authCollection).findOne({
38
+ email
39
+ });
40
+ if (!authUser) {
41
+ throw new Error(utils_1.AUTH_ERRORS.INVALID_CREDENTIALS);
42
+ }
43
+ const token = (0, crypto_1.generateToken)();
44
+ const tokenId = (0, crypto_1.generateToken)();
45
+ yield (db === null || db === void 0 ? void 0 : db.collection(resetPasswordCollection).updateOne({ email }, { $set: { token, tokenId, email, createdAt: new Date() } }, { upsert: true }));
46
+ if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
47
+ const functionsList = state_1.StateManager.select('functions');
48
+ const services = state_1.StateManager.select('services');
49
+ const currentFunction = functionsList[resetPasswordConfig.resetFunctionName];
50
+ const baseArgs = { token, tokenId, email, password };
51
+ const args = Array.isArray(extraArguments) ? [baseArgs, ...extraArguments] : [baseArgs];
52
+ yield (0, context_1.GenerateContext)({
53
+ args,
54
+ app,
55
+ rules: {},
56
+ user: {},
57
+ currentFunction,
58
+ functionsList,
59
+ services
60
+ });
61
+ return;
62
+ }
63
+ try {
64
+ const { from, subject, mailToken, body } = (0, utils_1.getMailConfig)(resetPasswordConfig, token, tokenId);
65
+ mail_1.default.setApiKey(mailToken);
66
+ yield mail_1.default.send({
67
+ to: email,
68
+ from,
69
+ subject,
70
+ html: body
71
+ });
72
+ }
73
+ catch (error) {
74
+ console.log("Error send mail reset:", error);
75
+ }
76
+ });
35
77
  /**
36
78
  * Endpoint for user registration.
37
79
  *
@@ -121,48 +163,22 @@ function localUserPassController(app) {
121
163
  /**
122
164
  * Endpoint for reset password.
123
165
  *
124
- * @route {POST} /reset/call
166
+ * @route {POST} /reset/send
125
167
  * @param {ResetPasswordDto} req - The request object with th reset request.
126
168
  * @returns {Promise<void>}
127
169
  */
128
170
  app.post(utils_1.AUTH_ENDPOINTS.RESET, {
129
- schema: utils_1.RESET_SCHEMA
171
+ schema: utils_1.RESET_SEND_SCHEMA
130
172
  }, function (req) {
131
173
  return __awaiter(this, void 0, void 0, function* () {
132
- const { resetPasswordCollection, resetPasswordConfig } = constants_1.AUTH_CONFIG;
133
- const email = req.body.email;
134
- const authUser = yield db.collection(authCollection).findOne({
135
- email
136
- });
137
- if (!authUser) {
138
- throw new Error(utils_1.AUTH_ERRORS.INVALID_CREDENTIALS);
139
- }
140
- const token = (0, crypto_1.generateToken)();
141
- const tokenId = (0, crypto_1.generateToken)();
142
- yield (db === null || db === void 0 ? void 0 : db.collection(resetPasswordCollection).updateOne({ email }, { $set: { token, tokenId, email, createdAt: new Date() } }, { upsert: true }));
143
- if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
144
- const functionsList = state_1.StateManager.select('functions');
145
- const services = state_1.StateManager.select('services');
146
- const currentFunction = functionsList[resetPasswordConfig.resetFunctionName];
147
- yield (0, context_1.GenerateContext)({
148
- args: [{ token, tokenId, email }],
149
- app,
150
- rules: {},
151
- user: {},
152
- currentFunction,
153
- functionsList,
154
- services
155
- });
156
- return;
157
- }
158
- const { from, subject, mailToken, body } = (0, utils_1.getMailConfig)(resetPasswordConfig, token, tokenId);
159
- mail_1.default.setApiKey(mailToken);
160
- yield mail_1.default.send({
161
- to: email,
162
- from,
163
- subject,
164
- html: body
165
- });
174
+ yield handleResetPasswordRequest(req.body.email);
175
+ });
176
+ });
177
+ app.post(utils_1.AUTH_ENDPOINTS.RESET_CALL, {
178
+ schema: utils_1.RESET_CALL_SCHEMA
179
+ }, function (req) {
180
+ return __awaiter(this, void 0, void 0, function* () {
181
+ yield handleResetPasswordRequest(req.body.email, req.body.password, req.body.arguments);
166
182
  });
167
183
  });
168
184
  /**
@@ -19,10 +19,16 @@ export interface LoginDto {
19
19
  Body: LoginUserDto;
20
20
  Reply: LoginSuccessDto;
21
21
  }
22
- export interface ResetPasswordDto {
22
+ export interface ResetPasswordSendDto {
23
+ Body: {
24
+ email: string;
25
+ };
26
+ }
27
+ export interface ResetPasswordCallDto {
23
28
  Body: {
24
29
  email: string;
25
30
  password: string;
31
+ arguments?: unknown[];
26
32
  };
27
33
  }
28
34
  export interface ConfirmResetPasswordDto {
@@ -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,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,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"}
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,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB;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"}
@@ -12,7 +12,18 @@ export declare const LOGIN_SCHEMA: {
12
12
  required: string[];
13
13
  };
14
14
  };
15
- export declare const RESET_SCHEMA: {
15
+ export declare const RESET_SEND_SCHEMA: {
16
+ body: {
17
+ type: string;
18
+ properties: {
19
+ email: {
20
+ type: string;
21
+ };
22
+ };
23
+ required: string[];
24
+ };
25
+ };
26
+ export declare const RESET_CALL_SCHEMA: {
16
27
  body: {
17
28
  type: string;
18
29
  properties: {
@@ -22,6 +33,9 @@ export declare const RESET_SCHEMA: {
22
33
  password: {
23
34
  type: string;
24
35
  };
36
+ arguments: {
37
+ type: string;
38
+ };
25
39
  };
26
40
  required: string[];
27
41
  };
@@ -43,6 +57,17 @@ export declare const CONFIRM_RESET_SCHEMA: {
43
57
  required: string[];
44
58
  };
45
59
  };
60
+ export declare const RESET_SCHEMA: {
61
+ body: {
62
+ type: string;
63
+ properties: {
64
+ email: {
65
+ type: string;
66
+ };
67
+ };
68
+ required: string[];
69
+ };
70
+ };
46
71
  export declare const REGISTRATION_SCHEMA: {
47
72
  body: {
48
73
  type: string;
@@ -62,7 +87,8 @@ export declare enum AUTH_ENDPOINTS {
62
87
  REGISTRATION = "/register",
63
88
  PROFILE = "/profile",
64
89
  SESSION = "/session",
65
- RESET = "/reset/call",
90
+ RESET = "/reset/send",
91
+ RESET_CALL = "/reset/call",
66
92
  CONFIRM_RESET = "/reset",
67
93
  FIRST_USER = "/setup/first-user"
68
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY;;;;;;;;;;;;;CASxB,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;CASxB,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAUhC,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAS/B,CAAA;AAED,oBAAY,cAAc;IACxB,KAAK,WAAW;IAChB,YAAY,cAAc;IAC1B,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,KAAK,gBAAgB;IACrB,aAAa,WAAW;IACxB,UAAU,sBAAsB;CACjC;AAED,oBAAY,WAAW;IACrB,mBAAmB,wBAAwB;IAC3C,aAAa,mCAAmC;IAChD,oBAAoB,sCAAsC;CAC3D;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,aAAa,CAAA;IAC/B,iBAAiB,EAAE,cAAc,CAAA;CAClC;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,MAAM;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,OAAO,CAAA;IAChC,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;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,UAGjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,oBAGrC,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,qBAAqB,MAAM,EAC3B,OAAO,MAAM,EACb,SAAS,MAAM;;;;;CA2DhB,CAAA;AAMD,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,YAAY;;;;;;;;;;;;;CASxB,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;CAQ7B,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAU7B,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAUhC,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;CAAoB,CAAA;AAE7C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAS/B,CAAA;AAED,oBAAY,cAAc;IACxB,KAAK,WAAW;IAChB,YAAY,cAAc;IAC1B,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;CAC3D;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,aAAa,CAAA;IAC/B,iBAAiB,EAAE,cAAc,CAAA;CAClC;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,MAAM;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,OAAO,CAAA;IAChC,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;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,UAGjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,oBAGrC,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,qBAAqB,MAAM,EAC3B,OAAO,MAAM,EACb,SAAS,MAAM;;;;;CA2DhB,CAAA;AAMD,eAAO,MAAM,gBAAgB,GAAI,eAAW,WAG3C,CAAA"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generatePassword = exports.getMailConfig = exports.loadCustomUserData = exports.loadAuthConfig = exports.AUTH_ERRORS = exports.AUTH_ENDPOINTS = exports.REGISTRATION_SCHEMA = exports.CONFIRM_RESET_SCHEMA = exports.RESET_SCHEMA = exports.LOGIN_SCHEMA = void 0;
6
+ exports.generatePassword = exports.getMailConfig = exports.loadCustomUserData = exports.loadAuthConfig = exports.AUTH_ERRORS = exports.AUTH_ENDPOINTS = exports.REGISTRATION_SCHEMA = exports.RESET_SCHEMA = exports.CONFIRM_RESET_SCHEMA = exports.RESET_CALL_SCHEMA = exports.RESET_SEND_SCHEMA = exports.LOGIN_SCHEMA = void 0;
7
7
  const crypto_1 = __importDefault(require("crypto"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const path_1 = __importDefault(require("path"));
@@ -18,12 +18,22 @@ exports.LOGIN_SCHEMA = {
18
18
  required: ['username', 'password']
19
19
  }
20
20
  };
21
- exports.RESET_SCHEMA = {
21
+ exports.RESET_SEND_SCHEMA = {
22
+ body: {
23
+ type: 'object',
24
+ properties: {
25
+ email: { type: 'string' }
26
+ },
27
+ required: ['email']
28
+ }
29
+ };
30
+ exports.RESET_CALL_SCHEMA = {
22
31
  body: {
23
32
  type: 'object',
24
33
  properties: {
25
34
  email: { type: 'string' },
26
- password: { type: 'string' }
35
+ password: { type: 'string' },
36
+ arguments: { type: 'array' }
27
37
  },
28
38
  required: ['email', 'password']
29
39
  }
@@ -39,6 +49,7 @@ exports.CONFIRM_RESET_SCHEMA = {
39
49
  required: ['password', 'token', 'tokenId']
40
50
  }
41
51
  };
52
+ exports.RESET_SCHEMA = exports.RESET_SEND_SCHEMA;
42
53
  exports.REGISTRATION_SCHEMA = {
43
54
  body: {
44
55
  type: 'object',
@@ -55,7 +66,8 @@ var AUTH_ENDPOINTS;
55
66
  AUTH_ENDPOINTS["REGISTRATION"] = "/register";
56
67
  AUTH_ENDPOINTS["PROFILE"] = "/profile";
57
68
  AUTH_ENDPOINTS["SESSION"] = "/session";
58
- AUTH_ENDPOINTS["RESET"] = "/reset/call";
69
+ AUTH_ENDPOINTS["RESET"] = "/reset/send";
70
+ AUTH_ENDPOINTS["RESET_CALL"] = "/reset/call";
59
71
  AUTH_ENDPOINTS["CONFIRM_RESET"] = "/reset";
60
72
  AUTH_ENDPOINTS["FIRST_USER"] = "/setup/first-user";
61
73
  })(AUTH_ENDPOINTS || (exports.AUTH_ENDPOINTS = AUTH_ENDPOINTS = {}));
@@ -47,7 +47,7 @@ exports.comparePassword = comparePassword;
47
47
  * > Generate a random token
48
48
  * @param length -> the token length
49
49
  */
50
- const generateToken = (length = 32) => {
50
+ const generateToken = (length = 64) => {
51
51
  return node_crypto_1.default.randomBytes(length).toString('hex');
52
52
  };
53
53
  exports.generateToken = generateToken;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowerforce/flowerbase",
3
- "version": "1.2.1-beta.2",
3
+ "version": "1.2.1-beta.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,13 +14,15 @@ import {
14
14
  getMailConfig,
15
15
  LOGIN_SCHEMA,
16
16
  REGISTRATION_SCHEMA,
17
- RESET_SCHEMA
17
+ RESET_CALL_SCHEMA,
18
+ RESET_SEND_SCHEMA
18
19
  } from '../../utils'
19
20
  import {
20
21
  ConfirmResetPasswordDto,
21
22
  LoginDto,
22
23
  RegistrationDto,
23
- ResetPasswordDto
24
+ ResetPasswordCallDto,
25
+ ResetPasswordSendDto
24
26
  } from './dtos'
25
27
  /**
26
28
  * Controller for handling local user registration and login.
@@ -37,6 +39,66 @@ export async function localUserPassController(app: FastifyInstance) {
37
39
  on_user_creation_function_name
38
40
  } = AUTH_CONFIG
39
41
  const db = app.mongo.client.db(DB_NAME)
42
+ const handleResetPasswordRequest = async (
43
+ email: string,
44
+ password?: string,
45
+ extraArguments?: unknown[]
46
+ ) => {
47
+ const { resetPasswordCollection, resetPasswordConfig } = AUTH_CONFIG
48
+ const authUser = await db.collection(authCollection!).findOne({
49
+ email
50
+ })
51
+
52
+ if (!authUser) {
53
+ throw new Error(AUTH_ERRORS.INVALID_CREDENTIALS)
54
+ }
55
+
56
+ const token = generateToken()
57
+ const tokenId = generateToken()
58
+
59
+ await db
60
+ ?.collection(resetPasswordCollection)
61
+ .updateOne(
62
+ { email },
63
+ { $set: { token, tokenId, email, createdAt: new Date() } },
64
+ { upsert: true }
65
+ )
66
+
67
+ if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
68
+ const functionsList = StateManager.select('functions')
69
+ const services = StateManager.select('services')
70
+ const currentFunction = functionsList[resetPasswordConfig.resetFunctionName]
71
+ const baseArgs = { token, tokenId, email, password }
72
+ const args = Array.isArray(extraArguments) ? [baseArgs, ...extraArguments] : [baseArgs]
73
+ await GenerateContext({
74
+ args,
75
+ app,
76
+ rules: {},
77
+ user: {},
78
+ currentFunction,
79
+ functionsList,
80
+ services
81
+ })
82
+ return
83
+ }
84
+
85
+ try {
86
+ const { from, subject, mailToken, body } = getMailConfig(
87
+ resetPasswordConfig,
88
+ token,
89
+ tokenId
90
+ )
91
+ sendGrid.setApiKey(mailToken)
92
+ await sendGrid.send({
93
+ to: email,
94
+ from,
95
+ subject,
96
+ html: body
97
+ })
98
+ } catch (error) {
99
+ console.log("Error send mail reset:", error)
100
+ }
101
+ }
40
102
 
41
103
  /**
42
104
  * Endpoint for user registration.
@@ -158,65 +220,31 @@ export async function localUserPassController(app: FastifyInstance) {
158
220
  /**
159
221
  * Endpoint for reset password.
160
222
  *
161
- * @route {POST} /reset/call
223
+ * @route {POST} /reset/send
162
224
  * @param {ResetPasswordDto} req - The request object with th reset request.
163
225
  * @returns {Promise<void>}
164
226
  */
165
- app.post<ResetPasswordDto>(
227
+ app.post<ResetPasswordSendDto>(
166
228
  AUTH_ENDPOINTS.RESET,
167
229
  {
168
- schema: RESET_SCHEMA
230
+ schema: RESET_SEND_SCHEMA
169
231
  },
170
232
  async function (req) {
171
- const { resetPasswordCollection, resetPasswordConfig } = AUTH_CONFIG
172
- const email = req.body.email
173
- const authUser = await db.collection(authCollection!).findOne({
174
- email
175
- })
176
-
177
- if (!authUser) {
178
- throw new Error(AUTH_ERRORS.INVALID_CREDENTIALS)
179
- }
180
-
181
- const token = generateToken()
182
- const tokenId = generateToken()
183
-
184
- await db
185
- ?.collection(resetPasswordCollection)
186
- .updateOne(
187
- { email },
188
- { $set: { token, tokenId, email, createdAt: new Date() } },
189
- { upsert: true }
190
- )
191
-
192
- if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
193
- const functionsList = StateManager.select('functions')
194
- const services = StateManager.select('services')
195
- const currentFunction = functionsList[resetPasswordConfig.resetFunctionName]
196
- await GenerateContext({
197
- args: [{ token, tokenId, email }],
198
- app,
199
- rules: {},
200
- user: {},
201
- currentFunction,
202
- functionsList,
203
- services
204
- })
205
- return
206
- }
233
+ await handleResetPasswordRequest(req.body.email)
234
+ }
235
+ )
207
236
 
208
- const { from, subject, mailToken, body } = getMailConfig(
209
- resetPasswordConfig,
210
- token,
211
- tokenId
237
+ app.post<ResetPasswordCallDto>(
238
+ AUTH_ENDPOINTS.RESET_CALL,
239
+ {
240
+ schema: RESET_CALL_SCHEMA
241
+ },
242
+ async function (req) {
243
+ await handleResetPasswordRequest(
244
+ req.body.email,
245
+ req.body.password,
246
+ req.body.arguments
212
247
  )
213
- sendGrid.setApiKey(mailToken)
214
- await sendGrid.send({
215
- to: email,
216
- from,
217
- subject,
218
- html: body
219
- })
220
248
  }
221
249
  )
222
250
 
@@ -24,10 +24,17 @@ export interface LoginDto {
24
24
  Reply: LoginSuccessDto
25
25
  }
26
26
 
27
- export interface ResetPasswordDto {
27
+ export interface ResetPasswordSendDto {
28
+ Body: {
29
+ email: string
30
+ }
31
+ }
32
+
33
+ export interface ResetPasswordCallDto {
28
34
  Body: {
29
35
  email: string
30
36
  password: string
37
+ arguments?: unknown[]
31
38
  }
32
39
  }
33
40
 
package/src/auth/utils.ts CHANGED
@@ -15,12 +15,23 @@ export const LOGIN_SCHEMA = {
15
15
  }
16
16
  }
17
17
 
18
- export const RESET_SCHEMA = {
18
+ export const RESET_SEND_SCHEMA = {
19
+ body: {
20
+ type: 'object',
21
+ properties: {
22
+ email: { type: 'string' }
23
+ },
24
+ required: ['email']
25
+ }
26
+ }
27
+
28
+ export const RESET_CALL_SCHEMA = {
19
29
  body: {
20
30
  type: 'object',
21
31
  properties: {
22
32
  email: { type: 'string' },
23
- password: { type: 'string' }
33
+ password: { type: 'string' },
34
+ arguments: { type: 'array' }
24
35
  },
25
36
  required: ['email', 'password']
26
37
  }
@@ -38,6 +49,8 @@ export const CONFIRM_RESET_SCHEMA = {
38
49
  }
39
50
  }
40
51
 
52
+ export const RESET_SCHEMA = RESET_SEND_SCHEMA
53
+
41
54
  export const REGISTRATION_SCHEMA = {
42
55
  body: {
43
56
  type: 'object',
@@ -54,7 +67,8 @@ export enum AUTH_ENDPOINTS {
54
67
  REGISTRATION = '/register',
55
68
  PROFILE = '/profile',
56
69
  SESSION = '/session',
57
- RESET = '/reset/call',
70
+ RESET = '/reset/send',
71
+ RESET_CALL = '/reset/call',
58
72
  CONFIRM_RESET = "/reset",
59
73
  FIRST_USER = '/setup/first-user'
60
74
  }
@@ -36,6 +36,6 @@ export const comparePassword = async (plaintext: string, storedPassword: string)
36
36
  * > Generate a random token
37
37
  * @param length -> the token length
38
38
  */
39
- export const generateToken = (length = 32) => {
39
+ export const generateToken = (length = 64) => {
40
40
  return crypto.randomBytes(length).toString('hex')
41
41
  }