feat: Add options to skip automatic creation of internal database indexes on server start (#9897)

This commit is contained in:
Manuel
2025-11-01 18:22:52 +01:00
committed by GitHub
parent 4f4580a083
commit ea91aca142
6 changed files with 316 additions and 34 deletions

View File

@@ -649,4 +649,179 @@ describe_only_db('mongo')('MongoStorageAdapter', () => {
});
});
}
describe('index creation options', () => {
beforeEach(async () => {
await new MongoStorageAdapter({ uri: databaseURI }).deleteAllClasses();
});
async function getIndexes(collectionName) {
const adapter = Config.get(Parse.applicationId).database.adapter;
const collections = await adapter.database.listCollections({ name: collectionName }).toArray();
if (collections.length === 0) {
return [];
}
return await adapter.database.collection(collectionName).indexes();
}
it('should skip username index when createIndexUserUsername is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserUsername: false },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'username_1')).toBeUndefined();
});
it('should create username index when createIndexUserUsername is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserUsername: true },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'username_1')).toBeDefined();
});
it('should skip case-insensitive username index when createIndexUserUsernameCaseInsensitive is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserUsernameCaseInsensitive: false },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'case_insensitive_username')).toBeUndefined();
});
it('should create case-insensitive username index when createIndexUserUsernameCaseInsensitive is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserUsernameCaseInsensitive: true },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'case_insensitive_username')).toBeDefined();
});
it('should skip email index when createIndexUserEmail is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserEmail: false },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'email_1')).toBeUndefined();
});
it('should create email index when createIndexUserEmail is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserEmail: true },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'email_1')).toBeDefined();
});
it('should skip case-insensitive email index when createIndexUserEmailCaseInsensitive is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserEmailCaseInsensitive: false },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'case_insensitive_email')).toBeUndefined();
});
it('should create case-insensitive email index when createIndexUserEmailCaseInsensitive is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserEmailCaseInsensitive: true },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === 'case_insensitive_email')).toBeDefined();
});
it('should skip email verify token index when createIndexUserEmailVerifyToken is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserEmailVerifyToken: false },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === '_email_verify_token' || idx.name === '_email_verify_token_1')).toBeUndefined();
});
it('should create email verify token index when createIndexUserEmailVerifyToken is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserEmailVerifyToken: true },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === '_email_verify_token' || idx.name === '_email_verify_token_1')).toBeDefined();
});
it('should skip password reset token index when createIndexUserPasswordResetToken is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserPasswordResetToken: false },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === '_perishable_token' || idx.name === '_perishable_token_1')).toBeUndefined();
});
it('should create password reset token index when createIndexUserPasswordResetToken is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexUserPasswordResetToken: true },
});
const indexes = await getIndexes('_User');
expect(indexes.find(idx => idx.name === '_perishable_token' || idx.name === '_perishable_token_1')).toBeDefined();
});
it('should skip role name index when createIndexRoleName is false', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexRoleName: false },
});
const indexes = await getIndexes('_Role');
expect(indexes.find(idx => idx.name === 'name_1')).toBeUndefined();
});
it('should create role name index when createIndexRoleName is true', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: { createIndexRoleName: true },
});
const indexes = await getIndexes('_Role');
expect(indexes.find(idx => idx.name === 'name_1')).toBeDefined();
});
it('should create all indexes by default when options are undefined', async () => {
await reconfigureServer({
databaseAdapter: undefined,
databaseURI,
databaseOptions: {},
});
const userIndexes = await getIndexes('_User');
const roleIndexes = await getIndexes('_Role');
// Verify all indexes are created with default behavior (backward compatibility)
expect(userIndexes.find(idx => idx.name === 'username_1')).toBeDefined();
expect(userIndexes.find(idx => idx.name === 'case_insensitive_username')).toBeDefined();
expect(userIndexes.find(idx => idx.name === 'email_1')).toBeDefined();
expect(userIndexes.find(idx => idx.name === 'case_insensitive_email')).toBeDefined();
expect(userIndexes.find(idx => idx.name === '_email_verify_token' || idx.name === '_email_verify_token_1')).toBeDefined();
expect(userIndexes.find(idx => idx.name === '_perishable_token' || idx.name === '_perishable_token_1')).toBeDefined();
expect(roleIndexes.find(idx => idx.name === 'name_1')).toBeDefined();
});
});
});