@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.
- package/.editorconfig +8 -8
- package/.eslintignore +1 -1
- package/.eslintrc.js +24 -24
- package/.prettierrc.js +7 -7
- package/README.md +65 -65
- package/dist/configs/index.d.ts +1 -0
- package/dist/configs/index.js +1 -0
- package/dist/configs/index.js.map +1 -1
- package/dist/configs/santander.config.d.ts +5 -0
- package/dist/configs/santander.config.js +18 -0
- package/dist/configs/santander.config.js.map +1 -0
- package/dist/enums/export-type.enum.d.ts +1 -0
- package/dist/enums/export-type.enum.js +1 -0
- package/dist/enums/export-type.enum.js.map +1 -1
- package/dist/export.command.js +1 -1
- package/dist/export.command.js.map +1 -1
- package/dist/export.schema.d.ts +6 -2
- package/dist/export.schema.js +4 -0
- package/dist/export.schema.js.map +1 -1
- package/dist/exporters/index.d.ts +1 -0
- package/dist/exporters/index.js +1 -0
- package/dist/exporters/index.js.map +1 -1
- package/dist/exporters/santander.exporter.d.ts +12 -0
- package/dist/exporters/santander.exporter.js +63 -0
- package/dist/exporters/santander.exporter.js.map +1 -0
- package/dist/formats/auto24-xml.builder.js +2 -2
- package/dist/formats/google-xml.builder.js +3 -3
- package/dist/formats/modix-xml.builder.js +2 -2
- package/dist/formats/ooyyo-xml.builder.js +1 -1
- package/dist/formats/santander-csv.builder.d.ts +6 -0
- package/dist/formats/santander-csv.builder.js +17 -0
- package/dist/formats/santander-csv.builder.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/nest-cli.json +5 -5
- package/package.json +61 -61
- package/src/app.module.ts +38 -38
- package/src/configs/alleskralle.config.ts +15 -15
- package/src/configs/as24.config.ts +13 -13
- package/src/configs/auto24.config.ts +15 -15
- package/src/configs/autoboerse.config.ts +16 -16
- package/src/configs/autouncle.config.ts +14 -14
- package/src/configs/awin.config.ts +15 -15
- package/src/configs/by-owner.config.ts +14 -14
- package/src/configs/config.ts +83 -83
- package/src/configs/criteo.config.ts +17 -17
- package/src/configs/dasparking.config.ts +15 -15
- package/src/configs/eauto.config.ts +15 -15
- package/src/configs/evium.config.ts +18 -18
- package/src/configs/facebook-shop.config.ts +16 -16
- package/src/configs/fb.config.ts +16 -16
- package/src/configs/google.config.ts +14 -14
- package/src/configs/index.ts +22 -21
- package/src/configs/kleinanzeigeFocus.config.ts +14 -14
- package/src/configs/marktde.config.ts +18 -18
- package/src/configs/meinstadt.config.ts +15 -15
- package/src/configs/mitula.config.ts +14 -14
- package/src/configs/ooyyo.config.ts +15 -15
- package/src/configs/santander.config.ts +15 -0
- package/src/configs/trovit.config.ts +14 -14
- package/src/configs/yescar.config.ts +17 -17
- package/src/constants/autouncle.contants.ts +4 -4
- package/src/constants/fb.constants.ts +7 -7
- package/src/constants/index.ts +1 -1
- package/src/constants/modix/body-color-name.constant.ts +20 -20
- package/src/constants/modix/category.constant.ts +14 -14
- package/src/constants/modix/fuel.constant.ts +14 -14
- package/src/constants/modix/index.ts +7 -7
- package/src/constants/modix/manufacturers.constant.ts +7498 -7498
- package/src/constants/modix/transmission.constant.ts +8 -8
- package/src/constants/modix/usage-type.constant.ts +13 -13
- package/src/constants/modix/vehicle-class.constant.ts +17 -17
- package/src/enums/environment.enum.ts +5 -5
- package/src/enums/export-type.enum.ts +33 -32
- package/src/enums/file-types.enum.ts +8 -8
- package/src/enums/image-type.enum.ts +4 -4
- package/src/enums/index.ts +4 -4
- package/src/export.command.ts +37 -37
- package/src/export.schema.ts +134 -128
- package/src/exporters/as24.exporter.ts +69 -69
- package/src/exporters/auto24.exporter.ts +48 -48
- package/src/exporters/autouncle.exporter.ts +60 -60
- package/src/exporters/awin.exporter.ts +47 -47
- package/src/exporters/by-owner.exporter.ts +44 -44
- package/src/exporters/facebook-shop.exporter.ts +51 -51
- package/src/exporters/fb.exporter.ts +52 -52
- package/src/exporters/google.exporter.ts +45 -45
- package/src/exporters/index.ts +15 -14
- package/src/exporters/meinstadt.exporter.ts +55 -55
- package/src/exporters/mobile.exporter.ts +64 -64
- package/src/exporters/modix.exporter.ts +56 -56
- package/src/exporters/ooyyo.exporter.ts +48 -48
- package/src/exporters/rubrikk.exporter.ts +53 -53
- package/src/exporters/santander.exporter.ts +50 -0
- package/src/exporters/trovit.exporter.ts +51 -51
- package/src/formats/auto24-xml.builder.ts +54 -54
- package/src/formats/autouncle-json.builder.ts +20 -20
- package/src/formats/awin-csv.builder.ts +16 -16
- package/src/formats/facebook-shop.builder.ts +69 -69
- package/src/formats/fb-xml.builder.ts +71 -71
- package/src/formats/google-xml.builder.ts +35 -35
- package/src/formats/index.ts +5 -5
- package/src/formats/meinstadt-json.builder.ts +19 -19
- package/src/formats/modix-xml.builder.ts +180 -180
- package/src/formats/ooyyo-xml.builder.ts +48 -48
- package/src/formats/rubrikk-xml.builder.ts +27 -27
- package/src/formats/santander-csv.builder.ts +15 -0
- package/src/formats/trovit-xml.builder.ts +44 -44
- package/src/interfaces/atributes-wrap-item.intreface.ts +6 -6
- package/src/interfaces/dealers-mapping.interface.ts +7 -7
- package/src/interfaces/description.interface.ts +24 -24
- package/src/interfaces/export-item.interface.ts +366 -366
- package/src/interfaces/exporter.interface.ts +3 -3
- package/src/interfaces/index.ts +3 -3
- package/src/interfaces/input.interface.ts +6 -6
- package/src/interfaces/mapping-rules.interface.ts +11 -11
- package/src/interfaces/modix/index.ts +1 -1
- package/src/interfaces/modix/modix-item-list.interface.ts +5 -5
- package/src/interfaces/params.interface.ts +13 -13
- package/src/interfaces/rule-parser.interface.ts +3 -3
- package/src/main.ts +14 -14
- package/src/rules/abstract.rule.ts +37 -37
- package/src/rules/date.rule.ts +19 -19
- package/src/rules/number.rule.ts +15 -15
- package/src/rules/string.rule.ts +8 -8
- package/src/services/car.service.ts +49 -49
- package/src/services/config.service.ts +15 -15
- package/src/services/images.service.ts +207 -207
- package/src/services/index.ts +9 -9
- package/src/services/loader.service.ts +29 -29
- package/src/services/mapping.service.ts +91 -91
- package/src/services/request.service.ts +44 -44
- package/src/services/rules.service.ts +61 -61
- package/src/services/transformer.service.ts +129 -129
- package/src/services/user.service.ts +57 -57
- package/src/transformers/as24.transformer.ts +253 -253
- package/src/transformers/auto24.transfomer.ts +155 -155
- package/src/transformers/autouncle.transformer.ts +236 -236
- package/src/transformers/awin.transformer.ts +193 -193
- package/src/transformers/by-owner.transformer.ts +354 -354
- package/src/transformers/facebook-shop.transformer.ts +93 -93
- package/src/transformers/fb-description.transformer.ts +316 -316
- package/src/transformers/fb-equipment.transformer.ts +161 -161
- package/src/transformers/fb.transformer.ts +655 -655
- package/src/transformers/google.transformer.ts +169 -169
- package/src/transformers/index.ts +5 -5
- package/src/transformers/meinstadt.transformer.ts +92 -92
- package/src/transformers/mobile.transformer.ts +482 -482
- package/src/transformers/modix.transformer.ts +227 -227
- package/src/transformers/ooyyo.transformer.ts +109 -109
- package/src/transformers/rubrikk.transformer.ts +200 -200
- package/src/transformers/trovit.transformer.ts +63 -63
- package/src/utils/converter.utils.ts +15 -15
- package/src/utils/index.ts +2 -2
- package/src/utils/validator.utils.ts +7 -7
- package/tsconfig.build.json +4 -4
- 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
|
+
}
|