diff --git a/config/database.js b/config/database.js index ce8d9f8054b..f0fad96e49c 100644 --- a/config/database.js +++ b/config/database.js @@ -1,7 +1,26 @@ +function buildDbUri(baseUri, dbName) { + if (!baseUri) return baseUri; + + const [head, query] = baseUri.split('?', 2); + + const schemeIdx = head.indexOf('://'); + if (schemeIdx === -1) return baseUri; + + const pathIdx = head.indexOf('/', schemeIdx + 3); + const prefix = pathIdx === -1 ? head : head.slice(0, pathIdx); + + const rebuilt = `${prefix}/${dbName}`; + return query ? `${rebuilt}?${query}` : rebuilt; +} + +const DEFAULT_MAIN = 'mongodb://localhost:27017/tiledesk'; +const mainUri = process.env.MONGODB_URI || DEFAULT_MAIN; + module.exports = { - secret:'nodeauthsecret', - schemaVersion: 2111, - database: 'mongodb://localhost:27017/tiledesk', - databaselogs: 'mongodb://localhost:27017/tiledesk-logs', - databasetest: 'mongodb://localhost:27017/tiledesk-test' + buildDbUri, + secret: process.env.JWT_SECRET || 'nodeauthsecret', + schemaVersion: 2111, + database: mainUri, + databaselogs: process.env.MONGODB_URI_LOGS || buildDbUri(mainUri, 'tiledesk-logs'), + databasetest: process.env.MONGODB_URI_TEST || buildDbUri(mainUri, 'tiledesk-test') }; diff --git a/test/config/buildDbUri.test.js b/test/config/buildDbUri.test.js new file mode 100644 index 00000000000..7aed8294086 --- /dev/null +++ b/test/config/buildDbUri.test.js @@ -0,0 +1,39 @@ +const assert = require('assert'); +const { buildDbUri } = require('../../config/database'); + +describe('buildDbUri', () => { + + it('replaces the db name in a standard URI', () => { + const result = buildDbUri('mongodb://localhost:27017/tiledesk', 'tiledesk-logs'); + assert.strictEqual(result, 'mongodb://localhost:27017/tiledesk-logs'); + }); + + it('handles mongodb+srv with query params', () => { + const base = 'mongodb+srv://user:pass@cluster.example.com/mydb?retryWrites=true'; + const result = buildDbUri(base, 'tiledesk-logs'); + assert.strictEqual(result, 'mongodb+srv://user:pass@cluster.example.com/tiledesk-logs?retryWrites=true'); + }); + + it('handles URI without a db path', () => { + const result = buildDbUri('mongodb://localhost:27017', 'tiledesk-logs'); + assert.strictEqual(result, 'mongodb://localhost:27017/tiledesk-logs'); + }); + + it('handles URI with auth credentials', () => { + const base = 'mongodb://admin:secret@host1:27017,host2:27017/proddb?authSource=admin'; + const result = buildDbUri(base, 'tiledesk-logs'); + assert.strictEqual(result, 'mongodb://admin:secret@host1:27017,host2:27017/tiledesk-logs?authSource=admin'); + }); + + it('returns undefined when input is undefined', () => { + assert.strictEqual(buildDbUri(undefined, 'db'), undefined); + }); + + it('returns empty string when input is empty', () => { + assert.strictEqual(buildDbUri('', 'db'), ''); + }); + + it('returns input unchanged when no scheme is found', () => { + assert.strictEqual(buildDbUri('not-a-uri', 'db'), 'not-a-uri'); + }); +}); \ No newline at end of file