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:
@ -27,8 +27,8 @@ export enum FieldMetadataType {
|
||||
NUMBER = 'NUMBER',
|
||||
PROBABILITY = 'PROBABILITY',
|
||||
ENUM = 'ENUM',
|
||||
URL = 'URL',
|
||||
MONEY = 'MONEY',
|
||||
LINK = 'LINK',
|
||||
CURRENCY = 'CURRENCY',
|
||||
RELATION = 'RELATION',
|
||||
}
|
||||
|
||||
|
||||
@ -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'> = [
|
||||
|
||||
@ -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'> =
|
||||
|
||||
@ -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'",
|
||||
},
|
||||
|
||||
@ -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',
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@ -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', () => {
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
@ -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),
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
@ -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}`);
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -75,7 +75,7 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
||||
isNullable: true,
|
||||
isActive: true,
|
||||
isCustom: false,
|
||||
// isSystem: true,
|
||||
isSystem: true,
|
||||
workspaceId: record.workspaceId,
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user