From 47a617c78b98a9f0d0c2bc1d6e22add29b109084 Mon Sep 17 00:00:00 2001 From: andreas-unleash <104830839+andreas-unleash@users.noreply.github.com> Date: Wed, 9 Nov 2022 14:44:53 +0200 Subject: [PATCH] Add changeRequestEnabled to project and project_environments (#2357) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add `change_request_enabled` column to `projects` and `project_environments` - Modified the store to include the new column - Added new column to Project open api schema ## About the changes Closes # ### Important files ## Discussion points --- src/lib/db/project-store.ts | 21 +++++++++++++++---- .../spec/project-environment-schema.ts | 3 +++ src/lib/openapi/spec/project-schema.test.ts | 16 ++++++++++++++ src/lib/openapi/spec/project-schema.ts | 3 +++ src/lib/types/model.ts | 2 +- src/lib/types/stores/project-store.ts | 8 +++++++ ...07132528-change-request-project-options.js | 21 +++++++++++++++++++ .../__snapshots__/openapi.e2e.test.ts.snap | 6 ++++++ 8 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 src/migrations/20221107132528-change-request-project-options.js diff --git a/src/lib/db/project-store.ts b/src/lib/db/project-store.ts index 5f46bba893..2476e42b1d 100644 --- a/src/lib/db/project-store.ts +++ b/src/lib/db/project-store.ts @@ -21,12 +21,14 @@ const COLUMNS = [ 'created_at', 'health', 'updated_at', + 'change_request_enabled', ]; const TABLE = 'projects'; export interface IEnvironmentProjectLink { environmentName: string; projectId: string; + changeRequestsEnabled?: string; } export interface IProjectMembersCount { @@ -78,7 +80,7 @@ class ProjectStore implements IProjectStore { let projects = this.db(TABLE) .select( this.db.raw( - 'projects.id, projects.name, projects.description, projects.health, projects.updated_at, count(features.name) AS number_of_features', + 'projects.id, projects.name, projects.description, projects.health, projects.updated_at, projects.change_request_enabled, count(features.name) AS number_of_features', ), ) .leftJoin('features', 'features.project', 'projects.id') @@ -115,6 +117,7 @@ class ProjectStore implements IProjectStore { featureCount: Number(row.number_of_features) || 0, memberCount: Number(row.number_of_users) || 0, updatedAt: row.updated_at, + changeRequestsEnabled: row.change_request_enabled || false, }; } @@ -196,6 +199,7 @@ class ProjectStore implements IProjectStore { const environments = projects.map((p) => ({ project_id: p.id, environment_name: DEFAULT_ENV, + change_request_enabled: p.change_request_enabled, })); await this.db('project_environments') .insert(environments) @@ -240,8 +244,13 @@ class ProjectStore implements IProjectStore { id: string, environment: string, ): Promise { + const project = await this.get(id); await this.db('project_environments') - .insert({ project_id: id, environment_name: environment }) + .insert({ + project_id: id, + environment_name: environment, + change_request_enabled: project.changeRequestsEnabled, + }) .onConflict(['project_id', 'environment_name']) .ignore(); } @@ -250,10 +259,12 @@ class ProjectStore implements IProjectStore { environment: string, projects: string[], ): Promise { - const rows = projects.map((project) => { + const rows = projects.map(async (projectId) => { + const project = await this.get(projectId); return { - project_id: project, + project_id: projectId, environment_name: environment, + change_request_enabled: project.changeRequestsEnabled || false, }; }); @@ -370,6 +381,7 @@ class ProjectStore implements IProjectStore { return { environmentName: row.environment_name, projectId: row.project_id, + changeRequestsEnabled: row.change_request_enabled, }; } @@ -386,6 +398,7 @@ class ProjectStore implements IProjectStore { createdAt: row.created_at, health: row.health || 100, updatedAt: row.updated_at || new Date(), + changeRequestsEnabled: row.change_request_enabled || false, }; } } diff --git a/src/lib/openapi/spec/project-environment-schema.ts b/src/lib/openapi/spec/project-environment-schema.ts index 0cc6f61ffe..072df4897e 100644 --- a/src/lib/openapi/spec/project-environment-schema.ts +++ b/src/lib/openapi/spec/project-environment-schema.ts @@ -9,6 +9,9 @@ export const projectEnvironmentSchema = { environment: { type: 'string', }, + changeRequestsEnabled: { + type: 'boolean', + }, }, components: {}, } as const; diff --git a/src/lib/openapi/spec/project-schema.test.ts b/src/lib/openapi/spec/project-schema.test.ts index 9909014019..ce231dd847 100644 --- a/src/lib/openapi/spec/project-schema.test.ts +++ b/src/lib/openapi/spec/project-schema.test.ts @@ -10,6 +10,22 @@ test('projectSchema', () => { featureCount: 10, memberCount: 3, updatedAt: '2022-06-28T17:33:53.963Z', + changeRequestsEnabled: false, + }; + + expect( + validateSchema('#/components/schemas/projectSchema', {}), + ).not.toBeUndefined(); + + expect( + validateSchema('#/components/schemas/projectSchema', data), + ).toBeUndefined(); +}); + +test('projectSchema with only required', () => { + const data: ProjectSchema = { + name: 'Default', + id: 'default', }; expect( diff --git a/src/lib/openapi/spec/project-schema.ts b/src/lib/openapi/spec/project-schema.ts index 23740bec00..0fab13a074 100644 --- a/src/lib/openapi/spec/project-schema.ts +++ b/src/lib/openapi/spec/project-schema.ts @@ -33,6 +33,9 @@ export const projectSchema = { format: 'date-time', nullable: true, }, + changeRequestsEnabled: { + type: 'boolean', + }, }, components: {}, } as const; diff --git a/src/lib/types/model.ts b/src/lib/types/model.ts index abe274446a..00771d6d50 100644 --- a/src/lib/types/model.ts +++ b/src/lib/types/model.ts @@ -345,8 +345,8 @@ export interface IProject { health?: number; createdAt?: Date; updatedAt?: Date; + changeRequestsEnabled?: boolean; } - export interface ICustomRole { id: number; name: string; diff --git a/src/lib/types/stores/project-store.ts b/src/lib/types/stores/project-store.ts index 82dc6ad877..c574d318b5 100644 --- a/src/lib/types/stores/project-store.ts +++ b/src/lib/types/stores/project-store.ts @@ -10,6 +10,7 @@ export interface IProjectInsert { name: string; description: string; updatedAt?: Date; + changeRequestsEnabled?: boolean; } export interface IProjectArchived { @@ -26,6 +27,11 @@ export interface IProjectQuery { id?: string; } +export interface IProjectEnvironmentWithChangeRequests { + environment: string; + changeRequestsEnabled: boolean; +} + export interface IProjectStore extends Store { hasProject(id: string): Promise; updateHealth(healthUpdate: IProjectHealthUpdate): Promise; @@ -44,9 +50,11 @@ export interface IProjectStore extends Store { getProjectsWithCounts(query?: IProjectQuery): Promise; count(): Promise; getAll(query?: IProjectQuery): Promise; + getProjectLinksForEnvironments( environments: string[], ): Promise; + addEnvironmentToProjects( environment: string, projects: string[], diff --git a/src/migrations/20221107132528-change-request-project-options.js b/src/migrations/20221107132528-change-request-project-options.js new file mode 100644 index 0000000000..208eac22bd --- /dev/null +++ b/src/migrations/20221107132528-change-request-project-options.js @@ -0,0 +1,21 @@ +'use strict'; + +exports.up = function (db, callback) { + db.runSql( + ` + ALTER TABLE project_environments add column if not exists change_request_enabled bool default false; + ALTER TABLE projects add column if not exists change_request_enabled bool default false; + `, + callback, + ); +}; + +exports.down = function (db, callback) { + db.runSql( + ` + ALTER TABLE project_environments drop column if exists change_request_enabled; + ALTER TABLE projects drop column if exists change_request_enabled; + `, + callback, + ); +}; diff --git a/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap b/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap index 56ed7e7911..097e791975 100644 --- a/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap +++ b/src/test/e2e/api/openapi/__snapshots__/openapi.e2e.test.ts.snap @@ -2255,6 +2255,9 @@ exports[`should serve the OpenAPI spec 1`] = ` "projectEnvironmentSchema": { "additionalProperties": false, "properties": { + "changeRequestsEnabled": { + "type": "boolean", + }, "environment": { "type": "string", }, @@ -2267,6 +2270,9 @@ exports[`should serve the OpenAPI spec 1`] = ` "projectSchema": { "additionalProperties": false, "properties": { + "changeRequestsEnabled": { + "type": "boolean", + }, "createdAt": { "format": "date-time", "type": "string",