Skip to content

Commit b81b245

Browse files
committed
Added neo4j Config + some fixes overall
1 parent 9d501bf commit b81b245

14 files changed

+130
-6
lines changed

.env.sample

+10
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ export MONGO_STOP_GRACE_PERIOD='3m30s'
7474
export MONGO_SERVICE_DIR_NAME='mongo'
7575
export MONGO_HOST_SERVICE_DIR='./services/mongo'
7676

77+
# ======================================================================= #
78+
# Neo #
79+
# ======================================================================= #
80+
export NEO4J_CONNECTION_SCHEME='neo4j'
81+
export NEO4J_HOST='127.0.0.1'
82+
export NEO4J_SERVICE_PORT_MAP='7687:7687'
83+
export NEO4J_SERVICE_PORT_EXPOSE='7687'
84+
export NEO4J_USERNAME='neo4j'
85+
export NEO4J_PASSWORD='veryinsecure'
86+
# TODO: Add container configuration
7787

7888
# ======================================================================= #
7989
# Password Hash: Argon2 #

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"ioredis": "^5.4.1",
4545
"joi": "^17.13.1",
4646
"mongoose": "^8.4.0",
47+
"neo4j-driver": "^5.20.0",
4748
"nestjs-i18n": "^10.4.5",
4849
"pg": "^8.11.5",
4950
"reflect-metadata": "^0.2.0",

src/app.module.ts

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { OutInterceptor } from "@/base/interceptors/out.interceptor";
88
import developmentSchema from "@/config/env/schema.development";
99
import productionSchema from "@/config/env/schema.production";
1010
import { MongoConfigModule } from "@/config/mongo/mongo.config.module";
11+
import { Neo4JConfigModule } from "@/config/neo4j/neo4j.config.module";
1112
import { PostgresConfigModule } from "@/config/postgres/postgres.config.module";
1213
import { RedisConfigModule } from "@/config/redis/redis.config.module";
1314

@@ -37,6 +38,7 @@ import { RedisConfigModule } from "@/config/redis/redis.config.module";
3738
PostgresConfigModule,
3839
RedisConfigModule,
3940
MongoConfigModule,
41+
Neo4JConfigModule,
4042
],
4143
controllers: [],
4244
providers: [

src/base/types/global.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
2+
namespace NodeJS {
3+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
4+
interface ProcessEnv {
5+
NODE_ENV: "development" | "production";
6+
}
7+
}

src/config/env/schema.development.ts

+8
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,12 @@ export default Joi.object({
3232
MONGO_INITDB_DATABASE: Joi.string(),
3333
MONGO_SERVICE_PORT_MAP: Joi.string().pattern(SERVICE_PORT_MAP_REGEX),
3434
MONGO_SERVICE_PORT_EXPOSE: Joi.number().greater(1023),
35+
36+
// ** ============================= Neo ============================= ** //
37+
NEO4J_CONNECTION_SCHEME: Joi.string().valid("neo4j", "neo4j+s", "bolt", "bolt+s"),
38+
NEO4J_HOST: Joi.string().valid("localhost", "127.0.0.1"),
39+
NEO4J_SERVICE_PORT_MAP: Joi.string().pattern(SERVICE_PORT_MAP_REGEX),
40+
NEO4J_SERVICE_PORT_EXPOSE: Joi.number().greater(1023),
41+
NEO4J_USERNAME: Joi.string(),
42+
NEO4J_PASSWORD: Joi.string(),
3543
});

src/config/mongo/environment.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace NodeJS {
1010

1111
MONGO_SERVICE_NAME: string;
1212
MONGO_RESTART_POLICY: string;
13-
MONGO_SERVICE_PORT_MAP: string;
13+
MONGO_SERVICE_PORT_MAP: `${number}:${number}`;
1414
MONGO_SERVICE_PORT_EXPOSE: string;
1515
MONGO_SERVICE_DIR_NAME: string;
1616
}

src/config/neo4j/.keep

Whitespace-only changes.

src/config/neo4j/environment.d.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
// eslint-disable-next-line @typescript-eslint/no-unused-vars
22
namespace NodeJS {
33
// eslint-disable-next-line @typescript-eslint/no-unused-vars
4-
interface ProcessEnv {}
4+
interface ProcessEnv {
5+
NEO4J_CONNECTION_SCHEME: "neo4j" | "bolt";
6+
NEO4J_HOST: string;
7+
NEO4J_SERVICE_PORT_MAP: `${number}:${number}`;
8+
NEO4J_SERVICE_PORT_EXPOSE: string | null;
9+
NEO4J_USERNAME: string;
10+
NEO4J_PASSWORD: string;
11+
}
512
}
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Inject, Logger, Module, OnModuleDestroy, OnModuleInit } from "@nestjs/common";
2+
import type { Driver } from "neo4j-driver";
3+
4+
import {
5+
NEO4J_CONFIG_MODULE_CONTEXT,
6+
NEO4J_DRIVER_01,
7+
neo4jProviders,
8+
} from "@/config/neo4j/neo4j.config.provider";
9+
10+
@Module({
11+
providers: [...neo4jProviders],
12+
exports: [...neo4jProviders],
13+
})
14+
export class Neo4JConfigModule implements OnModuleDestroy, OnModuleInit {
15+
constructor(
16+
@Inject(NEO4J_DRIVER_01)
17+
private readonly neoDriver: Driver,
18+
) {}
19+
20+
async onModuleInit() {
21+
await this.neoDriver.executeQuery("RETURN 1");
22+
Logger.log("Connected to Neo", NEO4J_CONFIG_MODULE_CONTEXT);
23+
}
24+
25+
async onModuleDestroy() {
26+
await this.neoDriver.close();
27+
}
28+
}
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Logger, Provider } from "@nestjs/common";
2+
import * as neo4j from "neo4j-driver";
3+
4+
export const NEO4J_DRIVER_01 = "NEO4J_DRIVER_01";
5+
export const NEO4J_CONFIG_MODULE_CONTEXT = "Neo";
6+
7+
export const neo4jProviders: Array<Provider<neo4j.Driver>> = [
8+
{
9+
provide: NEO4J_DRIVER_01,
10+
useFactory: () => {
11+
const {
12+
NEO4J_CONNECTION_SCHEME,
13+
NEO4J_HOST,
14+
NEO4J_SERVICE_PORT_EXPOSE,
15+
NEO4J_SERVICE_PORT_MAP,
16+
NEO4J_USERNAME,
17+
NEO4J_PASSWORD,
18+
} = process.env;
19+
20+
const PORT = NEO4J_SERVICE_PORT_EXPOSE ?? NEO4J_SERVICE_PORT_MAP.split(":")[0];
21+
const URI = `${NEO4J_CONNECTION_SCHEME}://${NEO4J_HOST}:${PORT}`;
22+
23+
try {
24+
const driver = neo4j.driver(
25+
URI,
26+
neo4j.auth.basic(NEO4J_USERNAME, NEO4J_PASSWORD),
27+
);
28+
return driver;
29+
} catch (err) {
30+
Logger.error(
31+
`Encountered an error while trying to instantiate Neo4J driver: '${err}'`,
32+
NEO4J_CONFIG_MODULE_CONTEXT,
33+
);
34+
throw err;
35+
}
36+
},
37+
},
38+
];

