@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.
- package/dist/app.module.js +4 -7
- package/dist/app.module.js.map +1 -1
- 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/trovit.config.d.ts +5 -0
- package/dist/configs/trovit.config.js +17 -0
- package/dist/configs/trovit.config.js.map +1 -0
- package/dist/constants/modix/category.constant.js.map +1 -1
- package/dist/enums/export-type.enum.d.ts +2 -1
- package/dist/enums/export-type.enum.js +1 -0
- package/dist/enums/export-type.enum.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/trovit.exporter.d.ts +12 -0
- package/dist/exporters/trovit.exporter.js +62 -0
- package/dist/exporters/trovit.exporter.js.map +1 -0
- package/dist/formats/index.d.ts +1 -0
- package/dist/formats/index.js +1 -0
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/trovit-xml.builder.d.ts +8 -0
- package/dist/formats/trovit-xml.builder.js +39 -0
- package/dist/formats/trovit-xml.builder.js.map +1 -0
- package/dist/interfaces/{autoborse.intreface.d.ts → atributes-wrap-item.intreface.d.ts} +1 -1
- package/dist/interfaces/{modix/modix-wrap-item.intreface.js → atributes-wrap-item.intreface.js} +1 -1
- package/dist/interfaces/atributes-wrap-item.intreface.js.map +1 -0
- package/dist/interfaces/export-item.interface.d.ts +64 -37
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/index.js.map +1 -1
- package/dist/interfaces/modix/index.d.ts +0 -1
- package/dist/interfaces/modix/index.js +0 -1
- package/dist/interfaces/modix/index.js.map +1 -1
- package/dist/interfaces/modix/modix-item-list.interface.d.ts +2 -2
- package/dist/services/images.service.d.ts +3 -3
- package/dist/services/images.service.js +10 -10
- package/dist/services/images.service.js.map +1 -1
- package/dist/services/index.d.ts +6 -5
- package/dist/services/index.js +6 -5
- package/dist/services/index.js.map +1 -1
- package/dist/services/transformer.service.d.ts +29 -0
- package/dist/services/transformer.service.js +122 -0
- package/dist/services/transformer.service.js.map +1 -0
- package/dist/transformers/auto24.transfomer.js +3 -3
- package/dist/transformers/auto24.transfomer.js.map +1 -1
- package/dist/transformers/autouncle.transformer.js +1 -1
- package/dist/transformers/autouncle.transformer.js.map +1 -1
- package/dist/transformers/facebook-shop.transformer.js +1 -1
- package/dist/transformers/facebook-shop.transformer.js.map +1 -1
- package/dist/transformers/fb-description.transformer.js +4 -4
- package/dist/transformers/fb-description.transformer.js.map +1 -1
- package/dist/transformers/fb.transformer.js +5 -6
- package/dist/transformers/fb.transformer.js.map +1 -1
- package/dist/transformers/google.transformer.js +1 -1
- package/dist/transformers/google.transformer.js.map +1 -1
- package/dist/transformers/index.d.ts +1 -0
- package/dist/transformers/index.js +1 -0
- package/dist/transformers/index.js.map +1 -1
- package/dist/transformers/meinstadt.transformer.d.ts +1 -1
- package/dist/transformers/meinstadt.transformer.js +3 -3
- package/dist/transformers/meinstadt.transformer.js.map +1 -1
- package/dist/transformers/mobile.transformer.js +3 -3
- package/dist/transformers/mobile.transformer.js.map +1 -1
- package/dist/transformers/modix.transformer.js +5 -5
- package/dist/transformers/modix.transformer.js.map +1 -1
- package/dist/transformers/ooyyo.transformer.js +1 -1
- package/dist/transformers/ooyyo.transformer.js.map +1 -1
- package/dist/transformers/rubrikk.transformer.js +1 -1
- package/dist/transformers/rubrikk.transformer.js.map +1 -1
- package/dist/transformers/trovit.transformer.d.ts +16 -0
- package/dist/transformers/trovit.transformer.js +73 -0
- package/dist/transformers/trovit.transformer.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/converter.utils.d.ts +1 -0
- package/dist/utils/converter.utils.js +5 -1
- package/dist/utils/converter.utils.js.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +3 -3
- package/src/app.module.ts +14 -8
- package/src/configs/index.ts +1 -0
- package/src/configs/trovit.config.ts +14 -0
- package/src/constants/modix/category.constant.ts +0 -1
- package/src/enums/export-type.enum.ts +1 -0
- package/src/export.schema.ts +6 -0
- package/src/exporters/index.ts +1 -0
- package/src/exporters/trovit.exporter.ts +49 -0
- package/src/formats/index.ts +1 -0
- package/src/formats/trovit-xml.builder.ts +44 -0
- package/src/interfaces/{autoborse.intreface.ts → atributes-wrap-item.intreface.ts} +1 -1
- package/src/interfaces/export-item.interface.ts +65 -37
- package/src/interfaces/index.ts +1 -0
- package/src/interfaces/modix/index.ts +0 -1
- package/src/interfaces/modix/modix-item-list.interface.ts +2 -2
- package/src/services/images.service.ts +19 -10
- package/src/services/index.ts +6 -5
- package/src/services/transformer.service.ts +129 -0
- package/src/transformers/as24.transformer.ts +3 -3
- package/src/transformers/auto24.transfomer.ts +7 -2
- package/src/transformers/autouncle.transformer.ts +2 -2
- package/src/transformers/facebook-shop.transformer.ts +1 -1
- package/src/transformers/fb-description.transformer.ts +4 -4
- package/src/transformers/fb.transformer.ts +14 -12
- package/src/transformers/google.transformer.ts +6 -2
- package/src/transformers/index.ts +1 -0
- package/src/transformers/meinstadt.transformer.ts +9 -4
- package/src/transformers/mobile.transformer.ts +8 -4
- package/src/transformers/modix.transformer.ts +14 -14
- package/src/transformers/ooyyo.transformer.ts +1 -1
- package/src/transformers/rubrikk.transformer.ts +1 -1
- package/src/transformers/trovit.transformer.ts +63 -0
- package/src/utils/converter.utils.ts +4 -0
- package/src/utils/index.ts +3 -0
- package/dist/interfaces/autoborse.intreface.js +0 -3
- package/dist/interfaces/autoborse.intreface.js.map +0 -1
- package/dist/interfaces/modix/modix-wrap-item.intreface.d.ts +0 -6
- package/dist/interfaces/modix/modix-wrap-item.intreface.js.map +0 -1
- 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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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) {
|
|
333
|
-
|
|
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(
|
|
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,
|
|
@@ -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({
|
|
18
|
-
|
|
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
|
|
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(
|
|
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,
|
|
13
|
-
import { isNotEmptyArray, isValidVin } from '../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:
|
|
42
|
-
submodel: { value: (get(car, 'mainData.subModel', '')
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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:
|
|
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&medium=listing&campaign=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
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"autoborse.intreface.js","sourceRoot":"","sources":["../../src/interfaces/autoborse.intreface.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"modix-wrap-item.intreface.js","sourceRoot":"","sources":["../../../src/interfaces/modix/modix-wrap-item.intreface.ts"],"names":[],"mappings":""}
|