diff --git a/.gitignore b/.gitignore index d23d9c1..b92bfe3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /node_modules bun.lock .env +.vscode diff --git a/config/cassandra.ts b/config/cassandra.ts new file mode 100644 index 0000000..06e088b --- /dev/null +++ b/config/cassandra.ts @@ -0,0 +1,12 @@ +export const cassandra: CassandraConfig = { + host: process.env.CASSANDRA_HOST || "localhost", + port: Number.parseInt(process.env.CASSANDRA_PORT || "9042", 10), + keyspace: process.env.CASSANDRA_KEYSPACE || "void_db", + username: process.env.CASSANDRA_USERNAME || "", + password: process.env.CASSANDRA_PASSWORD || "", + datacenter: process.env.CASSANDRA_DATACENTER || "", + contactPoints: (process.env.CASSANDRA_CONTACT_POINTS || "localhost").split( + ",", + ), + authEnabled: process.env.CASSANDRA_AUTH_ENABLED !== "false", +}; diff --git a/config/environment.ts b/config/environment.ts deleted file mode 100644 index 32938f3..0000000 --- a/config/environment.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { logger } from "@creations.works/logger"; - -const environment: Environment = { - port: Number.parseInt(process.env.PORT || "", 10), - host: process.env.HOST || "0.0.0.0", - development: - process.env.NODE_ENV === "development" || process.argv.includes("--dev"), -}; - -const redisTtl: number = process.env.REDIS_TTL - ? Number.parseInt(process.env.REDIS_TTL, 10) - : 60 * 60 * 1; // 1 hour - -const cassandra: CassandraConfig = { - host: process.env.CASSANDRA_HOST || "localhost", - port: Number.parseInt(process.env.CASSANDRA_PORT || "9042", 10), - keyspace: process.env.CASSANDRA_KEYSPACE || "void_db", - username: process.env.CASSANDRA_USERNAME || "", - password: process.env.CASSANDRA_PASSWORD || "", - datacenter: process.env.CASSANDRA_DATACENTER || "", - contactPoints: (process.env.CASSANDRA_CONTACT_POINTS || "localhost").split( - ",", - ), - authEnabled: process.env.CASSANDRA_AUTH_ENABLED === "false", -}; - -const jwt: JWTConfig = { - secret: process.env.JWT_SECRET || "", - expiration: process.env.JWT_EXPIRATION || "1h", - issuer: process.env.JWT_ISSUER || "", - algorithm: process.env.JWT_ALGORITHM || "HS256", -}; - -function verifyRequiredVariables(): void { - const requiredVariables = [ - "HOST", - "PORT", - - "REDIS_URL", - "REDIS_TTL", - - "CASSANDRA_HOST", - "CASSANDRA_PORT", - "CASSANDRA_CONTACT_POINTS", - "CASSANDRA_AUTH_ENABLED", - "CASSANDRA_DATACENTER", - - "JWT_SECRET", - "JWT_EXPIRATION", - "JWT_ISSUER", - ]; - - let hasError = false; - - for (const key of requiredVariables) { - const value = process.env[key]; - if (value === undefined || value.trim() === "") { - logger.error(`Missing or empty environment variable: ${key}`); - hasError = true; - } - } - - if (hasError) { - process.exit(1); - } -} - -export { environment, cassandra, redisTtl, verifyRequiredVariables, jwt }; diff --git a/config/index.ts b/config/index.ts new file mode 100644 index 0000000..861117a --- /dev/null +++ b/config/index.ts @@ -0,0 +1,48 @@ +import { logger } from "@creations.works/logger"; + +const environment: Environment = { + port: Number.parseInt(process.env.PORT || "", 10), + host: process.env.HOST || "0.0.0.0", + development: + process.env.NODE_ENV === "development" || process.argv.includes("--dev"), +}; + +function verifyRequiredVariables(): void { + const requiredVariables = [ + "HOST", + "PORT", + + "REDIS_URL", + "REDIS_TTL", + + "CASSANDRA_HOST", + "CASSANDRA_PORT", + "CASSANDRA_CONTACT_POINTS", + "CASSANDRA_AUTH_ENABLED", + "CASSANDRA_DATACENTER", + + "JWT_SECRET", + "JWT_EXPIRATION", + "JWT_ISSUER", + ]; + + let hasError = false; + + for (const key of requiredVariables) { + const value = process.env[key]; + if (value === undefined || value.trim() === "") { + logger.error(`Missing or empty environment variable: ${key}`); + hasError = true; + } + } + + if (hasError) { + process.exit(1); + } +} + +export * from "@config/cassandra"; +export * from "@config/jwt"; +export * from "@config/redis"; + +export { environment, verifyRequiredVariables }; diff --git a/config/jwt.ts b/config/jwt.ts new file mode 100644 index 0000000..5751dd0 --- /dev/null +++ b/config/jwt.ts @@ -0,0 +1,6 @@ +export const jwt: JWTConfig = { + secret: process.env.JWT_SECRET || "", + expiration: process.env.JWT_EXPIRATION || "1h", + issuer: process.env.JWT_ISSUER || "", + algorithm: process.env.JWT_ALGORITHM || "HS256", +}; diff --git a/config/redis.ts b/config/redis.ts new file mode 100644 index 0000000..8721478 --- /dev/null +++ b/config/redis.ts @@ -0,0 +1,3 @@ +export const redisTtl: number = process.env.REDIS_TTL + ? Number.parseInt(process.env.REDIS_TTL, 10) + : 60 * 60 * 1; // 1 hour diff --git a/config/setup/index.ts b/config/setup/index.ts index ea13288..c8a7637 100644 --- a/config/setup/index.ts +++ b/config/setup/index.ts @@ -1,10 +1,7 @@ import { readdir } from "node:fs/promises"; import { extname, join, resolve } from "node:path"; import { pathToFileURL } from "node:url"; -import { - cassandra as cassandraConfig, - verifyRequiredVariables, -} from "@config/environment"; +import { cassandra as cassandraConfig, verifyRequiredVariables } from "@config"; import { logger } from "@creations.works/logger"; import { cassandra } from "@lib/cassandra"; diff --git a/src/index.ts b/src/index.ts index 432e6a8..ed44a26 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { serverHandler } from "@/server"; -import { verifyRequiredVariables } from "@config/environment"; +import { verifyRequiredVariables } from "@config"; import { logger } from "@creations.works/logger"; import { cassandra } from "@lib/cassandra"; import { redis } from "bun"; diff --git a/src/lib/cassandra.ts b/src/lib/cassandra.ts index eddec13..4bd9943 100644 --- a/src/lib/cassandra.ts +++ b/src/lib/cassandra.ts @@ -1,4 +1,4 @@ -import { cassandra as config } from "@config/environment"; +import { cassandra as config } from "@config"; import { logger } from "@creations.works/logger"; import { Client, auth } from "cassandra-driver"; diff --git a/src/lib/jwt.ts b/src/lib/jwt.ts index 1ca24dd..cf857a0 100644 --- a/src/lib/jwt.ts +++ b/src/lib/jwt.ts @@ -1,4 +1,4 @@ -import { environment, jwt } from "@config/environment"; +import { environment, jwt } from "@config"; import { redis } from "bun"; import { createDecoder, createSigner, createVerifier } from "fast-jwt"; diff --git a/src/routes/user/delete.ts b/src/routes/user/delete.ts new file mode 100644 index 0000000..f698656 --- /dev/null +++ b/src/routes/user/delete.ts @@ -0,0 +1 @@ +// TODO: add after every other kinda of data related to the user diff --git a/src/server.ts b/src/server.ts index 3bb20c7..b2e522b 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,5 +1,5 @@ import { resolve } from "node:path"; -import { environment } from "@config/environment"; +import { environment } from "@config"; import { logger } from "@creations.works/logger"; import { jsonResponse } from "@lib/http"; import { diff --git a/tsconfig.json b/tsconfig.json index 7b46a11..391e2c9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "baseUrl": "./", "paths": { "@/*": ["src/*"], + "@config": ["config/index.ts"], "@config/*": ["config/*"], "@types/*": ["types/*"], "@lib/*": ["src/lib/*"]