src/config/redis/environment.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace NodeJS {
88
REDIS_GENERAL_CACHE_TTL: string;
99
REDIS_USERNAME: string;
1010
REDIS_PASSWORD: string;
11-
REDIS_SERVER_PORT_MAP: string;
11+
REDIS_SERVER_PORT_MAP: `${number}:${number}`;
1212
REDIS_INSIGHT_PORT_MAP: string;
1313
REDIS_SERVER_PORT_EXPOSE: string;
1414
}

src/config/redis/redis.config.module.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
REDIS_CLIENT_01,
66
REDIS_CONFIG_MODULE_CONTEXT,
77
redisProvider,
8-
} from "@/config/redis/redis.config.service";
8+
} from "@/config/redis/redis.config.provider";
99

1010
@Module({
1111
providers: [...redisProvider],

src/config/redis/redis.config.service.ts src/config/redis/redis.config.provider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Logger, type Provider } from "@nestjs/common";
22
import { Redis } from "ioredis";
33

4-
export const REDIS_CLIENT_01 = "REDIS_CLIENT";
4+
export const REDIS_CLIENT_01 = "REDIS_CLIENT_01";
55
export const REDIS_CONFIG_MODULE_CONTEXT = "Redis";
66

77
export const redisProvider: Array<Provider<Redis>> = [

yarn.lock

+24-1
Original file line numberDiff line numberDiff line change
@@ -6277,6 +6277,29 @@ neo-async@^2.6.2:
62776277
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
62786278
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
62796279

6280+
6281+
version "5.20.0"
6282+
resolved "https://registry.yarnpkg.com/neo4j-driver-bolt-connection/-/neo4j-driver-bolt-connection-5.20.0.tgz#5b7f662a640e01b19f1e116313d3284d61d887e5"
6283+
integrity sha512-jSF2S/kBJBKGCUsOA0z4HFffVKQnHivSQagU1+lQH2fN2WIWy8iJIBngZWkvUaFIvE54a++WCVjE28CAtyzmPw==
6284+
dependencies:
6285+
buffer "^6.0.3"
6286+
neo4j-driver-core "5.20.0"
6287+
string_decoder "^1.3.0"
6288+
6289+
6290+
version "5.20.0"
6291+
resolved "https://registry.yarnpkg.com/neo4j-driver-core/-/neo4j-driver-core-5.20.0.tgz#5bacdabf17249dc730c5ab2f7c3e7769dedc194f"
6292+
integrity sha512-TJx4MyKPGw+ocev8mo+3MPI4tt7KirHPM/c3Oa6X8s4jvCKucoslld5MoBYRfBXeqqVZL4FfWoFP1pOn9U0HuQ==
6293+
6294+
neo4j-driver@^5.20.0:
6295+
version "5.20.0"
6296+
resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-5.20.0.tgz#2730995bb5380228e0230a85530bfe13a9b8d38a"
6297+
integrity sha512-VCH/ay+fmaGkl5wr6lnDZE/QLFDXzamCtF22QMjPHAcBuwee9PWq0ZbtRlkUfpYVCduWm5HjSNBbNu8SZmUn+A==
6298+
dependencies:
6299+
neo4j-driver-bolt-connection "5.20.0"
6300+
neo4j-driver-core "5.20.0"
6301+
rxjs "^7.8.1"
6302+
62806303
nestjs-i18n@^10.4.5:
62816304
version "10.4.5"
62826305
resolved "https://registry.yarnpkg.com/nestjs-i18n/-/nestjs-i18n-10.4.5.tgz#fbac2441229112a45680cb4d93a179de91cb1478"
@@ -7644,7 +7667,7 @@ string.prototype.trimstart@^1.0.8:
76447667
define-properties "^1.2.1"
76457668
es-object-atoms "^1.0.0"
76467669

7647-
string_decoder@^1.1.1:
7670+
string_decoder@^1.1.1, string_decoder@^1.3.0:
76487671
version "1.3.0"
76497672
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
76507673
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==

0 commit comments

Comments
 (0)