@brightchain/brightchain-api-lib 0.12.0 → 0.13.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/package.json +4 -4
- package/src/lib/application-base.d.ts +1 -1
- package/src/lib/application-base.d.ts.map +1 -1
- package/src/lib/application.d.ts +52 -0
- package/src/lib/application.d.ts.map +1 -1
- package/src/lib/application.js +104 -0
- package/src/lib/application.js.map +1 -1
- package/src/lib/controllers/api/blocks.d.ts.map +1 -1
- package/src/lib/controllers/api/blocks.js +62 -0
- package/src/lib/controllers/api/blocks.js.map +1 -1
- package/src/lib/controllers/api/docs.d.ts +67 -0
- package/src/lib/controllers/api/docs.d.ts.map +1 -0
- package/src/lib/controllers/api/docs.js +86 -0
- package/src/lib/controllers/api/docs.js.map +1 -0
- package/src/lib/controllers/api/energy.d.ts.map +1 -1
- package/src/lib/controllers/api/energy.js +35 -7
- package/src/lib/controllers/api/energy.js.map +1 -1
- package/src/lib/controllers/api/health.d.ts +95 -0
- package/src/lib/controllers/api/health.d.ts.map +1 -0
- package/src/lib/controllers/api/health.js +319 -0
- package/src/lib/controllers/api/health.js.map +1 -0
- package/src/lib/controllers/api/index.d.ts +6 -0
- package/src/lib/controllers/api/index.d.ts.map +1 -1
- package/src/lib/controllers/api/index.js +6 -0
- package/src/lib/controllers/api/index.js.map +1 -1
- package/src/lib/controllers/api/messages.d.ts +119 -0
- package/src/lib/controllers/api/messages.d.ts.map +1 -0
- package/src/lib/controllers/api/messages.js +269 -0
- package/src/lib/controllers/api/messages.js.map +1 -0
- package/src/lib/controllers/api/nodes.d.ts +152 -0
- package/src/lib/controllers/api/nodes.d.ts.map +1 -0
- package/src/lib/controllers/api/nodes.js +378 -0
- package/src/lib/controllers/api/nodes.js.map +1 -0
- package/src/lib/controllers/api/quorum.d.ts +12 -8
- package/src/lib/controllers/api/quorum.d.ts.map +1 -1
- package/src/lib/controllers/api/quorum.js +83 -17
- package/src/lib/controllers/api/quorum.js.map +1 -1
- package/src/lib/controllers/api/scbl.d.ts +80 -0
- package/src/lib/controllers/api/scbl.d.ts.map +1 -0
- package/src/lib/controllers/api/scbl.js +325 -0
- package/src/lib/controllers/api/scbl.js.map +1 -0
- package/src/lib/controllers/api/sync.d.ts +140 -0
- package/src/lib/controllers/api/sync.d.ts.map +1 -0
- package/src/lib/controllers/api/sync.js +352 -0
- package/src/lib/controllers/api/sync.js.map +1 -0
- package/src/lib/controllers/api/user.d.ts +2 -0
- package/src/lib/controllers/api/user.d.ts.map +1 -1
- package/src/lib/controllers/api/user.js +122 -7
- package/src/lib/controllers/api/user.js.map +1 -1
- package/src/lib/enumerations/brightChainApiStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightChainApiStrings.js.map +1 -1
- package/src/lib/errors/symmetric.d.ts +2 -2
- package/src/lib/errors/symmetric.d.ts.map +1 -1
- package/src/lib/errors/symmetric.js.map +1 -1
- package/src/lib/errors/typed-error-local.d.ts +3 -3
- package/src/lib/errors/typed-error-local.d.ts.map +1 -1
- package/src/lib/errors/typed-error-local.js.map +1 -1
- package/src/lib/interfaces/application.d.ts +2 -1
- package/src/lib/interfaces/application.d.ts.map +1 -1
- package/src/lib/interfaces/backend-objects/index.d.ts +4 -4
- package/src/lib/interfaces/backend-objects/index.d.ts.map +1 -1
- package/src/lib/interfaces/backend-objects/index.js +0 -5
- package/src/lib/interfaces/backend-objects/index.js.map +1 -1
- package/src/lib/interfaces/bases/index.d.ts +4 -4
- package/src/lib/interfaces/bases/index.d.ts.map +1 -1
- package/src/lib/interfaces/bases/index.js +0 -5
- package/src/lib/interfaces/bases/index.js.map +1 -1
- package/src/lib/interfaces/index.d.ts +32 -32
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/index.js +0 -33
- package/src/lib/interfaces/index.js.map +1 -1
- package/src/lib/interfaces/member/index.d.ts +3 -3
- package/src/lib/interfaces/member/index.d.ts.map +1 -1
- package/src/lib/interfaces/member/index.js +0 -4
- package/src/lib/interfaces/member/index.js.map +1 -1
- package/src/lib/interfaces/requests/deleteMessagesRequest.d.ts +12 -0
- package/src/lib/interfaces/requests/deleteMessagesRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/deleteMessagesRequest.js +3 -0
- package/src/lib/interfaces/requests/deleteMessagesRequest.js.map +1 -0
- package/src/lib/interfaces/requests/discoverBlockRequest.d.ts +10 -0
- package/src/lib/interfaces/requests/discoverBlockRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/discoverBlockRequest.js +3 -0
- package/src/lib/interfaces/requests/discoverBlockRequest.js.map +1 -0
- package/src/lib/interfaces/requests/getBlockLocationRequest.d.ts +9 -0
- package/src/lib/interfaces/requests/getBlockLocationRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/getBlockLocationRequest.js +3 -0
- package/src/lib/interfaces/requests/getBlockLocationRequest.js.map +1 -0
- package/src/lib/interfaces/requests/getMessageRequest.d.ts +12 -0
- package/src/lib/interfaces/requests/getMessageRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/getMessageRequest.js +3 -0
- package/src/lib/interfaces/requests/getMessageRequest.js.map +1 -0
- package/src/lib/interfaces/requests/getNodeRequest.d.ts +9 -0
- package/src/lib/interfaces/requests/getNodeRequest.d.ts.map +1 -0
- package/src/lib/interfaces/{membersResponse.js → requests/getNodeRequest.js} +1 -1
- package/src/lib/interfaces/requests/getNodeRequest.js.map +1 -0
- package/src/lib/interfaces/requests/index.d.ts +12 -0
- package/src/lib/interfaces/requests/index.d.ts.map +1 -0
- package/src/lib/interfaces/requests/index.js +3 -0
- package/src/lib/interfaces/requests/index.js.map +1 -0
- package/src/lib/interfaces/requests/messageRequest.d.ts +10 -0
- package/src/lib/interfaces/requests/messageRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/messageRequest.js +3 -0
- package/src/lib/interfaces/requests/messageRequest.js.map +1 -0
- package/src/lib/interfaces/requests/queryMessagesRequest.d.ts +16 -0
- package/src/lib/interfaces/requests/queryMessagesRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/queryMessagesRequest.js +3 -0
- package/src/lib/interfaces/requests/queryMessagesRequest.js.map +1 -0
- package/src/lib/interfaces/requests/registerNodeRequest.d.ts +11 -0
- package/src/lib/interfaces/requests/registerNodeRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/registerNodeRequest.js +3 -0
- package/src/lib/interfaces/requests/registerNodeRequest.js.map +1 -0
- package/src/lib/interfaces/requests/replicateBlockRequest.d.ts +13 -0
- package/src/lib/interfaces/requests/replicateBlockRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/replicateBlockRequest.js +3 -0
- package/src/lib/interfaces/requests/replicateBlockRequest.js.map +1 -0
- package/src/lib/interfaces/requests/sendMessageRequest.d.ts +24 -0
- package/src/lib/interfaces/requests/sendMessageRequest.d.ts.map +1 -0
- package/src/lib/interfaces/requests/sendMessageRequest.js +3 -0
- package/src/lib/interfaces/requests/sendMessageRequest.js.map +1 -0
- package/src/lib/interfaces/requests/storeSCBLRequestBody.d.ts +9 -0
- package/src/lib/interfaces/requests/storeSCBLRequestBody.d.ts.map +1 -0
- package/src/lib/interfaces/requests/storeSCBLRequestBody.js +3 -0
- package/src/lib/interfaces/requests/storeSCBLRequestBody.js.map +1 -0
- package/src/lib/interfaces/requests/syncRequestBody.d.ts +10 -0
- package/src/lib/interfaces/requests/syncRequestBody.d.ts.map +1 -0
- package/src/lib/interfaces/requests/syncRequestBody.js +3 -0
- package/src/lib/interfaces/requests/syncRequestBody.js.map +1 -0
- package/src/lib/interfaces/responses/index.d.ts +7 -7
- package/src/lib/interfaces/responses/index.d.ts.map +1 -1
- package/src/lib/interfaces/responses/index.js +0 -8
- package/src/lib/interfaces/responses/index.js.map +1 -1
- package/src/lib/middlewares/authentication.d.ts +133 -0
- package/src/lib/middlewares/authentication.d.ts.map +1 -0
- package/src/lib/middlewares/authentication.js +224 -0
- package/src/lib/middlewares/authentication.js.map +1 -0
- package/src/lib/middlewares/index.d.ts +2 -0
- package/src/lib/middlewares/index.d.ts.map +1 -1
- package/src/lib/middlewares/index.js +15 -1
- package/src/lib/middlewares/index.js.map +1 -1
- package/src/lib/middlewares/request-id.d.ts +18 -0
- package/src/lib/middlewares/request-id.d.ts.map +1 -0
- package/src/lib/middlewares/request-id.js +30 -0
- package/src/lib/middlewares/request-id.js.map +1 -0
- package/src/lib/openapi/index.d.ts +8 -0
- package/src/lib/openapi/index.d.ts.map +1 -0
- package/src/lib/openapi/index.js +21 -0
- package/src/lib/openapi/index.js.map +1 -0
- package/src/lib/openapi/schemas.d.ts +15 -0
- package/src/lib/openapi/schemas.d.ts.map +1 -0
- package/src/lib/openapi/schemas.js +610 -0
- package/src/lib/openapi/schemas.js.map +1 -0
- package/src/lib/routers/api.d.ts +62 -0
- package/src/lib/routers/api.d.ts.map +1 -1
- package/src/lib/routers/api.js +85 -0
- package/src/lib/routers/api.js.map +1 -1
- package/src/lib/services/diskQuorumService.d.ts +7 -6
- package/src/lib/services/diskQuorumService.d.ts.map +1 -1
- package/src/lib/services/diskQuorumService.js.map +1 -1
- package/src/lib/services/email.d.ts +2 -1
- package/src/lib/services/email.d.ts.map +1 -1
- package/src/lib/services/email.js.map +1 -1
- package/src/lib/services/eventNotificationSystem.d.ts +88 -6
- package/src/lib/services/eventNotificationSystem.d.ts.map +1 -1
- package/src/lib/services/eventNotificationSystem.js +132 -17
- package/src/lib/services/eventNotificationSystem.js.map +1 -1
- package/src/lib/services/fec.js +1 -1
- package/src/lib/services/fec.js.map +1 -1
- package/src/lib/types/backend-id.d.ts +2 -1
- package/src/lib/types/backend-id.d.ts.map +1 -1
- package/src/lib/utils/errorResponse.d.ts +227 -2
- package/src/lib/utils/errorResponse.d.ts.map +1 -1
- package/src/lib/utils/errorResponse.js +292 -3
- package/src/lib/utils/errorResponse.js.map +1 -1
- package/src/lib/i18n/index.d.ts +0 -7
- package/src/lib/i18n/index.d.ts.map +0 -1
- package/src/lib/i18n/index.js +0 -29
- package/src/lib/i18n/index.js.map +0 -1
- package/src/lib/i18n/strings/index.d.ts +0 -6
- package/src/lib/i18n/strings/index.d.ts.map +0 -1
- package/src/lib/i18n/strings/index.js +0 -17
- package/src/lib/i18n/strings/index.js.map +0 -1
- package/src/lib/interfaces/membersResponse.d.ts +0 -12
- package/src/lib/interfaces/membersResponse.d.ts.map +0 -1
- package/src/lib/interfaces/membersResponse.js.map +0 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessagesController = void 0;
|
|
4
|
+
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
5
|
+
const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
|
|
6
|
+
const errorResponse_1 = require("../../utils/errorResponse");
|
|
7
|
+
const base_1 = require("../base");
|
|
8
|
+
/**
|
|
9
|
+
* Controller for message passing operations.
|
|
10
|
+
*
|
|
11
|
+
* Provides REST API endpoints for sending, retrieving, querying, and deleting
|
|
12
|
+
* messages in the BrightChain distributed messaging system.
|
|
13
|
+
*
|
|
14
|
+
* ## Endpoints
|
|
15
|
+
*
|
|
16
|
+
* ### POST /api/messages
|
|
17
|
+
* Send a new message with optional recipients.
|
|
18
|
+
*
|
|
19
|
+
* **Request Body:**
|
|
20
|
+
* - `content` (string, required): Base64-encoded message content
|
|
21
|
+
* - `senderId` (string, required): Sender member ID
|
|
22
|
+
* - `recipients` (string[], optional): Recipient IDs (broadcast if empty)
|
|
23
|
+
* - `messageType` (string, required): Message type identifier
|
|
24
|
+
* - `priority` (number, optional): Message priority level
|
|
25
|
+
* - `encryptionScheme` (number, optional): Encryption scheme identifier
|
|
26
|
+
*
|
|
27
|
+
* **Response:** Message ID and magnet URL
|
|
28
|
+
*
|
|
29
|
+
* ### GET /api/messages/:id
|
|
30
|
+
* Retrieve a message by its ID.
|
|
31
|
+
*
|
|
32
|
+
* **Parameters:**
|
|
33
|
+
* - `id` (string, required): Message ID
|
|
34
|
+
*
|
|
35
|
+
* **Response:** Base64-encoded message content
|
|
36
|
+
*
|
|
37
|
+
* ### GET /api/messages
|
|
38
|
+
* Query messages with optional filters.
|
|
39
|
+
*
|
|
40
|
+
* **Query Parameters:**
|
|
41
|
+
* - `recipientId` (string, optional): Filter by recipient ID
|
|
42
|
+
* - `senderId` (string, optional): Filter by sender ID
|
|
43
|
+
* - `messageType` (string, optional): Filter by message type
|
|
44
|
+
* - `page` (number, optional): Page number (default: 1)
|
|
45
|
+
* - `pageSize` (number, optional): Page size (default: 50)
|
|
46
|
+
*
|
|
47
|
+
* **Response:** Array of message metadata
|
|
48
|
+
*
|
|
49
|
+
* ### DELETE /api/messages/:id
|
|
50
|
+
* Delete a message by its ID.
|
|
51
|
+
*
|
|
52
|
+
* **Parameters:**
|
|
53
|
+
* - `id` (string, required): Message ID
|
|
54
|
+
*
|
|
55
|
+
* **Response:** 204 No Content on success
|
|
56
|
+
*
|
|
57
|
+
* @requirements 1.1, 1.2, 1.3, 1.4, 1.5, 1.6
|
|
58
|
+
*/
|
|
59
|
+
class MessagesController extends base_1.BaseController {
|
|
60
|
+
constructor(application) {
|
|
61
|
+
super(application);
|
|
62
|
+
this.messageService = null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Set the MessagePassingService instance.
|
|
66
|
+
* This allows for dependency injection and testing.
|
|
67
|
+
*/
|
|
68
|
+
setMessageService(service) {
|
|
69
|
+
this.messageService = service;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the MessagePassingService instance.
|
|
73
|
+
* Throws if the service has not been set.
|
|
74
|
+
*/
|
|
75
|
+
getMessageService() {
|
|
76
|
+
if (!this.messageService) {
|
|
77
|
+
throw new Error('MessagePassingService not initialized');
|
|
78
|
+
}
|
|
79
|
+
return this.messageService;
|
|
80
|
+
}
|
|
81
|
+
initRouteDefinitions() {
|
|
82
|
+
this.routeDefinitions = [
|
|
83
|
+
(0, node_express_suite_1.routeConfig)('post', '/', {
|
|
84
|
+
useAuthentication: false,
|
|
85
|
+
useCryptoAuthentication: false,
|
|
86
|
+
handlerKey: 'sendMessage',
|
|
87
|
+
}),
|
|
88
|
+
(0, node_express_suite_1.routeConfig)('get', '/:id', {
|
|
89
|
+
handlerKey: 'getMessage',
|
|
90
|
+
useAuthentication: false,
|
|
91
|
+
useCryptoAuthentication: false,
|
|
92
|
+
}),
|
|
93
|
+
(0, node_express_suite_1.routeConfig)('get', '/', {
|
|
94
|
+
handlerKey: 'queryMessages',
|
|
95
|
+
useAuthentication: false,
|
|
96
|
+
useCryptoAuthentication: false,
|
|
97
|
+
}),
|
|
98
|
+
(0, node_express_suite_1.routeConfig)('delete', '/:id', {
|
|
99
|
+
handlerKey: 'deleteMessage',
|
|
100
|
+
useAuthentication: false,
|
|
101
|
+
useCryptoAuthentication: false,
|
|
102
|
+
}),
|
|
103
|
+
];
|
|
104
|
+
this.handlers = {
|
|
105
|
+
sendMessage: this.handleSendMessage.bind(this),
|
|
106
|
+
getMessage: this.handleGetMessage.bind(this),
|
|
107
|
+
queryMessages: this.handleQueryMessages.bind(this),
|
|
108
|
+
deleteMessage: this.handleDeleteMessage.bind(this),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* POST /api/messages
|
|
113
|
+
* Send a new message.
|
|
114
|
+
*
|
|
115
|
+
* @param req - Request containing message content and metadata
|
|
116
|
+
* @returns Message ID and magnet URL on success, or error response
|
|
117
|
+
* @requirements 1.1
|
|
118
|
+
*/
|
|
119
|
+
async handleSendMessage(req) {
|
|
120
|
+
try {
|
|
121
|
+
const { content, senderId, recipients, messageType, priority, encryptionScheme, } = req.body;
|
|
122
|
+
// Validate required fields
|
|
123
|
+
if (!content) {
|
|
124
|
+
return (0, errorResponse_1.validationError)('Missing required field: content');
|
|
125
|
+
}
|
|
126
|
+
if (!senderId) {
|
|
127
|
+
return (0, errorResponse_1.validationError)('Missing required field: senderId');
|
|
128
|
+
}
|
|
129
|
+
if (!messageType) {
|
|
130
|
+
return (0, errorResponse_1.validationError)('Missing required field: messageType');
|
|
131
|
+
}
|
|
132
|
+
// Validate field types
|
|
133
|
+
if (typeof content !== 'string') {
|
|
134
|
+
return (0, errorResponse_1.validationError)('Invalid field type: content must be a string');
|
|
135
|
+
}
|
|
136
|
+
if (typeof senderId !== 'string') {
|
|
137
|
+
return (0, errorResponse_1.validationError)('Invalid field type: senderId must be a string');
|
|
138
|
+
}
|
|
139
|
+
if (typeof messageType !== 'string') {
|
|
140
|
+
return (0, errorResponse_1.validationError)('Invalid field type: messageType must be a string');
|
|
141
|
+
}
|
|
142
|
+
const contentBuffer = Buffer.from(content, 'base64');
|
|
143
|
+
const service = this.getMessageService();
|
|
144
|
+
// Map numeric encryption scheme to enum value
|
|
145
|
+
const encryptionSchemeValue = encryptionScheme === 1
|
|
146
|
+
? brightchain_lib_1.MessageEncryptionScheme.SHARED_KEY
|
|
147
|
+
: encryptionScheme === 2
|
|
148
|
+
? brightchain_lib_1.MessageEncryptionScheme.RECIPIENT_KEYS
|
|
149
|
+
: brightchain_lib_1.MessageEncryptionScheme.NONE;
|
|
150
|
+
const result = await service.sendMessage(contentBuffer, senderId, {
|
|
151
|
+
recipients: recipients || [],
|
|
152
|
+
messageType,
|
|
153
|
+
priority: priority ?? brightchain_lib_1.MessagePriority.NORMAL,
|
|
154
|
+
senderId,
|
|
155
|
+
encryptionScheme: encryptionSchemeValue,
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
statusCode: 201,
|
|
159
|
+
response: {
|
|
160
|
+
messageId: result.messageId,
|
|
161
|
+
magnetUrl: result.magnetUrl,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (_error) {
|
|
166
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* GET /api/messages/:id
|
|
171
|
+
* Retrieve a message by its ID.
|
|
172
|
+
*
|
|
173
|
+
* @param req - Request containing the message ID parameter
|
|
174
|
+
* @returns Base64-encoded message content on success, or 404 if not found
|
|
175
|
+
* @requirements 1.2, 1.5
|
|
176
|
+
*/
|
|
177
|
+
async handleGetMessage(req) {
|
|
178
|
+
try {
|
|
179
|
+
const { id } = req.params;
|
|
180
|
+
if (!id) {
|
|
181
|
+
return (0, errorResponse_1.validationError)('Missing required parameter: id');
|
|
182
|
+
}
|
|
183
|
+
const service = this.getMessageService();
|
|
184
|
+
const content = await service.getMessage(id);
|
|
185
|
+
if (!content) {
|
|
186
|
+
return (0, errorResponse_1.notFoundError)('Message', id);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
statusCode: 200,
|
|
190
|
+
response: {
|
|
191
|
+
content: content.toString('base64'),
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (_error) {
|
|
196
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* GET /api/messages
|
|
201
|
+
* Query messages with optional filters.
|
|
202
|
+
*
|
|
203
|
+
* @param req - Request containing query parameters
|
|
204
|
+
* @returns Array of message metadata matching the query
|
|
205
|
+
* @requirements 1.3
|
|
206
|
+
*/
|
|
207
|
+
async handleQueryMessages(req) {
|
|
208
|
+
try {
|
|
209
|
+
const { recipientId, senderId, messageType, page, pageSize } = req.query;
|
|
210
|
+
const query = {};
|
|
211
|
+
if (recipientId) {
|
|
212
|
+
query['recipientId'] = recipientId;
|
|
213
|
+
}
|
|
214
|
+
if (senderId) {
|
|
215
|
+
query['senderId'] = senderId;
|
|
216
|
+
}
|
|
217
|
+
if (messageType) {
|
|
218
|
+
query['messageType'] = messageType;
|
|
219
|
+
}
|
|
220
|
+
const pageNum = parseInt(page || '1', 10);
|
|
221
|
+
const pageSizeNum = parseInt(pageSize || '50', 10);
|
|
222
|
+
query['page'] = pageNum;
|
|
223
|
+
query['pageSize'] = pageSizeNum;
|
|
224
|
+
const service = this.getMessageService();
|
|
225
|
+
const results = await service.queryMessages(query);
|
|
226
|
+
return {
|
|
227
|
+
statusCode: 200,
|
|
228
|
+
response: {
|
|
229
|
+
messages: results,
|
|
230
|
+
total: results.length,
|
|
231
|
+
page: pageNum,
|
|
232
|
+
pageSize: pageSizeNum,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
catch (_error) {
|
|
237
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* DELETE /api/messages/:id
|
|
242
|
+
* Delete a message by its ID.
|
|
243
|
+
*
|
|
244
|
+
* @param req - Request containing the message ID parameter
|
|
245
|
+
* @returns 204 No Content on success, or 404 if not found
|
|
246
|
+
* @requirements 1.4
|
|
247
|
+
*/
|
|
248
|
+
async handleDeleteMessage(req) {
|
|
249
|
+
try {
|
|
250
|
+
const { id } = req.params;
|
|
251
|
+
if (!id) {
|
|
252
|
+
return (0, errorResponse_1.validationError)('Missing required parameter: id');
|
|
253
|
+
}
|
|
254
|
+
const service = this.getMessageService();
|
|
255
|
+
await service.deleteMessage(id);
|
|
256
|
+
return {
|
|
257
|
+
statusCode: 204,
|
|
258
|
+
response: {
|
|
259
|
+
success: true,
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
catch (_error) {
|
|
264
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
exports.MessagesController = MessagesController;
|
|
269
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/controllers/api/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { IAvailabilityService, IDiscoverBlockResponse, IDiscoveryProtocol, IGetNodeResponse, IListNodesResponse, IRegisterNodeResponse } from '@brightchain/brightchain-lib';
|
|
2
|
+
import { CoreLanguageCode } from '@digitaldefiance/i18n-lib';
|
|
3
|
+
import { PlatformID } from '@digitaldefiance/node-ecies-lib';
|
|
4
|
+
import { ApiErrorResponse, ApiRequestHandler, TypedHandlers } from '@digitaldefiance/node-express-suite';
|
|
5
|
+
import { IBrightChainApplication } from '../../interfaces/application';
|
|
6
|
+
import { DefaultBackendIdType } from '../../shared-types';
|
|
7
|
+
import { BaseController } from '../base';
|
|
8
|
+
type NodesApiResponse = IListNodesResponse | IGetNodeResponse | IDiscoverBlockResponse | IRegisterNodeResponse | ApiErrorResponse;
|
|
9
|
+
interface NodesHandlers extends TypedHandlers {
|
|
10
|
+
listNodes: ApiRequestHandler<IListNodesResponse | ApiErrorResponse>;
|
|
11
|
+
getNode: ApiRequestHandler<IGetNodeResponse | ApiErrorResponse>;
|
|
12
|
+
discoverBlock: ApiRequestHandler<IDiscoverBlockResponse | ApiErrorResponse>;
|
|
13
|
+
registerNode: ApiRequestHandler<IRegisterNodeResponse | ApiErrorResponse>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Controller for node discovery and network management operations.
|
|
17
|
+
*
|
|
18
|
+
* Provides REST API endpoints for listing connected nodes, getting node details,
|
|
19
|
+
* discovering blocks across the network, and registering nodes for WebSocket authentication.
|
|
20
|
+
*
|
|
21
|
+
* ## Endpoints
|
|
22
|
+
*
|
|
23
|
+
* ### GET /api/nodes
|
|
24
|
+
* List all connected peer nodes with their status and capabilities.
|
|
25
|
+
*
|
|
26
|
+
* **Response:**
|
|
27
|
+
* - `nodes` (array): Array of node information objects
|
|
28
|
+
* - `total` (number): Total number of connected nodes
|
|
29
|
+
*
|
|
30
|
+
* ### GET /api/nodes/:nodeId
|
|
31
|
+
* Get detailed information about a specific node.
|
|
32
|
+
*
|
|
33
|
+
* **Parameters:**
|
|
34
|
+
* - `nodeId` (string, required): Node ID to retrieve
|
|
35
|
+
*
|
|
36
|
+
* **Response:**
|
|
37
|
+
* - `node` (object): Node information including latency and last seen timestamp
|
|
38
|
+
*
|
|
39
|
+
* ### POST /api/nodes/discover
|
|
40
|
+
* Discover nodes that have a specific block.
|
|
41
|
+
*
|
|
42
|
+
* **Request Body:**
|
|
43
|
+
* - `blockId` (string, required): Block ID to discover
|
|
44
|
+
*
|
|
45
|
+
* **Response:**
|
|
46
|
+
* - `blockId` (string): The block ID that was searched for
|
|
47
|
+
* - `found` (boolean): Whether the block was found
|
|
48
|
+
* - `locations` (array): Nodes where the block was found
|
|
49
|
+
* - `queriedPeers` (number): Number of peers queried
|
|
50
|
+
* - `duration` (number): Discovery duration in milliseconds
|
|
51
|
+
*
|
|
52
|
+
* ### POST /api/nodes/register
|
|
53
|
+
* Register a node's public key for WebSocket authentication.
|
|
54
|
+
*
|
|
55
|
+
* **Request Body:**
|
|
56
|
+
* - `nodeId` (string, required): Node ID to register
|
|
57
|
+
* - `publicKey` (string, required): Public key for authentication
|
|
58
|
+
*
|
|
59
|
+
* **Response:**
|
|
60
|
+
* - `success` (boolean): Whether registration succeeded
|
|
61
|
+
* - `nodeId` (string): The registered node ID
|
|
62
|
+
* - `message` (string): Status message
|
|
63
|
+
*
|
|
64
|
+
* @requirements 3.1, 3.2, 3.3, 3.4, 3.5
|
|
65
|
+
*/
|
|
66
|
+
export declare class NodesController<TID extends PlatformID = DefaultBackendIdType> extends BaseController<TID, NodesApiResponse, NodesHandlers, CoreLanguageCode> {
|
|
67
|
+
private discoveryProtocol;
|
|
68
|
+
private availabilityService;
|
|
69
|
+
/**
|
|
70
|
+
* Store for registered node public keys (nodeId -> publicKey)
|
|
71
|
+
*/
|
|
72
|
+
private registeredNodes;
|
|
73
|
+
constructor(application: IBrightChainApplication<TID>);
|
|
74
|
+
/**
|
|
75
|
+
* Set the DiscoveryProtocol instance.
|
|
76
|
+
* This allows for dependency injection and testing.
|
|
77
|
+
*/
|
|
78
|
+
setDiscoveryProtocol(protocol: IDiscoveryProtocol): void;
|
|
79
|
+
/**
|
|
80
|
+
* Set the AvailabilityService instance.
|
|
81
|
+
* This allows for dependency injection and testing.
|
|
82
|
+
*/
|
|
83
|
+
setAvailabilityService(service: IAvailabilityService): void;
|
|
84
|
+
/**
|
|
85
|
+
* Get the DiscoveryProtocol instance.
|
|
86
|
+
* Throws if the protocol has not been set.
|
|
87
|
+
*/
|
|
88
|
+
private getDiscoveryProtocol;
|
|
89
|
+
/**
|
|
90
|
+
* Get the AvailabilityService instance.
|
|
91
|
+
* Throws if the service has not been set.
|
|
92
|
+
*/
|
|
93
|
+
private getAvailabilityService;
|
|
94
|
+
/**
|
|
95
|
+
* Check if a node is registered.
|
|
96
|
+
* @param nodeId - The node ID to check
|
|
97
|
+
* @returns True if the node is registered
|
|
98
|
+
*/
|
|
99
|
+
isNodeRegistered(nodeId: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Get the public key for a registered node.
|
|
102
|
+
* @param nodeId - The node ID to get the public key for
|
|
103
|
+
* @returns The public key or undefined if not registered
|
|
104
|
+
*/
|
|
105
|
+
getNodePublicKey(nodeId: string): string | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Clear all registered nodes (for testing).
|
|
108
|
+
*/
|
|
109
|
+
clearRegisteredNodes(): void;
|
|
110
|
+
protected initRouteDefinitions(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Convert ILocationRecord to node info format
|
|
113
|
+
*/
|
|
114
|
+
private locationToNodeInfo;
|
|
115
|
+
/**
|
|
116
|
+
* GET /api/nodes
|
|
117
|
+
* List all connected peer nodes with their status and capabilities.
|
|
118
|
+
*
|
|
119
|
+
* @returns List of connected nodes
|
|
120
|
+
* @requirements 3.1
|
|
121
|
+
*/
|
|
122
|
+
private handleListNodes;
|
|
123
|
+
/**
|
|
124
|
+
* GET /api/nodes/:nodeId
|
|
125
|
+
* Get detailed information about a specific node.
|
|
126
|
+
*
|
|
127
|
+
* @param req - Request containing the node ID parameter
|
|
128
|
+
* @returns Node information on success, or 404 if not found
|
|
129
|
+
* @requirements 3.2, 3.5
|
|
130
|
+
*/
|
|
131
|
+
private handleGetNode;
|
|
132
|
+
/**
|
|
133
|
+
* POST /api/nodes/discover
|
|
134
|
+
* Discover nodes that have a specific block.
|
|
135
|
+
*
|
|
136
|
+
* @param req - Request containing the block ID to discover
|
|
137
|
+
* @returns Discovery result with locations
|
|
138
|
+
* @requirements 3.3
|
|
139
|
+
*/
|
|
140
|
+
private handleDiscoverBlock;
|
|
141
|
+
/**
|
|
142
|
+
* POST /api/nodes/register
|
|
143
|
+
* Register a node's public key for WebSocket authentication.
|
|
144
|
+
*
|
|
145
|
+
* @param req - Request containing node ID and public key
|
|
146
|
+
* @returns Registration result
|
|
147
|
+
* @requirements 3.4, 3.5
|
|
148
|
+
*/
|
|
149
|
+
private handleRegisterNode;
|
|
150
|
+
}
|
|
151
|
+
export {};
|
|
152
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/controllers/api/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAGlB,qBAAqB,EAEtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EAEd,MAAM,qCAAqC,CAAC;AAM7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM1D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,KAAK,gBAAgB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,sBAAsB,GACtB,qBAAqB,GACrB,gBAAgB,CAAC;AAErB,UAAU,aAAc,SAAQ,aAAa;IAC3C,SAAS,EAAE,iBAAiB,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;IACpE,OAAO,EAAE,iBAAiB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CAAC;IAChE,aAAa,EAAE,iBAAiB,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,CAAC;IAC5E,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,eAAe,CAC1B,GAAG,SAAS,UAAU,GAAG,oBAAoB,CAC7C,SAAQ,cAAc,CACtB,GAAG,EACH,gBAAgB,EAChB,aAAa,EACb,gBAAgB,CACjB;IACC,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,mBAAmB,CAAqC;IAEhE;;OAEG;IACH,OAAO,CAAC,eAAe,CAAkC;gBAE7C,WAAW,EAAE,uBAAuB,CAAC,GAAG,CAAC;IAIrD;;;OAGG;IACI,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI/D;;;OAGG;IACI,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAIlE;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhD;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3D;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAInC,SAAS,CAAC,oBAAoB,IAAI,IAAI;IAgCtC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;;;;OAMG;YACW,eAAe;IA+D7B;;;;;;;OAOG;YACW,aAAa;IAsE3B;;;;;;;OAOG;YACW,mBAAmB;IA0CjC;;;;;;;OAOG;YACW,kBAAkB;CAyCjC"}
|