parse-sort-params.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { Type } from 'shared/shared-types';
  2. import { Connection, OrderByCondition } from 'typeorm';
  3. import { ColumnMetadata } from 'typeorm/metadata/ColumnMetadata';
  4. import { VendureEntity } from '../entity/base/base.entity';
  5. import { I18nError } from '../i18n/i18n-error';
  6. import { SortParameter } from './common-types';
  7. /**
  8. * Parses the provided SortParameter array against the metadata of the given entity, ensuring that only
  9. * valid fields are being sorted against. The output assumes
  10. * @param connection
  11. * @param entity
  12. * @param sortParams
  13. */
  14. export function parseSortParams<T extends VendureEntity>(
  15. connection: Connection,
  16. entity: Type<T>,
  17. sortParams: SortParameter<T> | undefined,
  18. ): OrderByCondition {
  19. if (!sortParams || Object.keys(sortParams).length === 0) {
  20. return {};
  21. }
  22. const metadata = connection.getMetadata(entity);
  23. const columns = metadata.columns;
  24. let translationColumns: ColumnMetadata[] = [];
  25. const relations = metadata.relations;
  26. const translationRelation = relations.find(r => r.propertyName === 'translations');
  27. if (translationRelation) {
  28. const translationMetadata = connection.getMetadata(translationRelation.type);
  29. translationColumns = columns.concat(translationMetadata.columns.filter(c => !c.relationMetadata));
  30. }
  31. const output = {};
  32. const alias = metadata.name.toLowerCase();
  33. for (const [key, order] of Object.entries(sortParams)) {
  34. if (columns.find(c => c.propertyName === key)) {
  35. output[`${alias}.${key}`] = order;
  36. } else if (translationColumns.find(c => c.propertyName === key)) {
  37. output[`${alias}_translations.${key}`] = order;
  38. } else {
  39. throw new I18nError('error.invalid-sort-field', {
  40. fieldName: key,
  41. validFields: getValidSortFields([...columns, ...translationColumns]),
  42. });
  43. }
  44. }
  45. return output;
  46. }
  47. function getValidSortFields(columns: ColumnMetadata[]): string {
  48. return Array.from(new Set(columns.map(c => c.propertyName))).join(', ');
  49. }