@hauska-sdk/adapters-storage-postgres 0.1.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/CHANGELOG.md ADDED
@@ -0,0 +1,19 @@
1
+ # Changelog - @hauska-sdk/adapters-storage-postgres
2
+
3
+ All notable changes to the PostgreSQL Storage Adapter will be documented in this file.
4
+
5
+ ## [0.1.0] - 2025-02-03
6
+
7
+ ### Added
8
+ - Initial release of PostgreSQL Storage Adapter
9
+ - Full StorageAdapter interface implementation
10
+ - VDA storage and retrieval
11
+ - Payment record storage
12
+ - Universal metadata indexing (address, patientId, api14)
13
+ - Cross-spoke search with pagination
14
+ - Access pass management
15
+ - Automatic database migrations
16
+
17
+ ---
18
+
19
+ [0.1.0]: https://github.com/hauska-sdk/hauska-sdk/releases/tag/@hauska-sdk/adapters-storage-postgres@0.1.0
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @hauska-sdk/adapters-storage-postgres
3
+ * CNS Protocol PostgreSQL Storage Adapter
4
+ */
5
+ import type { Pool } from "pg";
6
+ import type { VDA } from "@hauska-sdk/vda";
7
+ import type { PaymentRecord } from "@hauska-sdk/payment";
8
+ /**
9
+ * PostgreSQL Storage Adapter Configuration
10
+ */
11
+ export interface PostgreSQLAdapterConfig {
12
+ /**
13
+ * PostgreSQL connection pool or connection string
14
+ */
15
+ pool: Pool | string;
16
+ /**
17
+ * Whether to automatically run migrations on initialization
18
+ */
19
+ autoMigrate?: boolean;
20
+ }
21
+ /**
22
+ * PostgreSQL Storage Adapter
23
+ *
24
+ * Implements the StorageAdapter interface for PostgreSQL database persistence.
25
+ */
26
+ export declare class PostgreSQLStorageAdapter {
27
+ private pool;
28
+ private autoMigrate;
29
+ constructor(config: PostgreSQLAdapterConfig);
30
+ /**
31
+ * Initialize database schema
32
+ */
33
+ private initializeSchema;
34
+ /**
35
+ * Convert database row to VDA
36
+ */
37
+ private rowToVDA;
38
+ /**
39
+ * Convert VDA to database row
40
+ */
41
+ private vdaToRow;
42
+ /**
43
+ * Create a VDA
44
+ */
45
+ createVDA(vda: VDA): Promise<VDA>;
46
+ /**
47
+ * Get a VDA by ID
48
+ */
49
+ getVDA(vdaId: string): Promise<VDA | null>;
50
+ /**
51
+ * Get a VDA by IPFS CID
52
+ */
53
+ getVDAByCID(cid: string): Promise<VDA | null>;
54
+ /**
55
+ * List VDAs by owner wallet
56
+ */
57
+ listVDAsByOwner(wallet: string): Promise<VDA[]>;
58
+ /**
59
+ * List access passes by owner wallet
60
+ */
61
+ listAccessPassesByOwner(wallet: string): Promise<VDA[]>;
62
+ /**
63
+ * Index VDA by address
64
+ */
65
+ indexByAddress(_address: string, _vdaId: string): Promise<void>;
66
+ /**
67
+ * Search VDAs by address (supports partial matching)
68
+ */
69
+ searchByAddress(address: string, options?: {
70
+ limit?: number;
71
+ offset?: number;
72
+ }): Promise<{
73
+ results: VDA[];
74
+ total: number;
75
+ offset: number;
76
+ limit: number;
77
+ }>;
78
+ /**
79
+ * Index VDA by patient ID
80
+ */
81
+ indexByPatientId(_patientId: string, _vdaId: string): Promise<void>;
82
+ /**
83
+ * Search VDAs by patient ID (exact match)
84
+ */
85
+ searchByPatientId(patientId: string, options?: {
86
+ limit?: number;
87
+ offset?: number;
88
+ }): Promise<{
89
+ results: VDA[];
90
+ total: number;
91
+ offset: number;
92
+ limit: number;
93
+ }>;
94
+ /**
95
+ * Index VDA by API14
96
+ */
97
+ indexByAPI14(_api14: string, _vdaId: string): Promise<void>;
98
+ /**
99
+ * Search VDAs by API14 (exact match)
100
+ */
101
+ searchByAPI14(api14: string, options?: {
102
+ limit?: number;
103
+ offset?: number;
104
+ }): Promise<{
105
+ results: VDA[];
106
+ total: number;
107
+ offset: number;
108
+ limit: number;
109
+ }>;
110
+ /**
111
+ * Transfer ownership of a VDA
112
+ */
113
+ transferOwnership(vdaId: string, newOwner: string): Promise<void>;
114
+ /**
115
+ * Record a payment
116
+ */
117
+ recordPayment(_record: PaymentRecord): Promise<void>;
118
+ /**
119
+ * Get a payment record
120
+ */
121
+ getPayment(_resourceId: string): Promise<PaymentRecord | null>;
122
+ /**
123
+ * Close the database connection pool
124
+ */
125
+ close(): Promise<void>;
126
+ }
127
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,343 @@
1
+ /**
2
+ * @hauska-sdk/adapters-storage-postgres
3
+ * CNS Protocol PostgreSQL Storage Adapter
4
+ */
5
+ /**
6
+ * PostgreSQL Storage Adapter
7
+ *
8
+ * Implements the StorageAdapter interface for PostgreSQL database persistence.
9
+ */
10
+ export class PostgreSQLStorageAdapter {
11
+ pool;
12
+ autoMigrate;
13
+ constructor(config) {
14
+ if (typeof config.pool === "string") {
15
+ // If connection string provided, we need pg Pool
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
17
+ const { Pool: PgPool } = require("pg");
18
+ this.pool = new PgPool({ connectionString: config.pool });
19
+ }
20
+ else {
21
+ this.pool = config.pool;
22
+ }
23
+ this.autoMigrate = config.autoMigrate ?? false;
24
+ if (this.autoMigrate) {
25
+ this.initializeSchema().catch((err) => {
26
+ console.error("Failed to initialize database schema:", err);
27
+ });
28
+ }
29
+ }
30
+ /**
31
+ * Initialize database schema
32
+ */
33
+ async initializeSchema() {
34
+ const migrationSQL = `
35
+ CREATE TABLE IF NOT EXISTS vdas (
36
+ id UUID PRIMARY KEY,
37
+ asset_id UUID NOT NULL,
38
+ asset_type VARCHAR(50) NOT NULL,
39
+ address TEXT,
40
+ legal_desc TEXT,
41
+ patient_id VARCHAR(100),
42
+ api14 VARCHAR(50),
43
+ owner_wallet VARCHAR(42) NOT NULL,
44
+ grantor_wallet VARCHAR(42),
45
+ spoke VARCHAR(50) NOT NULL,
46
+ ipfs_cid TEXT,
47
+ expiry BIGINT,
48
+ accessible_vdas JSONB,
49
+ permissions JSONB,
50
+ metadata JSONB,
51
+ created_at BIGINT NOT NULL,
52
+ updated_at BIGINT NOT NULL
53
+ );
54
+
55
+ CREATE INDEX IF NOT EXISTS idx_vdas_owner ON vdas(owner_wallet);
56
+ CREATE INDEX IF NOT EXISTS idx_vdas_address ON vdas(address);
57
+ CREATE INDEX IF NOT EXISTS idx_vdas_patient_id ON vdas(patient_id);
58
+ CREATE INDEX IF NOT EXISTS idx_vdas_api14 ON vdas(api14);
59
+ CREATE INDEX IF NOT EXISTS idx_vdas_asset_type ON vdas(asset_type);
60
+ CREATE INDEX IF NOT EXISTS idx_vdas_spoke ON vdas(spoke);
61
+ CREATE INDEX IF NOT EXISTS idx_vdas_ipfs_cid ON vdas(ipfs_cid);
62
+ CREATE INDEX IF NOT EXISTS idx_vdas_expiry ON vdas(expiry) WHERE expiry IS NOT NULL;
63
+ `;
64
+ await this.pool.query(migrationSQL);
65
+ }
66
+ /**
67
+ * Convert database row to VDA
68
+ */
69
+ rowToVDA(row) {
70
+ return {
71
+ id: row.id,
72
+ metadata: {
73
+ assetId: row.asset_id,
74
+ assetType: row.asset_type,
75
+ address: row.address,
76
+ legalDesc: row.legal_desc,
77
+ patientId: row.patient_id,
78
+ api14: row.api14,
79
+ ownerWallet: row.owner_wallet,
80
+ grantorWallet: row.grantor_wallet,
81
+ spoke: row.spoke,
82
+ ipfsCid: row.ipfs_cid,
83
+ expiry: row.expiry,
84
+ accessibleVDAs: row.accessible_vdas || undefined,
85
+ permissions: row.permissions || undefined,
86
+ metadata: row.metadata || undefined,
87
+ createdAt: row.created_at,
88
+ updatedAt: row.updated_at,
89
+ },
90
+ };
91
+ }
92
+ /**
93
+ * Convert VDA to database row
94
+ */
95
+ vdaToRow(vda) {
96
+ return {
97
+ id: vda.id,
98
+ asset_id: vda.metadata.assetId,
99
+ asset_type: vda.metadata.assetType,
100
+ address: vda.metadata.address || null,
101
+ legal_desc: vda.metadata.legalDesc || null,
102
+ patient_id: vda.metadata.patientId || null,
103
+ api14: vda.metadata.api14 || null,
104
+ owner_wallet: vda.metadata.ownerWallet,
105
+ grantor_wallet: vda.metadata.grantorWallet || null,
106
+ spoke: vda.metadata.spoke,
107
+ ipfs_cid: vda.metadata.ipfsCid || null,
108
+ expiry: vda.metadata.expiry || null,
109
+ accessible_vdas: vda.metadata.accessibleVDAs
110
+ ? vda.metadata.accessibleVDAs
111
+ : null,
112
+ permissions: vda.metadata.permissions
113
+ ? vda.metadata.permissions
114
+ : null,
115
+ metadata: vda.metadata.metadata
116
+ ? JSON.stringify(vda.metadata.metadata)
117
+ : null,
118
+ created_at: vda.metadata.createdAt,
119
+ updated_at: vda.metadata.updatedAt,
120
+ };
121
+ }
122
+ /**
123
+ * Create a VDA
124
+ */
125
+ async createVDA(vda) {
126
+ const row = this.vdaToRow(vda);
127
+ const query = `
128
+ INSERT INTO vdas (
129
+ id, asset_id, asset_type, address, legal_desc, patient_id, api14,
130
+ owner_wallet, grantor_wallet, spoke, ipfs_cid, expiry,
131
+ accessible_vdas, permissions, metadata, created_at, updated_at
132
+ ) VALUES (
133
+ $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17
134
+ ) RETURNING *
135
+ `;
136
+ const values = [
137
+ row.id,
138
+ row.asset_id,
139
+ row.asset_type,
140
+ row.address,
141
+ row.legal_desc,
142
+ row.patient_id,
143
+ row.api14,
144
+ row.owner_wallet,
145
+ row.grantor_wallet,
146
+ row.spoke,
147
+ row.ipfs_cid,
148
+ row.expiry,
149
+ row.accessible_vdas,
150
+ row.permissions,
151
+ row.metadata,
152
+ row.created_at,
153
+ row.updated_at,
154
+ ];
155
+ const result = await this.pool.query(query, values);
156
+ const created = this.rowToVDA(result.rows[0]);
157
+ // Index by universal keys
158
+ if (vda.metadata.address) {
159
+ await this.indexByAddress(vda.metadata.address, vda.id);
160
+ }
161
+ if (vda.metadata.patientId) {
162
+ await this.indexByPatientId(vda.metadata.patientId, vda.id);
163
+ }
164
+ if (vda.metadata.api14) {
165
+ await this.indexByAPI14(vda.metadata.api14, vda.id);
166
+ }
167
+ return created;
168
+ }
169
+ /**
170
+ * Get a VDA by ID
171
+ */
172
+ async getVDA(vdaId) {
173
+ const query = `SELECT * FROM vdas WHERE id = $1`;
174
+ const result = await this.pool.query(query, [vdaId]);
175
+ if (result.rows.length === 0) {
176
+ return null;
177
+ }
178
+ return this.rowToVDA(result.rows[0]);
179
+ }
180
+ /**
181
+ * Get a VDA by IPFS CID
182
+ */
183
+ async getVDAByCID(cid) {
184
+ const query = `SELECT * FROM vdas WHERE ipfs_cid = $1`;
185
+ const result = await this.pool.query(query, [cid]);
186
+ if (result.rows.length === 0) {
187
+ return null;
188
+ }
189
+ return this.rowToVDA(result.rows[0]);
190
+ }
191
+ /**
192
+ * List VDAs by owner wallet
193
+ */
194
+ async listVDAsByOwner(wallet) {
195
+ const query = `SELECT * FROM vdas WHERE owner_wallet = $1 ORDER BY created_at DESC`;
196
+ const result = await this.pool.query(query, [wallet]);
197
+ return result.rows.map((row) => this.rowToVDA(row));
198
+ }
199
+ /**
200
+ * List access passes by owner wallet
201
+ */
202
+ async listAccessPassesByOwner(wallet) {
203
+ const query = `
204
+ SELECT * FROM vdas
205
+ WHERE owner_wallet = $1 AND asset_type = 'access-pass'
206
+ ORDER BY created_at DESC
207
+ `;
208
+ const result = await this.pool.query(query, [wallet]);
209
+ return result.rows.map((row) => this.rowToVDA(row));
210
+ }
211
+ /**
212
+ * Index VDA by address
213
+ */
214
+ async indexByAddress(_address, _vdaId) {
215
+ // Indexing is handled by the database index on the address column
216
+ // This method exists for interface compatibility
217
+ // We could add a separate index table here if needed for more complex queries
218
+ }
219
+ /**
220
+ * Search VDAs by address (supports partial matching)
221
+ */
222
+ async searchByAddress(address, options) {
223
+ // Normalize address for searching (lowercase, trim)
224
+ const normalizedAddress = address.toLowerCase().trim();
225
+ // Use ILIKE for case-insensitive partial matching
226
+ // Match addresses that contain the search term
227
+ const searchPattern = `%${normalizedAddress}%`;
228
+ // Count total results
229
+ const countQuery = `SELECT COUNT(*) FROM vdas WHERE LOWER(address) LIKE $1`;
230
+ const countResult = await this.pool.query(countQuery, [searchPattern]);
231
+ const total = parseInt(countResult.rows[0].count, 10);
232
+ // Get paginated results
233
+ const limit = options?.limit ?? 100;
234
+ const offset = options?.offset ?? 0;
235
+ const query = `
236
+ SELECT * FROM vdas
237
+ WHERE LOWER(address) LIKE $1
238
+ ORDER BY created_at DESC
239
+ LIMIT $2 OFFSET $3
240
+ `;
241
+ const result = await this.pool.query(query, [searchPattern, limit, offset]);
242
+ return {
243
+ results: result.rows.map((row) => this.rowToVDA(row)),
244
+ total,
245
+ offset,
246
+ limit,
247
+ };
248
+ }
249
+ /**
250
+ * Index VDA by patient ID
251
+ */
252
+ async indexByPatientId(_patientId, _vdaId) {
253
+ // Indexing is handled by the database index on the patient_id column
254
+ }
255
+ /**
256
+ * Search VDAs by patient ID (exact match)
257
+ */
258
+ async searchByPatientId(patientId, options) {
259
+ // Count total results
260
+ const countQuery = `SELECT COUNT(*) FROM vdas WHERE patient_id = $1`;
261
+ const countResult = await this.pool.query(countQuery, [patientId]);
262
+ const total = parseInt(countResult.rows[0].count, 10);
263
+ // Get paginated results
264
+ const limit = options?.limit ?? 100;
265
+ const offset = options?.offset ?? 0;
266
+ const query = `
267
+ SELECT * FROM vdas
268
+ WHERE patient_id = $1
269
+ ORDER BY created_at DESC
270
+ LIMIT $2 OFFSET $3
271
+ `;
272
+ const result = await this.pool.query(query, [patientId, limit, offset]);
273
+ return {
274
+ results: result.rows.map((row) => this.rowToVDA(row)),
275
+ total,
276
+ offset,
277
+ limit,
278
+ };
279
+ }
280
+ /**
281
+ * Index VDA by API14
282
+ */
283
+ async indexByAPI14(_api14, _vdaId) {
284
+ // Indexing is handled by the database index on the api14 column
285
+ }
286
+ /**
287
+ * Search VDAs by API14 (exact match)
288
+ */
289
+ async searchByAPI14(api14, options) {
290
+ // Count total results
291
+ const countQuery = `SELECT COUNT(*) FROM vdas WHERE api14 = $1`;
292
+ const countResult = await this.pool.query(countQuery, [api14]);
293
+ const total = parseInt(countResult.rows[0].count, 10);
294
+ // Get paginated results
295
+ const limit = options?.limit ?? 100;
296
+ const offset = options?.offset ?? 0;
297
+ const query = `
298
+ SELECT * FROM vdas
299
+ WHERE api14 = $1
300
+ ORDER BY created_at DESC
301
+ LIMIT $2 OFFSET $3
302
+ `;
303
+ const result = await this.pool.query(query, [api14, limit, offset]);
304
+ return {
305
+ results: result.rows.map((row) => this.rowToVDA(row)),
306
+ total,
307
+ offset,
308
+ limit,
309
+ };
310
+ }
311
+ /**
312
+ * Transfer ownership of a VDA
313
+ */
314
+ async transferOwnership(vdaId, newOwner) {
315
+ const query = `
316
+ UPDATE vdas
317
+ SET owner_wallet = $1, updated_at = $2
318
+ WHERE id = $3
319
+ `;
320
+ await this.pool.query(query, [newOwner, Date.now(), vdaId]);
321
+ }
322
+ /**
323
+ * Record a payment
324
+ */
325
+ async recordPayment(_record) {
326
+ // Payment records table would need to be created separately
327
+ // For now, we'll throw an error indicating this needs to be implemented
328
+ throw new Error("Payment record storage not yet implemented in PostgreSQL adapter");
329
+ }
330
+ /**
331
+ * Get a payment record
332
+ */
333
+ async getPayment(_resourceId) {
334
+ throw new Error("Payment record retrieval not yet implemented in PostgreSQL adapter");
335
+ }
336
+ /**
337
+ * Close the database connection pool
338
+ */
339
+ async close() {
340
+ await this.pool.end();
341
+ }
342
+ }
343
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@hauska-sdk/adapters-storage-postgres",
3
+ "version": "0.1.0",
4
+ "description": "CNS Protocol PostgreSQL Storage Adapter",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "clean": "rimraf dist",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:coverage": "vitest run --coverage",
21
+ "type-check": "tsc --noEmit"
22
+ },
23
+ "dependencies": {
24
+ "pg": "^8.11.3",
25
+ "@types/pg": "^8.10.9"
26
+ },
27
+ "devDependencies": {
28
+ "typescript": "^5.3.3",
29
+ "rimraf": "^5.0.5",
30
+ "vitest": "^4.0.18"
31
+ },
32
+ "keywords": [
33
+ "cns-protocol",
34
+ "storage",
35
+ "postgres",
36
+ "postgresql",
37
+ "adapter",
38
+ "database"
39
+ ],
40
+ "author": "Hauska SDK Team",
41
+ "license": "MIT",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/hauska-sdk/hauska-sdk.git",
45
+ "directory": "packages/adapters/storage-postgres"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/hauska-sdk/hauska-sdk/issues"
49
+ },
50
+ "homepage": "https://github.com/hauska-sdk/hauska-sdk#readme",
51
+ "engines": {
52
+ "node": ">=18.0.0",
53
+ "npm": ">=9.0.0"
54
+ },
55
+ "files": [
56
+ "dist",
57
+ "README.md",
58
+ "CHANGELOG.md"
59
+ ],
60
+ "scripts": {
61
+ "build": "tsc",
62
+ "clean": "rimraf dist",
63
+ "test": "vitest run",
64
+ "test:watch": "vitest",
65
+ "test:coverage": "vitest run --coverage",
66
+ "type-check": "tsc --noEmit",
67
+ "prepublishOnly": "npm run build"
68
+ },
69
+ "publishConfig": {
70
+ "access": "public",
71
+ "registry": "https://registry.npmjs.org"
72
+ }
73
+ }