diff --git a/.env.development b/.env.development index bb1272e..7e1bcb5 100644 --- a/.env.development +++ b/.env.development @@ -4,11 +4,11 @@ CORS_ORIGIN=http://localhost:5173 JWT_SECRET=supersecretjwtkeythatislongandsecure JWT_EXPIRES_IN=7d -DB_HOST=127.0.0.1 +DB_HOST=106.51.105.22 DB_PORT=5432 -DB_USER=postgres -DB_PASS=Liyaqath@7890 -DB_NAME=Pim_Maskan +DB_NAME=pc_dev +DB_USER=pc_user +DB_PASSWORD="#TpW@%a&b$[zm" DB_DIALECT=postgres # IMPORTANT: Gmail SMTP requires an App Password, NOT your regular password. diff --git a/.env.local b/.env.local index bb1272e..ad9d794 100644 --- a/.env.local +++ b/.env.local @@ -1,14 +1,14 @@ PORT=5000 -NODE_ENV=development +NODE_ENV=local CORS_ORIGIN=http://localhost:5173 JWT_SECRET=supersecretjwtkeythatislongandsecure JWT_EXPIRES_IN=7d -DB_HOST=127.0.0.1 +DB_HOST=106.51.105.22 DB_PORT=5432 -DB_USER=postgres -DB_PASS=Liyaqath@7890 -DB_NAME=Pim_Maskan +DB_NAME=pc_local +DB_USER=pc_user +DB_PASSWORD="#TpW@%a&b$[zm" DB_DIALECT=postgres # IMPORTANT: Gmail SMTP requires an App Password, NOT your regular password. diff --git a/.env.test b/.env.test index 67fdab2..fe155b0 100644 --- a/.env.test +++ b/.env.test @@ -4,11 +4,11 @@ CORS_ORIGIN=http://localhost:5173 JWT_SECRET=supersecretjwtkeythatislongandsecure JWT_EXPIRES_IN=7d -DB_HOST=127.0.0.1 +DB_HOST=106.51.105.22 DB_PORT=5432 -DB_USER=postgres -DB_PASS=Liyaqath@7890 -DB_NAME=Pim_Maskan_Test +DB_NAME=pc_test +DB_USER=pc_user +DB_PASSWORD="#TpW@%a&b$[zm" DB_DIALECT=postgres # IMPORTANT: Gmail SMTP requires an App Password, NOT your regular password. diff --git a/index.js b/index.js index 786de1d..183c7bf 100644 --- a/index.js +++ b/index.js @@ -5,8 +5,8 @@ import { connectDatabase } from './src/shared/database/connection.js'; import { SocketService } from './src/shared/services/socket.service.js'; // Load environment variables -dotenv.config(); - +const env = process.env.NODE_ENV || 'local'; +dotenv.config({ path: `.env.${env}` }); const PORT = process.env.PORT || 5000; async function bootstrap() { diff --git a/logs/.3fa4d5e91883ce1217f62a49f94203b42caa131d-audit.json b/logs/.3fa4d5e91883ce1217f62a49f94203b42caa131d-audit.json index 9add8df..e07c2da 100644 --- a/logs/.3fa4d5e91883ce1217f62a49f94203b42caa131d-audit.json +++ b/logs/.3fa4d5e91883ce1217f62a49f94203b42caa131d-audit.json @@ -14,6 +14,16 @@ "date": 1782968983048, "name": "logs\\combined-2026-07-02.log", "hash": "10138c0f35436a800870f14a317b542645e7976bcd44030300d436a715a20c36" + }, + { + "date": 1783058300242, + "name": "logs\\combined-2026-07-03.log", + "hash": "a0e79e7be8f5ef13f7e6e8483c8bb663b1c7ddeb1eaa188152cda3f015df5203" + }, + { + "date": 1783142857411, + "name": "logs\\combined-2026-07-04.log", + "hash": "df5726dddf64ecbb358dc871efc7f6fa558f95b33fec683e6eef801c4d9f7e4a" } ], "hashType": "sha256" diff --git a/logs/.944c2a6e38c8046075bb4cb64c11b1f8d919853c-audit.json b/logs/.944c2a6e38c8046075bb4cb64c11b1f8d919853c-audit.json index 89c0263..ce5cf73 100644 --- a/logs/.944c2a6e38c8046075bb4cb64c11b1f8d919853c-audit.json +++ b/logs/.944c2a6e38c8046075bb4cb64c11b1f8d919853c-audit.json @@ -14,6 +14,16 @@ "date": 1782968983045, "name": "logs\\error-2026-07-02.log", "hash": "bf64fe21cbfba23af08772bef924ee896b52bcbf80bb4e87b6f7c5fb125e38aa" + }, + { + "date": 1783058300224, + "name": "logs\\error-2026-07-03.log", + "hash": "9d7b2b6bae80886841b6c099d2312d2fe37fd6e58d4eb934668e9c62e4e38bc1" + }, + { + "date": 1783142857406, + "name": "logs\\error-2026-07-04.log", + "hash": "7d2caa5cd525a8a119155e3c48baeded2d8741b61d934b266de04b9140095740" } ], "hashType": "sha256" diff --git a/package-lock.json b/package-lock.json index df7569a..bf8e18a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "nodemailer": "^9.0.3", "pg": "^8.13.1", "pg-hstore": "^2.3.4", - "sequelize": "^6.37.5", + "sequelize": "^6.37.8", "socket.io": "^4.8.1", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", @@ -30,6 +30,7 @@ "winston-daily-rotate-file": "^5.0.0" }, "devDependencies": { + "cross-env": "^10.1.0", "nodemon": "^3.1.9", "sequelize-cli": "^6.6.2" }, @@ -105,6 +106,13 @@ "kuler": "^2.0.0" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -875,6 +883,24 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2320,6 +2346,13 @@ "fn.name": "1.x.x" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", diff --git a/package.json b/package.json index 0e2a2c3..90ce6f1 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,18 @@ "main": "index.js", "type": "module", "scripts": { - "start": "node index.js", - "dev": "nodemon index.js", - "db:migrate": "sequelize-cli db:migrate --config src/shared/config/database.config.cjs --migrations-path src/migrations --models-path src/shared/database", - "db:seed": "sequelize-cli db:seed:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database", - "db:rollback": "sequelize-cli db:migrate:undo --config src/shared/config/database.config.cjs --migrations-path src/migrations --models-path src/shared/database" + "start": "cross-env NODE_ENV=production node index.js", + "dev": "cross-env NODE_ENV=development nodemon index.js", + "start:local": "cross-env NODE_ENV=local nodemon index.js", + "db:migrate:local": "cross-env NODE_ENV=local sequelize-cli db:migrate --config src/shared/config/database.config.cjs --migrations-path src/migrations --models-path src/shared/database", + "db:seed:local": "cross-env NODE_ENV=local sequelize-cli db:seed:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database", + "db:seed:undo:local": "cross-env NODE_ENV=local sequelize-cli db:seed:undo:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database", + "db:migrate:dev": "cross-env NODE_ENV=development sequelize-cli db:migrate --config src/shared/config/database.config.cjs --migrations-path src/migrations --models-path src/shared/database", + "db:seed:dev": "cross-env NODE_ENV=development sequelize-cli db:seed:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database", + "db:seed:undo:dev": "cross-env NODE_ENV=development sequelize-cli db:seed:undo:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database", + "db:migrate:test": "cross-env NODE_ENV=test sequelize-cli db:migrate --config src/shared/config/database.config.cjs --migrations-path src/migrations --models-path src/shared/database", + "db:seed:test": "cross-env NODE_ENV=test sequelize-cli db:seed:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database", + "db:seed:undo:test": "cross-env NODE_ENV=test sequelize-cli db:seed:undo:all --config src/shared/config/database.config.cjs --seeders-path src/seeders --models-path src/shared/database" }, "dependencies": { "bcrypt": "^6.0.0", @@ -26,7 +33,7 @@ "nodemailer": "^9.0.3", "pg": "^8.13.1", "pg-hstore": "^2.3.4", - "sequelize": "^6.37.5", + "sequelize": "^6.37.8", "socket.io": "^4.8.1", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", @@ -34,6 +41,7 @@ "winston-daily-rotate-file": "^5.0.0" }, "devDependencies": { + "cross-env": "^10.1.0", "nodemon": "^3.1.9", "sequelize-cli": "^6.6.2" }, diff --git a/src/shared/config/database.config.cjs b/src/shared/config/database.config.cjs index 221c0f5..afc7ccb 100644 --- a/src/shared/config/database.config.cjs +++ b/src/shared/config/database.config.cjs @@ -1,38 +1,60 @@ -const dotenv = require('dotenv'); -dotenv.config(); +const dotenv = require("dotenv"); + +const env = process.env.NODE_ENV || "local"; + +dotenv.config({ + path: `.env.${env}`, +}); + +const rawDbPass = process.env.DB_PASSWORD || process.env.DB_PASS; +const dbPassword = rawDbPass + ? rawDbPass.replace(/^['"]|['"]$/g, "") + : "postgres"; module.exports = { + local: { + username: process.env.DB_USER || "postgres", + password: dbPassword, + database: process.env.DB_NAME_LOCAL || process.env.DB_NAME || "maskan_pim", + host: process.env.DB_HOST || "127.0.0.1", + port: process.env.DB_PORT || 5432, + dialect: process.env.DB_DIALECT || "postgres", + logging: console.log, + }, + development: { - username: process.env.DB_USER || 'postgres', - password: process.env.DB_PASS || 'postgres', - database: process.env.DB_NAME || 'maskan_pim', - host: process.env.DB_HOST || '127.0.0.1', + username: process.env.DB_USER || "postgres", + password: dbPassword, + database: process.env.DB_NAME_DEV || process.env.DB_NAME || "maskan_pim", + host: process.env.DB_HOST || "127.0.0.1", port: process.env.DB_PORT || 5432, - dialect: process.env.DB_DIALECT || 'postgres', - logging: console.log + dialect: process.env.DB_DIALECT || "postgres", + logging: console.log, }, + test: { - username: process.env.DB_USER || 'postgres', - password: process.env.DB_PASS || 'postgres', - database: process.env.DB_NAME_TEST || 'maskan_pim_test', - host: process.env.DB_HOST || '127.0.0.1', + username: process.env.DB_USER || "postgres", + password: dbPassword, + database: process.env.DB_NAME_TEST || process.env.DB_NAME || "maskan_pim_test", + host: process.env.DB_HOST || "127.0.0.1", port: process.env.DB_PORT || 5432, - dialect: process.env.DB_DIALECT || 'postgres', - logging: false + dialect: process.env.DB_DIALECT || "postgres", + logging: false, }, + production: { username: process.env.DB_USER, - password: process.env.DB_PASS, + password: dbPassword, database: process.env.DB_NAME, host: process.env.DB_HOST, port: process.env.DB_PORT, - dialect: process.env.DB_DIALECT || 'postgres', + dialect: process.env.DB_DIALECT || "postgres", logging: false, pool: { max: 5, min: 0, acquire: 30000, - idle: 10000 - } - } -}; + idle: 10000, + }, + }, +}; \ No newline at end of file diff --git a/src/shared/database/connection.js b/src/shared/database/connection.js index 4540dd3..ecb4af1 100644 --- a/src/shared/database/connection.js +++ b/src/shared/database/connection.js @@ -2,7 +2,7 @@ import { Sequelize } from 'sequelize'; import dbConfig from '../config/database.config.cjs'; import { initializeDatabaseModels } from './models.js'; -const env = process.env.NODE_ENV || 'development'; +const env = process.env.NODE_ENV || 'local'; const config = dbConfig[env]; let sequelize; @@ -26,7 +26,7 @@ export const connectDatabase = async () => { await sequelize.authenticate(); console.log('Database connection has been established successfully.'); - if (env === 'development' || env === 'test') { + if (env === 'local' || env === 'development' || env === 'test') { await sequelize.sync({ alter: true }); console.log('Database schema synced successfully.');