From 1c71ff89653b70aceae55a04b13c3cd340677d4f Mon Sep 17 00:00:00 2001 From: andreas-unleash <104830839+andreas-unleash@users.noreply.github.com> Date: Thu, 10 Nov 2022 09:38:59 +0200 Subject: [PATCH] add get and update functionality to project environments change request config --- frontend/src/interfaces/environments.ts | 2 ++ src/lib/db/project-store.ts | 45 ++++++++++++++++++++++++- src/lib/services/project-service.ts | 20 ++++++++++- src/lib/types/model.ts | 1 + src/lib/types/stores/project-store.ts | 17 ++++++++-- 5 files changed, 80 insertions(+), 5 deletions(-) diff --git a/frontend/src/interfaces/environments.ts b/frontend/src/interfaces/environments.ts index a1125fb32f..704a693f44 100644 --- a/frontend/src/interfaces/environments.ts +++ b/frontend/src/interfaces/environments.ts @@ -15,11 +15,13 @@ export interface IProjectEnvironment { export interface IEnvironmentPayload { name: string; type: string; + changeRequestsEnabled?: boolean; } export interface IEnvironmentEditPayload { sortOrder: number; type: string; + changeRequestsEnabled?: boolean; } export interface IEnvironmentClonePayload { diff --git a/src/lib/db/project-store.ts b/src/lib/db/project-store.ts index 2476e42b1d..965eb6f1de 100644 --- a/src/lib/db/project-store.ts +++ b/src/lib/db/project-store.ts @@ -6,8 +6,10 @@ import { IEnvironment, IProject, IProjectWithCount } from '../types/model'; import { IProjectHealthUpdate, IProjectInsert, + IProjectEnvironmentConfig, IProjectQuery, IProjectStore, + IUpdateProjectEnvironmentConfig, } from '../types/stores/project-store'; import { DEFAULT_ENV } from '../util/constants'; import metricsHelper from '../util/metrics-helper'; @@ -223,7 +225,11 @@ class ProjectStore implements IProjectStore { environments: string[], ): Promise { let rows = await this.db('project_environments') - .select(['project_id', 'environment_name']) + .select([ + 'project_id', + 'environment_name', + 'change_request_enabled', + ]) .whereIn('environment_name', environments); return rows.map(this.mapLinkRow); } @@ -289,6 +295,43 @@ class ProjectStore implements IProjectStore { .pluck('project_environments.environment_name'); } + async getChangeRequestConfigForProject( + id: string, + ): Promise { + return this.db('project_environments') + .select( + 'project_environments.environment_name as environment', + 'environments.type as type', + 'project_environments.change_request_enabled as changeRequestEnabled', + ) + .where({ + project_id: id, + }) + .innerJoin( + 'environments', + 'project_environments.environment_name', + 'environments.name', + ) + .orderBy('environments.sort_order', 'asc') + .orderBy('project_environments.environment_name', 'asc'); + } + + async updateProjectEnvironmentConfig( + id: string, + data: IUpdateProjectEnvironmentConfig, + ): Promise { + try { + await this.db('project_environments') + .where({ project_id: id, environment_name: data.environment }) + .update({ change_request_enabled: data.changeRequestsEnabled }); + } catch (err) { + this.logger.error( + 'Could not update project environment, error: ', + err, + ); + } + } + async getMembersCount(): Promise { const members = await this.db .select('project') diff --git a/src/lib/services/project-service.ts b/src/lib/services/project-service.ts index a13bf74a8d..6189604525 100644 --- a/src/lib/services/project-service.ts +++ b/src/lib/services/project-service.ts @@ -30,7 +30,12 @@ import { IEnvironmentStore } from '../types/stores/environment-store'; import { IFeatureTypeStore } from '../types/stores/feature-type-store'; import { IFeatureToggleStore } from '../types/stores/feature-toggle-store'; import { IFeatureEnvironmentStore } from '../types/stores/feature-environment-store'; -import { IProjectQuery, IProjectStore } from '../types/stores/project-store'; +import { + IProjectEnvironmentConfig, + IProjectQuery, + IProjectStore, + IUpdateProjectEnvironmentConfig, +} from '../types/stores/project-store'; import { IProjectAccessModel, IRoleDescriptor, @@ -601,4 +606,17 @@ export default class ProjectService { version: 1, }; } + + async getChangeRequestConfig( + projectId: string, + ): Promise { + return this.store.getChangeRequestConfigForProject(projectId); + } + + async updateEnvironmentConfig( + projectId: string, + data: IUpdateProjectEnvironmentConfig, + ): Promise { + await this.store.updateProjectEnvironmentConfig(projectId, data); + } } diff --git a/src/lib/types/model.ts b/src/lib/types/model.ts index 00771d6d50..349ff25b30 100644 --- a/src/lib/types/model.ts +++ b/src/lib/types/model.ts @@ -347,6 +347,7 @@ export interface IProject { 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 c574d318b5..119ed24e5d 100644 --- a/src/lib/types/stores/project-store.ts +++ b/src/lib/types/stores/project-store.ts @@ -27,7 +27,13 @@ export interface IProjectQuery { id?: string; } -export interface IProjectEnvironmentWithChangeRequests { +export interface IProjectEnvironmentConfig { + environment: string; + type: string; + changeRequestsEnabled: boolean; +} + +export interface IUpdateProjectEnvironmentConfig { environment: string; changeRequestsEnabled: boolean; } @@ -50,13 +56,18 @@ export interface IProjectStore extends Store { getProjectsWithCounts(query?: IProjectQuery): Promise; count(): Promise; getAll(query?: IProjectQuery): Promise; - getProjectLinksForEnvironments( environments: string[], ): Promise; - addEnvironmentToProjects( environment: string, projects: string[], ): Promise; + getChangeRequestConfigForProject( + id: string, + ): Promise; + updateProjectEnvironmentConfig( + id: string, + data: IUpdateProjectEnvironmentConfig, + ); }