mirror of
				https://github.com/lingble/twenty.git
				synced 2025-10-30 12:22:29 +00:00 
			
		
		
		
	Adding the DefaultCountry in the backend
This commit is contained in:
		| @@ -5,6 +5,7 @@ import { | |||||||
|   IsEnum, |   IsEnum, | ||||||
|   IsInt, |   IsInt, | ||||||
|   IsOptional, |   IsOptional, | ||||||
|  |   IsString, | ||||||
|   Max, |   Max, | ||||||
|   Min, |   Min, | ||||||
|   validateOrReject, |   validateOrReject, | ||||||
| @@ -23,7 +24,7 @@ enum ValueType { | |||||||
|   NUMBER = 'number', |   NUMBER = 'number', | ||||||
| } | } | ||||||
|  |  | ||||||
| class SettingsValidation { | class NumberSettingsValidation { | ||||||
|   @IsOptional() |   @IsOptional() | ||||||
|   @IsInt() |   @IsInt() | ||||||
|   @Min(0) |   @Min(0) | ||||||
| @@ -32,7 +33,9 @@ class SettingsValidation { | |||||||
|   @IsOptional() |   @IsOptional() | ||||||
|   @IsEnum(ValueType) |   @IsEnum(ValueType) | ||||||
|   type?: 'percentage' | 'number'; |   type?: 'percentage' | 'number'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class TextSettingsValidation { | ||||||
|   @IsOptional() |   @IsOptional() | ||||||
|   @IsInt() |   @IsInt() | ||||||
|   @Min(0) |   @Min(0) | ||||||
| @@ -40,6 +43,12 @@ class SettingsValidation { | |||||||
|   displayedMaxRows?: number; |   displayedMaxRows?: number; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | class AddressSettingsValidation { | ||||||
|  |   @IsOptional() | ||||||
|  |   @IsString() | ||||||
|  |   defaultCountry?: string; | ||||||
|  | } | ||||||
|  |  | ||||||
| @Injectable() | @Injectable() | ||||||
| export class FieldMetadataValidationService< | export class FieldMetadataValidationService< | ||||||
|   T extends FieldMetadataType | 'default' = 'default', |   T extends FieldMetadataType | 'default' = 'default', | ||||||
| @@ -55,17 +64,22 @@ export class FieldMetadataValidationService< | |||||||
|   }) { |   }) { | ||||||
|     switch (fieldType) { |     switch (fieldType) { | ||||||
|       case FieldMetadataType.NUMBER: |       case FieldMetadataType.NUMBER: | ||||||
|  |         await this.validateSettings(NumberSettingsValidation, settings); | ||||||
|  |         break; | ||||||
|       case FieldMetadataType.TEXT: |       case FieldMetadataType.TEXT: | ||||||
|         await this.validateSettings(settings); |         await this.validateSettings(TextSettingsValidation, settings); | ||||||
|  |         break; | ||||||
|  |       case FieldMetadataType.ADDRESS: | ||||||
|  |         await this.validateSettings(AddressSettingsValidation, settings); | ||||||
|         break; |         break; | ||||||
|       default: |       default: | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private async validateSettings(settings: any) { |   private async validateSettings(validator: any, settings: any) { | ||||||
|     try { |     try { | ||||||
|       const settingsInstance = plainToInstance(SettingsValidation, settings); |       const settingsInstance = plainToInstance(validator, settings); | ||||||
|  |  | ||||||
|       await validateOrReject(settingsInstance); |       await validateOrReject(settingsInstance); | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|   | |||||||
| @@ -28,11 +28,16 @@ type FieldMetadataDateTimeSettings = { | |||||||
|   displayAsRelativeDate?: boolean; |   displayAsRelativeDate?: boolean; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | type FieldMetadataAddressSettings = { | ||||||
|  |   defaultCountry?: string; | ||||||
|  | }; | ||||||
|  |  | ||||||
| type FieldMetadataSettingsMapping = { | type FieldMetadataSettingsMapping = { | ||||||
|   [FieldMetadataType.NUMBER]: FieldMetadataNumberSettings; |   [FieldMetadataType.NUMBER]: FieldMetadataNumberSettings; | ||||||
|   [FieldMetadataType.DATE]: FieldMetadataDateSettings; |   [FieldMetadataType.DATE]: FieldMetadataDateSettings; | ||||||
|   [FieldMetadataType.DATE_TIME]: FieldMetadataDateTimeSettings; |   [FieldMetadataType.DATE_TIME]: FieldMetadataDateTimeSettings; | ||||||
|   [FieldMetadataType.TEXT]: FieldMetadataTextSettings; |   [FieldMetadataType.TEXT]: FieldMetadataTextSettings; | ||||||
|  |   [FieldMetadataType.ADDRESS]: FieldMetadataAddressSettings; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| type SettingsByFieldMetadata<T extends FieldMetadataType | 'default'> = | type SettingsByFieldMetadata<T extends FieldMetadataType | 'default'> = | ||||||
|   | |||||||
| @@ -0,0 +1,81 @@ | |||||||
|  | import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface'; | ||||||
|  |  | ||||||
|  | import { FieldMetadataValidationService } from 'src/engine/metadata-modules/field-metadata/field-metadata-validation.service'; | ||||||
|  | import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; | ||||||
|  | import { FieldMetadataException } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; | ||||||
|  |  | ||||||
|  | describe('FieldMetadataValidationService', () => { | ||||||
|  |   let service: FieldMetadataValidationService; | ||||||
|  |  | ||||||
|  |   beforeAll(() => { | ||||||
|  |     service = new FieldMetadataValidationService(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should validate NUMBER settings successfully', async () => { | ||||||
|  |     const settings = { decimals: 2, type: 'number' } as FieldMetadataSettings; | ||||||
|  |  | ||||||
|  |     await expect( | ||||||
|  |       service.validateSettingsOrThrow({ | ||||||
|  |         fieldType: FieldMetadataType.NUMBER, | ||||||
|  |         settings, | ||||||
|  |       }), | ||||||
|  |     ).resolves.not.toThrow(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should throw an error for invalid NUMBER settings', async () => { | ||||||
|  |     const settings = { type: 'invalidType' } as FieldMetadataSettings; | ||||||
|  |  | ||||||
|  |     await expect( | ||||||
|  |       service.validateSettingsOrThrow({ | ||||||
|  |         fieldType: FieldMetadataType.NUMBER, | ||||||
|  |         settings, | ||||||
|  |       }), | ||||||
|  |     ).rejects.toThrow(FieldMetadataException); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should validate TEXT settings successfully', async () => { | ||||||
|  |     const settings = { displayedMaxRows: 10 } as FieldMetadataSettings; | ||||||
|  |  | ||||||
|  |     await expect( | ||||||
|  |       service.validateSettingsOrThrow({ | ||||||
|  |         fieldType: FieldMetadataType.TEXT, | ||||||
|  |         settings, | ||||||
|  |       }), | ||||||
|  |     ).resolves.not.toThrow(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should throw an error for invalid TEXT settings', async () => { | ||||||
|  |     const settings = { | ||||||
|  |       displayedMaxRows: 'NotANumber', | ||||||
|  |     } as FieldMetadataSettings; | ||||||
|  |  | ||||||
|  |     await expect( | ||||||
|  |       service.validateSettingsOrThrow({ | ||||||
|  |         fieldType: FieldMetadataType.TEXT, | ||||||
|  |         settings, | ||||||
|  |       }), | ||||||
|  |     ).rejects.toThrow(FieldMetadataException); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should validate ADDRESS settings successfully', async () => { | ||||||
|  |     const settings = { defaultCountry: 'France' } as FieldMetadataSettings; | ||||||
|  |  | ||||||
|  |     await expect( | ||||||
|  |       service.validateSettingsOrThrow({ | ||||||
|  |         fieldType: FieldMetadataType.ADDRESS, | ||||||
|  |         settings, | ||||||
|  |       }), | ||||||
|  |     ).resolves.not.toThrow(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should throw an error for invalid ADDRESS settings', async () => { | ||||||
|  |     const settings = { defaultCountry: 123 } as FieldMetadataSettings; | ||||||
|  |  | ||||||
|  |     await expect( | ||||||
|  |       service.validateSettingsOrThrow({ | ||||||
|  |         fieldType: FieldMetadataType.ADDRESS, | ||||||
|  |         settings, | ||||||
|  |       }), | ||||||
|  |     ).rejects.toThrow(FieldMetadataException); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
		Reference in New Issue
	
	Block a user
	 guillim
					guillim