mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	task: add default environment (#989)
- Adds development and production environments. - Connects default environment to all projects - When creating a project connects the project to all enabled environments
This commit is contained in:
		
							parent
							
								
									c870b33ba6
								
							
						
					
					
						commit
						e3cebb21c8
					
				@ -91,10 +91,14 @@ export default class EnvironmentStore implements IEnvironmentStore {
 | 
				
			|||||||
        throw new NotFoundError(`Could not find environment with name: ${key}`);
 | 
					        throw new NotFoundError(`Could not find environment with name: ${key}`);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async getAll(): Promise<IEnvironment[]> {
 | 
					    async getAll(query?: Object): Promise<IEnvironment[]> {
 | 
				
			||||||
        const rows = await this.db<IEnvironmentsTable>(TABLE)
 | 
					        let qB = this.db<IEnvironmentsTable>(TABLE)
 | 
				
			||||||
            .select('*')
 | 
					            .select('*')
 | 
				
			||||||
            .orderBy('sort_order', 'created_at');
 | 
					            .orderBy('sort_order', 'created_at');
 | 
				
			||||||
 | 
					        if (query) {
 | 
				
			||||||
 | 
					            qB = qB.where(query);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const rows = await qB;
 | 
				
			||||||
        return rows.map(mapRow);
 | 
					        return rows.map(mapRow);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -30,7 +30,6 @@ import { IEventStore } from '../types/stores/event-store';
 | 
				
			|||||||
import FeatureToggleServiceV2 from './feature-toggle-service-v2';
 | 
					import FeatureToggleServiceV2 from './feature-toggle-service-v2';
 | 
				
			||||||
import { CREATE_FEATURE, UPDATE_FEATURE } from '../types/permissions';
 | 
					import { CREATE_FEATURE, UPDATE_FEATURE } from '../types/permissions';
 | 
				
			||||||
import NoAccessError from '../error/no-access-error';
 | 
					import NoAccessError from '../error/no-access-error';
 | 
				
			||||||
import { DEFAULT_ENV } from '../util/constants';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getCreatedBy = (user: User) => user.email || user.username;
 | 
					const getCreatedBy = (user: User) => user.email || user.username;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -123,8 +122,17 @@ export default class ProjectService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        await this.store.create(data);
 | 
					        await this.store.create(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO: we should only connect to enabled environments
 | 
					        const enabledEnvironments = await this.environmentStore.getAll({
 | 
				
			||||||
        await this.featureEnvironmentStore.connectProject(DEFAULT_ENV, data.id);
 | 
					            enabled: true,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        await Promise.all(
 | 
				
			||||||
 | 
					            enabledEnvironments.map(async (e) => {
 | 
				
			||||||
 | 
					                await this.featureEnvironmentStore.connectProject(
 | 
				
			||||||
 | 
					                    e.name,
 | 
				
			||||||
 | 
					                    data.id,
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        await this.accessService.createDefaultProjectRoles(user, data.id);
 | 
					        await this.accessService.createDefaultProjectRoles(user, data.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -113,6 +113,7 @@ export interface IEnvironmentCreate {
 | 
				
			|||||||
    name: string;
 | 
					    name: string;
 | 
				
			||||||
    type: string;
 | 
					    type: string;
 | 
				
			||||||
    sortOrder?: number;
 | 
					    sortOrder?: number;
 | 
				
			||||||
 | 
					    enabled?: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IEnvironmentOverview {
 | 
					export interface IEnvironmentOverview {
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports.up = function (db, cb) {
 | 
				
			||||||
 | 
					    db.runSql(
 | 
				
			||||||
 | 
					        `
 | 
				
			||||||
 | 
					            INSERT INTO environments(name, type, enabled)
 | 
				
			||||||
 | 
					            VALUES ('development', 'development', true),
 | 
				
			||||||
 | 
					                   ('production', 'production', true);
 | 
				
			||||||
 | 
					        `,
 | 
				
			||||||
 | 
					        cb,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports.down = function (db, cb) {
 | 
				
			||||||
 | 
					    db.runSql(
 | 
				
			||||||
 | 
					        `
 | 
				
			||||||
 | 
					        DELETE
 | 
				
			||||||
 | 
					        FROM environments
 | 
				
			||||||
 | 
					        WHERE name IN ('development', 'production');
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					        cb,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					exports.up = function (db, cb) {
 | 
				
			||||||
 | 
					    db.runSql(
 | 
				
			||||||
 | 
					        `
 | 
				
			||||||
 | 
					        INSERT INTO project_environments(project_id, environment_name)
 | 
				
			||||||
 | 
					        SELECT id, 'default'
 | 
				
			||||||
 | 
					        FROM projects
 | 
				
			||||||
 | 
					        ON CONFLICT DO NOTHING;
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					        cb,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports.down = function (db, cb) {
 | 
				
			||||||
 | 
					    db.runSql(
 | 
				
			||||||
 | 
					        `
 | 
				
			||||||
 | 
					        DELETE
 | 
				
			||||||
 | 
					        FROM project_environments
 | 
				
			||||||
 | 
					        WHERE environment_name = 'default';
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					        cb,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -31,6 +31,7 @@
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
      "name": "default",
 | 
					      "name": "default",
 | 
				
			||||||
      "type": "production",
 | 
					      "type": "production",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      "sortOrder": 1,
 | 
					      "sortOrder": 1,
 | 
				
			||||||
      "enabled": true,
 | 
					      "enabled": true,
 | 
				
			||||||
      "protected": true
 | 
					      "protected": true
 | 
				
			||||||
 | 
				
			|||||||
@ -132,7 +132,7 @@ test('should validate name, legal', async () => {
 | 
				
			|||||||
    expect(result).toBe(true);
 | 
					    expect(result).toBe(true);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test('should not be able to create exiting project', async () => {
 | 
					test('should not be able to create existing project', async () => {
 | 
				
			||||||
    const project = {
 | 
					    const project = {
 | 
				
			||||||
        id: 'test-delete',
 | 
					        id: 'test-delete',
 | 
				
			||||||
        name: 'New project',
 | 
					        name: 'New project',
 | 
				
			||||||
@ -510,3 +510,29 @@ test('should change project when checks pass', async () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    expect(updatedFeature.project).toBe(projectDestination.id);
 | 
					    expect(updatedFeature.project).toBe(projectDestination.id);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('A newly created project only gets connected to enabled environments', async () => {
 | 
				
			||||||
 | 
					    const project = {
 | 
				
			||||||
 | 
					        id: 'environment-test',
 | 
				
			||||||
 | 
					        name: 'New environment project',
 | 
				
			||||||
 | 
					        description: 'Blah',
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    const enabledEnv = 'connection_test';
 | 
				
			||||||
 | 
					    await db.stores.environmentStore.create({
 | 
				
			||||||
 | 
					        name: enabledEnv,
 | 
				
			||||||
 | 
					        type: 'test',
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    const disabledEnv = 'do_not_connect';
 | 
				
			||||||
 | 
					    await db.stores.environmentStore.create({
 | 
				
			||||||
 | 
					        name: disabledEnv,
 | 
				
			||||||
 | 
					        type: 'test',
 | 
				
			||||||
 | 
					        enabled: false,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await projectService.createProject(project, user);
 | 
				
			||||||
 | 
					    const connectedEnvs =
 | 
				
			||||||
 | 
					        await db.stores.projectStore.getEnvironmentsForProject(project.id);
 | 
				
			||||||
 | 
					    expect(connectedEnvs).toHaveLength(2); // default, connection_test
 | 
				
			||||||
 | 
					    expect(connectedEnvs.some((e) => e === enabledEnv)).toBeTruthy();
 | 
				
			||||||
 | 
					    expect(connectedEnvs.some((e) => e === disabledEnv)).toBeFalsy();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user