Adding the DefaultCountry in the backend

This commit is contained in:
guillim
2024-11-19 14:53:23 +01:00
parent c17e18b1e9
commit 6291ca5b17
3 changed files with 104 additions and 4 deletions

View File

@@ -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) {

View File

@@ -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'> =

View File

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