@volontariapp/bridge 0.1.0-next.20260408104813

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +104 -0
  2. package/dist/index.d.ts +7 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +7 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/interfaces/database.config.interface.d.ts +26 -0
  7. package/dist/interfaces/database.config.interface.d.ts.map +1 -0
  8. package/dist/interfaces/database.config.interface.js +2 -0
  9. package/dist/interfaces/database.config.interface.js.map +1 -0
  10. package/dist/interfaces/provider.interface.d.ts +7 -0
  11. package/dist/interfaces/provider.interface.d.ts.map +1 -0
  12. package/dist/interfaces/provider.interface.js +2 -0
  13. package/dist/interfaces/provider.interface.js.map +1 -0
  14. package/dist/providers/neo4j.provider.d.ts +14 -0
  15. package/dist/providers/neo4j.provider.d.ts.map +1 -0
  16. package/dist/providers/neo4j.provider.js +46 -0
  17. package/dist/providers/neo4j.provider.js.map +1 -0
  18. package/dist/providers/postgres.provider.d.ts +13 -0
  19. package/dist/providers/postgres.provider.d.ts.map +1 -0
  20. package/dist/providers/postgres.provider.js +46 -0
  21. package/dist/providers/postgres.provider.js.map +1 -0
  22. package/dist/providers/redis.provider.d.ts +14 -0
  23. package/dist/providers/redis.provider.d.ts.map +1 -0
  24. package/dist/providers/redis.provider.js +49 -0
  25. package/dist/providers/redis.provider.js.map +1 -0
  26. package/dist/test/integration/bridge.int.spec.d.ts +2 -0
  27. package/dist/test/integration/bridge.int.spec.d.ts.map +1 -0
  28. package/dist/test/integration/bridge.int.spec.js +73 -0
  29. package/dist/test/integration/bridge.int.spec.js.map +1 -0
  30. package/dist/test/integration/config.example.d.ts +5 -0
  31. package/dist/test/integration/config.example.d.ts.map +1 -0
  32. package/dist/test/integration/config.example.js +20 -0
  33. package/dist/test/integration/config.example.js.map +1 -0
  34. package/dist/test/unit/neo4j.provider.unit.spec.d.ts +2 -0
  35. package/dist/test/unit/neo4j.provider.unit.spec.d.ts.map +1 -0
  36. package/dist/test/unit/neo4j.provider.unit.spec.js +85 -0
  37. package/dist/test/unit/neo4j.provider.unit.spec.js.map +1 -0
  38. package/dist/test/unit/postgres.provider.unit.spec.d.ts +2 -0
  39. package/dist/test/unit/postgres.provider.unit.spec.d.ts.map +1 -0
  40. package/dist/test/unit/postgres.provider.unit.spec.js +76 -0
  41. package/dist/test/unit/postgres.provider.unit.spec.js.map +1 -0
  42. package/dist/test/unit/redis.provider.unit.spec.d.ts +2 -0
  43. package/dist/test/unit/redis.provider.unit.spec.d.ts.map +1 -0
  44. package/dist/test/unit/redis.provider.unit.spec.js +70 -0
  45. package/dist/test/unit/redis.provider.unit.spec.js.map +1 -0
  46. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # @volontariapp/bridge
