@bytebrand/export-cars 1.10.11 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/app.module.js +4 -7
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/configs/index.d.ts +1 -0
  4. package/dist/configs/index.js +1 -0
  5. package/dist/configs/index.js.map +1 -1
  6. package/dist/configs/trovit.config.d.ts +5 -0
  7. package/dist/configs/trovit.config.js +17 -0
  8. package/dist/configs/trovit.config.js.map +1 -0
  9. package/dist/constants/modix/category.constant.js.map +1 -1
  10. package/dist/enums/export-type.enum.d.ts +2 -1
  11. package/dist/enums/export-type.enum.js +1 -0
  12. package/dist/enums/export-type.enum.js.map +1 -1
  13. package/dist/export.schema.d.ts +6 -2
  14. package/dist/export.schema.js +4 -0
  15. package/dist/export.schema.js.map +1 -1
  16. package/dist/exporters/index.d.ts +1 -0
  17. package/dist/exporters/index.js +1 -0
  18. package/dist/exporters/index.js.map +1 -1
  19. package/dist/exporters/trovit.exporter.d.ts +12 -0
  20. package/dist/exporters/trovit.exporter.js +62 -0
  21. package/dist/exporters/trovit.exporter.js.map +1 -0
  22. package/dist/formats/index.d.ts +1 -0
  23. package/dist/formats/index.js +1 -0
  24. package/dist/formats/index.js.map +1 -1
  25. package/dist/formats/trovit-xml.builder.d.ts +8 -0
  26. package/dist/formats/trovit-xml.builder.js +39 -0
  27. package/dist/formats/trovit-xml.builder.js.map +1 -0
  28. package/dist/interfaces/{autoborse.intreface.d.ts → atributes-wrap-item.intreface.d.ts} +1 -1
  29. package/dist/interfaces/{modix/modix-wrap-item.intreface.js → atributes-wrap-item.intreface.js} +1 -1
  30. package/dist/interfaces/atributes-wrap-item.intreface.js.map +1 -0
  31. package/dist/interfaces/export-item.interface.d.ts +64 -37
  32. package/dist/interfaces/index.d.ts +1 -0
  33. package/dist/interfaces/index.js +1 -0
  34. package/dist/interfaces/index.js.map +1 -1
  35. package/dist/interfaces/modix/index.d.ts +0 -1
  36. package/dist/interfaces/modix/index.js +0 -1
  37. package/dist/interfaces/modix/index.js.map +1 -1
  38. package/dist/interfaces/modix/modix-item-list.interface.d.ts +2 -2
  39. package/dist/services/images.service.d.ts +3 -3
  40. package/dist/services/images.service.js +10 -10
  41. package/dist/services/images.service.js.map +1 -1
  42. package/dist/services/index.d.ts +6 -5
  43. package/dist/services/index.js +6 -5
  44. package/dist/services/index.js.map +1 -1
  45. package/dist/services/transformer.service.d.ts +29 -0
  46. package/dist/services/transformer.service.js +122 -0
  47. package/dist/services/transformer.service.js.map +1 -0
  48. package/dist/transformers/auto24.transfomer.js +3 -3
  49. package/dist/transformers/auto24.transfomer.js.map +1 -1
  50. package/dist/transformers/autouncle.transformer.js +1 -1
  51. package/dist/transformers/autouncle.transformer.js.map +1 -1
  52. package/dist/transformers/facebook-shop.transformer.js +1 -1
  53. package/dist/transformers/facebook-shop.transformer.js.map +1 -1
  54. package/dist/transformers/fb-description.transformer.js +4 -4
  55. package/dist/transformers/fb-description.transformer.js.map +1 -1
  56. package/dist/transformers/fb.transformer.js +5 -6
  57. package/dist/transformers/fb.transformer.js.map +1 -1
  58. package/dist/transformers/google.transformer.js +1 -1
  59. package/dist/transformers/google.transformer.js.map +1 -1
  60. package/dist/transformers/index.d.ts +1 -0
  61. package/dist/transformers/index.js +1 -0
  62. package/dist/transformers/index.js.map +1 -1
  63. package/dist/transformers/meinstadt.transformer.d.ts +1 -1
  64. package/dist/transformers/meinstadt.transformer.js +3 -3
  65. package/dist/transformers/meinstadt.transformer.js.map +1 -1
  66. package/dist/transformers/mobile.transformer.js +3 -3
  67. package/dist/transformers/mobile.transformer.js.map +1 -1
  68. package/dist/transformers/modix.transformer.js +5 -5
  69. package/dist/transformers/modix.transformer.js.map +1 -1
  70. package/dist/transformers/ooyyo.transformer.js +1 -1
  71. package/dist/transformers/ooyyo.transformer.js.map +1 -1
  72. package/dist/transformers/rubrikk.transformer.js +1 -1
  73. package/dist/transformers/rubrikk.transformer.js.map +1 -1
  74. package/dist/transformers/trovit.transformer.d.ts +16 -0
  75. package/dist/transformers/trovit.transformer.js +73 -0
  76. package/dist/transformers/trovit.transformer.js.map +1 -0
  77. package/dist/tsconfig.build.tsbuildinfo +1 -1
  78. package/dist/utils/converter.utils.d.ts +1 -0
  79. package/dist/utils/converter.utils.js +5 -1
  80. package/dist/utils/converter.utils.js.map +1 -1
  81. package/dist/utils/index.d.ts +3 -0
  82. package/dist/utils/index.js +20 -0
  83. package/dist/utils/index.js.map +1 -0
  84. package/package.json +3 -3
  85. package/src/app.module.ts +14 -8
  86. package/src/configs/index.ts +1 -0
  87. package/src/configs/trovit.config.ts +14 -0
  88. package/src/constants/modix/category.constant.ts +0 -1
  89. package/src/enums/export-type.enum.ts +1 -0
  90. package/src/export.schema.ts +6 -0
  91. package/src/exporters/index.ts +1 -0
  92. package/src/exporters/trovit.exporter.ts +49 -0
  93. package/src/formats/index.ts +1 -0
  94. package/src/formats/trovit-xml.builder.ts +44 -0
  95. package/src/interfaces/{autoborse.intreface.ts → atributes-wrap-item.intreface.ts} +1 -1
  96. package/src/interfaces/export-item.interface.ts +65 -37
  97. package/src/interfaces/index.ts +1 -0
  98. package/src/interfaces/modix/index.ts +0 -1
  99. package/src/interfaces/modix/modix-item-list.interface.ts +2 -2
  100. package/src/services/images.service.ts +19 -10
  101. package/src/services/index.ts +6 -5
  102. package/src/services/transformer.service.ts +129 -0
  103. package/src/transformers/as24.transformer.ts +3 -3
  104. package/src/transformers/auto24.transfomer.ts +7 -2
  105. package/src/transformers/autouncle.transformer.ts +2 -2
  106. package/src/transformers/facebook-shop.transformer.ts +1 -1
  107. package/src/transformers/fb-description.transformer.ts +4 -4
  108. package/src/transformers/fb.transformer.ts +14 -12
  109. package/src/transformers/google.transformer.ts +6 -2
  110. package/src/transformers/index.ts +1 -0
  111. package/src/transformers/meinstadt.transformer.ts +9 -4
  112. package/src/transformers/mobile.transformer.ts +8 -4
  113. package/src/transformers/modix.transformer.ts +14 -14
  114. package/src/transformers/ooyyo.transformer.ts +1 -1
  115. package/src/transformers/rubrikk.transformer.ts +1 -1
  116. package/src/transformers/trovit.transformer.ts +63 -0
  117. package/src/utils/converter.utils.ts +4 -0
  118. package/src/utils/index.ts +3 -0
  119. package/dist/interfaces/autoborse.intreface.js +0 -3
  120. package/dist/interfaces/autoborse.intreface.js.map +0 -1
  121. package/dist/interfaces/modix/modix-wrap-item.intreface.d.ts +0 -6
  122. package/dist/interfaces/modix/modix-wrap-item.intreface.js.map +0 -1
  123. package/src/interfaces/modix/modix-wrap-item.intreface.ts +0 -6
