@bytebrand/export-cars 1.21.7 → 1.21.8

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 (156) hide show
  1. package/.editorconfig +8 -8
  2. package/.eslintignore +1 -1
  3. package/.eslintrc.js +24 -24
  4. package/.prettierrc.js +7 -7
  5. package/README.md +65 -65
  6. package/dist/configs/index.d.ts +1 -0
  7. package/dist/configs/index.js +1 -0
  8. package/dist/configs/index.js.map +1 -1
  9. package/dist/configs/santander.config.d.ts +5 -0
  10. package/dist/configs/santander.config.js +18 -0
  11. package/dist/configs/santander.config.js.map +1 -0
  12. package/dist/enums/export-type.enum.d.ts +1 -0
  13. package/dist/enums/export-type.enum.js +1 -0
  14. package/dist/enums/export-type.enum.js.map +1 -1
  15. package/dist/export.command.js +1 -1
  16. package/dist/export.command.js.map +1 -1
  17. package/dist/export.schema.d.ts +6 -2
  18. package/dist/export.schema.js +4 -0
  19. package/dist/export.schema.js.map +1 -1
  20. package/dist/exporters/index.d.ts +1 -0
  21. package/dist/exporters/index.js +1 -0
  22. package/dist/exporters/index.js.map +1 -1
  23. package/dist/exporters/santander.exporter.d.ts +12 -0
  24. package/dist/exporters/santander.exporter.js +63 -0
  25. package/dist/exporters/santander.exporter.js.map +1 -0
  26. package/dist/formats/auto24-xml.builder.js +2 -2
  27. package/dist/formats/google-xml.builder.js +3 -3
  28. package/dist/formats/modix-xml.builder.js +2 -2
  29. package/dist/formats/ooyyo-xml.builder.js +1 -1
  30. package/dist/formats/santander-csv.builder.d.ts +6 -0
  31. package/dist/formats/santander-csv.builder.js +17 -0
  32. package/dist/formats/santander-csv.builder.js.map +1 -0
  33. package/dist/tsconfig.build.tsbuildinfo +1 -1
  34. package/nest-cli.json +5 -5
  35. package/package.json +61 -61
  36. package/src/app.module.ts +38 -38
  37. package/src/configs/alleskralle.config.ts +15 -15
  38. package/src/configs/as24.config.ts +13 -13
  39. package/src/configs/auto24.config.ts +15 -15
  40. package/src/configs/autoboerse.config.ts +16 -16
  41. package/src/configs/autouncle.config.ts +14 -14
  42. package/src/configs/awin.config.ts +15 -15
  43. package/src/configs/by-owner.config.ts +14 -14
  44. package/src/configs/config.ts +83 -83
  45. package/src/configs/criteo.config.ts +17 -17
  46. package/src/configs/dasparking.config.ts +15 -15
  47. package/src/configs/eauto.config.ts +15 -15
  48. package/src/configs/evium.config.ts +18 -18
  49. package/src/configs/facebook-shop.config.ts +16 -16
  50. package/src/configs/fb.config.ts +16 -16
  51. package/src/configs/google.config.ts +14 -14
  52. package/src/configs/index.ts +22 -21
  53. package/src/configs/kleinanzeigeFocus.config.ts +14 -14
  54. package/src/configs/marktde.config.ts +18 -18
  55. package/src/configs/meinstadt.config.ts +15 -15
  56. package/src/configs/mitula.config.ts +14 -14
  57. package/src/configs/ooyyo.config.ts +15 -15
  58. package/src/configs/santander.config.ts +15 -0
  59. package/src/configs/trovit.config.ts +14 -14
  60. package/src/configs/yescar.config.ts +17 -17
  61. package/src/constants/autouncle.contants.ts +4 -4
  62. package/src/constants/fb.constants.ts +7 -7
  63. package/src/constants/index.ts +1 -1
  64. package/src/constants/modix/body-color-name.constant.ts +20 -20
  65. package/src/constants/modix/category.constant.ts +14 -14
  66. package/src/constants/modix/fuel.constant.ts +14 -14
  67. package/src/constants/modix/index.ts +7 -7
  68. package/src/constants/modix/manufacturers.constant.ts +7498 -7498
  69. package/src/constants/modix/transmission.constant.ts +8 -8
  70. package/src/constants/modix/usage-type.constant.ts +13 -13
  71. package/src/constants/modix/vehicle-class.constant.ts +17 -17
  72. package/src/enums/environment.enum.ts +5 -5
  73. package/src/enums/export-type.enum.ts +33 -32
  74. package/src/enums/file-types.enum.ts +8 -8
  75. package/src/enums/image-type.enum.ts +4 -4
  76. package/src/enums/index.ts +4 -4
  77. package/src/export.command.ts +37 -37
  78. package/src/export.schema.ts +134 -128
  79. package/src/exporters/as24.exporter.ts +69 -69
  80. package/src/exporters/auto24.exporter.ts +48 -48
  81. package/src/exporters/autouncle.exporter.ts +60 -60
  82. package/src/exporters/awin.exporter.ts +47 -47
  83. package/src/exporters/by-owner.exporter.ts +44 -44
  84. package/src/exporters/facebook-shop.exporter.ts +51 -51
  85. package/src/exporters/fb.exporter.ts +52 -52
  86. package/src/exporters/google.exporter.ts +45 -45
  87. package/src/exporters/index.ts +15 -14
  88. package/src/exporters/meinstadt.exporter.ts +55 -55
  89. package/src/exporters/mobile.exporter.ts +64 -64
  90. package/src/exporters/modix.exporter.ts +56 -56
  91. package/src/exporters/ooyyo.exporter.ts +48 -48
  92. package/src/exporters/rubrikk.exporter.ts +53 -53
  93. package/src/exporters/santander.exporter.ts +50 -0
  94. package/src/exporters/trovit.exporter.ts +51 -51
  95. package/src/formats/auto24-xml.builder.ts +54 -54
  96. package/src/formats/autouncle-json.builder.ts +20 -20
  97. package/src/formats/awin-csv.builder.ts +16 -16
  98. package/src/formats/facebook-shop.builder.ts +69 -69
  99. package/src/formats/fb-xml.builder.ts +71 -71
  100. package/src/formats/google-xml.builder.ts +35 -35
  101. package/src/formats/index.ts +5 -5
  102. package/src/formats/meinstadt-json.builder.ts +19 -19
  103. package/src/formats/modix-xml.builder.ts +180 -180
  104. package/src/formats/ooyyo-xml.builder.ts +48 -48
  105. package/src/formats/rubrikk-xml.builder.ts +27 -27
  106. package/src/formats/santander-csv.builder.ts +15 -0
  107. package/src/formats/trovit-xml.builder.ts +44 -44
  108. package/src/interfaces/atributes-wrap-item.intreface.ts +6 -6
  109. package/src/interfaces/dealers-mapping.interface.ts +7 -7
  110. package/src/interfaces/description.interface.ts +24 -24
  111. package/src/interfaces/export-item.interface.ts +366 -366
  112. package/src/interfaces/exporter.interface.ts +3 -3
  113. package/src/interfaces/index.ts +3 -3
  114. package/src/interfaces/input.interface.ts +6 -6
  115. package/src/interfaces/mapping-rules.interface.ts +11 -11
  116. package/src/interfaces/modix/index.ts +1 -1
  117. package/src/interfaces/modix/modix-item-list.interface.ts +5 -5
  118. package/src/interfaces/params.interface.ts +13 -13
  119. package/src/interfaces/rule-parser.interface.ts +3 -3
  120. package/src/main.ts +14 -14
  121. package/src/rules/abstract.rule.ts +37 -37
  122. package/src/rules/date.rule.ts +19 -19
  123. package/src/rules/number.rule.ts +15 -15
  124. package/src/rules/string.rule.ts +8 -8
  125. package/src/services/car.service.ts +49 -49
  126. package/src/services/config.service.ts +15 -15
  127. package/src/services/images.service.ts +207 -207
  128. package/src/services/index.ts +9 -9
  129. package/src/services/loader.service.ts +29 -29
  130. package/src/services/mapping.service.ts +91 -91
  131. package/src/services/request.service.ts +44 -44
  132. package/src/services/rules.service.ts +61 -61
  133. package/src/services/transformer.service.ts +129 -129
  134. package/src/services/user.service.ts +57 -57
  135. package/src/transformers/as24.transformer.ts +253 -253
  136. package/src/transformers/auto24.transfomer.ts +155 -155
  137. package/src/transformers/autouncle.transformer.ts +236 -236
  138. package/src/transformers/awin.transformer.ts +193 -193
  139. package/src/transformers/by-owner.transformer.ts +354 -354
  140. package/src/transformers/facebook-shop.transformer.ts +93 -93
  141. package/src/transformers/fb-description.transformer.ts +316 -316
  142. package/src/transformers/fb-equipment.transformer.ts +161 -161
  143. package/src/transformers/fb.transformer.ts +655 -655
  144. package/src/transformers/google.transformer.ts +169 -169
  145. package/src/transformers/index.ts +5 -5
  146. package/src/transformers/meinstadt.transformer.ts +92 -92
  147. package/src/transformers/mobile.transformer.ts +482 -482
  148. package/src/transformers/modix.transformer.ts +227 -227
  149. package/src/transformers/ooyyo.transformer.ts +109 -109
  150. package/src/transformers/rubrikk.transformer.ts +200 -200
  151. package/src/transformers/trovit.transformer.ts +63 -63
  152. package/src/utils/converter.utils.ts +15 -15
  153. package/src/utils/index.ts +2 -2
  154. package/src/utils/validator.utils.ts +7 -7
  155. package/tsconfig.build.json +4 -4
  156. package/tsconfig.json +29 -29
