@brightchain/brightchain-api-lib 0.2.1 → 0.5.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 +2 -2
- package/src/index.d.ts +10 -75
- package/src/index.d.ts.map +1 -1
- package/src/index.js +11 -78
- package/src/index.js.map +1 -1
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.d.ts +1 -2
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.d.ts.map +1 -1
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js +1 -1
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js.map +1 -1
- package/src/lib/application-base.d.ts +7 -6
- package/src/lib/application-base.d.ts.map +1 -1
- package/src/lib/application-base.js.map +1 -1
- package/src/lib/application.d.ts +7 -2
- package/src/lib/application.d.ts.map +1 -1
- package/src/lib/application.js +30 -0
- package/src/lib/application.js.map +1 -1
- package/src/lib/controllers/api/blocks.d.ts +246 -0
- package/src/lib/controllers/api/blocks.d.ts.map +1 -0
- package/src/lib/controllers/api/blocks.js +414 -0
- package/src/lib/controllers/api/blocks.js.map +1 -0
- package/src/lib/controllers/api/cbl.d.ts +88 -0
- package/src/lib/controllers/api/cbl.d.ts.map +1 -0
- package/src/lib/controllers/api/cbl.js +222 -0
- package/src/lib/controllers/api/cbl.js.map +1 -0
- package/src/lib/controllers/api/energy.d.ts +18 -0
- package/src/lib/controllers/api/energy.d.ts.map +1 -0
- package/src/lib/controllers/api/energy.js +96 -0
- package/src/lib/controllers/api/energy.js.map +1 -0
- package/src/lib/controllers/api/i18n.d.ts +19 -0
- package/src/lib/controllers/api/i18n.d.ts.map +1 -0
- package/src/lib/controllers/api/i18n.js +27 -0
- package/src/lib/controllers/api/i18n.js.map +1 -0
- package/src/lib/controllers/api/index.d.ts +9 -0
- package/src/lib/controllers/api/index.d.ts.map +1 -0
- package/src/lib/controllers/api/index.js +12 -0
- package/src/lib/controllers/api/index.js.map +1 -0
- package/src/lib/controllers/api/members.d.ts +19 -0
- package/src/lib/controllers/api/members.d.ts.map +1 -0
- package/src/lib/controllers/api/members.js +27 -0
- package/src/lib/controllers/api/members.js.map +1 -0
- package/src/lib/controllers/api/quorum.d.ts +369 -0
- package/src/lib/controllers/api/quorum.d.ts.map +1 -0
- package/src/lib/controllers/api/quorum.js +592 -0
- package/src/lib/controllers/api/quorum.js.map +1 -0
- package/src/lib/controllers/api/sessions.d.ts +21 -0
- package/src/lib/controllers/api/sessions.d.ts.map +1 -0
- package/src/lib/controllers/api/sessions.js +32 -0
- package/src/lib/controllers/api/sessions.js.map +1 -0
- package/src/lib/controllers/api/user.d.ts +20 -0
- package/src/lib/controllers/api/user.d.ts.map +1 -0
- package/src/lib/controllers/api/user.js +109 -0
- package/src/lib/controllers/api/user.js.map +1 -0
- package/src/lib/controllers/base.d.ts +6 -48
- package/src/lib/controllers/base.d.ts.map +1 -1
- package/src/lib/controllers/base.js +2 -225
- package/src/lib/controllers/base.js.map +1 -1
- package/src/lib/controllers/index.d.ts +3 -0
- package/src/lib/controllers/index.d.ts.map +1 -0
- package/src/lib/controllers/index.js +6 -0
- package/src/lib/controllers/index.js.map +1 -0
- package/src/lib/datastore/block-document-store.d.ts.map +1 -1
- package/src/lib/datastore/block-document-store.js +22 -18
- package/src/lib/datastore/block-document-store.js.map +1 -1
- package/src/lib/datastore/document-store.d.ts +1 -2
- package/src/lib/datastore/document-store.d.ts.map +1 -1
- 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 +8 -0
- package/src/lib/datastore/index.js.map +1 -0
- package/src/lib/datastore/memory-document-store.d.ts.map +1 -1
- package/src/lib/datastore/memory-document-store.js.map +1 -1
- package/src/lib/documents/base.d.ts +3 -2
- package/src/lib/documents/base.d.ts.map +1 -1
- package/src/lib/enumerations/index.d.ts +5 -0
- package/src/lib/enumerations/index.d.ts.map +1 -0
- package/src/lib/enumerations/index.js +8 -0
- package/src/lib/enumerations/index.js.map +1 -0
- package/src/lib/enumerations/websocketMessageType.d.ts +44 -0
- package/src/lib/enumerations/websocketMessageType.d.ts.map +1 -0
- package/src/lib/enumerations/websocketMessageType.js +47 -0
- package/src/lib/enumerations/websocketMessageType.js.map +1 -0
- package/src/lib/environment.d.ts +4 -2
- package/src/lib/environment.d.ts.map +1 -1
- package/src/lib/environment.js.map +1 -1
- package/src/lib/errors/index.d.ts +20 -0
- package/src/lib/errors/index.d.ts.map +1 -0
- package/src/lib/errors/index.js +23 -0
- package/src/lib/errors/index.js.map +1 -0
- package/src/lib/interfaces/application.d.ts +19 -7
- package/src/lib/interfaces/application.d.ts.map +1 -1
- package/src/lib/interfaces/auth-credentials.d.ts +6 -0
- package/src/lib/interfaces/auth-credentials.d.ts.map +1 -0
- package/src/lib/interfaces/{server-init-result.js → auth-credentials.js} +1 -1
- package/src/lib/interfaces/auth-credentials.js.map +1 -0
- package/src/lib/interfaces/auth-token.d.ts +6 -0
- package/src/lib/interfaces/auth-token.d.ts.map +1 -0
- package/src/lib/interfaces/{ecies-consts.js → auth-token.js} +1 -1
- package/src/lib/interfaces/auth-token.js.map +1 -0
- package/src/lib/interfaces/backend-objects/index.d.ts +5 -0
- package/src/lib/interfaces/backend-objects/index.d.ts.map +1 -0
- package/src/lib/interfaces/backend-objects/index.js +8 -0
- package/src/lib/interfaces/backend-objects/index.js.map +1 -0
- package/src/lib/interfaces/bases/index.d.ts +5 -0
- package/src/lib/interfaces/bases/index.d.ts.map +1 -0
- package/src/lib/interfaces/bases/index.js +8 -0
- package/src/lib/interfaces/bases/index.js.map +1 -0
- package/src/lib/interfaces/blockRequest.d.ts +40 -0
- package/src/lib/interfaces/blockRequest.d.ts.map +1 -0
- package/src/lib/interfaces/{mongo-errors.js → blockRequest.js} +1 -1
- package/src/lib/interfaces/blockRequest.js.map +1 -0
- package/src/lib/interfaces/blockResponses.d.ts +32 -0
- package/src/lib/interfaces/blockResponses.d.ts.map +1 -0
- package/src/lib/interfaces/blockResponses.js +3 -0
- package/src/lib/interfaces/blockResponses.js.map +1 -0
- package/src/lib/interfaces/blockService.d.ts +16 -0
- package/src/lib/interfaces/blockService.d.ts.map +1 -0
- package/src/lib/interfaces/{pbkdf2-result.js → blockService.js} +1 -1
- package/src/lib/interfaces/blockService.js.map +1 -0
- package/src/lib/interfaces/blockStore.d.ts +7 -0
- package/src/lib/interfaces/blockStore.d.ts.map +1 -0
- package/src/lib/interfaces/blockStore.js +3 -0
- package/src/lib/interfaces/blockStore.js.map +1 -0
- package/src/lib/interfaces/blocksHandlers.d.ts +7 -0
- package/src/lib/interfaces/blocksHandlers.d.ts.map +1 -0
- package/src/lib/interfaces/blocksHandlers.js +3 -0
- package/src/lib/interfaces/blocksHandlers.js.map +1 -0
- package/src/lib/interfaces/cblHandlers.d.ts +7 -0
- package/src/lib/interfaces/cblHandlers.d.ts.map +1 -0
- package/src/lib/interfaces/cblHandlers.js +3 -0
- package/src/lib/interfaces/cblHandlers.js.map +1 -0
- package/src/lib/interfaces/environment.d.ts +4 -2
- package/src/lib/interfaces/environment.d.ts.map +1 -1
- package/src/lib/interfaces/index.d.ts +33 -0
- package/src/lib/interfaces/index.d.ts.map +1 -0
- package/src/lib/interfaces/index.js +36 -0
- package/src/lib/interfaces/index.js.map +1 -0
- package/src/lib/interfaces/member/index.d.ts +3 -0
- package/src/lib/interfaces/member/index.d.ts.map +1 -0
- package/src/lib/interfaces/member/index.js +6 -0
- package/src/lib/interfaces/member/index.js.map +1 -0
- package/src/lib/interfaces/member/operational.d.ts +1 -2
- package/src/lib/interfaces/member/operational.d.ts.map +1 -1
- package/src/lib/interfaces/membersResponse.d.ts +12 -0
- package/src/lib/interfaces/membersResponse.d.ts.map +1 -0
- package/src/lib/interfaces/membersResponse.js +3 -0
- package/src/lib/interfaces/membersResponse.js.map +1 -0
- package/src/lib/interfaces/responses/index.d.ts +0 -1
- package/src/lib/interfaces/responses/index.d.ts.map +1 -1
- package/src/lib/interfaces/token-payload.d.ts +9 -0
- package/src/lib/interfaces/token-payload.d.ts.map +1 -0
- package/src/lib/interfaces/token-payload.js +3 -0
- package/src/lib/interfaces/token-payload.js.map +1 -0
- package/src/lib/interfaces/websocketMessages.d.ts +222 -0
- package/src/lib/interfaces/websocketMessages.d.ts.map +1 -0
- package/src/lib/interfaces/websocketMessages.js +6 -0
- package/src/lib/interfaces/websocketMessages.js.map +1 -0
- package/src/lib/routers/api.d.ts +9 -4
- package/src/lib/routers/api.d.ts.map +1 -1
- package/src/lib/routers/api.js +18 -6
- package/src/lib/routers/api.js.map +1 -1
- package/src/lib/routers/app.d.ts +3 -2
- package/src/lib/routers/app.d.ts.map +1 -1
- package/src/lib/routers/app.js +5 -4
- package/src/lib/routers/app.js.map +1 -1
- package/src/lib/routers/base.d.ts +6 -4
- package/src/lib/routers/base.d.ts.map +1 -1
- package/src/lib/routers/base.js.map +1 -1
- package/src/lib/routers/index.d.ts +5 -0
- package/src/lib/routers/index.d.ts.map +1 -0
- package/src/lib/routers/index.js +8 -0
- package/src/lib/routers/index.js.map +1 -0
- package/src/lib/services/auth.d.ts +23 -0
- package/src/lib/services/auth.d.ts.map +1 -0
- package/src/lib/services/auth.js +93 -0
- package/src/lib/services/auth.js.map +1 -0
- package/src/lib/services/base.d.ts +12 -0
- package/src/lib/services/base.d.ts.map +1 -0
- package/src/lib/services/base.js +15 -0
- package/src/lib/services/base.js.map +1 -0
- package/src/lib/services/blockServiceFactory.d.ts +29 -0
- package/src/lib/services/blockServiceFactory.d.ts.map +1 -0
- package/src/lib/services/blockServiceFactory.js +42 -0
- package/src/lib/services/blockServiceFactory.js.map +1 -0
- package/src/lib/services/blockStore.d.ts +52 -0
- package/src/lib/services/blockStore.d.ts.map +1 -0
- package/src/lib/services/blockStore.js +105 -0
- package/src/lib/services/blockStore.js.map +1 -0
- package/src/lib/services/blocks.d.ts +26 -0
- package/src/lib/services/blocks.d.ts.map +1 -0
- package/src/lib/services/blocks.js +35 -0
- package/src/lib/services/blocks.js.map +1 -0
- 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 +4 -3
- package/src/lib/services/email.d.ts.map +1 -1
- package/src/lib/services/email.js +4 -3
- package/src/lib/services/email.js.map +1 -1
- package/src/lib/services/index.d.ts +21 -0
- package/src/lib/services/index.d.ts.map +1 -0
- package/src/lib/services/index.js +26 -0
- package/src/lib/services/index.js.map +1 -0
- package/src/lib/services/messagePassingService.d.ts.map +1 -1
- package/src/lib/services/messagePassingService.js +1 -1
- package/src/lib/services/messagePassingService.js.map +1 -1
- package/src/lib/services/quorum.d.ts +44 -0
- package/src/lib/services/quorum.d.ts.map +1 -0
- package/src/lib/services/quorum.js +83 -0
- package/src/lib/services/quorum.js.map +1 -0
- package/src/lib/services/requestUser.d.ts +18 -0
- package/src/lib/services/requestUser.d.ts.map +1 -0
- package/src/lib/services/requestUser.js +22 -0
- package/src/lib/services/requestUser.js.map +1 -0
- package/src/lib/services/role.d.ts +19 -0
- package/src/lib/services/role.d.ts.map +1 -0
- package/src/lib/services/role.js +18 -0
- package/src/lib/services/role.js.map +1 -0
- package/src/lib/services/websocketHandler.d.ts +95 -0
- package/src/lib/services/websocketHandler.d.ts.map +1 -0
- package/src/lib/services/websocketHandler.js +269 -0
- package/src/lib/services/websocketHandler.js.map +1 -0
- package/src/lib/shared-types.d.ts +2 -1
- package/src/lib/shared-types.d.ts.map +1 -1
- package/src/lib/stores/availabilityAwareBlockStore.d.ts +45 -1
- package/src/lib/stores/availabilityAwareBlockStore.d.ts.map +1 -1
- package/src/lib/stores/availabilityAwareBlockStore.js +109 -0
- package/src/lib/stores/availabilityAwareBlockStore.js.map +1 -1
- package/src/lib/stores/diskBlockAsyncStore.d.ts +72 -1
- package/src/lib/stores/diskBlockAsyncStore.d.ts.map +1 -1
- package/src/lib/stores/diskBlockAsyncStore.js +300 -0
- package/src/lib/stores/diskBlockAsyncStore.js.map +1 -1
- package/src/lib/transforms/index.d.ts +4 -0
- package/src/lib/transforms/index.d.ts.map +1 -0
- package/src/lib/transforms/index.js +7 -0
- package/src/lib/transforms/index.js.map +1 -0
- package/src/lib/utils/errorResponse.d.ts +180 -0
- package/src/lib/utils/errorResponse.d.ts.map +1 -0
- package/src/lib/utils/errorResponse.js +313 -0
- package/src/lib/utils/errorResponse.js.map +1 -0
- package/src/lib/controllers/user.d.ts +0 -9
- package/src/lib/controllers/user.d.ts.map +0 -1
- package/src/lib/controllers/user.js +0 -21
- package/src/lib/controllers/user.js.map +0 -1
- package/src/lib/interfaces/api-express-validation-error-response.d.ts +0 -7
- package/src/lib/interfaces/api-express-validation-error-response.d.ts.map +0 -1
- package/src/lib/interfaces/api-express-validation-error-response.js +0 -3
- package/src/lib/interfaces/api-express-validation-error-response.js.map +0 -1
- package/src/lib/interfaces/api-mongo-validation-error-response.d.ts +0 -6
- package/src/lib/interfaces/api-mongo-validation-error-response.d.ts.map +0 -1
- package/src/lib/interfaces/api-mongo-validation-error-response.js +0 -3
- package/src/lib/interfaces/api-mongo-validation-error-response.js.map +0 -1
- package/src/lib/interfaces/authenticated-cipher.d.ts +0 -10
- package/src/lib/interfaces/authenticated-cipher.d.ts.map +0 -1
- package/src/lib/interfaces/authenticated-cipher.js +0 -3
- package/src/lib/interfaces/authenticated-cipher.js.map +0 -1
- package/src/lib/interfaces/authenticated-decipher.d.ts +0 -9
- package/src/lib/interfaces/authenticated-decipher.d.ts.map +0 -1
- package/src/lib/interfaces/authenticated-decipher.js +0 -3
- package/src/lib/interfaces/authenticated-decipher.js.map +0 -1
- package/src/lib/interfaces/ecies-consts.d.ts +0 -88
- package/src/lib/interfaces/ecies-consts.d.ts.map +0 -1
- package/src/lib/interfaces/ecies-consts.js.map +0 -1
- package/src/lib/interfaces/mongo-errors.d.ts +0 -9
- package/src/lib/interfaces/mongo-errors.d.ts.map +0 -1
- package/src/lib/interfaces/mongo-errors.js.map +0 -1
- package/src/lib/interfaces/pbkdf2-result.d.ts +0 -6
- package/src/lib/interfaces/pbkdf2-result.d.ts.map +0 -1
- package/src/lib/interfaces/pbkdf2-result.js.map +0 -1
- package/src/lib/interfaces/server-init-result.d.ts +0 -34
- package/src/lib/interfaces/server-init-result.d.ts.map +0 -1
- package/src/lib/interfaces/server-init-result.js.map +0 -1
- package/src/lib/services/keyWrapping.d.ts +0 -61
- package/src/lib/services/keyWrapping.d.ts.map +0 -1
- package/src/lib/services/keyWrapping.js +0 -297
- package/src/lib/services/keyWrapping.js.map +0 -1
- package/src/lib/services/pbkdf2.d.ts +0 -6
- package/src/lib/services/pbkdf2.d.ts.map +0 -1
- package/src/lib/services/pbkdf2.js +0 -31
- package/src/lib/services/pbkdf2.js.map +0 -1
- package/src/lib/services/user.d.ts +0 -10
- package/src/lib/services/user.d.ts.map +0 -1
- package/src/lib/services/user.js +0 -11
- package/src/lib/services/user.js.map +0 -1
- /package/{README.md → brightchain-api-lib/README.md} +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { CoreLanguageCode } from '@digitaldefiance/i18n-lib';
|
|
2
|
+
import { PlatformID } from '@digitaldefiance/node-ecies-lib';
|
|
3
|
+
import { ApiErrorResponse, ApiRequestHandler, TypedHandlers } from '@digitaldefiance/node-express-suite';
|
|
4
|
+
import { IBrightChainApplication } from '../../interfaces/application';
|
|
5
|
+
import { IBrightenBlockResponse, IDeleteBlockResponse, IGetBlockMetadataResponse, IGetBlockResponse, IStoreBlockResponse } from '../../interfaces/blockResponses';
|
|
6
|
+
import { DefaultBackendIdType } from '../../shared-types';
|
|
7
|
+
import { BaseController } from '../base';
|
|
8
|
+
/**
|
|
9
|
+
* Error codes for block API operations
|
|
10
|
+
* @deprecated Use ErrorCode from '../../utils/errorResponse' instead
|
|
11
|
+
*/
|
|
12
|
+
export declare enum BlockErrorCode {
|
|
13
|
+
BLOCK_NOT_FOUND = "BLOCK_NOT_FOUND",
|
|
14
|
+
BLOCK_VALIDATION_FAILED = "BLOCK_VALIDATION_FAILED",
|
|
15
|
+
BLOCK_SIZE_MISMATCH = "BLOCK_SIZE_MISMATCH",
|
|
16
|
+
INSUFFICIENT_RANDOM_BLOCKS = "INSUFFICIENT_RANDOM_BLOCKS",
|
|
17
|
+
BLOCK_ALREADY_EXISTS = "BLOCK_ALREADY_EXISTS",
|
|
18
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
19
|
+
UNAUTHORIZED = "UNAUTHORIZED",
|
|
20
|
+
INTERNAL_ERROR = "INTERNAL_ERROR"
|
|
21
|
+
}
|
|
22
|
+
type BlockApiResponse = IStoreBlockResponse | IGetBlockResponse | IGetBlockMetadataResponse | IDeleteBlockResponse | IBrightenBlockResponse | ApiErrorResponse;
|
|
23
|
+
interface BlocksHandlers extends TypedHandlers {
|
|
24
|
+
storeBlock: ApiRequestHandler<IStoreBlockResponse | ApiErrorResponse>;
|
|
25
|
+
getBlock: ApiRequestHandler<IGetBlockResponse | ApiErrorResponse>;
|
|
26
|
+
getBlockMetadata: ApiRequestHandler<IGetBlockMetadataResponse | ApiErrorResponse>;
|
|
27
|
+
deleteBlock: ApiRequestHandler<IDeleteBlockResponse | ApiErrorResponse>;
|
|
28
|
+
brightenBlock: ApiRequestHandler<IBrightenBlockResponse | ApiErrorResponse>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Controller for block storage operations.
|
|
32
|
+
*
|
|
33
|
+
* Provides REST API endpoints for storing, retrieving, and managing blocks
|
|
34
|
+
* in the BrightChain distributed storage system.
|
|
35
|
+
*
|
|
36
|
+
* ## Endpoints
|
|
37
|
+
*
|
|
38
|
+
* ### POST /api/blocks
|
|
39
|
+
* Store a new block with optional durability settings.
|
|
40
|
+
*
|
|
41
|
+
* **Request Body:**
|
|
42
|
+
* - `data` (string, required): Base64-encoded block data
|
|
43
|
+
* - `canRead` (boolean, optional): Whether the block can be read (default: true)
|
|
44
|
+
* - `canPersist` (boolean, optional): Whether the block can be persisted (default: true)
|
|
45
|
+
* - `options` (object, optional): Block storage options
|
|
46
|
+
* - `expiresAt` (string): ISO date when the block expires
|
|
47
|
+
* - `durabilityLevel` (string): 'ephemeral' | 'standard' | 'high_durability'
|
|
48
|
+
*
|
|
49
|
+
* **Response:** Block ID and metadata
|
|
50
|
+
*
|
|
51
|
+
* ### GET /api/blocks/:blockId
|
|
52
|
+
* Retrieve a block by its ID.
|
|
53
|
+
*
|
|
54
|
+
* **Parameters:**
|
|
55
|
+
* - `blockId` (string, required): Hex-encoded block checksum
|
|
56
|
+
*
|
|
57
|
+
* **Response:** Block data (base64) and metadata
|
|
58
|
+
*
|
|
59
|
+
* ### GET /api/blocks/:blockId/metadata
|
|
60
|
+
* Get metadata for a block without retrieving the data.
|
|
61
|
+
*
|
|
62
|
+
* **Parameters:**
|
|
63
|
+
* - `blockId` (string, required): Hex-encoded block checksum
|
|
64
|
+
*
|
|
65
|
+
* **Response:** Block metadata including durability level, access count, etc.
|
|
66
|
+
*
|
|
67
|
+
* ### DELETE /api/blocks/:blockId
|
|
68
|
+
* Delete a block and its associated parity blocks.
|
|
69
|
+
*
|
|
70
|
+
* **Parameters:**
|
|
71
|
+
* - `blockId` (string, required): Hex-encoded block checksum
|
|
72
|
+
*
|
|
73
|
+
* **Response:** Success confirmation
|
|
74
|
+
*
|
|
75
|
+
* ### POST /api/blocks/brighten
|
|
76
|
+
* Brighten a block by XORing it with random blocks for Owner-Free storage.
|
|
77
|
+
*
|
|
78
|
+
* **Request Body:**
|
|
79
|
+
* - `blockId` (string, required): Hex-encoded block checksum to brighten
|
|
80
|
+
* - `randomBlockCount` (number, required): Number of random blocks to XOR with
|
|
81
|
+
*
|
|
82
|
+
* **Response:** Brightened block ID and list of random block IDs used
|
|
83
|
+
*
|
|
84
|
+
* @requirements 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7
|
|
85
|
+
*/
|
|
86
|
+
export declare class BlocksController<TID extends PlatformID = DefaultBackendIdType> extends BaseController<TID, BlockApiResponse, BlocksHandlers, CoreLanguageCode> {
|
|
87
|
+
private blocksService;
|
|
88
|
+
constructor(application: IBrightChainApplication<TID>);
|
|
89
|
+
protected initRouteDefinitions(): void;
|
|
90
|
+
/**
|
|
91
|
+
* POST /api/blocks
|
|
92
|
+
* Store a new block with optional durability settings.
|
|
93
|
+
*
|
|
94
|
+
* The block data is stored with the configured durability level, which determines
|
|
95
|
+
* how many parity blocks are generated for FEC recovery:
|
|
96
|
+
* - 'ephemeral': No parity blocks
|
|
97
|
+
* - 'standard': 1 parity block
|
|
98
|
+
* - 'high_durability': 2+ parity blocks
|
|
99
|
+
*
|
|
100
|
+
* @param req - Request containing base64-encoded block data and options
|
|
101
|
+
* @returns Block ID and metadata on success, or error response
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```json
|
|
105
|
+
* // Request
|
|
106
|
+
* POST /api/blocks
|
|
107
|
+
* {
|
|
108
|
+
* "data": "SGVsbG8gV29ybGQ=",
|
|
109
|
+
* "options": {
|
|
110
|
+
* "durabilityLevel": "standard",
|
|
111
|
+
* "expiresAt": "2025-12-31T23:59:59Z"
|
|
112
|
+
* }
|
|
113
|
+
* }
|
|
114
|
+
*
|
|
115
|
+
* // Response
|
|
116
|
+
* {
|
|
117
|
+
* "blockId": "abc123...",
|
|
118
|
+
* "success": true,
|
|
119
|
+
* "metadata": {
|
|
120
|
+
* "blockId": "abc123...",
|
|
121
|
+
* "durabilityLevel": "standard",
|
|
122
|
+
* "parityBlockIds": ["abc123.p0"],
|
|
123
|
+
* ...
|
|
124
|
+
* }
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
private handleStoreBlock;
|
|
129
|
+
/**
|
|
130
|
+
* GET /api/blocks/:blockId
|
|
131
|
+
* Retrieve a block by its ID.
|
|
132
|
+
*
|
|
133
|
+
* Returns the block data and metadata. The access count and last access
|
|
134
|
+
* timestamp in the metadata are updated on each retrieval.
|
|
135
|
+
*
|
|
136
|
+
* @param req - Request containing the block ID parameter
|
|
137
|
+
* @returns Block data (base64) and metadata on success, or 404 if not found
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```json
|
|
141
|
+
* // Request
|
|
142
|
+
* GET /api/blocks/abc123...
|
|
143
|
+
*
|
|
144
|
+
* // Response
|
|
145
|
+
* {
|
|
146
|
+
* "blockId": "abc123...",
|
|
147
|
+
* "data": "SGVsbG8gV29ybGQ=",
|
|
148
|
+
* "canRead": true,
|
|
149
|
+
* "canPersist": true,
|
|
150
|
+
* "metadata": { ... }
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
private handleGetBlock;
|
|
155
|
+
/**
|
|
156
|
+
* GET /api/blocks/:blockId/metadata
|
|
157
|
+
* Get metadata for a block without retrieving the data.
|
|
158
|
+
*
|
|
159
|
+
* Useful for checking block status, durability level, replication status,
|
|
160
|
+
* and access patterns without the overhead of retrieving the full block data.
|
|
161
|
+
*
|
|
162
|
+
* @param req - Request containing the block ID parameter
|
|
163
|
+
* @returns Block metadata on success, or 404 if not found
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```json
|
|
167
|
+
* // Request
|
|
168
|
+
* GET /api/blocks/abc123.../metadata
|
|
169
|
+
*
|
|
170
|
+
* // Response
|
|
171
|
+
* {
|
|
172
|
+
* "blockId": "abc123...",
|
|
173
|
+
* "metadata": {
|
|
174
|
+
* "blockId": "abc123...",
|
|
175
|
+
* "createdAt": "2025-01-15T10:00:00Z",
|
|
176
|
+
* "durabilityLevel": "standard",
|
|
177
|
+
* "parityBlockIds": ["abc123.p0"],
|
|
178
|
+
* "accessCount": 5,
|
|
179
|
+
* "lastAccessedAt": "2025-01-16T14:30:00Z",
|
|
180
|
+
* "replicationStatus": "replicated",
|
|
181
|
+
* "size": 4096,
|
|
182
|
+
* "checksum": "abc123..."
|
|
183
|
+
* }
|
|
184
|
+
* }
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
private handleGetBlockMetadata;
|
|
188
|
+
/**
|
|
189
|
+
* DELETE /api/blocks/:blockId
|
|
190
|
+
* Delete a block and its associated parity blocks.
|
|
191
|
+
*
|
|
192
|
+
* This operation removes:
|
|
193
|
+
* - The block data file
|
|
194
|
+
* - All associated parity block files
|
|
195
|
+
* - The block metadata
|
|
196
|
+
*
|
|
197
|
+
* @param req - Request containing the block ID parameter
|
|
198
|
+
* @returns Success confirmation on success, or 404 if not found
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```json
|
|
202
|
+
* // Request
|
|
203
|
+
* DELETE /api/blocks/abc123...
|
|
204
|
+
*
|
|
205
|
+
* // Response
|
|
206
|
+
* {
|
|
207
|
+
* "blockId": "abc123...",
|
|
208
|
+
* "success": true
|
|
209
|
+
* }
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
private handleDeleteBlock;
|
|
213
|
+
/**
|
|
214
|
+
* POST /api/blocks/brighten
|
|
215
|
+
* Brighten a block by XORing it with random blocks for Owner-Free storage.
|
|
216
|
+
*
|
|
217
|
+
* This operation implements the Owner-Free storage pattern where the original
|
|
218
|
+
* data cannot be reconstructed without all the random blocks used in the
|
|
219
|
+
* XOR operation. The brightened block is stored and its ID is returned along
|
|
220
|
+
* with the IDs of all random blocks used.
|
|
221
|
+
*
|
|
222
|
+
* @param req - Request containing block ID and random block count
|
|
223
|
+
* @returns Brightened block ID and list of random block IDs used
|
|
224
|
+
* @throws INSUFFICIENT_RANDOM_BLOCKS if not enough random blocks are available
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```json
|
|
228
|
+
* // Request
|
|
229
|
+
* POST /api/blocks/brighten
|
|
230
|
+
* {
|
|
231
|
+
* "blockId": "abc123...",
|
|
232
|
+
* "randomBlockCount": 3
|
|
233
|
+
* }
|
|
234
|
+
*
|
|
235
|
+
* // Response
|
|
236
|
+
* {
|
|
237
|
+
* "brightenedBlockId": "def456...",
|
|
238
|
+
* "randomBlockIds": ["rand1...", "rand2...", "rand3..."],
|
|
239
|
+
* "originalBlockId": "abc123..."
|
|
240
|
+
* }
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
private handleBrightenBlock;
|
|
244
|
+
}
|
|
245
|
+
export {};
|
|
246
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/controllers/api/blocks.ts"],"names":[],"mappings":"AAMA,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;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAQvE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC;;;GAGG;AACH,oBAAY,cAAc;IACxB,eAAe,oBAAoB;IACnC,uBAAuB,4BAA4B;IACnD,mBAAmB,wBAAwB;IAC3C,0BAA0B,+BAA+B;IACzD,oBAAoB,yBAAyB;IAC7C,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAC7B,cAAc,mBAAmB;CAClC;AAED,KAAK,gBAAgB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,yBAAyB,GACzB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,CAAC;AAErB,UAAU,cAAe,SAAQ,aAAa;IAC5C,UAAU,EAAE,iBAAiB,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAC;IACtE,QAAQ,EAAE,iBAAiB,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,CAAC;IAClE,gBAAgB,EAAE,iBAAiB,CACjC,yBAAyB,GAAG,gBAAgB,CAC7C,CAAC;IACF,WAAW,EAAE,iBAAiB,CAAC,oBAAoB,GAAG,gBAAgB,CAAC,CAAC;IACxE,aAAa,EAAE,iBAAiB,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,qBAAa,gBAAgB,CAC3B,GAAG,SAAS,UAAU,GAAG,oBAAoB,CAC7C,SAAQ,cAAc,CACtB,GAAG,EACH,gBAAgB,EAChB,cAAc,EACd,gBAAgB,CACjB;IACC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,WAAW,EAAE,uBAAuB,CAAC,GAAG,CAAC;IAOrD,SAAS,CAAC,oBAAoB,IAAI,IAAI;IAsCtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACH,OAAO,CAAC,gBAAgB,CA+DtB;IAEF;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,cAAc,CA4BpB;IAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,sBAAsB,CA6B5B;IAEF;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,iBAAiB,CAyBvB;IAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,OAAO,CAAC,mBAAmB,CAoCzB;CACH"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BlocksController = exports.BlockErrorCode = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
6
|
+
const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
|
|
7
|
+
const blockServiceFactory_1 = require("../../services/blockServiceFactory");
|
|
8
|
+
const errorResponse_1 = require("../../utils/errorResponse");
|
|
9
|
+
const base_1 = require("../base");
|
|
10
|
+
/**
|
|
11
|
+
* Error codes for block API operations
|
|
12
|
+
* @deprecated Use ErrorCode from '../../utils/errorResponse' instead
|
|
13
|
+
*/
|
|
14
|
+
var BlockErrorCode;
|
|
15
|
+
(function (BlockErrorCode) {
|
|
16
|
+
BlockErrorCode["BLOCK_NOT_FOUND"] = "BLOCK_NOT_FOUND";
|
|
17
|
+
BlockErrorCode["BLOCK_VALIDATION_FAILED"] = "BLOCK_VALIDATION_FAILED";
|
|
18
|
+
BlockErrorCode["BLOCK_SIZE_MISMATCH"] = "BLOCK_SIZE_MISMATCH";
|
|
19
|
+
BlockErrorCode["INSUFFICIENT_RANDOM_BLOCKS"] = "INSUFFICIENT_RANDOM_BLOCKS";
|
|
20
|
+
BlockErrorCode["BLOCK_ALREADY_EXISTS"] = "BLOCK_ALREADY_EXISTS";
|
|
21
|
+
BlockErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
|
|
22
|
+
BlockErrorCode["UNAUTHORIZED"] = "UNAUTHORIZED";
|
|
23
|
+
BlockErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
24
|
+
})(BlockErrorCode || (exports.BlockErrorCode = BlockErrorCode = {}));
|
|
25
|
+
/**
|
|
26
|
+
* Controller for block storage operations.
|
|
27
|
+
*
|
|
28
|
+
* Provides REST API endpoints for storing, retrieving, and managing blocks
|
|
29
|
+
* in the BrightChain distributed storage system.
|
|
30
|
+
*
|
|
31
|
+
* ## Endpoints
|
|
32
|
+
*
|
|
33
|
+
* ### POST /api/blocks
|
|
34
|
+
* Store a new block with optional durability settings.
|
|
35
|
+
*
|
|
36
|
+
* **Request Body:**
|
|
37
|
+
* - `data` (string, required): Base64-encoded block data
|
|
38
|
+
* - `canRead` (boolean, optional): Whether the block can be read (default: true)
|
|
39
|
+
* - `canPersist` (boolean, optional): Whether the block can be persisted (default: true)
|
|
40
|
+
* - `options` (object, optional): Block storage options
|
|
41
|
+
* - `expiresAt` (string): ISO date when the block expires
|
|
42
|
+
* - `durabilityLevel` (string): 'ephemeral' | 'standard' | 'high_durability'
|
|
43
|
+
*
|
|
44
|
+
* **Response:** Block ID and metadata
|
|
45
|
+
*
|
|
46
|
+
* ### GET /api/blocks/:blockId
|
|
47
|
+
* Retrieve a block by its ID.
|
|
48
|
+
*
|
|
49
|
+
* **Parameters:**
|
|
50
|
+
* - `blockId` (string, required): Hex-encoded block checksum
|
|
51
|
+
*
|
|
52
|
+
* **Response:** Block data (base64) and metadata
|
|
53
|
+
*
|
|
54
|
+
* ### GET /api/blocks/:blockId/metadata
|
|
55
|
+
* Get metadata for a block without retrieving the data.
|
|
56
|
+
*
|
|
57
|
+
* **Parameters:**
|
|
58
|
+
* - `blockId` (string, required): Hex-encoded block checksum
|
|
59
|
+
*
|
|
60
|
+
* **Response:** Block metadata including durability level, access count, etc.
|
|
61
|
+
*
|
|
62
|
+
* ### DELETE /api/blocks/:blockId
|
|
63
|
+
* Delete a block and its associated parity blocks.
|
|
64
|
+
*
|
|
65
|
+
* **Parameters:**
|
|
66
|
+
* - `blockId` (string, required): Hex-encoded block checksum
|
|
67
|
+
*
|
|
68
|
+
* **Response:** Success confirmation
|
|
69
|
+
*
|
|
70
|
+
* ### POST /api/blocks/brighten
|
|
71
|
+
* Brighten a block by XORing it with random blocks for Owner-Free storage.
|
|
72
|
+
*
|
|
73
|
+
* **Request Body:**
|
|
74
|
+
* - `blockId` (string, required): Hex-encoded block checksum to brighten
|
|
75
|
+
* - `randomBlockCount` (number, required): Number of random blocks to XOR with
|
|
76
|
+
*
|
|
77
|
+
* **Response:** Brightened block ID and list of random block IDs used
|
|
78
|
+
*
|
|
79
|
+
* @requirements 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7
|
|
80
|
+
*/
|
|
81
|
+
class BlocksController extends base_1.BaseController {
|
|
82
|
+
constructor(application) {
|
|
83
|
+
super(application);
|
|
84
|
+
/**
|
|
85
|
+
* POST /api/blocks
|
|
86
|
+
* Store a new block with optional durability settings.
|
|
87
|
+
*
|
|
88
|
+
* The block data is stored with the configured durability level, which determines
|
|
89
|
+
* how many parity blocks are generated for FEC recovery:
|
|
90
|
+
* - 'ephemeral': No parity blocks
|
|
91
|
+
* - 'standard': 1 parity block
|
|
92
|
+
* - 'high_durability': 2+ parity blocks
|
|
93
|
+
*
|
|
94
|
+
* @param req - Request containing base64-encoded block data and options
|
|
95
|
+
* @returns Block ID and metadata on success, or error response
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```json
|
|
99
|
+
* // Request
|
|
100
|
+
* POST /api/blocks
|
|
101
|
+
* {
|
|
102
|
+
* "data": "SGVsbG8gV29ybGQ=",
|
|
103
|
+
* "options": {
|
|
104
|
+
* "durabilityLevel": "standard",
|
|
105
|
+
* "expiresAt": "2025-12-31T23:59:59Z"
|
|
106
|
+
* }
|
|
107
|
+
* }
|
|
108
|
+
*
|
|
109
|
+
* // Response
|
|
110
|
+
* {
|
|
111
|
+
* "blockId": "abc123...",
|
|
112
|
+
* "success": true,
|
|
113
|
+
* "metadata": {
|
|
114
|
+
* "blockId": "abc123...",
|
|
115
|
+
* "durabilityLevel": "standard",
|
|
116
|
+
* "parityBlockIds": ["abc123.p0"],
|
|
117
|
+
* ...
|
|
118
|
+
* }
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
this.handleStoreBlock = async (req) => {
|
|
123
|
+
try {
|
|
124
|
+
const { data, canRead = true, canPersist = true, options, } = req.body;
|
|
125
|
+
// Validate required fields
|
|
126
|
+
if (!data) {
|
|
127
|
+
return (0, errorResponse_1.validationError)('Missing required field: data');
|
|
128
|
+
}
|
|
129
|
+
// Get authenticated member from session
|
|
130
|
+
const sessionsController = this.application.getController('sessions');
|
|
131
|
+
let member;
|
|
132
|
+
try {
|
|
133
|
+
member = sessionsController.getMemberFromSession(req.headers.authorization);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return (0, errorResponse_1.unauthorizedError)();
|
|
137
|
+
}
|
|
138
|
+
// Parse options if provided
|
|
139
|
+
const blockStoreOptions = options
|
|
140
|
+
? {
|
|
141
|
+
expiresAt: options.expiresAt
|
|
142
|
+
? new Date(options.expiresAt)
|
|
143
|
+
: undefined,
|
|
144
|
+
durabilityLevel: options.durabilityLevel,
|
|
145
|
+
}
|
|
146
|
+
: undefined;
|
|
147
|
+
const result = await this.blocksService.storeBlock(Buffer.from(data, 'base64'), member, canRead, canPersist, blockStoreOptions);
|
|
148
|
+
return {
|
|
149
|
+
statusCode: 200,
|
|
150
|
+
response: {
|
|
151
|
+
blockId: result.blockId,
|
|
152
|
+
success: true,
|
|
153
|
+
metadata: result.metadata,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (_error) {
|
|
158
|
+
if (_error instanceof brightchain_lib_1.StoreError) {
|
|
159
|
+
return (0, errorResponse_1.mapStoreError)(_error);
|
|
160
|
+
}
|
|
161
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* GET /api/blocks/:blockId
|
|
166
|
+
* Retrieve a block by its ID.
|
|
167
|
+
*
|
|
168
|
+
* Returns the block data and metadata. The access count and last access
|
|
169
|
+
* timestamp in the metadata are updated on each retrieval.
|
|
170
|
+
*
|
|
171
|
+
* @param req - Request containing the block ID parameter
|
|
172
|
+
* @returns Block data (base64) and metadata on success, or 404 if not found
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```json
|
|
176
|
+
* // Request
|
|
177
|
+
* GET /api/blocks/abc123...
|
|
178
|
+
*
|
|
179
|
+
* // Response
|
|
180
|
+
* {
|
|
181
|
+
* "blockId": "abc123...",
|
|
182
|
+
* "data": "SGVsbG8gV29ybGQ=",
|
|
183
|
+
* "canRead": true,
|
|
184
|
+
* "canPersist": true,
|
|
185
|
+
* "metadata": { ... }
|
|
186
|
+
* }
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
this.handleGetBlock = async (req) => {
|
|
190
|
+
try {
|
|
191
|
+
const { blockId } = req.params;
|
|
192
|
+
if (!blockId) {
|
|
193
|
+
return (0, errorResponse_1.validationError)('Missing required parameter: blockId');
|
|
194
|
+
}
|
|
195
|
+
const block = await this.blocksService.getBlock(blockId);
|
|
196
|
+
return {
|
|
197
|
+
statusCode: 200,
|
|
198
|
+
response: {
|
|
199
|
+
blockId,
|
|
200
|
+
data: block.data,
|
|
201
|
+
canRead: true,
|
|
202
|
+
canPersist: true,
|
|
203
|
+
metadata: block.metadata,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (_error) {
|
|
208
|
+
if (_error instanceof brightchain_lib_1.StoreError) {
|
|
209
|
+
return (0, errorResponse_1.mapStoreError)(_error);
|
|
210
|
+
}
|
|
211
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* GET /api/blocks/:blockId/metadata
|
|
216
|
+
* Get metadata for a block without retrieving the data.
|
|
217
|
+
*
|
|
218
|
+
* Useful for checking block status, durability level, replication status,
|
|
219
|
+
* and access patterns without the overhead of retrieving the full block data.
|
|
220
|
+
*
|
|
221
|
+
* @param req - Request containing the block ID parameter
|
|
222
|
+
* @returns Block metadata on success, or 404 if not found
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```json
|
|
226
|
+
* // Request
|
|
227
|
+
* GET /api/blocks/abc123.../metadata
|
|
228
|
+
*
|
|
229
|
+
* // Response
|
|
230
|
+
* {
|
|
231
|
+
* "blockId": "abc123...",
|
|
232
|
+
* "metadata": {
|
|
233
|
+
* "blockId": "abc123...",
|
|
234
|
+
* "createdAt": "2025-01-15T10:00:00Z",
|
|
235
|
+
* "durabilityLevel": "standard",
|
|
236
|
+
* "parityBlockIds": ["abc123.p0"],
|
|
237
|
+
* "accessCount": 5,
|
|
238
|
+
* "lastAccessedAt": "2025-01-16T14:30:00Z",
|
|
239
|
+
* "replicationStatus": "replicated",
|
|
240
|
+
* "size": 4096,
|
|
241
|
+
* "checksum": "abc123..."
|
|
242
|
+
* }
|
|
243
|
+
* }
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
this.handleGetBlockMetadata = async (req) => {
|
|
247
|
+
try {
|
|
248
|
+
const { blockId } = req.params;
|
|
249
|
+
if (!blockId) {
|
|
250
|
+
return (0, errorResponse_1.validationError)('Missing required parameter: blockId');
|
|
251
|
+
}
|
|
252
|
+
const metadata = await this.blocksService.getBlockMetadata(blockId);
|
|
253
|
+
if (!metadata) {
|
|
254
|
+
return (0, errorResponse_1.notFoundError)('Block', blockId);
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
statusCode: 200,
|
|
258
|
+
response: {
|
|
259
|
+
blockId,
|
|
260
|
+
metadata,
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
catch (_error) {
|
|
265
|
+
if (_error instanceof brightchain_lib_1.StoreError) {
|
|
266
|
+
return (0, errorResponse_1.mapStoreError)(_error);
|
|
267
|
+
}
|
|
268
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* DELETE /api/blocks/:blockId
|
|
273
|
+
* Delete a block and its associated parity blocks.
|
|
274
|
+
*
|
|
275
|
+
* This operation removes:
|
|
276
|
+
* - The block data file
|
|
277
|
+
* - All associated parity block files
|
|
278
|
+
* - The block metadata
|
|
279
|
+
*
|
|
280
|
+
* @param req - Request containing the block ID parameter
|
|
281
|
+
* @returns Success confirmation on success, or 404 if not found
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```json
|
|
285
|
+
* // Request
|
|
286
|
+
* DELETE /api/blocks/abc123...
|
|
287
|
+
*
|
|
288
|
+
* // Response
|
|
289
|
+
* {
|
|
290
|
+
* "blockId": "abc123...",
|
|
291
|
+
* "success": true
|
|
292
|
+
* }
|
|
293
|
+
* ```
|
|
294
|
+
*/
|
|
295
|
+
this.handleDeleteBlock = async (req) => {
|
|
296
|
+
try {
|
|
297
|
+
const { blockId } = req.params;
|
|
298
|
+
if (!blockId) {
|
|
299
|
+
return (0, errorResponse_1.validationError)('Missing required parameter: blockId');
|
|
300
|
+
}
|
|
301
|
+
await this.blocksService.deleteBlock(blockId);
|
|
302
|
+
return {
|
|
303
|
+
statusCode: 200,
|
|
304
|
+
response: {
|
|
305
|
+
blockId,
|
|
306
|
+
success: true,
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
catch (_error) {
|
|
311
|
+
if (_error instanceof brightchain_lib_1.StoreError) {
|
|
312
|
+
return (0, errorResponse_1.mapStoreError)(_error);
|
|
313
|
+
}
|
|
314
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
/**
|
|
318
|
+
* POST /api/blocks/brighten
|
|
319
|
+
* Brighten a block by XORing it with random blocks for Owner-Free storage.
|
|
320
|
+
*
|
|
321
|
+
* This operation implements the Owner-Free storage pattern where the original
|
|
322
|
+
* data cannot be reconstructed without all the random blocks used in the
|
|
323
|
+
* XOR operation. The brightened block is stored and its ID is returned along
|
|
324
|
+
* with the IDs of all random blocks used.
|
|
325
|
+
*
|
|
326
|
+
* @param req - Request containing block ID and random block count
|
|
327
|
+
* @returns Brightened block ID and list of random block IDs used
|
|
328
|
+
* @throws INSUFFICIENT_RANDOM_BLOCKS if not enough random blocks are available
|
|
329
|
+
*
|
|
330
|
+
* @example
|
|
331
|
+
* ```json
|
|
332
|
+
* // Request
|
|
333
|
+
* POST /api/blocks/brighten
|
|
334
|
+
* {
|
|
335
|
+
* "blockId": "abc123...",
|
|
336
|
+
* "randomBlockCount": 3
|
|
337
|
+
* }
|
|
338
|
+
*
|
|
339
|
+
* // Response
|
|
340
|
+
* {
|
|
341
|
+
* "brightenedBlockId": "def456...",
|
|
342
|
+
* "randomBlockIds": ["rand1...", "rand2...", "rand3..."],
|
|
343
|
+
* "originalBlockId": "abc123..."
|
|
344
|
+
* }
|
|
345
|
+
* ```
|
|
346
|
+
*/
|
|
347
|
+
this.handleBrightenBlock = async (req) => {
|
|
348
|
+
try {
|
|
349
|
+
const { blockId, randomBlockCount } = req.body;
|
|
350
|
+
// Validate required fields
|
|
351
|
+
if (!blockId) {
|
|
352
|
+
return (0, errorResponse_1.validationError)('Missing required field: blockId');
|
|
353
|
+
}
|
|
354
|
+
if (randomBlockCount === undefined || randomBlockCount < 1) {
|
|
355
|
+
return (0, errorResponse_1.validationError)('randomBlockCount must be a positive integer');
|
|
356
|
+
}
|
|
357
|
+
const result = await this.blocksService.brightenBlock(blockId, randomBlockCount);
|
|
358
|
+
return {
|
|
359
|
+
statusCode: 200,
|
|
360
|
+
response: {
|
|
361
|
+
brightenedBlockId: result.brightenedBlockId,
|
|
362
|
+
randomBlockIds: result.randomBlockIds,
|
|
363
|
+
originalBlockId: result.originalBlockId,
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
catch (_error) {
|
|
368
|
+
if (_error instanceof brightchain_lib_1.StoreError) {
|
|
369
|
+
return (0, errorResponse_1.mapStoreError)(_error);
|
|
370
|
+
}
|
|
371
|
+
return (0, errorResponse_1.handleError)(_error);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
this.blocksService = blockServiceFactory_1.BlockServiceFactory.getInstance().getService(application);
|
|
375
|
+
}
|
|
376
|
+
initRouteDefinitions() {
|
|
377
|
+
this.routeDefinitions = [
|
|
378
|
+
(0, node_express_suite_1.routeConfig)('post', '/', {
|
|
379
|
+
useAuthentication: true,
|
|
380
|
+
useCryptoAuthentication: false,
|
|
381
|
+
handlerKey: 'storeBlock',
|
|
382
|
+
}),
|
|
383
|
+
(0, node_express_suite_1.routeConfig)('get', '/:blockId', {
|
|
384
|
+
handlerKey: 'getBlock',
|
|
385
|
+
useAuthentication: true,
|
|
386
|
+
useCryptoAuthentication: false,
|
|
387
|
+
}),
|
|
388
|
+
(0, node_express_suite_1.routeConfig)('get', '/:blockId/metadata', {
|
|
389
|
+
handlerKey: 'getBlockMetadata',
|
|
390
|
+
useAuthentication: true,
|
|
391
|
+
useCryptoAuthentication: false,
|
|
392
|
+
}),
|
|
393
|
+
(0, node_express_suite_1.routeConfig)('delete', '/:blockId', {
|
|
394
|
+
handlerKey: 'deleteBlock',
|
|
395
|
+
useAuthentication: true,
|
|
396
|
+
useCryptoAuthentication: false,
|
|
397
|
+
}),
|
|
398
|
+
(0, node_express_suite_1.routeConfig)('post', '/brighten', {
|
|
399
|
+
handlerKey: 'brightenBlock',
|
|
400
|
+
useAuthentication: true,
|
|
401
|
+
useCryptoAuthentication: false,
|
|
402
|
+
}),
|
|
403
|
+
];
|
|
404
|
+
this.handlers = {
|
|
405
|
+
storeBlock: this.handleStoreBlock.bind(this),
|
|
406
|
+
getBlock: this.handleGetBlock.bind(this),
|
|
407
|
+
getBlockMetadata: this.handleGetBlockMetadata.bind(this),
|
|
408
|
+
deleteBlock: this.handleDeleteBlock.bind(this),
|
|
409
|
+
brightenBlock: this.handleBrightenBlock.bind(this),
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
exports.BlocksController = BlocksController;
|
|
414
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/controllers/api/blocks.ts"],"names":[],"mappings":"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"}
|