Rename Money/Url to Currency/Link and remove snake_case from composite fields (#2536)

* Rename Money/Url to Currency/Link

* regenerate front types

* renaming money/url field types

* fix double text

* fix tests

* fix server tests

* fix generate-target-column-map

* fix currency convert

* fix: tests

---------

Co-authored-by: Jérémy Magrin <jeremy.magrin@gmail.com>
This commit is contained in:
Weiko
2023-11-17 10:31:17 +01:00
committed by GitHub
parent 31e439681c
commit bc579d64a6
56 changed files with 579 additions and 512 deletions

View File

@ -27,8 +27,8 @@ export enum FieldMetadataType {
NUMBER = 'NUMBER',
PROBABILITY = 'PROBABILITY',
ENUM = 'ENUM',
URL = 'URL',
MONEY = 'MONEY',
LINK = 'LINK',
CURRENCY = 'CURRENCY',
RELATION = 'RELATION',
}

View File

@ -23,21 +23,21 @@ export type FieldMetadataDynamicDefaultValue =
| { type: 'uuid' }
| { type: 'now' };
interface FieldMetadataDefaultValueUrl {
text: string;
link: string;
interface FieldMetadataDefaultValueLink {
label: string;
url: string;
}
interface FieldMetadataDefaultValueMoney {
amount: number;
currency: string;
interface FieldMetadataDefaultValueCurrency {
amountMicros: number;
currencyCode: string;
}
type AllFieldMetadataDefaultValueTypes =
| FieldMetadataScalarDefaultValue
| FieldMetadataDynamicDefaultValue
| FieldMetadataDefaultValueUrl
| FieldMetadataDefaultValueMoney;
| FieldMetadataDefaultValueLink
| FieldMetadataDefaultValueCurrency;
type FieldMetadataDefaultValueMapping = {
[FieldMetadataType.UUID]: FieldMetadataDefaultValueString;
@ -49,8 +49,8 @@ type FieldMetadataDefaultValueMapping = {
[FieldMetadataType.NUMBER]: FieldMetadataDefaultValueNumber;
[FieldMetadataType.PROBABILITY]: FieldMetadataDefaultValueNumber;
[FieldMetadataType.ENUM]: FieldMetadataDefaultValueString;
[FieldMetadataType.URL]: FieldMetadataDefaultValueUrl;
[FieldMetadataType.MONEY]: FieldMetadataDefaultValueMoney;
[FieldMetadataType.LINK]: FieldMetadataDefaultValueLink;
[FieldMetadataType.CURRENCY]: FieldMetadataDefaultValueCurrency;
};
type DefaultValueByFieldMetadata<T extends FieldMetadataType | 'default'> = [

View File

@ -4,14 +4,14 @@ export interface FieldMetadataTargetColumnMapValue {
value: string;
}
export interface FieldMetadataTargetColumnMapUrl {
text: string;
link: string;
export interface FieldMetadataTargetColumnMapLink {
label: string;
url: string;
}
export interface FieldMetadataTargetColumnMapMoney {
amount: string;
currency: string;
export interface FieldMetadataTargetColumnMapCurrency {
amountMicros: string;
currencyCode: string;
}
type AllFieldMetadataTypes = {
@ -19,8 +19,8 @@ type AllFieldMetadataTypes = {
};
type FieldMetadataTypeMapping = {
[FieldMetadataType.URL]: FieldMetadataTargetColumnMapUrl;
[FieldMetadataType.MONEY]: FieldMetadataTargetColumnMapMoney;
[FieldMetadataType.LINK]: FieldMetadataTargetColumnMapLink;
[FieldMetadataType.CURRENCY]: FieldMetadataTargetColumnMapCurrency;
};
type TypeByFieldMetadata<T extends FieldMetadataType | 'default'> =

View File

@ -19,46 +19,49 @@ describe('convertFieldMetadataToColumnActions', () => {
]);
});
it('should convert URL field metadata to column actions', () => {
it('should convert LINK field metadata to column actions', () => {
const fieldMetadata = {
type: FieldMetadataType.URL,
targetColumnMap: { text: 'url_text', link: 'url_link' },
defaultValue: { text: 'http://example.com', link: 'Example' },
type: FieldMetadataType.LINK,
targetColumnMap: { label: 'linkLabel', url: 'linkURL' },
defaultValue: { label: 'http://example.com', url: 'Example' },
} as any;
const columnActions = convertFieldMetadataToColumnActions(fieldMetadata);
expect(columnActions).toEqual([
{
action: 'CREATE',
columnName: 'url_text',
columnName: 'linkLabel',
columnType: 'varchar',
defaultValue: "'http://example.com'",
},
{
action: 'CREATE',
columnName: 'url_link',
columnName: 'linkURL',
columnType: 'varchar',
defaultValue: "'Example'",
},
]);
});
it('should convert MONEY field metadata to column actions', () => {
it('should convert CURRENCY field metadata to column actions', () => {
const fieldMetadata = {
type: FieldMetadataType.MONEY,
targetColumnMap: { amount: 'money_amount', currency: 'money_currency' },
defaultValue: { amount: 100, currency: 'USD' },
type: FieldMetadataType.CURRENCY,
targetColumnMap: {
amountMicros: 'moneyAmountMicros',
currencyCode: 'moneyCurrencyCode',
},
defaultValue: { amountMicros: 100 * 1_000_000, currencyCode: 'USD' },
} as any;
const columnActions = convertFieldMetadataToColumnActions(fieldMetadata);
expect(columnActions).toEqual([
{
action: 'CREATE',
columnName: 'money_amount',
columnName: 'moneyAmountMicros',
columnType: 'integer',
defaultValue: 100,
defaultValue: 100 * 1_000_000,
},
{
action: 'CREATE',
columnName: 'money_currency',
columnName: 'moneyCurrencyCode',
columnType: 'varchar',
defaultValue: "'USD'",
},

View File

@ -12,21 +12,21 @@ describe('generateTargetColumnMap', () => {
);
expect(textMap).toEqual({ value: 'name' });
const urlMap = generateTargetColumnMap(
FieldMetadataType.URL,
const linkMap = generateTargetColumnMap(
FieldMetadataType.LINK,
false,
'website',
);
expect(urlMap).toEqual({ text: 'website_text', link: 'website_link' });
expect(linkMap).toEqual({ label: 'websiteLabel', url: 'websiteUrl' });
const moneyMap = generateTargetColumnMap(
FieldMetadataType.MONEY,
const currencyMap = generateTargetColumnMap(
FieldMetadataType.CURRENCY,
true,
'price',
);
expect(moneyMap).toEqual({
amount: '_price_amount',
currency: '_price_currency',
expect(currencyMap).toEqual({
amountMicros: '_priceAmountMicros',
currencyCode: '_priceCurrencyCode',
});
});

View File

@ -8,7 +8,9 @@ describe('serializeDefaultValue', () => {
});
it('should handle uuid dynamic default value', () => {
expect(serializeDefaultValue({ type: 'uuid' })).toBe('uuid_generate_v4()');
expect(serializeDefaultValue({ type: 'uuid' })).toBe(
'public.uuid_generate_v4()',
);
});
it('should handle now dynamic default value', () => {

View File

@ -124,44 +124,44 @@ describe('validateDefaultValueBasedOnType', () => {
).toBe(false);
});
// URL type
it('should validate URL default value', () => {
// LINK type
it('should validate LINK default value', () => {
expect(
validateDefaultValueBasedOnType(
{ text: 'http://example.com', link: 'Example' },
FieldMetadataType.URL,
{ label: 'http://example.com', url: 'Example' },
FieldMetadataType.LINK,
),
).toBe(true);
});
it('should return false for invalid URL default value', () => {
it('should return false for invalid LINK default value', () => {
expect(
validateDefaultValueBasedOnType(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error Just for testing purposes
{ text: 123, link: {} },
FieldMetadataType.URL,
{ label: 123, url: {} },
FieldMetadataType.LINK,
),
).toBe(false);
});
// MONEY type
it('should validate MONEY default value', () => {
// CURRENCY type
it('should validate CURRENCY default value', () => {
expect(
validateDefaultValueBasedOnType(
{ amount: 100, currency: 'USD' },
FieldMetadataType.MONEY,
{ amountMicros: 100, currencyCode: 'USD' },
FieldMetadataType.CURRENCY,
),
).toBe(true);
});
it('should return false for invalid MONEY default value', () => {
it('should return false for invalid CURRENCY default value', () => {
expect(
validateDefaultValueBasedOnType(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error Just for testing purposes
{ amount: '100', currency: 'USD' },
FieldMetadataType.MONEY,
{ amountMicros: '100', currencyCode: 'USD' },
FieldMetadataType.CURRENCY,
),
).toBe(false);
});

View File

@ -85,41 +85,41 @@ export function convertFieldMetadataToColumnActions(
},
];
}
case FieldMetadataType.URL: {
case FieldMetadataType.LINK: {
const defaultValue =
fieldMetadata.defaultValue as FieldMetadataDefaultValue<FieldMetadataType.URL>;
fieldMetadata.defaultValue as FieldMetadataDefaultValue<FieldMetadataType.LINK>;
return [
{
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.text,
columnName: fieldMetadata.targetColumnMap.label,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.text),
defaultValue: serializeDefaultValue(defaultValue?.label),
},
{
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.link,
columnName: fieldMetadata.targetColumnMap.url,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.link),
defaultValue: serializeDefaultValue(defaultValue?.url),
},
];
}
case FieldMetadataType.MONEY: {
case FieldMetadataType.CURRENCY: {
const defaultValue =
fieldMetadata.defaultValue as FieldMetadataDefaultValue<FieldMetadataType.MONEY>;
fieldMetadata.defaultValue as FieldMetadataDefaultValue<FieldMetadataType.CURRENCY>;
return [
{
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.amount,
columnName: fieldMetadata.targetColumnMap.amountMicros,
columnType: 'integer',
defaultValue: serializeDefaultValue(defaultValue?.amount),
defaultValue: serializeDefaultValue(defaultValue?.amountMicros),
},
{
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.currency,
columnName: fieldMetadata.targetColumnMap.currencyCode,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.currency),
defaultValue: serializeDefaultValue(defaultValue?.currencyCode),
},
];
}

View File

@ -29,15 +29,15 @@ export function generateTargetColumnMap(
return {
value: columnName,
};
case FieldMetadataType.URL:
case FieldMetadataType.LINK:
return {
text: `${columnName}_text`,
link: `${columnName}_link`,
label: `${columnName}Label`,
url: `${columnName}Url`,
};
case FieldMetadataType.MONEY:
case FieldMetadataType.CURRENCY:
return {
amount: `${columnName}_amount`,
currency: `${columnName}_currency`,
amountMicros: `${columnName}AmountMicros`,
currencyCode: `${columnName}CurrencyCode`,
};
default:
throw new BadRequestException(`Unknown type ${type}`);

View File

@ -13,7 +13,7 @@ export const serializeDefaultValue = (
if (typeof defaultValue === 'object' && 'type' in defaultValue) {
switch (defaultValue.type) {
case 'uuid':
return 'uuid_generate_v4()';
return 'public.uuid_generate_v4()';
case 'now':
return 'now()';
default:

View File

@ -54,22 +54,22 @@ export const validateDefaultValueBasedOnType = (
defaultValue.value instanceof Date
);
case FieldMetadataType.URL:
case FieldMetadataType.LINK:
return (
typeof defaultValue === 'object' &&
'text' in defaultValue &&
typeof defaultValue.text === 'string' &&
'link' in defaultValue &&
typeof defaultValue.link === 'string'
'label' in defaultValue &&
typeof defaultValue.label === 'string' &&
'url' in defaultValue &&
typeof defaultValue.url === 'string'
);
case FieldMetadataType.MONEY:
case FieldMetadataType.CURRENCY:
return (
typeof defaultValue === 'object' &&
'amount' in defaultValue &&
typeof defaultValue.amount === 'number' &&
'currency' in defaultValue &&
typeof defaultValue.currency === 'string'
'amountMicros' in defaultValue &&
typeof defaultValue.amountMicros === 'number' &&
'currencyCode' in defaultValue &&
typeof defaultValue.currencyCode === 'string'
);
default:

View File

@ -75,7 +75,7 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
isNullable: true,
isActive: true,
isCustom: false,
// isSystem: true,
isSystem: true,
workspaceId: record.workspaceId,
},
{