@@ -0,0 +1,129 @@
1
+ import { DataSchemes } from '@bytebrand/car-schema';
2
+ import { Injectable } from '@nestjs/common';
3
+
4
+ import { escape, get, join, toNumber, toSafeInteger, toString, trim } from 'lodash';
5
+ import * as moment from 'moment';
6
+
7
+ import { BodyColorList, CategoryList, FuelList, TransmissionList } from '../constants';
8
+ import { MIN_MILEAGES } from '../constants/autouncle.contants';
9
+ import { ConfigService } from './config.service';
10
+ import { isValidVin } from '../utils';
11
+
12
+ @Injectable()
13
+ export class TransformerService {
14
+ constructor(private readonly configService: ConfigService) {}
15
+
16
+ identifier(car: DataSchemes.Car): string {
17
+ return get(car, 'metaData.vehicleId', '');
18
+ }
19
+
20
+ link(car: DataSchemes.Car, params?: string): string {
21
+ return params
22
+ ? `https://${this.configService.config.domain}/search/vehicle/${car._id}?${params}`
23
+ : `https://${this.configService.config.domain}/search/vehicle/${car._id}`;
24
+ }
25
+
26
+ title(car: DataSchemes.Car): string {
27
+ const make = toString(get(car, 'mainData.make', ''));
28
+ const model = toString(get(car, 'mainData.model', ''));
29
+ const subModel = toString(get(car, 'mainData.subModel', ''));
30
+ return trim(escape(join([make, model, subModel], ' ')));
31
+ }
32
+
33
+ price(car: DataSchemes.Car): number {
34
+ const price = get(car, 'price.currentSalesPrice', null);
35
+ return toNumber(price);
36
+ }
37
+
38
+ postCode(car: DataSchemes.Car): string {
39
+ return toString(get(car, 'location.zipCode', ''));
40
+ }
41
+
42
+ vinCode(car: DataSchemes.Car): string {
43
+ const vin: string = get(car, 'metaData.vin', '');
44
+ return isValidVin(vin) ? vin : get(car, 'marketing.fakeVIN', '');
45
+ }
46
+
47
+ make(car: DataSchemes.Car): string {
48
+ return toString(get(car, 'mainData.make', ''));
49
+ }
50
+
51
+ model(car: DataSchemes.Car): string {
52
+ return toString(get(car, 'mainData.model', ''));
53
+ }
54
+
55
+ color(car: DataSchemes.Car): string {
56
+ const colorSelection = get(car, 'exterior.exteriorColor', 'selector_unknown');
57
+ return <string>get(BodyColorList, colorSelection).value;
58
+ }
59
+
60
+ bodyStyle(car: DataSchemes.Car): string {
61
+ const body_style_selector = get(car, 'mainData.category', 'selector_unknown');
62
+ return <string>get(CategoryList, body_style_selector).value;
63
+ }
64
+ year(car: DataSchemes.Car): number {
65
+ const firstRegistration = get(car, 'mainData.firstRegistration', null) as number;
66
+ if (firstRegistration !== 0) {
67
+ return toSafeInteger(moment(firstRegistration * 1000).format('YYYY'));
68
+ }
69
+ return 0;
70
+ }
71
+
72
+ mileage(car: DataSchemes.Car): number {
73
+ const mileage = get(car, 'mainData.mileage', 0);
74
+ return mileage <= MIN_MILEAGES ? MIN_MILEAGES + 1 : mileage;
75
+ }
76
+
77
+ doors(car: DataSchemes.Car): number {
78
+ return toNumber(get(car, 'mainData.doors', null));
79
+ }
80
+
81
+ seats(car: DataSchemes.Car): number {
82
+ return toNumber(get(car, 'mainData.seats', null));
83
+ }
84
+
85
+ engineSizeInCCM(car: DataSchemes.Car): number {
86
+ return toNumber(get(car, 'engineData.cubicCapacity', null));
87
+ }
88
+
89
+ cylinders(car: DataSchemes.Car): number {
90
+ return toNumber(get(car, 'engineData.cylinders', null));
91
+ }
92
+
93
+ fuelType(car: DataSchemes.Car): string {
94
+ const fuel_selector = get(car, 'consumption.fuel', '');
95
+ return <string>get(FuelList, fuel_selector).value;
96
+ }
97
+
98
+ transmission(car: DataSchemes.Car): string {
99
+ const transmission_selector = get(car, 'driveSuspension.gearbox', 'selector_unknown');
100
+ return <string>get(TransmissionList, transmission_selector).value;
101
+ }
102
+
103
+ powerKW(car: DataSchemes.Car): number {
104
+ return toNumber(get(car, 'engineData.powerKW', null));
105
+ }
106
+
107
+ powerPS(car: DataSchemes.Car): number {
108
+ return toNumber(get(car, 'engineData.powerPS', null));
109
+ }
110
+
111
+ fuelConsumption(car: DataSchemes.Car): number {
112
+ return toNumber(get(car, 'consumption.consumptionCombined', null));
113
+ }
114
+
115
+ cO2Emission(car: DataSchemes.Car): number {
116
+ return toNumber(get(car, 'environmentEmissions.co2', null));
117
+ }
118
+
119
+ isNewBoolean(car: DataSchemes.Car): number {
120
+ const available = {
121
+ selector_condition_new: 1,
122
+ selector_condition_used: 0,
123
+ selector_unknown: 0,
124
+ };
125
+
126
+ const condition = get(car, 'mainData.condition', 'selector_unknown');
127
+ return get(available, condition);
128
+ }
129
+ }
@@ -6,9 +6,9 @@ import { MappingRules } from '../interfaces/mapping-rules.interface';
6
6
  import { Injectable } from '@nestjs/common';
