From c0796b9085be0ba74af3ee8d9e4cc5766825b94b Mon Sep 17 00:00:00 2001 From: CapoMK25 Date: Tue, 24 Feb 2026 11:07:22 +0200 Subject: [PATCH 1/3] Configured migrate-mongo as the DB migrations tool --- migrate-mongo-config.js | 27 ++++++++++++++++++ migration-template.js | 15 ++++++++++ package-lock.json | 62 +++++++++++++++++++++++++++++++++++------ package.json | 9 ++++-- src/app.module.ts | 1 + 5 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 migrate-mongo-config.js create mode 100644 migration-template.js diff --git a/migrate-mongo-config.js b/migrate-mongo-config.js new file mode 100644 index 000000000..727fd3644 --- /dev/null +++ b/migrate-mongo-config.js @@ -0,0 +1,27 @@ +require('dotenv').config(); + +const { + MONGO_USERNAME, + MONGO_PASSWORD, + MONGO_HOST, + MONGO_PORT, + MONGO_DB_NAME +} = process.env; + +const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOST}:${MONGO_PORT}/?replicaSet=rs0`; + +const config = { + mongodb: { + url: url, + databaseName: MONGO_DB_NAME, + options: { + } + }, + migrationsDir: "src/database/migrations", + changelogCollectionName: "migrations_changelog", + migrationFileExtension: ".js", + useFileHash: false, + moduleSystem: 'esm', +}; + +module.exports = config; \ No newline at end of file diff --git a/migration-template.js b/migration-template.js new file mode 100644 index 000000000..b98938510 --- /dev/null +++ b/migration-template.js @@ -0,0 +1,15 @@ +/** + * @param db {import('mongodb').Db} + * @param client {import('mongodb').MongoClient} + */ +export const up = async (db, client) => { + // TODO: Write your migration logic here when applicable +}; + +/** + * @param db {import('mongodb').Db} + * @param client {import('mongodb').MongoClient} + */ +export const down = async (db, client) => { + // TODO: Write your rollback logic here when applicable +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8b205f4eb..13e461030 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "ioredis": "5.8.2", "jsonwebtoken": "^9.0.2", "lodash": "4.17.21", + "migrate-mongo": "^14.0.7", "mongodb": "6.20.0", "mongoose": "8.19.4", "mqtt": "5.14.1", @@ -233,6 +234,7 @@ "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -762,7 +764,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -2329,6 +2330,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.9.tgz", "integrity": "sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ==", "license": "MIT", + "peer": true, "dependencies": { "file-type": "21.1.0", "iterare": "1.2.1", @@ -2361,6 +2363,7 @@ "integrity": "sha512-a00B0BM4X+9z+t3UxJqIZlemIwCQdYoPKrMcM+ky4z3pkqqG1eTWexjs+YXpGObnLnjtMPVKWlcZHp3adDYvUw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", @@ -2459,6 +2462,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.9.tgz", "integrity": "sha512-GVd3+0lO0mJq2m1kl9hDDnVrX3Nd4oH3oDfklz0pZEVEVS0KVSp63ufHq2Lu9cyPdSBuelJr9iPm2QQ1yX+Kmw==", "license": "MIT", + "peer": true, "dependencies": { "cors": "2.8.5", "express": "5.1.0", @@ -2647,6 +2651,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-11.1.9.tgz", "integrity": "sha512-kkkdeTVcc3X7ZzvVqUVpOAJoh49kTRUjWNUXo5jmG+27OvZoHfs/vuSiqxidrrbIgydSqN15HUsf1wZwQUrxCQ==", "license": "MIT", + "peer": true, "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", @@ -2960,6 +2965,7 @@ "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -3082,6 +3088,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -3192,6 +3199,7 @@ "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.4", @@ -3232,6 +3240,7 @@ "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.4", "@typescript-eslint/types": "8.46.4", @@ -3961,6 +3970,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4020,6 +4030,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -4486,6 +4497,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -4600,6 +4612,7 @@ "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.63.2.tgz", "integrity": "sha512-c1K5gcAh0a+C9lcRXaA1GePDYtmUywCH1pNXkUlZ8lFlqQnrtKyZpcr5aZJcjyZVx6y7t5259ru+ttJFNUQ5kw==", "license": "MIT", + "peer": true, "dependencies": { "cron-parser": "^4.9.0", "ioredis": "^5.8.2", @@ -4768,6 +4781,7 @@ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -4815,13 +4829,15 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/class-validator": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.2.tgz", "integrity": "sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==", "license": "MIT", + "peer": true, "dependencies": { "@types/validator": "^13.11.8", "libphonenumber-js": "^1.11.1", @@ -4858,7 +4874,6 @@ "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, "license": "MIT", "dependencies": { "string-width": "^4.2.0" @@ -5444,7 +5459,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -5564,6 +5578,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6958,7 +6973,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7147,6 +7161,7 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -8450,6 +8465,34 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/migrate-mongo": { + "version": "14.0.7", + "resolved": "https://registry.npmjs.org/migrate-mongo/-/migrate-mongo-14.0.7.tgz", + "integrity": "sha512-+p7XfJDNaXPTHeo7v/ldYmVLMy8xYda0KMXSqkMUzlVndS39rMGBQHfyLrdmOKMjgciWyWpjekXzRQuj1B7HqA==", + "license": "MIT", + "dependencies": { + "cli-table3": "^0.6.5", + "commander": "^14.0.2" + }, + "bin": { + "migrate-mongo": "bin/migrate-mongo.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "mongodb": "^4.4.1 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/migrate-mongo/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -8531,6 +8574,7 @@ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@mongodb-js/saslprep": "^1.3.0", "bson": "^6.10.4", @@ -8639,6 +8683,7 @@ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.19.4.tgz", "integrity": "sha512-yiY/Wv6FUYDQ4kBN1RQHiYuayQS4k+yzytj4nctMmQiBIXLfJqvw6fRgmvw1rIOmShp7iAbpNt7s2s6TyVOSyA==", "license": "MIT", + "peer": true, "dependencies": { "bson": "^6.10.4", "kareem": "2.6.3", @@ -10090,6 +10135,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -10505,7 +10551,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -10559,7 +10604,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10569,7 +10613,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -11111,6 +11154,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -11258,6 +11302,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11617,6 +11662,7 @@ "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", diff --git a/package.json b/package.json index 688be8bfc..6fe949f52 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,11 @@ "test:watch": "jest --watch", "test:quiet": "DOTENV_CONFIG_QUIET=true jest", "sonar:analize": "docker compose -f sonar_docker-compose.yml up -d && sonar-scanner \\\n -Dsonar.projectKey=AltzoneLocal \\\n -Dsonar.sources=. \\\n -Dsonar.host.url=http://localhost:9000 \\\n -Dsonar.login=sqp_d0d523f9a2cf5e1e8f7587e0da315df0adc86568 \\\n && echo \"Remember to stop the sonar server with: \\n docker compose -f sonar_docker-compose.yml down\"\n", - "prepare": "husky" + "prepare": "husky", + "migrate:create": "migrate-mongo create", + "migrate:up": "migrate-mongo up", + "migrate:down": "migrate-mongo down", + "migrate:status": "migrate-mongo status" }, "keywords": [], "author": "", @@ -47,6 +51,7 @@ "ioredis": "5.8.2", "jsonwebtoken": "^9.0.2", "lodash": "4.17.21", + "migrate-mongo": "^14.0.7", "mongodb": "6.20.0", "mongoose": "8.19.4", "mqtt": "5.14.1", @@ -81,4 +86,4 @@ "typescript": "5.9.3", "typescript-eslint": "8.46.4" } -} \ No newline at end of file +} diff --git a/src/app.module.ts b/src/app.module.ts index 15fad1355..0087ddec6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -70,6 +70,7 @@ const authGuardClassToUse = isTestingSession() ? BoxAuthGuard : AuthGuard; return { uri: mongoString, dbName, + autoIndex: false, }; }, }), From f7e1f0760b4d440fd639053e41f377fcabb2bf30 Mon Sep 17 00:00:00 2001 From: CapoMK25 Date: Tue, 24 Feb 2026 11:38:52 +0200 Subject: [PATCH 2/3] chore: added folder structure and gitkeep --- src/database/migrations/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/database/migrations/.gitkeep diff --git a/src/database/migrations/.gitkeep b/src/database/migrations/.gitkeep new file mode 100644 index 000000000..e69de29bb From 8a5f374d9062f0e7681f0fe0c86b3ad8bd3d72bd Mon Sep 17 00:00:00 2001 From: CapoMK25 Date: Fri, 6 Mar 2026 21:31:51 +0200 Subject: [PATCH 3/3] changed autoindex back to true to accomodate the current scope --- src/app.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.module.ts b/src/app.module.ts index 0087ddec6..22fda1fc1 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -70,7 +70,7 @@ const authGuardClassToUse = isTestingSession() ? BoxAuthGuard : AuthGuard; return { uri: mongoString, dbName, - autoIndex: false, + autoIndex: true, }; }, }),