@@ -1,169 +1,169 @@
1
- import { escape, get, join, round, toString, trim } from 'lodash';
2
- import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
3
- import { DataSchemes } from '@bytebrand/car-schema';
4
- import { TranslatorExtended } from '@bytebrand/schema-tools';
5
- import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
6
- import { Injectable } from '@nestjs/common';
7
- import { ConfigService, ImagesService, UserService } from '../services';
8
- import { GoogleXmlItem } from '../interfaces';
9
-
10
- @Injectable()
11
- export class GoogleTransformer {
12
- private translator: TranslatorExtended;
13
-
14
- constructor(
15
- private userService: UserService,
16
- private configService: ConfigService,
17
- private imageService: ImagesService,
18
- ) {
19
- const dict = { ...de, ...deVehicleProps, ...deVehicleDetailsPage };
20
- this.translator = new TranslatorExtended(dict);
21
- }
22
-
23
- async transform({ car, images }: { car: DataSchemes.Car; images: Array<any> }): Promise<GoogleXmlItem> {
24
- const carId = toString(get(car, '_id', ''));
25
- const transformedImages = await this.imageService.getImages(
26
- car,
27
- images,
28
- this.configService.config.imageType,
29
- false,
30
- );
31
-
32
- return {
33
- id: carId,
34
- title: this.getTitle(car),
35
- description: await this.getDescription(car),
36
- google_product_category: this.getBreadcrumbs(car),
37
- product_type: this.getCategory(car),
38
- link: this.getLink(car),
39
- image_link: transformedImages[0],
40
- condition: this.mapState(car),
41
- availability: this.getAvailability(car),
42
- brand: get(car, 'mainData.make', ''),
43
- price: this.getRetailPrice(car),
44
- sale_price: this.getPrice(car),
45
- energy_efficiency_class: this.getEnergyClass(car),
46
- color: this.getColor(car),
47
- installment: this.getInstallment(car),
48
- custom_label_0: `${this.getInstallment(car)} EUR mtl.`,
49
- };
50
- }
51
-
52
- private getTitle(car: DataSchemes.Car): string {
53
- const model = toString(get(car, 'mainData.model', ''));
54
-
55
- return trim(escape(join([this.getBrand(car), model], ' ')));
56
- }
57
-
58
- private async getDescription(car: DataSchemes.Car): Promise<string> {
59
- if (this.configService.config.isCriteo) {
60
- return '0€ Anzahlung möglich. 14 Tage Geld-zurück-Garantie. Lieferung bis vor die Haustür. 1 Jahr Garantie inklusive. Deutschlands großes Autoportal.';
61
- }
62
- const dealerId = get(car, 'metaData.ownerId');
63
- const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
64
- const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
65
-
66
- return descriptionBuilder.transform(descriptionSchema);
67
- }
68
-
69
- private getCategory(car: DataSchemes.Car): string {
70
- return this.translator.translateVal(get(car, 'mainData.category', ''));
71
- }
72
-
73
- private getBreadcrumbs(car: DataSchemes.Car): string {
74
- const make = get(car, 'mainData.make', '');
75
- const model = get(car, 'mainData.model', '');
76
-
77
- return `${make} ${model}`;
78
- }
79
-
80
- private getLink(car: DataSchemes.Car): string {
81
- const autodeId = get(car, '_id', '');
82
- if (this.configService.config.isCriteo) {
83
- return `https://www.${this.configService.config.domain}/search/vehicle/${autodeId}?source=criteo&medium=cpc&campaign=retargeting`;
84
- }
85
- return `https://www.${this.configService.config.domain}/search/vehicle/${autodeId}`;
86
- }
87
-
88
- private getRetailPrice(car: DataSchemes.Car): string {
89
- const retailPrice = get(car, 'recommendedRetailPrice', '');
90
- if (retailPrice) {
91
- return `${round(retailPrice, 2)} EUR`;
92
- }
93
- return this.getPrice(car);
94
- }
95
-
96
- private getPrice(car: DataSchemes.Car): string {
97
- const price = get(car, 'price.currentSalesPrice', 0);
98
- return `${round(price, 2)} EUR`;
99
- }
100
-
101
- private getColor(car: DataSchemes.Car): string {
102
- let colorSelection = get(car, 'exterior.exteriorColor', 'other');
103
- if (!colorSelection || colorSelection === 'selector_unknown') {
104
- colorSelection = 'other';
105
- }
106
- return this.translator.translateVal(colorSelection);
107
- }
108
-
109
- private mapState(car: DataSchemes.Car): string {
110
- const available = {
111
- selector_condition_new: 'Neu',
112
- selector_condition_used: 'Gebraucht',
113
- selector_unknown: 'Gebraucht',
114
- };
115
- const condition = get(car, 'mainData.condition', 'selector_unknown');
116
- return get(available, condition);
117
- }
118
-
119
- private getAvailability(car: DataSchemes.Car): string {
120
- const available = {
121
- selector_availabilityMode_fromDate: 'Ab einem bestimmten Datum',
122
- selector_availabilityMode_unknown: 'Ab einem bestimmten Datum',
123
- selector_availabilityMode_always: 'Sofort',
124
- };
125
- const availability = get(car, 'offer.availabilityMode', 'selector_availabilityMode_unknown');
126
- return get(available, availability);
127
- }
128
-
129
- private getEnergyClass(car: DataSchemes.Car): string {
130
- const available = {
131
- selector_energyEfficiencyClass_a: 'A',
132
- selector_energyEfficiencyClass_ap: 'A+',
133
- selector_energyEfficiencyClass_app: 'A++',
134
- selector_energyEfficiencyClass_appp: 'A+++',
135
- selector_energyEfficiencyClass_b: 'B',
136
- selector_energyEfficiencyClass_c: 'C',
137
- selector_energyEfficiencyClass_d: 'D',
138
- selector_energyEfficiencyClass_e: 'E',
139
- selector_energyEfficiencyClass_f: 'F',
140
- selector_energyEfficiencyClass_g: 'G',
141
- selector_unknown: 'default',
142
- };
143
- const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
144
- return get(available, energyClass);
145
- }
146
-
147
- private getInstallment(car: DataSchemes.Car) {
148
- const monthlyInstallment = round(get(car, 'rate.monthlyInstallment', null));
149
- const paybackPeriod = round(get(car, 'rate.paybackPeriod', null));
150
-
151
- return {
152
- paybackPeriod,
153
- monthlyInstallment,
154
- };
155
- }
156
-
157
- private getBrand(car: DataSchemes.Car): string {
158
- const make = get(car, 'mainData.make', '');
159
-
160
- switch (make) {
161
- case 'Mercedes-Benz':
162
- return 'Mercedes';
163
- case 'Volkswagen':
164
- return 'VW';
165
- default:
166
- return make;
167
- }
168
- }
169
- }
1
+ import { escape, get, join, round, toString, trim } from 'lodash';
2
+ import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
3
+ import { DataSchemes } from '@bytebrand/car-schema';
4
+ import { TranslatorExtended } from '@bytebrand/schema-tools';
5
+ import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
6
+ import { Injectable } from '@nestjs/common';
7
+ import { ConfigService, ImagesService, UserService } from '../services';
8
+ import { GoogleXmlItem } from '../interfaces';
9
+
10
+ @Injectable()
11
+ export class GoogleTransformer {
12
+ private translator: TranslatorExtended;
13
+
14
+ constructor(
15
+ private userService: UserService,
16
+ private configService: ConfigService,
17
+ private imageService: ImagesService,
18
+ ) {
19
+ const dict = { ...de, ...deVehicleProps, ...deVehicleDetailsPage };
20
+ this.translator = new TranslatorExtended(dict);
21
+ }
22
+
23
+ async transform({ car, images }: { car: DataSchemes.Car; images: Array<any> }): Promise<GoogleXmlItem> {
24
+ const carId = toString(get(car, '_id', ''));
25
+ const transformedImages = await this.imageService.getImages(
26
+ car,
27
+ images,
28
+ this.configService.config.imageType,
29
+ false,
30
+ );
31
+
32
+ return {
33
+ id: carId,
34
+ title: this.getTitle(car),
35
+ description: await this.getDescription(car),
36
+ google_product_category: this.getBreadcrumbs(car),
37
+ product_type: this.getCategory(car),
38
+ link: this.getLink(car),
39
+ image_link: transformedImages[0],
40
+ condition: this.mapState(car),
41
+ availability: this.getAvailability(car),
42
+ brand: get(car, 'mainData.make', ''),
43
+ price: this.getRetailPrice(car),
44
+ sale_price: this.getPrice(car),
45
+ energy_efficiency_class: this.getEnergyClass(car),
46
+ color: this.getColor(car),
47
+ installment: this.getInstallment(car),
48
+ custom_label_0: `${this.getInstallment(car)} EUR mtl.`,
49
+ };
50
+ }
51
+
52
+ private getTitle(car: DataSchemes.Car): string {
53
+ const model = toString(get(car, 'mainData.model', ''));
54
+
55
+ return trim(escape(join([this.getBrand(car), model], ' ')));
56
+ }
57
+
58
+ private async getDescription(car: DataSchemes.Car): Promise<string> {
59
+ if (this.configService.config.isCriteo) {
60
+ return '0€ Anzahlung möglich. 14 Tage Geld-zurück-Garantie. Lieferung bis vor die Haustür. 1 Jahr Garantie inklusive. Deutschlands großes Autoportal.';
61
+ }
62
+ const dealerId = get(car, 'metaData.ownerId');
63
+ const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
64
+ const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
65
+
66
+ return descriptionBuilder.transform(descriptionSchema);
67
+ }
68
+
69
+ private getCategory(car: DataSchemes.Car): string {
70
+ return this.translator.translateVal(get(car, 'mainData.category', ''));
71
+ }
72
+
73
+ private getBreadcrumbs(car: DataSchemes.Car): string {
74
+ const make = get(car, 'mainData.make', '');
75
+ const model = get(car, 'mainData.model', '');
76
+
77
+ return `${make} ${model}`;
78
+ }
79
+
80
+ private getLink(car: DataSchemes.Car): string {
81
+ const autodeId = get(car, '_id', '');
82
+ if (this.configService.config.isCriteo) {
83
+ return `https://www.${this.configService.config.domain}/search/vehicle/${autodeId}?source=criteo&medium=cpc&campaign=retargeting`;
84
+ }
85
+ return `https://www.${this.configService.config.domain}/search/vehicle/${autodeId}`;
86
+ }
87
+
88
+ private getRetailPrice(car: DataSchemes.Car): string {
89
+ const retailPrice = get(car, 'recommendedRetailPrice', '');
90
+ if (retailPrice) {
91
+ return `${round(retailPrice, 2)} EUR`;
92
+ }
93
+ return this.getPrice(car);
94
+ }
95
+
96
+ private getPrice(car: DataSchemes.Car): string {
97
+ const price = get(car, 'price.currentSalesPrice', 0);
98
+ return `${round(price, 2)} EUR`;
99
+ }
100
+
101
+ private getColor(car: DataSchemes.Car): string {
102
+ let colorSelection = get(car, 'exterior.exteriorColor', 'other');
103
+ if (!colorSelection || colorSelection === 'selector_unknown') {
104
+ colorSelection = 'other';
105
+ }
106
+ return this.translator.translateVal(colorSelection);
107
+ }
108
+
109
+ private mapState(car: DataSchemes.Car): string {
110
+ const available = {
111
+ selector_condition_new: 'Neu',
112
+ selector_condition_used: 'Gebraucht',
113
+ selector_unknown: 'Gebraucht',
114
+ };
115
+ const condition = get(car, 'mainData.condition', 'selector_unknown');
116
+ return get(available, condition);
117
+ }
118
+
119
+ private getAvailability(car: DataSchemes.Car): string {
120
+ const available = {
121
+ selector_availabilityMode_fromDate: 'Ab einem bestimmten Datum',
122
+ selector_availabilityMode_unknown: 'Ab einem bestimmten Datum',
123
+ selector_availabilityMode_always: 'Sofort',
124
+ };
125
+ const availability = get(car, 'offer.availabilityMode', 'selector_availabilityMode_unknown');
126
+ return get(available, availability);
127
+ }
128
+
129
+ private getEnergyClass(car: DataSchemes.Car): string {
130
+ const available = {
131
+ selector_energyEfficiencyClass_a: 'A',
132
+ selector_energyEfficiencyClass_ap: 'A+',
133
+ selector_energyEfficiencyClass_app: 'A++',
134
+ selector_energyEfficiencyClass_appp: 'A+++',
135
+ selector_energyEfficiencyClass_b: 'B',
136
+ selector_energyEfficiencyClass_c: 'C',
137
+ selector_energyEfficiencyClass_d: 'D',
138
+ selector_energyEfficiencyClass_e: 'E',
139
+ selector_energyEfficiencyClass_f: 'F',
140
+ selector_energyEfficiencyClass_g: 'G',
141
+ selector_unknown: 'default',
142
+ };
143
+ const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
144
+ return get(available, energyClass);
145
+ }
146
+
147
+ private getInstallment(car: DataSchemes.Car) {
148
+ const monthlyInstallment = round(get(car, 'rate.monthlyInstallment', null));
149
+ const paybackPeriod = round(get(car, 'rate.paybackPeriod', null));
150
+
151
+ return {
152
+ paybackPeriod,
153
+ monthlyInstallment,
154
+ };
155
+ }
156
+
157
+ private getBrand(car: DataSchemes.Car): string {
158
+ const make = get(car, 'mainData.make', '');
159
+
160
+ switch (make) {
161
+ case 'Mercedes-Benz':
162
+ return 'Mercedes';
163
+ case 'Volkswagen':
164
+ return 'VW';
165
+ default:
166
+ return make;
167
+ }
168
+ }
169
+ }
@@ -1,5 +1,5 @@
1
- export * from './rubrikk.transformer';
2
- export * from './modix.transformer';
3
- export * from './facebook-shop.transformer';
4
- export * from './trovit.transformer';
5
- export * from './awin.transformer';
1
+ export * from './rubrikk.transformer';
2
+ export * from './modix.transformer';
3
+ export * from './facebook-shop.transformer';
4
+ export * from './trovit.transformer';
5
+ export * from './awin.transformer';
@@ -1,92 +1,92 @@
1
- import { get, toString } from 'lodash';
2
-
3
- import { Injectable } from '@nestjs/common';
4
-
5
- import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
6
- import { ImboImageResponseInterface } from '@bytebrand/chunkable';
7
- import { DataSchemes } from '@bytebrand/car-schema';
8
- import { de } from '@bytebrand/i18n-dictionaries';
9
-
10
- import { ConfigService, ImagesService, UserService } from '../services';
11
- import { MeinstadtJsonItem } from '../interfaces';
12
-
13
- @Injectable()
14
- export class MeinstadtTransformer {
15
- constructor(
16
- private configService: ConfigService,
17
- private readonly imageService: ImagesService,
18
- private userService: UserService
19
- ) {}
20
-
21
- async transform({
22
- car,
23
- images,
24
- }: {
25
- car: DataSchemes.Car;
26
- images: ImboImageResponseInterface[];
27
- }): Promise<Partial<MeinstadtJsonItem>> {
28
- const carImages = await this.imageService.getImages(car, images, this.configService.config.imageType, false);
29
-
30
- const carId = toString(get(car, '_id', null));
31
-
32
- return {
33
- id: get(car, 'metaData.vehicleId', null),
34
- make: get(car, 'mainData.make', null),
35
- model: get(car, 'mainData.model', null),
36
- cpc: get(this.configService.config, 'cpc', '0.08'),
37
- listingUrl: `https://www.${this.configService.config.domain}/search/vehicle/${carId}?source=classifieds&medium=listing&campaign=meinestadt`,
38
- title: this.getTitle(car),
39
- accidentFree: get(car, 'mainData.accidentDamaged', null),
40
- mileage: get(car, 'mainData.mileage', null),
41
- initialRegistration: get(car, 'mainData.firstRegistration', null),
42
- offerCreationDate: get(car, 'metaData.creationDate', null),
43
- numberOfDoors: get(car, 'mainData.doors', null),
44
- numberOfSeats: get(car, 'mainData.seats', null),
45
- numberOfPreviousOwners: get(car, 'mainData.numberOfPreviousOwners', null),
46
- price: get(car, 'price.currentSalesPrice', null),
47
- power: get(car, 'engineData.powerPS', null),
48
- co2Emissions: get(car, 'environmentEmissions.co2', null),
49
- fuelConsumptionCombined: get(car, 'consumption.consumptionCombined', null),
50
- equipment: await this.getDescription(car),
51
- color: this.translate(get(car, 'exterior.exteriorColor', null)),
52
- bodyType: this.translate(get(car, 'mainData.category', null)),
53
- emissionClass: this.translate(get(car, 'environmentEmissions.emissionClass', null)),
54
- emissionSticker: this.translate(get(car, 'environmentEmissions.emissionSticker', null)),
55
- fuelType: this.translate(get(car, 'consumption.fuel', null)),
56
- 'transmissionType/transmission': this.translate(get(car, 'driveSuspension.gearbox', null)),
57
- imagesCount: carImages.length,
58
- 'customerType/sellerType': 'Händler',
59
- usageState: this.translate(this.getUsageState(car)),
60
- images: carImages[0],
61
- };
62
- }
63
-
64
- private getTitle(car: DataSchemes.Car): string {
65
- return `${car.mainData.make} ${car.mainData.model} ${car.mainData.subModel}`;
66
- }
67
-
68
- private translate(val: string | null): string {
69
- if (!val) return null;
70
- if (de[val]) return de[val];
71
- return null;
72
- }
73
-
74
- private getUsageState(car: DataSchemes.Car): string {
75
- const condition = get(car, 'mainData.condition', null);
76
- if (!condition || condition === 'selector_unknown') {
77
- const mileage = get(car, 'mainData.mileage', 0);
78
- if (mileage >= 100) {
79
- return 'selector_condition_used';
80
- }
81
- return 'selector_condition_new';
82
- }
83
- return condition;
84
- }
85
-
86
- private async getDescription(car: DataSchemes.Car): Promise<string> {
87
- const dealerId = get(car, 'metaData.ownerId');
88
- const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
89
- const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
90
- return descriptionBuilder.transform(descriptionSchema);
91
- }
92
- }
1
+ import { get, toString } from 'lodash';
2
+
3
+ import { Injectable } from '@nestjs/common';
4
+
5
+ import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
6
+ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
7
+ import { DataSchemes } from '@bytebrand/car-schema';
8
+ import { de } from '@bytebrand/i18n-dictionaries';
9
+
10
+ import { ConfigService, ImagesService, UserService } from '../services';
11
+ import { MeinstadtJsonItem } from '../interfaces';
12
+
13
+ @Injectable()
14
+ export class MeinstadtTransformer {
15
+ constructor(
16
+ private configService: ConfigService,
17
+ private readonly imageService: ImagesService,
18
+ private userService: UserService
19
+ ) {}
20
+
21
+ async transform({
22
+ car,
23
+ images,
24
+ }: {
25
+ car: DataSchemes.Car;
26
+ images: ImboImageResponseInterface[];
27
+ }): Promise<Partial<MeinstadtJsonItem>> {
28
+ const carImages = await this.imageService.getImages(car, images, this.configService.config.imageType, false);
29
+
30
+ const carId = toString(get(car, '_id', null));
31
+
32
+ return {
33
+ id: get(car, 'metaData.vehicleId', null),
34
+ make: get(car, 'mainData.make', null),
35
+ model: get(car, 'mainData.model', null),
36
+ cpc: get(this.configService.config, 'cpc', '0.08'),
37
+ listingUrl: `https://www.${this.configService.config.domain}/search/vehicle/${carId}?source=classifieds&medium=listing&campaign=meinestadt`,
38
+ title: this.getTitle(car),
39
+ accidentFree: get(car, 'mainData.accidentDamaged', null),
40
+ mileage: get(car, 'mainData.mileage', null),
41
+ initialRegistration: get(car, 'mainData.firstRegistration', null),
42
+ offerCreationDate: get(car, 'metaData.creationDate', null),
43
+ numberOfDoors: get(car, 'mainData.doors', null),
44
+ numberOfSeats: get(car, 'mainData.seats', null),
45
+ numberOfPreviousOwners: get(car, 'mainData.numberOfPreviousOwners', null),
46
+ price: get(car, 'price.currentSalesPrice', null),
47
+ power: get(car, 'engineData.powerPS', null),
48
+ co2Emissions: get(car, 'environmentEmissions.co2', null),
49
+ fuelConsumptionCombined: get(car, 'consumption.consumptionCombined', null),
50
+ equipment: await this.getDescription(car),
51
+ color: this.translate(get(car, 'exterior.exteriorColor', null)),
52
+ bodyType: this.translate(get(car, 'mainData.category', null)),
53
+ emissionClass: this.translate(get(car, 'environmentEmissions.emissionClass', null)),
54
+ emissionSticker: this.translate(get(car, 'environmentEmissions.emissionSticker', null)),
55
+ fuelType: this.translate(get(car, 'consumption.fuel', null)),
56
+ 'transmissionType/transmission': this.translate(get(car, 'driveSuspension.gearbox', null)),
57
+ imagesCount: carImages.length,
58
+ 'customerType/sellerType': 'Händler',
59
+ usageState: this.translate(this.getUsageState(car)),
60
+ images: carImages[0],
61
+ };
62
+ }
63
+
64
+ private getTitle(car: DataSchemes.Car): string {
65
+ return `${car.mainData.make} ${car.mainData.model} ${car.mainData.subModel}`;
66
+ }
67
+
68
+ private translate(val: string | null): string {
69
+ if (!val) return null;
70
+ if (de[val]) return de[val];
71
+ return null;
72
+ }
73
+
74
+ private getUsageState(car: DataSchemes.Car): string {
75
+ const condition = get(car, 'mainData.condition', null);
76
+ if (!condition || condition === 'selector_unknown') {
77
+ const mileage = get(car, 'mainData.mileage', 0);
78
+ if (mileage >= 100) {
79
+ return 'selector_condition_used';
80
+ }
81
+ return 'selector_condition_new';
82
+ }
83
+ return condition;
84
+ }
85
+
86
+ private async getDescription(car: DataSchemes.Car): Promise<string> {
87
+ const dealerId = get(car, 'metaData.ownerId');
88
+ const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
89
+ const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
90
+ return descriptionBuilder.transform(descriptionSchema);
91
+ }
92
+ }