7
7
  import { LoggerService } from '@bytebrand/cronicle-helper';
8
8
 
9
- /**
10
- * @deprecated 02.03.2022
11
- */
9
+ /**
10
+ * @deprecated 02.03.2022
11
+ */
12
12
  @Injectable()
13
13
  export class As24Transformer {
14
14
  private currentCar: DataSchemes.Car;
@@ -7,7 +7,7 @@ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
7
7
  import { Auto24XmlItem } from '../interfaces';
8
8
  import { Injectable } from '@nestjs/common';
9
9
  import { ConfigService, ImagesService } from '../services';
10
- import { isNotEmptyArray } from '../utils/validator.utils';
10
+ import { isNotEmptyArray } from '../utils';
11
11
 
12
12
  @Injectable()
13
13
  export class Auto24Transformer {
@@ -19,7 +19,12 @@ export class Auto24Transformer {
19
19
 
20
20
  async transform(car: DataSchemes.Car, imboImages: ImboImageResponseInterface[]): Promise<Auto24XmlItem> {
21
21
  const carId = toString(get(car, '_id', ''));
22
- const transformedImages = await this.imageService.getImages(car, imboImages, this.configService.config.imageType);
22
+ const transformedImages = await this.imageService.getImages(
23
+ car,
24
+ imboImages,
25
+ this.configService.config.imageType,
26
+ false,
27
+ );
23
28
  let userlink = `https://www.${this.configService.config.domain}/search/vehicle/${carId}`;
24
29
  if (this.configService.config.campaign) {
25
30
  userlink += `?source=classifieds&medium=listing&campaign=${this.configService.config.campaign}`;
@@ -1,6 +1,6 @@
1
1
  import { TranslatorExtended } from '@bytebrand/schema-tools';
2
2
  import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
3
- import {get, toString, isEmpty, toSafeInteger } from 'lodash';
3
+ import { get, toString, isEmpty, toSafeInteger } from 'lodash';
4
4
  import * as moment from 'moment';
5
5
  import { DataSchemes } from '@bytebrand/car-schema';
6
6
  import { DePostalCodesService } from '@bytebrand/car-basic-data-scope';
@@ -35,7 +35,7 @@ export class AutouncleTransformer {
35
35
  }): Promise<AutouncleJsonItem> {
36
36
  const autodeId = toString(get(car, '_id', ''));
37
37
  const address = await this.getAddress(car, owner);
38
- const image_urls = await this.imageService.getImages(car, images, this.configService.config.imageType);
38
+ const image_urls = await this.imageService.getImages(car, images, this.configService.config.imageType, false);
39
39
  const transformed_images = image_urls.map(url => {
40
40
  return { url };
41
41
  });
@@ -29,7 +29,7 @@ export class FacebookShopTransformer {
29
29
  car: DataSchemes.Car;
30
30
  images: ImboImageResponseInterface[];
31
31
  }): Promise<FacebookShopItem> {
32
- const imageLinks = await this.imageService.getImages(car, images, this.configService.config.imageType);
32
+ const imageLinks = await this.imageService.getImages(car, images, this.configService.config.imageType, false);
33
33
 
34
34
  return {
35
35
  id: { value: get(car, 'metaData.vehicleId'), isGoogle: true },
@@ -43,7 +43,7 @@ export class FbDescription {
43
43
  {
44
44
  title: 'title.cylinders',
45
45
  value: {
46
- key: get(this.car, 'engineData.cylinders') as string,
46
+ key: get(this.car, 'engineData.cylinders', '') as string,
47
47
  },
48
48
  },
49
49
  {
@@ -169,7 +169,7 @@ export class FbDescription {
169
169
  {
170
170
  title: 'title.base',
171
171
  value: {
172
- key: get(this.car, 'driveSuspension.wheelBase') as string,
172
+ key: get(this.car, 'driveSuspension.wheelBase', '') as string,
173
173
  },
174
174
  },
175
175
  {
@@ -191,13 +191,13 @@ export class FbDescription {
191
191
  {
192
192
  title: 'title.doors',
193
193
  value: {
194
- key: get(this.car, 'mainData.doors') as string,
194
+ key: get(this.car, 'mainData.doors', '') as string,
195
195
  },
196
196
  },
197
197
  {
198
198
  title: 'title.seats',
199
199
  value: {
200
- key: get(this.car, 'mainData.seats') as string,
200
+ key: get(this.car, 'mainData.seats', '') as string,
201
201
  },
202
202
  },
203
203
  {
@@ -29,7 +29,7 @@ import { Description } from '../interfaces/description.interface';
29
29
  import { FbDescription } from './fb-description.transformer';
30
30
  import { ConfigService, ImagesService } from '../services';
31
31
  import { FbEquipment } from './fb-equipment.transformer';
32
- import { isValidVin } from '../utils/validator.utils';
32
+ import { isValidVin } from '../utils';
33
33
  import { UserService } from 'src/services';
34
34
  import { ImageType } from '../enums';
35
35
  import {
@@ -41,7 +41,6 @@ import {
41
41
  TIMESTAMP_FIRST_YEAR,
42
42
  } from '../constants/fb.constants';
43
43
 
44
-
45
44
  @Injectable()
46
45
  export class FbTransformer {
47
46
  private translator: TranslatorExtended;
@@ -49,10 +48,10 @@ export class FbTransformer {
49
48
  private imagesService: ImagesService;
50
49
 
51
50
  constructor(
52
- @Inject(CACHE_MANAGER) private cacheManager: Cache,
53
- private readonly configService: ConfigService,
54
- private readonly userService: UserService
55
- ) {
51
+ @Inject(CACHE_MANAGER) private cacheManager: Cache,
52
+ private readonly configService: ConfigService,
53
+ private readonly userService: UserService,
54
+ ) {
56
55
  this.imagesService = new ImagesService(configService, userService);
57
56
  const dict = { ...de, ...deVehicleProps, ...deVehicleDetailsPage };
58
57
  this.translator = new TranslatorExtended(dict);
@@ -72,7 +71,7 @@ export class FbTransformer {
72
71
  const year = this.getYear(car);
73
72
  const dealerInfo = this.getDealerItems(car);
74
73
  const address = await this.getAddress(car, owner);
75
- const image_links = await this.imagesService.getImages(car, images, ImageType.marketing);
74
+ const image_links = await this.imagesService.getImages(car, images, ImageType.marketing, false);
76
75
  const transformedImages = image_links.map(el => {
77
76
  return { url: el };
78
77
  });
@@ -138,7 +137,7 @@ export class FbTransformer {
138
137
  const firstRegistration = get(car, 'mainData.firstRegistration', 0) as number;
139
138
  const firstRegistrationYear = moment(firstRegistration * 1000).format('YYYY');
140
139
 
141
- const constructionYear = get(car, 'mainData.constructionYear') as string;
140
+ const constructionYear = get(car, 'mainData.constructionYear', '') as string;
142
141
 
143
142
  const metaCreationDate = get(car, 'metaData.creationDate') as number;
144
143
  const metaCreationYear = moment(metaCreationDate * 1000).format('YYYY');
@@ -329,11 +328,15 @@ export class FbTransformer {
329
328
  const cacheKey = `${info.city}_${info.zip}`;
330
329
 
331
330
  let entry = await this.cacheManager.get(cacheKey);
332
- if (entry) { return entry as DePostalCodesEntryInterface; };
333
- if (entry === 'no_data') { return undefined; }
331
+ if (entry) {
332
+ return entry as DePostalCodesEntryInterface;
333
+ }
334
+ if (entry === 'no_data') {
335
+ return undefined;
336
+ }
334
337
 
335
338
  entry = await this.postalCodesService.getLocationByPostalCode(info.zip);
336
- entry && await this.cacheManager.set(cacheKey, entry);
339
+ entry && (await this.cacheManager.set(cacheKey, entry));
337
340
 
338
341
  if (!entry) {
339
342
  entry = await this.postalCodesService.getLocationByCity(info.city);
@@ -342,7 +345,6 @@ export class FbTransformer {
342
345
  } else {
343
346
  await this.cacheManager.set(cacheKey, 'no_data');
344
347
  }
345
-
346
348
  }
347
349
  return entry as DePostalCodesEntryInterface;
348
350
  }
@@ -6,7 +6,6 @@ import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictio
6
6
  import { Injectable } from '@nestjs/common';
7
7
  import { ConfigService, ImagesService, UserService } from '../services';
8
8
  import { GoogleXmlItem } from '../interfaces';
9
- import { ImageType } from '../enums';
10
9
 
11
10
  @Injectable()
12
11
  export class GoogleTransformer {
@@ -23,7 +22,12 @@ export class GoogleTransformer {
23
22
 
24
23
  async transform({ car, images }: { car: DataSchemes.Car; images: Array<any> }): Promise<GoogleXmlItem> {
25
24
  const carId = toString(get(car, '_id', ''));
26
- const transformedImages = await this.imageService.getImages(car, images, this.configService.config.imageType);
25
+ const transformedImages = await this.imageService.getImages(
26
+ car,
27
+ images,
28
+ this.configService.config.imageType,
29
+ false,
30
+ );
27
31
 
28
32
  return {
29
33
  id: carId,
@@ -1,3 +1,4 @@
1
1
  export * from './rubrikk.transformer';
2
2
  export * from './modix.transformer';
3
3
  export * from './facebook-shop.transformer';
4
+ export * from './trovit.transformer';
@@ -9,13 +9,18 @@ import { de } from '@bytebrand/i18n-dictionaries';
9
9
  import { ConfigService, ImagesService } from '../services';
10
10
  import { MeinstadtJsonItem } from '../interfaces';
11
11
 
12
-
13
12
  @Injectable()
14
13
  export class MeinstadtTransformer {
15
14
  constructor(private configService: ConfigService, private readonly imageService: ImagesService) {}
16
15
 
17
- async transform({ car, images }: { car: DataSchemes.Car, images: ImboImageResponseInterface[] }): Promise<Partial<MeinstadtJsonItem>> {
18
- const carImages = await this.imageService.getImages(car, images, this.configService.config.imageType);
16
+ async transform({
17
+ car,
18
+ images,
19
+ }: {
20
+ car: DataSchemes.Car;
21
+ images: ImboImageResponseInterface[];
22
+ }): Promise<Partial<MeinstadtJsonItem>> {
23
+ const carImages = await this.imageService.getImages(car, images, this.configService.config.imageType, false);
19
24
 
20
25
  const carId = toString(get(car, '_id', null));
21
26
 
@@ -47,7 +52,7 @@ export class MeinstadtTransformer {
47
52
  imagesCount: carImages.length,
48
53
  'customerType/sellerType': 'Händler',
49
54
  usageState: this.translate(this.getUsageState(car)),
50
- images: carImages,
55
+ images: carImages[0],
51
56
  };
52
57
  }
53
58
 
@@ -9,10 +9,9 @@ import { DataSchemes } from '@bytebrand/car-schema';
9
9
 
10
10
  import { MappingService, UserService, ImagesService } from '../services';
11
11
  import { MappingRules } from '../interfaces/mapping-rules.interface';
12
- import { isNotEmptyArray } from '../utils/validator.utils';
12
+ import { isNotEmptyArray } from '../utils';
13
13
  import { ConfigService } from '../services';
14
14
 
15
-
16
15
  const vinGenerator = require('vin-generator');
17
16
 
18
17
  @Injectable()
@@ -24,7 +23,7 @@ export class MobileTransformer {
24
23
  private userService: UserService,
25
24
  private configService: ConfigService,
26
25
  private imagesService: ImagesService,
27
- ) { }
26
+ ) {}
28
27
 
29
28
  async transform(carData: DataSchemes.Car, images: ImboImageResponseInterface[]): Promise<unknown> {
30
29
  this.currentCar = carData;
@@ -353,7 +352,12 @@ export class MobileTransformer {
353
352
  }
354
353
 
355
354
  private async getImages(car: DataSchemes.Car, images): Promise<string | null> {
356
- const transformedImages = await this.imagesService.getImages(car, images, this.configService.config.imageType);
355
+ const transformedImages = await this.imagesService.getImages(
356
+ car,
357
+ images,
358
+ this.configService.config.imageType,
359
+ false,
360
+ );
357
361
  let imagesAsALine;
358
362
  if (isNotEmptyArray(transformedImages)) {
359
363
  imagesAsALine = transformedImages.map((el: string) => el).join(';');
@@ -9,8 +9,8 @@ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
9
9
  import { ImportOrigins } from '@bytebrand/cronicle-helper';
10
10
  import { DataSchemes } from '@bytebrand/car-schema';
11
11
 
12
- import { imageItem, IModixWrapItem, ModixXmlItem } from '../interfaces';
13
- import { isNotEmptyArray, isValidVin } from '../utils/validator.utils';
12
+ import { imageItem, IAtributeWrapItem, ModixXmlItem } from '../interfaces';
13
+ import { isNotEmptyArray, isValidVin, xmlStringReplacer } from '../utils';
14
14
  import { ConfigService } from '../services';
15
15
  import {
16
16
  BodyColorList,
@@ -38,8 +38,8 @@ export class ModixTransformer {
38
38
  maindata: {
39
39
  category: this.getCategoryData(car),
40
40
  manufacturer: this.getManufactureData(car),
41
- model: { value: toString(get(car, 'mainData.model', '')) },
42
- submodel: { value: (get(car, 'mainData.subModel', '') || '').replace(/&/g, '&amp;') },
41
+ model: { value: xmlStringReplacer(get(car, 'mainData.model', '')) },
42
+ submodel: { value: xmlStringReplacer(get(car, 'mainData.subModel', '')) },
43
43
  mileage: { value: toNumber(get(car, 'mainData.mileage', null)), atributes: { scaleUnit: 'km' } },
44
44
  cylinderCapacity: { value: toString(get(car, 'engineData.cylinders', null)) },
45
45
  enginePower: { value: toNumber(get(car, 'engineData.powerKW', null)), atributes: { scaleUnit: 'kW' } },
@@ -112,12 +112,12 @@ export class ModixTransformer {
112
112
  };
113
113
  }
114
114
 
115
- private getCategoryData(car: DataSchemes.Car): IModixWrapItem {
115
+ private getCategoryData(car: DataSchemes.Car): IAtributeWrapItem {
116
116
  const vehicle_class = get(car, 'mainData.vehicleClass', 'selector_unknown');
117
117
  return get(VehicleClassList, vehicle_class);
118
118
  }
119
119
 
120
- private getManufactureData(car: DataSchemes.Car): IModixWrapItem {
120
+ private getManufactureData(car: DataSchemes.Car): IAtributeWrapItem {
121
121
  const carMake = toString(get(car, 'mainData.make', ''));
122
122
  const manufactureData = findLast(ManufactureList, item => toLowercase(item.name) === toLowercase(carMake));
123
123
  // temporary
@@ -127,23 +127,23 @@ export class ModixTransformer {
127
127
  return { value: manufactureData?.name || carMake, atributes: { id: manufactureData?.id || null } };
128
128
  }
129
129
 
130
- private getFuelData(car: DataSchemes.Car): IModixWrapItem {
130
+ private getFuelData(car: DataSchemes.Car): IAtributeWrapItem {
131
131
  const fuel_selector = get(car, 'consumption.fuel', '');
132
132
  return get(FuelList, fuel_selector);
133
133
  }
134
134
 
135
- private getTransmissionData(car: DataSchemes.Car): IModixWrapItem {
135
+ private getTransmissionData(car: DataSchemes.Car): IAtributeWrapItem {
136
136
  const transmission_selector = get(car, 'driveSuspension.gearbox', 'selector_unknown');
137
137
  return get(TransmissionList, transmission_selector);
138
138
  }
139
139
 
140
- private getAccident(car: DataSchemes.Car): IModixWrapItem {
140
+ private getAccident(car: DataSchemes.Car): IAtributeWrapItem {
141
141
  const accident = get(car, 'maindata.accidentDamaged', null);
142
142
 
143
143
  return { value: accident };
144
144
  }
145
145
 
146
- private getUsageData(car: DataSchemes.Car): IModixWrapItem {
146
+ private getUsageData(car: DataSchemes.Car): IAtributeWrapItem {
147
147
  const usageType = get(car, 'maindata.usageType', '');
148
148
  const usage_by_selector = get(UsageTypeList, usageType);
149
149
 
@@ -155,17 +155,17 @@ export class ModixTransformer {
155
155
  return get(UsageConditionList, condition);
156
156
  }
157
157
 
158
- private getBodyStyleData(car: DataSchemes.Car): IModixWrapItem {
158
+ private getBodyStyleData(car: DataSchemes.Car): IAtributeWrapItem {
159
159
  const body_style_selector = get(car, 'mainData.category', 'selector_unknown');
160
160
  return get(CategoryList, body_style_selector);
161
161
  }
162
162
 
163
- private getPainId(car: DataSchemes.Car): IModixWrapItem {
163
+ private getPainId(car: DataSchemes.Car): IAtributeWrapItem {
164
164
  const metallic = get(car, 'exterior.metallic', false);
165
165
  return metallic ? { value: 'metallic', atributes: { id: 3 } } : { value: 'solid', atributes: { id: 1 } };
166
166
  }
167
167
 
168
- private getColorNameData(car): IModixWrapItem {
168
+ private getColorNameData(car): IAtributeWrapItem {
169
169
  const colorSelection = get(car, 'exterior.exteriorColor', 'selector_unknown');
170
170
  return get(BodyColorList, colorSelection);
171
171
  }
@@ -202,7 +202,7 @@ export class ModixTransformer {
202
202
  const car_id = toString(get(car, '_id', ''));
203
203
  const url = `${this.configService.config.imageUrl}/carimage/${car_id}`;
204
204
 
205
- const imageList: IModixWrapItem[] = [];
205
+ const imageList: IAtributeWrapItem[] = [];
206
206
 
207
207
  if (isNotEmptyArray(images)) {
208
208
  images.forEach((image: ImboImageResponseInterface, index) => {
@@ -48,7 +48,7 @@ export class OoyyoTransformer {
48
48
  doors: toString(get(car, 'mainData.doors', '')),
49
49
  seats: toString(get(car, 'mainData.seats', '')),
50
50
  gears: toString(get(car, 'driveSuspension.gears', '')),
51
- pictures: await this.imageService.getImages(car, imboImages, this.configService.config.imageType),
51
+ pictures: await this.imageService.getImages(car, imboImages, this.configService.config.imageType, false),
52
52
  location: {
53
53
  city: toString(get(car, 'location.city', '')),
54
54
  postcode: toString(get(car, 'location.zipCode', '')),
@@ -32,7 +32,7 @@ export class RubrikkTransformer {
32
32
  }): Promise<RubrikkXmlItem> {
33
33
  return {
34
34
  //Common Fields
35
- ad__all_imageurls: await this.imageService.getImages(car, images, this.configService.config.imageType),
35
+ ad__all_imageurls: await this.imageService.getImages(car, images, this.configService.config.imageType, false),
36
36
  ad__condition_new_used_etc: this.getCondition(car),
37
37
  ad__description: toString(get(car, 'offer.offerDescription', '')),
38
38
  ad__headline: this.getTitle(car),
@@ -0,0 +1,63 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
4
+ import { DataSchemes } from '@bytebrand/car-schema';
5
+
6
+ import { ConfigService, ImagesService, TransformerService, UserService } from '../services';
7
+ import { TrovitXmlItem } from '../interfaces';
8
+ import { get } from 'lodash';
9
+ import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
10
+ import { xmlStringReplacer } from '../utils';
11
+
12
+ @Injectable()
13
+ export class TrovitTransformer {
14
+ constructor(
15
+ private readonly configService: ConfigService,
16
+ private readonly imageService: ImagesService,
17
+ private readonly transformService: TransformerService,
18
+ private readonly userService: UserService,
19
+ ) {}
20
+
21
+ async transform({
22
+ car,
23
+ images,
24
+ }: {
25
+ car: DataSchemes.Car;
26
+ images: ImboImageResponseInterface[];
27
+ }): Promise<TrovitXmlItem> {
28
+ return {
29
+ id: { value: this.transformService.identifier(car) },
30
+ url: { value: this.transformService.link(car, 'source=classifieds&ampmedium=listing&ampcampaign=trovit') },
31
+ title: { value: xmlStringReplacer(this.transformService.title(car)) },
32
+ content: { value: xmlStringReplacer(await this.getDescription(car)) },
33
+ price: { value: this.transformService.price(car), atributes: { currency: 'EUR' } },
34
+ car_type: { value: this.transformService.bodyStyle(car) },
35
+ dealer: { value: 'auto.de Handels GmbH' },
36
+ postcode: { value: this.transformService.postCode(car) },
37
+ vin_database: { value: this.transformService.vinCode(car) },
38
+ make: { value: xmlStringReplacer(this.transformService.make(car)) },
39
+ model: { value: xmlStringReplacer(this.transformService.model(car)) },
40
+ color: { value: this.transformService.color(car) },
41
+ year: { value: this.transformService.year(car) },
42
+ mileage: { value: this.transformService.mileage(car) },
43
+ doors: { value: this.transformService.doors(car) },
44
+ seats: { value: this.transformService.seats(car) },
45
+ engine_size: { value: this.transformService.engineSizeInCCM(car), atributes: { unit: 'cc' } },
46
+ cylinders: { value: this.transformService.cylinders(car) },
47
+ fuel: { value: this.transformService.fuelType(car) },
48
+ transmission: { value: this.transformService.transmission(car) },
49
+ power: { value: this.transformService.powerPS(car), atributes: { unit: 'ps' } },
50
+ fuel_consumption: { value: this.transformService.fuelConsumption(car), atributes: { unit: 'l/100km' } },
51
+ co2_emissions: { value: this.transformService.cO2Emission(car), atributes: { unit: 'g/km' } },
52
+ pictures: await this.imageService.getImages(car, images, this.configService.config.imageType, true),
53
+ is_new: { value: this.transformService.isNewBoolean(car) },
54
+ };
55
+ }
56
+
57
+ private async getDescription(car: DataSchemes.Car): Promise<string> {
58
+ const dealerId = get(car, 'metaData.ownerId');
59
+ const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
60
+ const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
61
+ return descriptionBuilder.transform(descriptionSchema);
62
+ }
63
+ }
@@ -9,3 +9,7 @@ export function convertToCSV(data: unknown): string {
9
9
  });
10
10
  return converted.join(';');
11
11
  }
12
+
13
+ export const xmlStringReplacer = (str: string): string => {
14
+ return typeof str === 'string' ? str.replace(/&/g, '&amp;').replace(/[<>]/g, '') : '';
15
+ };
@@ -0,0 +1,3 @@
1
+ export * from './converter.utils';
2
+ export * from './validator.utils';
3
+ export * from './date-time.utils';
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=autoborse.intreface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"autoborse.intreface.js","sourceRoot":"","sources":["../../src/interfaces/autoborse.intreface.ts"],"names":[],"mappings":""}
@@ -1,6 +0,0 @@
1
- export interface IModixWrapItem {
2
- value: string;
3
- atributes?: {
4
- [key: string]: any;
5
- };
6
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"modix-wrap-item.intreface.js","sourceRoot":"","sources":["../../../src/interfaces/modix/modix-wrap-item.intreface.ts"],"names":[],"mappings":""}
@@ -1,6 +0,0 @@
1
- export interface IModixWrapItem {
2
- value: string;
3
- atributes?: {
4
- [key: string]: any;
5
- };
6
- }