@brightchain/node-express-suite 0.25.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 (127) hide show
  1. package/MIGRATION.md +131 -0
  2. package/README.md +11 -0
  3. package/package.json +18 -0
  4. package/src/index.d.ts +46 -0
  5. package/src/index.d.ts.map +1 -0
  6. package/src/index.js +73 -0
  7. package/src/index.js.map +1 -0
  8. package/src/lib/application.d.ts +35 -0
  9. package/src/lib/application.d.ts.map +1 -0
  10. package/src/lib/application.js +38 -0
  11. package/src/lib/application.js.map +1 -0
  12. package/src/lib/bright-db-model-registry.d.ts +56 -0
  13. package/src/lib/bright-db-model-registry.d.ts.map +1 -0
  14. package/src/lib/bright-db-model-registry.js +71 -0
  15. package/src/lib/bright-db-model-registry.js.map +1 -0
  16. package/src/lib/brightchain-lib.d.ts +7 -0
  17. package/src/lib/brightchain-lib.d.ts.map +1 -0
  18. package/src/lib/brightchain-lib.js +12 -0
  19. package/src/lib/brightchain-lib.js.map +1 -0
  20. package/src/lib/brightdb.d.ts +7 -0
  21. package/src/lib/brightdb.d.ts.map +1 -0
  22. package/src/lib/brightdb.js +11 -0
  23. package/src/lib/brightdb.js.map +1 -0
  24. package/src/lib/constants.d.ts +6 -0
  25. package/src/lib/constants.d.ts.map +1 -0
  26. package/src/lib/constants.js +12 -0
  27. package/src/lib/constants.js.map +1 -0
  28. package/src/lib/create-test-app.d.ts +22 -0
  29. package/src/lib/create-test-app.d.ts.map +1 -0
  30. package/src/lib/create-test-app.js +49 -0
  31. package/src/lib/create-test-app.js.map +1 -0
  32. package/src/lib/databaseInit.d.ts +53 -0
  33. package/src/lib/databaseInit.d.ts.map +1 -0
  34. package/src/lib/databaseInit.js +114 -0
  35. package/src/lib/databaseInit.js.map +1 -0
  36. package/src/lib/datastore/block-document-store-factory.d.ts +31 -0
  37. package/src/lib/datastore/block-document-store-factory.d.ts.map +1 -0
  38. package/src/lib/datastore/block-document-store-factory.js +35 -0
  39. package/src/lib/datastore/block-document-store-factory.js.map +1 -0
  40. package/src/lib/datastore/block-document-store.d.ts +201 -0
  41. package/src/lib/datastore/block-document-store.d.ts.map +1 -0
  42. package/src/lib/datastore/block-document-store.js +649 -0
  43. package/src/lib/datastore/block-document-store.js.map +1 -0
  44. package/src/lib/datastore/document-store.d.ts +83 -0
  45. package/src/lib/datastore/document-store.d.ts.map +1 -0
  46. package/src/lib/datastore/document-store.js +3 -0
  47. package/src/lib/datastore/document-store.js.map +1 -0
  48. package/src/lib/datastore/index.d.ts +6 -0
  49. package/src/lib/datastore/index.d.ts.map +1 -0
  50. package/src/lib/datastore/index.js +11 -0
  51. package/src/lib/datastore/index.js.map +1 -0
  52. package/src/lib/datastore/memory-document-store.d.ts +9 -0
  53. package/src/lib/datastore/memory-document-store.d.ts.map +1 -0
  54. package/src/lib/datastore/memory-document-store.js +218 -0
  55. package/src/lib/datastore/memory-document-store.js.map +1 -0
  56. package/src/lib/environment.d.ts +64 -0
  57. package/src/lib/environment.d.ts.map +1 -0
  58. package/src/lib/environment.js +165 -0
  59. package/src/lib/environment.js.map +1 -0
  60. package/src/lib/factories/blockStoreFactory.d.ts +10 -0
  61. package/src/lib/factories/blockStoreFactory.d.ts.map +1 -0
  62. package/src/lib/factories/blockStoreFactory.js +14 -0
  63. package/src/lib/factories/blockStoreFactory.js.map +1 -0
  64. package/src/lib/interfaces/bright-db-application.d.ts +34 -0
  65. package/src/lib/interfaces/bright-db-application.d.ts.map +1 -0
  66. package/src/lib/interfaces/bright-db-application.js +13 -0
  67. package/src/lib/interfaces/bright-db-application.js.map +1 -0
  68. package/src/lib/interfaces/environment.d.ts +34 -0
  69. package/src/lib/interfaces/environment.d.ts.map +1 -0
  70. package/src/lib/interfaces/environment.js +11 -0
  71. package/src/lib/interfaces/environment.js.map +1 -0
  72. package/src/lib/middleware/index.d.ts +2 -0
  73. package/src/lib/middleware/index.d.ts.map +1 -0
  74. package/src/lib/middleware/index.js +6 -0
  75. package/src/lib/middleware/index.js.map +1 -0
  76. package/src/lib/middleware/validateBody.d.ts +13 -0
  77. package/src/lib/middleware/validateBody.d.ts.map +1 -0
  78. package/src/lib/middleware/validateBody.js +35 -0
  79. package/src/lib/middleware/validateBody.js.map +1 -0
  80. package/src/lib/middlewares.d.ts +9 -0
  81. package/src/lib/middlewares.d.ts.map +1 -0
  82. package/src/lib/middlewares.js +21 -0
  83. package/src/lib/middlewares.js.map +1 -0
  84. package/src/lib/plugins/bright-db-database-plugin.d.ts +95 -0
  85. package/src/lib/plugins/bright-db-database-plugin.d.ts.map +1 -0
  86. package/src/lib/plugins/bright-db-database-plugin.js +143 -0
  87. package/src/lib/plugins/bright-db-database-plugin.js.map +1 -0
  88. package/src/lib/plugins/configure-bright-db-app.d.ts +25 -0
  89. package/src/lib/plugins/configure-bright-db-app.d.ts.map +1 -0
  90. package/src/lib/plugins/configure-bright-db-app.js +31 -0
  91. package/src/lib/plugins/configure-bright-db-app.js.map +1 -0
  92. package/src/lib/services/bright-db-authentication-provider.d.ts +31 -0
  93. package/src/lib/services/bright-db-authentication-provider.d.ts.map +1 -0
  94. package/src/lib/services/bright-db-authentication-provider.js +91 -0
  95. package/src/lib/services/bright-db-authentication-provider.js.map +1 -0
  96. package/src/lib/services/bright-db-base-service.d.ts +26 -0
  97. package/src/lib/services/bright-db-base-service.d.ts.map +1 -0
  98. package/src/lib/services/bright-db-base-service.js +30 -0
  99. package/src/lib/services/bright-db-base-service.js.map +1 -0
  100. package/src/lib/services/bright-db-collection.d.ts +50 -0
  101. package/src/lib/services/bright-db-collection.d.ts.map +1 -0
  102. package/src/lib/services/bright-db-collection.js +116 -0
  103. package/src/lib/services/bright-db-collection.js.map +1 -0
  104. package/src/lib/services/sessionAdapter.d.ts +62 -0
  105. package/src/lib/services/sessionAdapter.d.ts.map +1 -0
  106. package/src/lib/services/sessionAdapter.js +106 -0
  107. package/src/lib/services/sessionAdapter.js.map +1 -0
  108. package/src/lib/shared-types.d.ts +41 -0
  109. package/src/lib/shared-types.d.ts.map +1 -0
  110. package/src/lib/shared-types.js +3 -0
  111. package/src/lib/shared-types.js.map +1 -0
  112. package/src/lib/transactions/bright-db-transaction-manager.d.ts +46 -0
  113. package/src/lib/transactions/bright-db-transaction-manager.d.ts.map +1 -0
  114. package/src/lib/transactions/bright-db-transaction-manager.js +81 -0
  115. package/src/lib/transactions/bright-db-transaction-manager.js.map +1 -0
  116. package/src/lib/types/backend-id.d.ts +3 -0
  117. package/src/lib/types/backend-id.d.ts.map +1 -0
  118. package/src/lib/types/backend-id.js +3 -0
  119. package/src/lib/types/backend-id.js.map +1 -0
  120. package/src/lib/upstream.d.ts +8 -0
  121. package/src/lib/upstream.d.ts.map +1 -0
  122. package/src/lib/upstream.js +13 -0
  123. package/src/lib/upstream.js.map +1 -0
  124. package/src/lib/validation/userValidation.d.ts +44 -0
  125. package/src/lib/validation/userValidation.d.ts.map +1 -0
  126. package/src/lib/validation/userValidation.js +147 -0
  127. package/src/lib/validation/userValidation.js.map +1 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview BrightDB transaction manager.
