1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-01 01:18:10 +02: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:
Christopher Kolstad 2021-09-29 11:09:35 +02:00 committed by GitHub
parent c870b33ba6
commit e3cebb21c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 91 additions and 6 deletions

View File

@ -91,10 +91,14 @@ export default class EnvironmentStore implements IEnvironmentStore {
throw new NotFoundError(`Could not find environment with name: ${key}`);
}
async getAll(): Promise<IEnvironment[]> {
const rows = await this.db<IEnvironmentsTable>(TABLE)
async getAll(query?: Object): Promise<IEnvironment[]> {
let qB = this.db<IEnvironmentsTable>(TABLE)
.select('*')
.orderBy('sort_order', 'created_at');
if (query) {
qB = qB.where(query);
}
const rows = await qB;
return rows.map(mapRow);
}

View File

@ -30,7 +30,6 @@ import { IEventStore } from '../types/stores/event-store';
import FeatureToggleServiceV2 from './feature-toggle-service-v2';
import { CREATE_FEATURE, UPDATE_FEATURE } from '../types/permissions';
import NoAccessError from '../error/no-access-error';
import { DEFAULT_ENV } from '../util/constants';
const getCreatedBy = (user: User) => user.email || user.username;
@ -123,8 +122,17 @@ export default class ProjectService {
await this.store.create(data);
// TODO: we should only connect to enabled environments
await this.featureEnvironmentStore.connectProject(DEFAULT_ENV, data.id);
const enabledEnvironments = await this.environmentStore.getAll({
enabled: true,
});
await Promise.all(
enabledEnvironments.map(async (e) => {
await this.featureEnvironmentStore.connectProject(
e.name,
data.id,
);
}),
);
await this.accessService.createDefaultProjectRoles(user, data.id);

View File

@ -113,6 +113,7 @@ export interface IEnvironmentCreate {
name: string;
type: string;
sortOrder?: number;
enabled?: boolean;
}
export interface IEnvironmentOverview {

View File

@ -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,
);
};

View File

@ -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,
);
};

View File

@ -31,6 +31,7 @@
{
"name": "default",
"type": "production",
"sortOrder": 1,
"enabled": true,
"protected": true

View File

@ -132,7 +132,7 @@ test('should validate name, legal', async () => {
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 = {
id: 'test-delete',
name: 'New project',
@ -510,3 +510,29 @@ test('should change project when checks pass', async () => {
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();
});