@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.
- package/MIGRATION.md +131 -0
- package/README.md +11 -0
- package/package.json +18 -0
- package/src/index.d.ts +46 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +73 -0
- package/src/index.js.map +1 -0
- package/src/lib/application.d.ts +35 -0
- package/src/lib/application.d.ts.map +1 -0
- package/src/lib/application.js +38 -0
- package/src/lib/application.js.map +1 -0
- package/src/lib/bright-db-model-registry.d.ts +56 -0
- package/src/lib/bright-db-model-registry.d.ts.map +1 -0
- package/src/lib/bright-db-model-registry.js +71 -0
- package/src/lib/bright-db-model-registry.js.map +1 -0
- package/src/lib/brightchain-lib.d.ts +7 -0
- package/src/lib/brightchain-lib.d.ts.map +1 -0
- package/src/lib/brightchain-lib.js +12 -0
- package/src/lib/brightchain-lib.js.map +1 -0
- package/src/lib/brightdb.d.ts +7 -0
- package/src/lib/brightdb.d.ts.map +1 -0
- package/src/lib/brightdb.js +11 -0
- package/src/lib/brightdb.js.map +1 -0
- package/src/lib/constants.d.ts +6 -0
- package/src/lib/constants.d.ts.map +1 -0
- package/src/lib/constants.js +12 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/create-test-app.d.ts +22 -0
- package/src/lib/create-test-app.d.ts.map +1 -0
- package/src/lib/create-test-app.js +49 -0
- package/src/lib/create-test-app.js.map +1 -0
- package/src/lib/databaseInit.d.ts +53 -0
- package/src/lib/databaseInit.d.ts.map +1 -0
- package/src/lib/databaseInit.js +114 -0
- package/src/lib/databaseInit.js.map +1 -0
- package/src/lib/datastore/block-document-store-factory.d.ts +31 -0
- package/src/lib/datastore/block-document-store-factory.d.ts.map +1 -0
- package/src/lib/datastore/block-document-store-factory.js +35 -0
- package/src/lib/datastore/block-document-store-factory.js.map +1 -0
- package/src/lib/datastore/block-document-store.d.ts +201 -0
- package/src/lib/datastore/block-document-store.d.ts.map +1 -0
- package/src/lib/datastore/block-document-store.js +649 -0
- package/src/lib/datastore/block-document-store.js.map +1 -0
- package/src/lib/datastore/document-store.d.ts +83 -0
- package/src/lib/datastore/document-store.d.ts.map +1 -0
- package/src/lib/datastore/document-store.js +3 -0
- package/src/lib/datastore/document-store.js.map +1 -0
- package/src/lib/datastore/index.d.ts +6 -0
- package/src/lib/datastore/index.d.ts.map +1 -0
- package/src/lib/datastore/index.js +11 -0
- package/src/lib/datastore/index.js.map +1 -0
- package/src/lib/datastore/memory-document-store.d.ts +9 -0
- package/src/lib/datastore/memory-document-store.d.ts.map +1 -0
- package/src/lib/datastore/memory-document-store.js +218 -0
- package/src/lib/datastore/memory-document-store.js.map +1 -0
- package/src/lib/environment.d.ts +64 -0
- package/src/lib/environment.d.ts.map +1 -0
- package/src/lib/environment.js +165 -0
- package/src/lib/environment.js.map +1 -0
- package/src/lib/factories/blockStoreFactory.d.ts +10 -0
- package/src/lib/factories/blockStoreFactory.d.ts.map +1 -0
- package/src/lib/factories/blockStoreFactory.js +14 -0
- package/src/lib/factories/blockStoreFactory.js.map +1 -0
- package/src/lib/interfaces/bright-db-application.d.ts +34 -0
- package/src/lib/interfaces/bright-db-application.d.ts.map +1 -0
- package/src/lib/interfaces/bright-db-application.js +13 -0
- package/src/lib/interfaces/bright-db-application.js.map +1 -0
- package/src/lib/interfaces/environment.d.ts +34 -0
- package/src/lib/interfaces/environment.d.ts.map +1 -0
- package/src/lib/interfaces/environment.js +11 -0
- package/src/lib/interfaces/environment.js.map +1 -0
- package/src/lib/middleware/index.d.ts +2 -0
- package/src/lib/middleware/index.d.ts.map +1 -0
- package/src/lib/middleware/index.js +6 -0
- package/src/lib/middleware/index.js.map +1 -0
- package/src/lib/middleware/validateBody.d.ts +13 -0
- package/src/lib/middleware/validateBody.d.ts.map +1 -0
- package/src/lib/middleware/validateBody.js +35 -0
- package/src/lib/middleware/validateBody.js.map +1 -0
- package/src/lib/middlewares.d.ts +9 -0
- package/src/lib/middlewares.d.ts.map +1 -0
- package/src/lib/middlewares.js +21 -0
- package/src/lib/middlewares.js.map +1 -0
- package/src/lib/plugins/bright-db-database-plugin.d.ts +95 -0
- package/src/lib/plugins/bright-db-database-plugin.d.ts.map +1 -0
- package/src/lib/plugins/bright-db-database-plugin.js +143 -0
- package/src/lib/plugins/bright-db-database-plugin.js.map +1 -0
- package/src/lib/plugins/configure-bright-db-app.d.ts +25 -0
- package/src/lib/plugins/configure-bright-db-app.d.ts.map +1 -0
- package/src/lib/plugins/configure-bright-db-app.js +31 -0
- package/src/lib/plugins/configure-bright-db-app.js.map +1 -0
- package/src/lib/services/bright-db-authentication-provider.d.ts +31 -0
- package/src/lib/services/bright-db-authentication-provider.d.ts.map +1 -0
- package/src/lib/services/bright-db-authentication-provider.js +91 -0
- package/src/lib/services/bright-db-authentication-provider.js.map +1 -0
- package/src/lib/services/bright-db-base-service.d.ts +26 -0
- package/src/lib/services/bright-db-base-service.d.ts.map +1 -0
- package/src/lib/services/bright-db-base-service.js +30 -0
- package/src/lib/services/bright-db-base-service.js.map +1 -0
- package/src/lib/services/bright-db-collection.d.ts +50 -0
- package/src/lib/services/bright-db-collection.d.ts.map +1 -0
- package/src/lib/services/bright-db-collection.js +116 -0
- package/src/lib/services/bright-db-collection.js.map +1 -0
- package/src/lib/services/sessionAdapter.d.ts +62 -0
- package/src/lib/services/sessionAdapter.d.ts.map +1 -0
- package/src/lib/services/sessionAdapter.js +106 -0
- package/src/lib/services/sessionAdapter.js.map +1 -0
- package/src/lib/shared-types.d.ts +41 -0
- package/src/lib/shared-types.d.ts.map +1 -0
- package/src/lib/shared-types.js +3 -0
- package/src/lib/shared-types.js.map +1 -0
- package/src/lib/transactions/bright-db-transaction-manager.d.ts +46 -0
- package/src/lib/transactions/bright-db-transaction-manager.d.ts.map +1 -0
- package/src/lib/transactions/bright-db-transaction-manager.js +81 -0
- package/src/lib/transactions/bright-db-transaction-manager.js.map +1 -0
- package/src/lib/types/backend-id.d.ts +3 -0
- package/src/lib/types/backend-id.d.ts.map +1 -0
- package/src/lib/types/backend-id.js +3 -0
- package/src/lib/types/backend-id.js.map +1 -0
- package/src/lib/upstream.d.ts +8 -0
- package/src/lib/upstream.d.ts.map +1 -0
- package/src/lib/upstream.js +13 -0
- package/src/lib/upstream.js.map +1 -0
- package/src/lib/validation/userValidation.d.ts +44 -0
- package/src/lib/validation/userValidation.d.ts.map +1 -0
- package/src/lib/validation/userValidation.js +147 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":";AAAA;;;;GAIG;;AAkBH,oDAsCC;AAOD,sCAoBC;AASD,wDA+BC;AAUD,4CAqCC;AA9JD;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,IAAa;IAChD,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAA+B,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAElC,IACE,CAAC,QAAQ;QACT,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,UAAU;YACjB,OAAO,EACL,8EAA8E;SACjF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,wCAAwC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,IAAa;IACzC,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAA+B,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAElC,IACE,CAAC,QAAQ;QACT,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,IAAa;IAClD,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAA+B,CAAC;IAE7C,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IAExC,IACE,CAAC,eAAe;QAChB,OAAO,eAAe,KAAK,QAAQ;QACnC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EACnC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,8BAA8B;SACxC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,0BAA0B;SACpC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,4CAA4C;SACtD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,IAAa;IAC5C,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAA+B,CAAC;IAE7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IAExC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IACE,CAAC,QAAQ;QACT,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,+BAA+B;aACzC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,4CAA4C;aACtD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
|