Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions config/database.js
Original file line number Diff line number Diff line change
@@ -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')
};
39 changes: 39 additions & 0 deletions test/config/buildDbUri.test.js
Original file line number Diff line number Diff line change
@@ -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');
});
});