mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: features overwrite warning (#4535)
This commit is contained in:
		
							parent
							
								
									f114aa401a
								
							
						
					
					
						commit
						2cfb99c768
					
				| @ -335,6 +335,11 @@ test('validate import data', async () => { | |||||||
|                     'The following features will not be imported as they are currently archived. To import them, please unarchive them first:', |                     'The following features will not be imported as they are currently archived. To import them, please unarchive them first:', | ||||||
|                 affectedItems: [archivedFeature], |                 affectedItems: [archivedFeature], | ||||||
|             }, |             }, | ||||||
|  |             { | ||||||
|  |                 message: | ||||||
|  |                     'The following features already exist in this project and will be overwritten:', | ||||||
|  |                 affectedItems: ['existing_feature'], | ||||||
|  |             }, | ||||||
|         ], |         ], | ||||||
|         permissions: [ |         permissions: [ | ||||||
|             { |             { | ||||||
|  | |||||||
| @ -151,6 +151,7 @@ export default class ExportImportService { | |||||||
|             unsupportedContextFields, |             unsupportedContextFields, | ||||||
|             archivedFeatures, |             archivedFeatures, | ||||||
|             otherProjectFeatures, |             otherProjectFeatures, | ||||||
|  |             existingProjectFeatures, | ||||||
|             missingPermissions, |             missingPermissions, | ||||||
|         ] = await Promise.all([ |         ] = await Promise.all([ | ||||||
|             this.getUnsupportedStrategies(dto), |             this.getUnsupportedStrategies(dto), | ||||||
| @ -158,6 +159,7 @@ export default class ExportImportService { | |||||||
|             this.getUnsupportedContextFields(dto), |             this.getUnsupportedContextFields(dto), | ||||||
|             this.getArchivedFeatures(dto), |             this.getArchivedFeatures(dto), | ||||||
|             this.getOtherProjectFeatures(dto), |             this.getOtherProjectFeatures(dto), | ||||||
|  |             this.getExistingProjectFeatures(dto), | ||||||
|             this.importPermissionsService.getMissingPermissions( |             this.importPermissionsService.getMissingPermissions( | ||||||
|                 dto, |                 dto, | ||||||
|                 user, |                 user, | ||||||
| @ -176,6 +178,7 @@ export default class ExportImportService { | |||||||
|         const warnings = ImportValidationMessages.compileWarnings( |         const warnings = ImportValidationMessages.compileWarnings( | ||||||
|             usedCustomStrategies, |             usedCustomStrategies, | ||||||
|             archivedFeatures, |             archivedFeatures, | ||||||
|  |             existingProjectFeatures, | ||||||
|         ); |         ); | ||||||
|         const permissions = |         const permissions = | ||||||
|             ImportValidationMessages.compilePermissionErrors( |             ImportValidationMessages.compilePermissionErrors( | ||||||
| @ -299,7 +302,7 @@ export default class ExportImportService { | |||||||
|                 this.contextService.createContextField( |                 this.contextService.createContextField( | ||||||
|                     { |                     { | ||||||
|                         name: contextField.name, |                         name: contextField.name, | ||||||
|                         description: contextField.description, |                         description: contextField.description || '', | ||||||
|                         legalValues: contextField.legalValues, |                         legalValues: contextField.legalValues, | ||||||
|                         stickiness: contextField.stickiness, |                         stickiness: contextField.stickiness, | ||||||
|                     }, |                     }, | ||||||
| @ -529,6 +532,15 @@ export default class ExportImportService { | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private async getExistingProjectFeatures(dto: ImportTogglesSchema) { | ||||||
|  |         const existingProjectsFeatures = | ||||||
|  |             await this.importTogglesStore.getFeaturesInProject( | ||||||
|  |                 dto.data.features.map((feature) => feature.name), | ||||||
|  |                 dto.project, | ||||||
|  |             ); | ||||||
|  |         return existingProjectsFeatures; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     private async getNewTagTypes(dto: ImportTogglesSchema) { |     private async getNewTagTypes(dto: ImportTogglesSchema) { | ||||||
|         const existingTagTypes = (await this.tagTypeService.getAll()).map( |         const existingTagTypes = (await this.tagTypeService.getAll()).map( | ||||||
|             (tagType) => tagType.name, |             (tagType) => tagType.name, | ||||||
|  | |||||||
| @ -11,6 +11,11 @@ export interface IImportTogglesStore { | |||||||
|         project: string, |         project: string, | ||||||
|     ): Promise<{ name: string; project: string }[]>; |     ): Promise<{ name: string; project: string }[]>; | ||||||
| 
 | 
 | ||||||
|  |     getFeaturesInProject( | ||||||
|  |         featureNames: string[], | ||||||
|  |         project: string, | ||||||
|  |     ): Promise<string[]>; | ||||||
|  | 
 | ||||||
|     deleteTagsForFeatures(tags: string[]): Promise<void>; |     deleteTagsForFeatures(tags: string[]): Promise<void>; | ||||||
| 
 | 
 | ||||||
|     strategiesExistForFeatures( |     strategiesExistForFeatures( | ||||||
|  | |||||||
| @ -74,6 +74,18 @@ export class ImportTogglesStore implements IImportTogglesStore { | |||||||
|         return rows.map((row) => ({ name: row.name, project: row.project })); |         return rows.map((row) => ({ name: row.name, project: row.project })); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     async getFeaturesInProject( | ||||||
|  |         featureNames: string[], | ||||||
|  |         project: string, | ||||||
|  |     ): Promise<string[]> { | ||||||
|  |         const rows = await this.db(T.features) | ||||||
|  |             .select(['name', 'project']) | ||||||
|  |             .where('project', project) | ||||||
|  |             .where('archived_at', null) | ||||||
|  |             .whereIn('name', featureNames); | ||||||
|  |         return rows.map((row) => row.name); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     async deleteTagsForFeatures(features: string[]): Promise<void> { |     async deleteTagsForFeatures(features: string[]): Promise<void> { | ||||||
|         return this.db(T.featureTag).whereIn('feature_name', features).del(); |         return this.db(T.featureTag).whereIn('feature_name', features).del(); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -73,6 +73,7 @@ export class ImportValidationMessages { | |||||||
|     static compileWarnings( |     static compileWarnings( | ||||||
|         usedCustomStrategies: string[], |         usedCustomStrategies: string[], | ||||||
|         archivedFeatures: string[], |         archivedFeatures: string[], | ||||||
|  |         existingFeatures: string[], | ||||||
|     ): ImportTogglesValidateItemSchema[] { |     ): ImportTogglesValidateItemSchema[] { | ||||||
|         const warnings: ImportTogglesValidateItemSchema[] = []; |         const warnings: ImportTogglesValidateItemSchema[] = []; | ||||||
|         if (usedCustomStrategies.length > 0) { |         if (usedCustomStrategies.length > 0) { | ||||||
| @ -89,6 +90,13 @@ export class ImportValidationMessages { | |||||||
|                 affectedItems: archivedFeatures, |                 affectedItems: archivedFeatures, | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|  |         if (existingFeatures.length > 0) { | ||||||
|  |             warnings.push({ | ||||||
|  |                 message: | ||||||
|  |                     'The following features already exist in this project and will be overwritten:', | ||||||
|  |                 affectedItems: existingFeatures, | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|         return warnings; |         return warnings; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user