4
+ * Manages transaction lifecycle with retry logic and timeout support.
5
+ * Parallel to upstream's TransactionManager (which wraps Mongoose sessions).
6
+ *
7
+ * @module transactions/bright-db-transaction-manager
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BrightDbTransactionManager = void 0;
11
+ /**
12
+ * Manager for BrightDB transactions.
13
+ * Wraps @brightchain/db's session-based transaction support.
14
+ *
15
+ * When `useTransactions` is false, the callback is executed directly
16
+ * without a session (passthrough mode).
17
+ */
18
+ class BrightDbTransactionManager {
19
+ db;
20
+ useTransactions;
21
+ constructor(db, useTransactions) {
22
+ this.db = db;
23
+ this.useTransactions = useTransactions;
24
+ }
25
+ /**
26
+ * Executes a callback within a transaction.
27
+ *
28
+ * When transactions are enabled, creates a session, starts a transaction,
29
+ * and commits on success or aborts on failure. Supports retry logic.
30
+ *
31
+ * When transactions are disabled, runs the callback directly with
32
+ * `undefined` as the session parameter.
33
+ *
34
+ * @template T - Return type
35
+ * @param callback - Function to execute, receives session or undefined
36
+ * @param options - Transaction options (timeout, retries)
37
+ * @returns Result of callback execution
38
+ */
39
+ async execute(callback, options) {
40
+ if (!this.useTransactions) {
41
+ return callback(undefined);
42
+ }
43
+ const maxRetries = options?.maxRetries ?? 0;
44
+ const timeoutMs = options?.timeoutMs;
45
+ let lastError;
46
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
47
+ const session = this.db.startSession();
48
+ session.startTransaction();
49
+ try {
50
+ const resultPromise = callback(session);
51
+ let result;
52
+ if (timeoutMs !== undefined) {
53
+ result = await Promise.race([
54
+ resultPromise,
55
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Transaction timed out after ${timeoutMs}ms`)), timeoutMs)),
56
+ ]);
57
+ }
58
+ else {
59
+ result = await resultPromise;
60
+ }
61
+ await session.commitTransaction();
62
+ return result;
63
+ }
64
+ catch (err) {
65
+ lastError = err;
66
+ try {
67
+ await session.abortTransaction();
68
+ }
69
+ catch {
70
+ // Best-effort abort
71
+ }
72
+ }
73
+ finally {
74
+ session.endSession();
75
+ }
76
+ }
77
+ throw lastError;
78
+ }
79
+ }
80
+ exports.BrightDbTransactionManager = BrightDbTransactionManager;
81
+ //# sourceMappingURL=bright-db-transaction-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bright-db-transaction-manager.js","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/transactions/bright-db-transaction-manager.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAeH;;;;;;GAMG;AACH,MAAa,0BAA0B;IAElB;IACA;IAFnB,YACmB,EAAY,EACZ,eAAwB;QADxB,OAAE,GAAF,EAAE,CAAU;QACZ,oBAAe,GAAf,eAAe,CAAS;IACxC,CAAC;IAEJ;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,OAAO,CACX,QAA6D,EAC7D,OAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;QAErC,IAAI,SAAkB,CAAC;QAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;YACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAE3B,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAExC,IAAI,MAAS,CAAC;gBACd,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;wBAC1B,aAAa;wBACb,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,SAAS,IAAI,CAAC,CAAC,EACrE,SAAS,CACV,CACF;qBACF,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,MAAM,aAAa,CAAC;gBAC/B,CAAC;gBAED,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAClC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,GAAG,CAAC;gBAChB,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,CAAC;IAClB,CAAC;CACF;AAvED,gEAuEC"}
@@ -0,0 +1,3 @@
1
+ import { GuidV4Buffer } from '@digitaldefiance/node-ecies-lib';
2
+ export type DefaultBackendIdType = GuidV4Buffer;
3
+ //# sourceMappingURL=backend-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-id.d.ts","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/types/backend-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=backend-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-id.js","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/types/backend-id.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Re-exports from @digitaldefiance/node-express-suite (upstream).
3
+ * Consumers can import these through @brightchain/node-express-suite
4
+ * instead of depending on the upstream package directly.
5
+ */
6
+ export { Application, createExpressConstants, AppRouter, } from '@digitaldefiance/node-express-suite';
7
+ export type { IApplication, IConstants, IAuthenticationProvider, IDatabasePlugin, IEnvironment, } from '@digitaldefiance/node-express-suite';
8
+ //# sourceMappingURL=upstream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../../../../brightchain-node-express-suite/src/lib/upstream.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,SAAS,GACV,MAAM,qCAAqC,CAAC;AAE7C,YAAY,EACV,YAAY,EACZ,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,YAAY,GACb,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppRouter = exports.createExpressConstants = exports.Application = void 0;
4
+ /**
5
+ * Re-exports from @digitaldefiance/node-express-suite (upstream).
6
+ * Consumers can import these through @brightchain/node-express-suite
7
+ * instead of depending on the upstream package directly.
8
+ */
9
+ var node_express_suite_1 = require("@digitaldefiance/node-express-suite");
10
+ Object.defineProperty(exports, "Application", { enumerable: true, get: function () { return node_express_suite_1.Application; } });
11
+ Object.defineProperty(exports, "createExpressConstants", { enumerable: true, get: function () { return node_express_suite_1.createExpressConstants; } });
12
+ Object.defineProperty(exports, "AppRouter", { enumerable: true, get: function () { return node_express_suite_1.AppRouter; } });
13
+ //# sourceMappingURL=upstream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../../../../brightchain-node-express-suite/src/lib/upstream.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,0EAI6C;AAH3C,iHAAA,WAAW,OAAA;AACX,4HAAA,sBAAsB,OAAA;AACtB,+GAAA,SAAS,OAAA"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Validation utilities for user endpoint request bodies.
3
+ *
4
+ * Requirements: 9.1, 9.2, 9.3, 9.4
5
+ */
6
+ export interface IValidationError {
7
+ field: string;
8
+ message: string;
9
+ }
10
+ export interface IValidationResult {
11
+ valid: boolean;
12
+ errors: IValidationError[];
13
+ }
14
+ /**
15
+ * Validates a registration request body.
16
+ * - username: non-empty, alphanumeric/hyphens/underscores only
17
+ * - email: valid email format
18
+ * - password: minimum 8 characters
19
+ */
20
+ export declare function validateRegistration(body: unknown): IValidationResult;
21
+ /**
22
+ * Validates a login request body.
23
+ * - username: non-empty
24
+ * - password: non-empty
25
+ */
26
+ export declare function validateLogin(body: unknown): IValidationResult;
27
+ /**
28
+ * Validates a password change request body.
29
+ * - currentPassword: non-empty string
30
+ * - newPassword: minimum 8 characters
31
+ *
32
+ * Requirements: 1.3, 5.7
33
+ */
34
+ export declare function validatePasswordChange(body: unknown): IValidationResult;
35
+ /**
36
+ * Validates a mnemonic recovery request body.
37
+ * - email: valid email format
38
+ * - mnemonic: non-empty string
39
+ * - newPassword (optional): if present, minimum 8 characters
40
+ *
41
+ * Requirements: 5.7
42
+ */
43
+ export declare function validateRecovery(body: unknown): IValidationResult;
44
+ //# sourceMappingURL=userValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userValidation.d.ts","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/validation/userValidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAsCrE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAoB9D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CA+BvE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAqCjE"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ /**
3
+ * Validation utilities for user endpoint request bodies.
4
+ *
5
+ * Requirements: 9.1, 9.2, 9.3, 9.4
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.validateRegistration = validateRegistration;
9
+ exports.validateLogin = validateLogin;
10
+ exports.validatePasswordChange = validatePasswordChange;
11
+ exports.validateRecovery = validateRecovery;
12
+ /**
13
+ * Validates a registration request body.
14
+ * - username: non-empty, alphanumeric/hyphens/underscores only
15
+ * - email: valid email format
16
+ * - password: minimum 8 characters
17
+ */
18
+ function validateRegistration(body) {
19
+ const errors = [];
20
+ const data = body;
21
+ const username = data['username'];
22
+ const email = data['email'];
23
+ const password = data['password'];
24
+ if (!username ||
25
+ typeof username !== 'string' ||
26
+ username.trim().length === 0) {
27
+ errors.push({ field: 'username', message: 'Username is required' });
28
+ }
29
+ else if (!/^[a-zA-Z0-9_-]+$/.test(username)) {
30
+ errors.push({
31
+ field: 'username',
32
+ message: 'Username must contain only alphanumeric characters, hyphens, and underscores',
33
+ });
34
+ }
35
+ if (!email || typeof email !== 'string') {
36
+ errors.push({ field: 'email', message: 'Email is required' });
37
+ }
38
+ else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
39
+ errors.push({ field: 'email', message: 'Email format is invalid' });
40
+ }
41
+ if (!password || typeof password !== 'string') {
42
+ errors.push({ field: 'password', message: 'Password is required' });
43
+ }
44
+ else if (password.length < 8) {
45
+ errors.push({
46
+ field: 'password',
47
+ message: 'Password must be at least 8 characters',
48
+ });
49
+ }
50
+ return { valid: errors.length === 0, errors };
51
+ }
52
+ /**
53
+ * Validates a login request body.
54
+ * - username: non-empty
55
+ * - password: non-empty
56
+ */
57
+ function validateLogin(body) {
58
+ const errors = [];
59
+ const data = body;
60
+ const username = data['username'];
61
+ const password = data['password'];
62
+ if (!username ||
63
+ typeof username !== 'string' ||
64
+ username.trim().length === 0) {
65
+ errors.push({ field: 'username', message: 'Username is required' });
66
+ }
67
+ if (!password || typeof password !== 'string') {
68
+ errors.push({ field: 'password', message: 'Password is required' });
69
+ }
70
+ return { valid: errors.length === 0, errors };
71
+ }
72
+ /**
73
+ * Validates a password change request body.
74
+ * - currentPassword: non-empty string
75
+ * - newPassword: minimum 8 characters
76
+ *
77
+ * Requirements: 1.3, 5.7
78
+ */
79
+ function validatePasswordChange(body) {
80
+ const errors = [];
81
+ const data = body;
82
+ const currentPassword = data['currentPassword'];
83
+ const newPassword = data['newPassword'];
84
+ if (!currentPassword ||
85
+ typeof currentPassword !== 'string' ||
86
+ currentPassword.trim().length === 0) {
87
+ errors.push({
88
+ field: 'currentPassword',
89
+ message: 'Current password is required',
90
+ });
91
+ }
92
+ if (!newPassword || typeof newPassword !== 'string') {
93
+ errors.push({
94
+ field: 'newPassword',
95
+ message: 'New password is required',
96
+ });
97
+ }
98
+ else if (newPassword.length < 8) {
99
+ errors.push({
100
+ field: 'newPassword',
101
+ message: 'New password must be at least 8 characters',
102
+ });
103
+ }
104
+ return { valid: errors.length === 0, errors };
105
+ }
106
+ /**
107
+ * Validates a mnemonic recovery request body.
108
+ * - email: valid email format
109
+ * - mnemonic: non-empty string
110
+ * - newPassword (optional): if present, minimum 8 characters
111
+ *
112
+ * Requirements: 5.7
113
+ */
114
+ function validateRecovery(body) {
115
+ const errors = [];
116
+ const data = body;
117
+ const email = data['email'];
118
+ const mnemonic = data['mnemonic'];
119
+ const newPassword = data['newPassword'];
120
+ if (!email || typeof email !== 'string') {
121
+ errors.push({ field: 'email', message: 'Email is required' });
122
+ }
123
+ else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
124
+ errors.push({ field: 'email', message: 'Email format is invalid' });
125
+ }
126
+ if (!mnemonic ||
127
+ typeof mnemonic !== 'string' ||
128
+ mnemonic.trim().length === 0) {
129
+ errors.push({ field: 'mnemonic', message: 'Mnemonic is required' });
130
+ }
131
+ if (newPassword !== undefined && newPassword !== null) {
132
+ if (typeof newPassword !== 'string') {
133
+ errors.push({
134
+ field: 'newPassword',
135
+ message: 'New password must be a string',
136
+ });
137
+ }
138
+ else if (newPassword.length < 8) {
139
+ errors.push({
140
+ field: 'newPassword',
141
+ message: 'New password must be at least 8 characters',
142
+ });
143
+ }
144
+ }
145
+ return { valid: errors.length === 0, errors };
146
+ }
147
+ //# sourceMappingURL=userValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userValidation.js","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/validation/userValidation.ts"],"names":[],"mappings":"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"}