custom-entity-fields.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { Column, ColumnType, Entity } from 'typeorm';
  2. import { assertNever } from '../../../shared/shared-utils';
  3. import { CustomFields, CustomFieldType, getConfig } from '../config/vendure-config';
  4. const config = getConfig();
  5. @Entity()
  6. export class CustomAddressFields {}
  7. @Entity()
  8. export class CustomCustomerFields {}
  9. @Entity()
  10. export class CustomProductFields {}
  11. @Entity()
  12. export class CustomProductOptionFields {}
  13. @Entity()
  14. export class CustomProductOptionGroupFields {}
  15. @Entity()
  16. export class CustomProductVariantFields {}
  17. @Entity()
  18. export class CustomUserFields {}
  19. /**
  20. * Dynamically add columns to the custom field entity based on the CustomFields config.
  21. */
  22. function registerEntityCustomFields(entityName: keyof CustomFields, ctor: { new (): any }) {
  23. const customFields = config.customFields && config.customFields[entityName];
  24. if (customFields) {
  25. for (const customField of customFields) {
  26. const { name, type } = customField;
  27. Column({ type: getColumnType(type), name })(new ctor(), name);
  28. }
  29. }
  30. }
  31. function getColumnType(type: CustomFieldType): ColumnType {
  32. switch (type) {
  33. case 'string':
  34. case 'localeString':
  35. return 'varchar';
  36. case 'boolean':
  37. return 'bool';
  38. case 'int':
  39. return 'int';
  40. case 'float':
  41. return 'double';
  42. case 'datetime':
  43. return 'datetime';
  44. default:
  45. assertNever(type);
  46. }
  47. return 'varchar';
  48. }
  49. registerEntityCustomFields('Address', CustomAddressFields);
  50. registerEntityCustomFields('Customer', CustomCustomerFields);
  51. registerEntityCustomFields('Product', CustomProductFields);
  52. registerEntityCustomFields('ProductOption', CustomProductOptionFields);
  53. registerEntityCustomFields('ProductOptionGroup', CustomProductOptionGroupFields);
  54. registerEntityCustomFields('ProductVariant', CustomProductVariantFields);
  55. registerEntityCustomFields('User', CustomUserFields);