2
+
3
+ This library provides core database connection providers for the Volontariapp microservices architecture. It abstracts the initialization, connection, and disconnection logic for Postgres, Neo4j, and Redis databases.
4
+
5
+ ## Features
6
+ - **PostgresProvider**: Uses TypeORM's `DataSource` underneath.
7
+ - **Neo4jProvider**: Uses the official `neo4j-driver`.
8
+ - **RedisProvider**: Uses `ioredis`.
9
+ - Strict typing and custom error handling using `@volontariapp/errors` instances for seamless microservice integration.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ yarn add @volontariapp/bridge @volontariapp/errors
15
+ ```
16
+
17
+ ## Abstract Usage
18
+
19
+ This package can be used outside NestJS environments or integrated manually.
20
+
21
+ ### Postgres Example
22
+ ```typescript
23
+ import { PostgresProvider, IPostgresConfig } from '@volontariapp/bridge';
24
+
25
+ const config: IPostgresConfig = {
26
+ host: 'localhost',
27
+ port: 5432,
28
+ username: 'postgres',
29
+ password: 'password',
30
+ database: 'my_db',
31
+ synchronize: true, // TypeORM specific options are supported natively
32
+ };
33
+
34
+ const provider = new PostgresProvider(config);
35
+
36
+ async function start() {
37
+ await provider.connect();
38
+ const driver = provider.getDriver(); // Returns TypeORM DataSource
39
+
40
+ // Use driver
41
+ const result = await driver.query('SELECT NOW()');
42
+ console.log(result);
43
+
44
+ await provider.disconnect();
45
+ }
46
+
47
+ start();
48
+ ```
49
+
50
+ ### Redis Example
51
+ ```typescript
52
+ import { RedisProvider, IRedisConfig } from '@volontariapp/bridge';
53
+
54
+ const config: IRedisConfig = {
55
+ host: 'localhost',
56
+ port: 6379,
57
+ };
58
+
59
+ const provider = new RedisProvider(config);
60
+
61
+ async function start() {
62
+ await provider.connect();
63
+ const redis = provider.getDriver();
64
+
65
+ await redis.set('foo', 'bar');
66
+ console.log(await redis.get('foo'));
67
+
68
+ await provider.disconnect();
69
+ }
70
+
71
+ start();
72
+ ```
73
+
74
+ ### Neo4j Example
75
+ ```typescript
76
+ import { Neo4jProvider, INeo4jConfig } from '@volontariapp/bridge';
77
+
78
+ const config: INeo4jConfig = {
79
+ url: 'neo4j://localhost:7687',
80
+ authToken: {
81
+ principal: 'neo4j',
82
+ credentials: 'password',
83
+ },
84
+ };
85
+
86
+ const provider = new Neo4jProvider(config);
87
+
88
+ async function start() {
89
+ await provider.connect();
90
+ const neo4jDriver = provider.getDriver(); // native neo4j-driver instance
91
+
92
+ const session = neo4jDriver.session();
93
+ const res = await session.run('RETURN 1 as val');
94
+ console.log(res.records[0].get('val'));
95
+
96
+ await session.close();
97
+ await provider.disconnect();
98
+ }
99
+
100
+ start();
101
+ ```
102
+
103
+ ## NestJS Usage
104
+ If you are building a NestJS project, use the `@volontariapp/bridge-nest` package wrapper to leverage NestJS lifecycle hooks and module isolation correctly.
@@ -0,0 +1,7 @@
1
+ import 'reflect-metadata';
2
+ export * from './interfaces/provider.interface.js';
3
+ export * from './providers/postgres.provider.js';
4
+ export * from './providers/neo4j.provider.js';
5
+ export * from './providers/redis.provider.js';
6
+ export * from './interfaces/database.config.interface.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2CAA2C,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ import 'reflect-metadata';
2
+ export * from './interfaces/provider.interface.js';
3
+ export * from './providers/postgres.provider.js';
4
+ export * from './providers/neo4j.provider.js';
5
+ export * from './providers/redis.provider.js';
6
+ export * from './interfaces/database.config.interface.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2CAA2C,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
2
+ import type { Config as Neo4jDriverConfig } from 'neo4j-driver';
3
+ import type { RedisOptions } from 'ioredis';
4
+ export interface IPostgresConfig extends Omit<PostgresConnectionOptions, 'type'> {
5
+ host: string;
6
+ port: number;
7
+ username: string;
8
+ password?: string;
9
+ database: string;
10
+ }
11
+ export interface INeo4jAuthToken {
12
+ scheme?: string;
13
+ principal: string;
14
+ credentials: string;
15
+ realm?: string;
16
+ }
17
+ export interface INeo4jConfig {
18
+ url: string;
19
+ authToken: INeo4jAuthToken;
20
+ config?: Neo4jDriverConfig;
21
+ }
22
+ export interface IRedisConfig extends RedisOptions {
23
+ host: string;
24
+ port: number;
25
+ }
26
+ //# sourceMappingURL=database.config.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.config.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/database.config.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAC;AACtG,OAAO,KAAK,EAAE,MAAM,IAAI,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=database.config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.config.interface.js","sourceRoot":"","sources":["../../src/interfaces/database.config.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export interface IConnectionProvider<T> {
2
+ connect(): Promise<void>;
3
+ disconnect(): Promise<void>;
4
+ getDriver(): T;
5
+ isConnected(): boolean;
6
+ }
7
+ //# sourceMappingURL=provider.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/provider.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,IAAI,CAAC,CAAC;IACf,WAAW,IAAI,OAAO,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.interface.js","sourceRoot":"","sources":["../../src/interfaces/provider.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { Driver } from 'neo4j-driver';
2
+ import type { IConnectionProvider } from '../interfaces/provider.interface.js';
3
+ import type { INeo4jConfig } from '../interfaces/database.config.interface.js';
4
+ export declare class Neo4jProvider implements IConnectionProvider<Driver> {
5
+ private readonly setup;
6
+ private driver;
7
+ private connected;
8
+ constructor(setup: INeo4jConfig);
9
+ connect(): Promise<void>;
10
+ disconnect(): Promise<void>;
11
+ getDriver(): Driver;
12
+ isConnected(): boolean;
13
+ }
14
+ //# sourceMappingURL=neo4j.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j.provider.d.ts","sourceRoot":"","sources":["../../src/providers/neo4j.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAE/E,qBAAa,aAAc,YAAW,mBAAmB,CAAC,MAAM,CAAC;IAInD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;gBAEG,KAAK,EAAE,YAAY;IAE1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,SAAS,IAAI,MAAM;IAUnB,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,46 @@
1
+ import neo4j from 'neo4j-driver';
2
+ import { InternalServerError } from '@volontariapp/errors';
3
+ export class Neo4jProvider {
4
+ setup;
5
+ driver = null;
6
+ connected = false;
7
+ constructor(setup) {
8
+ this.setup = setup;
9
+ }
10
+ async connect() {
11
+ try {
12
+ if (this.connected)
13
+ return;
14
+ this.driver = neo4j.driver(this.setup.url, neo4j.auth.basic(this.setup.authToken.principal, this.setup.authToken.credentials), this.setup.config);
15
+ await this.driver.verifyConnectivity();
16
+ this.connected = true;
17
+ }
18
+ catch (e) {
19
+ const message = e instanceof Error ? e.message : 'Unknown connection error';
20
+ throw new InternalServerError(`Failed to connect to Neo4j: ${message}`, 'NEO4J_CONNECTION_ERROR', { cause: e });
21
+ }
22
+ }
23
+ async disconnect() {
24
+ try {
25
+ if (!this.connected || !this.driver)
26
+ return;
27
+ await this.driver.close();
28
+ this.connected = false;
29
+ this.driver = null;
30
+ }
31
+ catch (e) {
32
+ const message = e instanceof Error ? e.message : 'Unknown disconnection error';
33
+ throw new InternalServerError(`Failed to disconnect from Neo4j: ${message}`, 'NEO4J_DISCONNECTION_ERROR', { cause: e });
34
+ }
35
+ }
36
+ getDriver() {
37
+ if (!this.connected || !this.driver) {
38
+ throw new InternalServerError('Neo4j driver not initialized. Call connect() first.', 'NEO4J_NOT_INITIALIZED');
39
+ }
40
+ return this.driver;
41
+ }
42
+ isConnected() {
43
+ return this.connected;
44
+ }
45
+ }
46
+ //# sourceMappingURL=neo4j.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j.provider.js","sourceRoot":"","sources":["../../src/providers/neo4j.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,OAAO,aAAa;IAIK;IAHrB,MAAM,GAAkB,IAAI,CAAC;IAC7B,SAAS,GAAG,KAAK,CAAC;IAE1B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO;YAE3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CACxB,IAAI,CAAC,KAAK,CAAC,GAAG,EACd,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAClF,IAAI,CAAC,KAAK,CAAC,MAAM,CAClB,CAAC;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC5E,MAAM,IAAI,mBAAmB,CAC3B,+BAA+B,OAAO,EAAE,EACxC,wBAAwB,EACxB,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YAC/E,MAAM,IAAI,mBAAmB,CAC3B,oCAAoC,OAAO,EAAE,EAC7C,2BAA2B,EAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,mBAAmB,CAC3B,qDAAqD,EACrD,uBAAuB,CACxB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { DataSource } from 'typeorm';
2
+ import type { IConnectionProvider } from '../interfaces/provider.interface.js';
3
+ import type { IPostgresConfig } from '../interfaces/database.config.interface.js';
4
+ export declare class PostgresProvider implements IConnectionProvider<DataSource> {
5
+ private dataSource;
6
+ private connected;
7
+ constructor(options: IPostgresConfig);
8
+ connect(): Promise<void>;
9
+ disconnect(): Promise<void>;
10
+ getDriver(): DataSource;
11
+ isConnected(): boolean;
12
+ }
13
+ //# sourceMappingURL=postgres.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.provider.d.ts","sourceRoot":"","sources":["../../src/providers/postgres.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAElF,qBAAa,gBAAiB,YAAW,mBAAmB,CAAC,UAAU,CAAC;IACtE,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,eAAe;IAO9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAexB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC,SAAS,IAAI,UAAU;IAUvB,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,46 @@
1
+ import { DataSource } from 'typeorm';
2
+ import { InternalServerError } from '@volontariapp/errors';
3
+ export class PostgresProvider {
4
+ dataSource;
5
+ connected = false;
6
+ constructor(options) {
7
+ this.dataSource = new DataSource({
8
+ ...options,
9
+ type: 'postgres',
10
+ });
11
+ }
12
+ async connect() {
13
+ try {
14
+ if (this.connected)
15
+ return;
16
+ await this.dataSource.initialize();
17
+ this.connected = true;
18
+ }
19
+ catch (e) {
20
+ const message = e instanceof Error ? e.message : 'Unknown connection error';
21
+ throw new InternalServerError(`Failed to connect to Postgres: ${message}`, 'POSTGRES_CONNECTION_ERROR', { cause: e });
22
+ }
23
+ }
24
+ async disconnect() {
25
+ try {
26
+ if (!this.connected)
27
+ return;
28
+ await this.dataSource.destroy();
29
+ this.connected = false;
30
+ }
31
+ catch (e) {
32
+ const message = e instanceof Error ? e.message : 'Unknown disconnection error';
33
+ throw new InternalServerError(`Failed to disconnect from Postgres: ${message}`, 'POSTGRES_DISCONNECTION_ERROR', { cause: e });
34
+ }
35
+ }
36
+ getDriver() {
37
+ if (!this.connected) {
38
+ throw new InternalServerError('Postgres driver not initialized. Call connect() first.', 'POSTGRES_NOT_INITIALIZED');
39
+ }
40
+ return this.dataSource;
41
+ }
42
+ isConnected() {
43
+ return this.connected;
44
+ }
45
+ }
46
+ //# sourceMappingURL=postgres.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.provider.js","sourceRoot":"","sources":["../../src/providers/postgres.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,OAAO,gBAAgB;IACnB,UAAU,CAAa;IACvB,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,OAAwB;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC;YAC/B,GAAI,OAAqC;YACzC,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC3B,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC5E,MAAM,IAAI,mBAAmB,CAC3B,kCAAkC,OAAO,EAAE,EAC3C,2BAA2B,EAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YAC/E,MAAM,IAAI,mBAAmB,CAC3B,uCAAuC,OAAO,EAAE,EAChD,8BAA8B,EAC9B,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,mBAAmB,CAC3B,wDAAwD,EACxD,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { Redis } from 'ioredis';
2
+ import type { IConnectionProvider } from '../interfaces/provider.interface.js';
3
+ import type { IRedisConfig } from '../interfaces/database.config.interface.js';
4
+ export declare class RedisProvider implements IConnectionProvider<Redis> {
5
+ private readonly setup;
6
+ private redis;
7
+ private connected;
8
+ constructor(setup: IRedisConfig);
9
+ connect(): Promise<void>;
10
+ disconnect(): Promise<void>;
11
+ getDriver(): Redis;
12
+ isConnected(): boolean;
13
+ }
14
+ //# sourceMappingURL=redis.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.provider.d.ts","sourceRoot":"","sources":["../../src/providers/redis.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAE/E,qBAAa,aAAc,YAAW,mBAAmB,CAAC,KAAK,CAAC;IAIlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,SAAS,CAAS;gBAEG,KAAK,EAAE,YAAY;IAE1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,SAAS,IAAI,KAAK;IAUlB,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,49 @@
1
+ import { Redis } from 'ioredis';
2
+ import { InternalServerError } from '@volontariapp/errors';
3
+ export class RedisProvider {
4
+ setup;
5
+ redis = null;
6
+ connected = false;
7
+ constructor(setup) {
8
+ this.setup = setup;
9
+ }
10
+ async connect() {
11
+ try {
12
+ if (this.connected)
13
+ return;
14
+ this.redis = new Redis({
15
+ ...this.setup,
16
+ lazyConnect: true,
17
+ });
18
+ await this.redis.connect();
19
+ this.connected = true;
20
+ }
21
+ catch (e) {
22
+ const message = e instanceof Error ? e.message : 'Unknown connection error';
23
+ throw new InternalServerError(`Failed to connect to Redis: ${message}`, 'REDIS_CONNECTION_ERROR', { cause: e });
24
+ }
25
+ }
26
+ async disconnect() {
27
+ try {
28
+ if (!this.connected || !this.redis)
29
+ return;
30
+ await this.redis.quit();
31
+ this.connected = false;
32
+ this.redis = null;
33
+ }
34
+ catch (e) {
35
+ const message = e instanceof Error ? e.message : 'Unknown disconnection error';
36
+ throw new InternalServerError(`Failed to disconnect from Redis: ${message}`, 'REDIS_DISCONNECTION_ERROR', { cause: e });
37
+ }
38
+ }
39
+ getDriver() {
40
+ if (!this.connected || !this.redis) {
41
+ throw new InternalServerError('Redis driver not initialized. Call connect() first.', 'REDIS_NOT_INITIALIZED');
42
+ }
43
+ return this.redis;
44
+ }
45
+ isConnected() {
46
+ return this.connected;
47
+ }
48
+ }
49
+ //# sourceMappingURL=redis.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.provider.js","sourceRoot":"","sources":["../../src/providers/redis.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,OAAO,aAAa;IAIK;IAHrB,KAAK,GAAiB,IAAI,CAAC;IAC3B,SAAS,GAAG,KAAK,CAAC;IAE1B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO;YAE3B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC;gBACrB,GAAG,IAAI,CAAC,KAAK;gBACb,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC5E,MAAM,IAAI,mBAAmB,CAC3B,+BAA+B,OAAO,EAAE,EACxC,wBAAwB,EACxB,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAC3C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YAC/E,MAAM,IAAI,mBAAmB,CAC3B,oCAAoC,OAAO,EAAE,EAC7C,2BAA2B,EAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,IAAI,mBAAmB,CAC3B,qDAAqD,EACrD,uBAAuB,CACxB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bridge.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/integration/bridge.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from '@jest/globals';
2
+ import { PostgresProvider } from '../../providers/postgres.provider.js';
3
+ import { Neo4jProvider } from '../../providers/neo4j.provider.js';
4
+ import { RedisProvider } from '../../providers/redis.provider.js';
5
+ import { postgresConfig, neo4jConfig, redisConfig } from './config.example.js';
6
+ describe('Bridge Providers (Integration)', () => {
7
+ describe('PostgresProvider', () => {
8
+ let provider;
9
+ beforeAll(async () => {
10
+ provider = new PostgresProvider(postgresConfig);
11
+ await provider.connect();
12
+ });
13
+ afterAll(async () => {
14
+ if (provider.isConnected()) {
15
+ await provider.disconnect();
16
+ }
17
+ });
18
+ it('should connect to Postgres', () => {
19
+ expect(provider.isConnected()).toBe(true);
20
+ });
21
+ it('should be able to execute a query (PostGIS check)', async () => {
22
+ const driver = provider.getDriver();
23
+ const result = (await driver.query('SELECT postgis_version();'));
24
+ expect(result).toBeDefined();
25
+ expect(result[0]?.postgis_version).toBeDefined();
26
+ });
27
+ });
28
+ describe('Neo4jProvider', () => {
29
+ let provider;
30
+ beforeAll(async () => {
31
+ provider = new Neo4jProvider(neo4jConfig);
32
+ await provider.connect();
33
+ });
34
+ afterAll(async () => {
35
+ if (provider.isConnected()) {
36
+ await provider.disconnect();
37
+ }
38
+ });
39
+ it('should connect to Neo4j', () => {
40
+ expect(provider.isConnected()).toBe(true);
41
+ });
42
+ it('should be able to run a cypher query', async () => {
43
+ const driver = provider.getDriver();
44
+ const session = driver.session();
45
+ const result = await session.run('RETURN 1 as val');
46
+ const val = result.records[0]?.get('val');
47
+ expect(val.toNumber()).toBe(1);
48
+ await session.close();
49
+ });
50
+ });
51
+ describe('RedisProvider', () => {
52
+ let provider;
53
+ beforeAll(async () => {
54
+ provider = new RedisProvider(redisConfig);
55
+ await provider.connect();
56
+ });
57
+ afterAll(async () => {
58
+ if (provider.isConnected()) {
59
+ await provider.disconnect();
60
+ }
61
+ });
62
+ it('should connect to Redis', () => {
63
+ expect(provider.isConnected()).toBe(true);
64
+ });
65
+ it('should be able to set and get a value', async () => {
66
+ const redis = provider.getDriver();
67
+ await redis.set('test_key', 'test_value');
68
+ const val = await redis.get('test_key');
69
+ expect(val).toBe('test_value');
70
+ });
71
+ });
72
+ });
73
+ //# sourceMappingURL=bridge.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/bridge.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { IPostgresConfig, INeo4jConfig, IRedisConfig } from '../../interfaces/database.config.interface.js';
2
+ export declare const postgresConfig: IPostgresConfig;
3
+ export declare const neo4jConfig: INeo4jConfig;
4
+ export declare const redisConfig: IRedisConfig;
5
+ //# sourceMappingURL=config.example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.example.d.ts","sourceRoot":"","sources":["../../../src/test/integration/config.example.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,+CAA+C,CAAC;AAEvD,eAAO,MAAM,cAAc,EAAE,eAO5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,YAMzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,YAGzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const postgresConfig = {
2
+ host: 'localhost',
3
+ port: 5432,
4
+ username: 'user',
5
+ password: 'password',
6
+ database: 'bridge_test',
7
+ synchronize: true,
8
+ };
9
+ export const neo4jConfig = {
10
+ url: 'bolt://localhost:7687',
11
+ authToken: {
12
+ principal: 'neo4j',
13
+ credentials: 'password',
14
+ },
15
+ };
16
+ export const redisConfig = {
17
+ host: 'localhost',
18
+ port: 6379,
19
+ };
20
+ //# sourceMappingURL=config.example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.example.js","sourceRoot":"","sources":["../../../src/test/integration/config.example.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,aAAa;IACvB,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,GAAG,EAAE,uBAAuB;IAC5B,SAAS,EAAE;QACT,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,UAAU;KACxB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;CACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=neo4j.provider.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j.provider.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/neo4j.provider.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect, jest, beforeEach, afterEach } from '@jest/globals';
2
+ import { Neo4jProvider } from '../../providers/neo4j.provider.js';
3
+ import { InternalServerError } from '@volontariapp/errors';
4
+ import neo4j from 'neo4j-driver';
5
+ describe('Neo4jProvider Unit Tests', () => {
6
+ let provider;
7
+ const config = {
8
+ url: 'bolt://localhost:7687',
9
+ authToken: {
10
+ principal: 'neo4j',
11
+ credentials: 'password',
12
+ },
13
+ config: { maxConnectionPoolSize: 100 },
14
+ };
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+ provider = new Neo4jProvider(config);
18
+ });
19
+ afterEach(() => {
20
+ jest.restoreAllMocks();
21
+ });
22
+ describe('connect', () => {
23
+ it('should instantiate Driver, call verifyConnectivity and set connected to true', async () => {
24
+ const verifyMock = jest.fn().mockResolvedValue(undefined);
25
+ jest
26
+ .spyOn(neo4j, 'driver')
27
+ .mockReturnValue({ verifyConnectivity: verifyMock });
28
+ await provider.connect();
29
+ expect(provider.isConnected()).toBe(true);
30
+ expect(verifyMock).toHaveBeenCalled();
31
+ });
32
+ it('should not initialize again if already connected', async () => {
33
+ const verifyMock = jest.fn().mockResolvedValue(undefined);
34
+ jest
35
+ .spyOn(neo4j, 'driver')
36
+ .mockReturnValue({ verifyConnectivity: verifyMock });
37
+ await provider.connect();
38
+ verifyMock.mockClear();
39
+ await provider.connect();
40
+ expect(verifyMock).not.toHaveBeenCalled();
41
+ });
42
+ it('should throw InternalServerError when connection fails', async () => {
43
+ const verifyMock = jest.fn().mockRejectedValue(new Error('Connection Failed'));
44
+ jest
45
+ .spyOn(neo4j, 'driver')
46
+ .mockReturnValue({ verifyConnectivity: verifyMock });
47
+ await expect(provider.connect()).rejects.toThrow(InternalServerError);
48
+ });
49
+ });
50
+ describe('disconnect', () => {
51
+ it('should do nothing if not connected', async () => {
52
+ await provider.disconnect();
53
+ expect(provider.isConnected()).toBe(false);
54
+ });
55
+ it('should close the driver and set connected to false', async () => {
56
+ const verifyMock = jest.fn().mockResolvedValue(undefined);
57
+ const closeMock = jest.fn().mockResolvedValue(undefined);
58
+ jest.spyOn(neo4j, 'driver').mockReturnValue({
59
+ verifyConnectivity: verifyMock,
60
+ close: closeMock,
61
+ });
62
+ await provider.connect();
63
+ await provider.disconnect();
64
+ expect(closeMock).toHaveBeenCalled();
65
+ expect(provider.isConnected()).toBe(false);
66
+ expect(() => provider.getDriver()).toThrow(InternalServerError);
67
+ });
68
+ it('should throw InternalServerError when disconnection fails', async () => {
69
+ const verifyMock = jest.fn().mockResolvedValue(undefined);
70
+ const closeMock = jest.fn().mockRejectedValue(new Error('Disconnection Failed'));
71
+ jest.spyOn(neo4j, 'driver').mockReturnValue({
72
+ verifyConnectivity: verifyMock,
73
+ close: closeMock,
74
+ });
75
+ await provider.connect();
76
+ await expect(provider.disconnect()).rejects.toThrow(InternalServerError);
77
+ });
78
+ });
79
+ describe('getDriver', () => {
80
+ it('should throw InternalServerError if not connected', () => {
81
+ expect(() => provider.getDriver()).toThrow(InternalServerError);
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=neo4j.provider.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j.provider.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/neo4j.provider.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=postgres.provider.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.provider.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/postgres.provider.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, it, expect, jest, beforeEach, afterEach } from '@jest/globals';
2
+ import { PostgresProvider } from '../../providers/postgres.provider.js';
3
+ import { InternalServerError } from '@volontariapp/errors';
4
+ import { DataSource } from 'typeorm';
5
+ import { postgresConfig } from '../integration/config.example.js';
6
+ describe('PostgresProvider Unit Tests', () => {
7
+ let provider;
8
+ const config = postgresConfig;
9
+ beforeEach(() => {
10
+ jest.clearAllMocks();
11
+ provider = new PostgresProvider(config);
12
+ });
13
+ afterEach(() => {
14
+ jest.restoreAllMocks();
15
+ });
16
+ describe('connect', () => {
17
+ it('should initialize data source and set connected status to true', async () => {
18
+ const initializeSpy = jest
19
+ .spyOn(DataSource.prototype, 'initialize')
20
+ .mockResolvedValue(undefined);
21
+ await provider.connect();
22
+ expect(provider.isConnected()).toBe(true);
23
+ expect(initializeSpy).toHaveBeenCalled();
24
+ });
25
+ it('should not initialize again if already connected', async () => {
26
+ const initializeSpy = jest
27
+ .spyOn(DataSource.prototype, 'initialize')
28
+ .mockResolvedValue(undefined);
29
+ await provider.connect();
30
+ initializeSpy.mockClear();
31
+ await provider.connect();
32
+ expect(initializeSpy).not.toHaveBeenCalled();
33
+ });
34
+ it('should throw InternalServerError when connection fails', async () => {
35
+ jest
36
+ .spyOn(DataSource.prototype, 'initialize')
37
+ .mockRejectedValue(new Error('Connection Failed'));
38
+ provider = new PostgresProvider(config);
39
+ await expect(provider.connect()).rejects.toThrow(InternalServerError);
40
+ });
41
+ });
42
+ describe('disconnect', () => {
43
+ it('should do nothing if not connected', async () => {
44
+ const destroySpy = jest
45
+ .spyOn(DataSource.prototype, 'destroy')
46
+ .mockResolvedValue(undefined);
47
+ provider = new PostgresProvider(config);
48
+ await provider.disconnect();
49
+ expect(destroySpy).not.toHaveBeenCalled();
50
+ });
51
+ it('should destroy the data source and set connected to false', async () => {
52
+ jest.spyOn(DataSource.prototype, 'initialize').mockResolvedValue(undefined);
53
+ const destroySpy = jest
54
+ .spyOn(DataSource.prototype, 'destroy')
55
+ .mockResolvedValue(undefined);
56
+ await provider.connect();
57
+ await provider.disconnect();
58
+ expect(destroySpy).toHaveBeenCalled();
59
+ expect(provider.isConnected()).toBe(false);
60
+ });
61
+ it('should throw InternalServerError when disconnection fails', async () => {
62
+ jest.spyOn(DataSource.prototype, 'initialize').mockResolvedValue(undefined);
63
+ jest
64
+ .spyOn(DataSource.prototype, 'destroy')
65
+ .mockRejectedValue(new Error('Disconnection Failed'));
66
+ await provider.connect();
67
+ await expect(provider.disconnect()).rejects.toThrow(InternalServerError);
68
+ });
69
+ });
70
+ describe('getDriver', () => {
71
+ it('should throw InternalServerError if not connected', () => {
72
+ expect(() => provider.getDriver()).toThrow(InternalServerError);
73
+ });
74
+ });
75
+ });
76
+ //# sourceMappingURL=postgres.provider.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.provider.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/postgres.provider.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=redis.provider.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.provider.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/redis.provider.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ import { describe, it, expect, jest, beforeEach, afterEach } from '@jest/globals';
2
+ import { RedisProvider } from '../../providers/redis.provider.js';
3
+ import { InternalServerError } from '@volontariapp/errors';
4
+ import { Redis } from 'ioredis';
5
+ describe('RedisProvider Unit Tests', () => {
6
+ let provider;
7
+ const config = {
8
+ host: 'localhost',
9
+ port: 6379,
10
+ };
11
+ beforeEach(() => {
12
+ jest.clearAllMocks();
13
+ provider = new RedisProvider(config);
14
+ });
15
+ afterEach(() => {
16
+ jest.restoreAllMocks();
17
+ });
18
+ describe('connect', () => {
19
+ it('should instantiate Redis, call connect and set connected status to true', async () => {
20
+ const connectSpy = jest
21
+ .spyOn(Redis.prototype, 'connect')
22
+ .mockResolvedValue(undefined);
23
+ await provider.connect();
24
+ expect(provider.isConnected()).toBe(true);
25
+ expect(connectSpy).toHaveBeenCalled();
26
+ });
27
+ it('should not initialize again if already connected', async () => {
28
+ const connectSpy = jest
29
+ .spyOn(Redis.prototype, 'connect')
30
+ .mockResolvedValue(undefined);
31
+ await provider.connect();
32
+ connectSpy.mockClear();
33
+ await provider.connect();
34
+ expect(connectSpy).not.toHaveBeenCalled();
35
+ });
36
+ it('should throw InternalServerError when connection fails', async () => {
37
+ jest.spyOn(Redis.prototype, 'connect').mockRejectedValue(new Error('Connection Failed'));
38
+ await expect(provider.connect()).rejects.toThrow(InternalServerError);
39
+ });
40
+ });
41
+ describe('disconnect', () => {
42
+ it('should do nothing if not connected', async () => {
43
+ const quitSpy = jest.spyOn(Redis.prototype, 'quit').mockResolvedValue('OK');
44
+ await provider.disconnect();
45
+ expect(quitSpy).not.toHaveBeenCalled();
46
+ expect(provider.isConnected()).toBe(false);
47
+ });
48
+ it('should quit the redis instance and set connected to false', async () => {
49
+ jest.spyOn(Redis.prototype, 'connect').mockResolvedValue(undefined);
50
+ const quitSpy = jest.spyOn(Redis.prototype, 'quit').mockResolvedValue('OK');
51
+ await provider.connect();
52
+ await provider.disconnect();
53
+ expect(quitSpy).toHaveBeenCalled();
54
+ expect(provider.isConnected()).toBe(false);
55
+ expect(() => provider.getDriver()).toThrow(InternalServerError);
56
+ });
57
+ it('should throw InternalServerError when disconnection fails', async () => {
58
+ jest.spyOn(Redis.prototype, 'connect').mockResolvedValue(undefined);
59
+ jest.spyOn(Redis.prototype, 'quit').mockRejectedValue(new Error('Disconnection Failed'));
60
+ await provider.connect();
61
+ await expect(provider.disconnect()).rejects.toThrow(InternalServerError);
62
+ });
63
+ });
64
+ describe('getDriver', () => {
65
+ it('should throw InternalServerError if not connected', () => {
66
+ expect(() => provider.getDriver()).toThrow(InternalServerError);
67
+ });
68
+ });
69
+ });
70
+ //# sourceMappingURL=redis.provider.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.provider.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/redis.provider.unit.spec.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@volontariapp/bridge",
3
+ "version": "0.1.0-next.20260408104813",
4
+ "publishConfig": {
5
+ "access": "public",
6
+ "provenance": true
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Volontariapp/npm-packages.git"
11
+ },
12
+ "description": "",
13
+ "license": "UNLICENSED",
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "engines": {
27
+ "node": ">=24.14.0"
28
+ },
29
+ "scripts": {
30
+ "prepublishOnly": "yarn build",
31
+ "build": "tsc -p tsconfig.json",
32
+ "lint": "eslint src/",
33
+ "test": "node --experimental-vm-modules $(yarn bin jest)",
34
+ "test:watch": "node --experimental-vm-modules $(yarn bin jest) --watch"
35
+ },
36
+ "devDependencies": {
37
+ "@jest/globals": "^30.3.0",
38
+ "@types/jest": "^30.0.0",
39
+ "@types/pg": "^8",
40
+ "jest": "^30.3.0",
41
+ "ts-jest": "^29.4.9",
42
+ "ts-node": "^10.9.2",
43
+ "typescript": "5.7.3"
44
+ },
45
+ "dependencies": {
46
+ "@types/geojson": "^7946.0.16",
47
+ "@volontariapp/errors": "0.2.0",
48
+ "ioredis": "^5.10.1",
49
+ "neo4j-driver": "^6.0.1",
50
+ "pg": "^8.20.0",
51
+ "reflect-metadata": "^0.2.2",
52
+ "typeorm": "^0.3.28"
53
+ }
54
+ }