@bytebrand/export-cars 1.0.15 → 1.1.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/api_export_cars_dasparking.xml +28 -0
- package/dist/config/alleskralle.config.d.ts +5 -0
- package/dist/config/alleskralle.config.js +18 -0
- package/dist/config/alleskralle.config.js.map +1 -0
- package/dist/config/auto24.config.d.ts +0 -1
- package/dist/config/auto24.config.js +3 -18
- package/dist/config/auto24.config.js.map +1 -1
- package/dist/config/config.d.ts +1 -0
- package/dist/config/config.js +1 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/dasparking.config.d.ts +5 -0
- package/dist/config/dasparking.config.js +18 -0
- package/dist/config/dasparking.config.js.map +1 -0
- package/dist/enums/export-type.enum.d.ts +3 -1
- package/dist/enums/export-type.enum.js +2 -0
- package/dist/enums/export-type.enum.js.map +1 -1
- package/dist/export.schema.d.ts +10 -0
- package/dist/export.schema.js +10 -0
- package/dist/export.schema.js.map +1 -1
- package/dist/exporters/auto24.exporter.js +10 -17
- package/dist/exporters/auto24.exporter.js.map +1 -1
- package/dist/formats/auto24-xml.builder.d.ts +1 -1
- package/dist/formats/auto24-xml.builder.js +8 -4
- package/dist/formats/auto24-xml.builder.js.map +1 -1
- package/dist/interfaces/export-item.interface.d.ts +0 -1
- package/dist/services/car.service.js +0 -1
- package/dist/services/car.service.js.map +1 -1
- package/dist/transformers/auto24.transfomer.js +9 -6
- package/dist/transformers/auto24.transfomer.js.map +1 -1
- package/dist/transformers/google.transformer.js +3 -0
- package/dist/transformers/google.transformer.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/parser.utils.d.ts +1 -0
- package/dist/utils/parser.utils.js +12 -1
- package/dist/utils/parser.utils.js.map +1 -1
- package/package.json +4 -3
- package/src/config/alleskralle.config.ts +15 -0
- package/src/config/auto24.config.ts +3 -19
- package/src/config/config.ts +1 -0
- package/src/config/dasparking.config.ts +15 -0
- package/src/enums/export-type.enum.ts +2 -0
- package/src/export.schema.ts +10 -0
- package/src/exporters/auto24.exporter.ts +10 -17
- package/src/formats/auto24-xml.builder.ts +7 -4
- package/src/interfaces/export-item.interface.ts +0 -1
- package/src/services/car.service.ts +0 -1
- package/src/transformers/auto24.transfomer.ts +10 -6
- package/src/transformers/google.transformer.ts +3 -0
- package/src/utils/parser.utils.ts +11 -0
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseFields = void 0;
|
|
3
|
+
exports.parseDealersList = exports.parseFields = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
4
5
|
function parseFields(values, fc) {
|
|
5
6
|
const fieldsArr = values.split(',');
|
|
6
7
|
return fieldsArr.map((e) => fc(e));
|
|
7
8
|
}
|
|
8
9
|
exports.parseFields = parseFields;
|
|
10
|
+
function parseDealersList(dealers) {
|
|
11
|
+
if (dealers) {
|
|
12
|
+
if ((0, lodash_1.indexOf)(dealers, ',') !== -1) {
|
|
13
|
+
return dealers.split(',').map((dealerId) => dealerId.trim());
|
|
14
|
+
}
|
|
15
|
+
return [dealers];
|
|
16
|
+
}
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
exports.parseDealersList = parseDealersList;
|
|
9
20
|
//# sourceMappingURL=parser.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.utils.js","sourceRoot":"","sources":["../../src/utils/parser.utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"parser.utils.js","sourceRoot":"","sources":["../../src/utils/parser.utils.ts"],"names":[],"mappings":";;;AAAA,mCAAiC;AAGjC,SAAgB,WAAW,CAAI,MAAc,EAAE,EAAiB;IAC9D,MAAM,SAAS,GAAa,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAS,EAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAHD,kCAGC;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,IAAI,OAAO,EAAE;QACX,IAAI,IAAA,gBAAO,EAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;YAChC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;SACtE;QACD,OAAO,CAAC,OAAO,CAAC,CAAC;KAClB;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AARD,4CAQC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytebrand/export-cars",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "bytebrand",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
12
12
|
"lint": "gts lint",
|
|
13
13
|
"clean": "gts clean",
|
|
14
|
-
"fix": "gts fix"
|
|
14
|
+
"fix": "gts fix",
|
|
15
|
+
"start:dev": "nest start --watch"
|
|
15
16
|
},
|
|
16
17
|
"dependencies": {
|
|
17
18
|
"@bytebrand/autode-request": "^1.5.13",
|
|
@@ -64,5 +65,5 @@
|
|
|
64
65
|
"engines": {
|
|
65
66
|
"node": ">=14.0.0"
|
|
66
67
|
},
|
|
67
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "752e83a7226fdc7a01bd7bd42ea9c85091a67a7f"
|
|
68
69
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Params } from '../interfaces/params.interface';
|
|
2
|
+
import { parseDealersList } from '../utils/parser.utils';
|
|
3
|
+
import { Config } from './config';
|
|
4
|
+
|
|
5
|
+
export class AlleskralleConfig extends Config {
|
|
6
|
+
constructor(params: Params) {
|
|
7
|
+
super(params);
|
|
8
|
+
this.pathesConfig.localConvertedDirectory = this.environmentConfig[params.environment].localConvertedDirectory;
|
|
9
|
+
this.pathesConfig.remoteDirectory = this.environmentConfig[params.environment].remoteDirectory;
|
|
10
|
+
this.dealersList = params.dealers ? parseDealersList(params.dealers) : null;
|
|
11
|
+
this.campaign = 'alleskralle';
|
|
12
|
+
this.location = 'Deutschland';
|
|
13
|
+
this.outputFiles = ['api_export_cars_alleskralle.xml'];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { indexOf } from 'lodash';
|
|
2
1
|
import { Params } from '../interfaces/params.interface';
|
|
2
|
+
import { parseDealersList } from '../utils/parser.utils';
|
|
3
3
|
import { Config } from './config';
|
|
4
4
|
|
|
5
5
|
export class Auto24Config extends Config {
|
|
@@ -7,23 +7,7 @@ export class Auto24Config extends Config {
|
|
|
7
7
|
super(params);
|
|
8
8
|
this.pathesConfig.localConvertedDirectory = this.environmentConfig[params.environment].localConvertedDirectory;
|
|
9
9
|
this.pathesConfig.remoteDirectory = this.environmentConfig[params.environment].remoteDirectory;
|
|
10
|
-
this.dealersList =
|
|
11
|
-
this.outputFiles = [
|
|
12
|
-
'api_export_cars_GERMAN.xml',
|
|
13
|
-
'api_export_moto_GERMAN.xml',
|
|
14
|
-
'api_export_nfz_GERMAN.xml',
|
|
15
|
-
'api_export_womo_GERMAN.xml',
|
|
16
|
-
'autode.tar.gz',
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
private getDealersList(dealers: string): string[] {
|
|
21
|
-
if (dealers) {
|
|
22
|
-
if (indexOf(dealers, ',') !== -1) {
|
|
23
|
-
return dealers.split(',').map((dealerId: string) => dealerId.trim());
|
|
24
|
-
}
|
|
25
|
-
return [dealers];
|
|
26
|
-
}
|
|
27
|
-
return [];
|
|
10
|
+
this.dealersList = params.dealers ? parseDealersList(params.dealers) : null;
|
|
11
|
+
this.outputFiles = ['api_export_cars_GERMAN.xml', 'autode.tar.gz'];
|
|
28
12
|
}
|
|
29
13
|
}
|
package/src/config/config.ts
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Params } from '../interfaces/params.interface';
|
|
2
|
+
import { parseDealersList } from '../utils/parser.utils';
|
|
3
|
+
import { Config } from './config';
|
|
4
|
+
|
|
5
|
+
export class DasparkingConfig extends Config {
|
|
6
|
+
constructor(params: Params) {
|
|
7
|
+
super(params);
|
|
8
|
+
this.pathesConfig.localConvertedDirectory = this.environmentConfig[params.environment].localConvertedDirectory;
|
|
9
|
+
this.pathesConfig.remoteDirectory = this.environmentConfig[params.environment].remoteDirectory;
|
|
10
|
+
this.dealersList = params.dealers ? parseDealersList(params.dealers) : null;
|
|
11
|
+
this.campaign = 'dasparking';
|
|
12
|
+
this.location = 'Deutschland';
|
|
13
|
+
this.outputFiles = ['api_export_cars_dasparking.xml'];
|
|
14
|
+
}
|
|
15
|
+
}
|
package/src/export.schema.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { AlleskralleConfig } from './config/alleskralle.config';
|
|
1
2
|
import { As24Config } from './config/as24.config';
|
|
2
3
|
import { Auto24Config } from './config/auto24.config';
|
|
3
4
|
import { AutoboerseConfig } from './config/autoboerse.config';
|
|
4
5
|
import { AutouncleConfig } from './config/autouncle.config';
|
|
5
6
|
import { ByOwnerConfig } from './config/by-owner.config';
|
|
7
|
+
import { DasparkingConfig } from './config/dasparking.config';
|
|
6
8
|
import { EautoConfig } from './config/eauto.config';
|
|
7
9
|
import { FbConfig } from './config/fb.config';
|
|
8
10
|
import { GoogleConfig } from './config/google.config';
|
|
@@ -70,4 +72,12 @@ export const exportSchema = {
|
|
|
70
72
|
config: As24Config,
|
|
71
73
|
exporter: As24Exporter,
|
|
72
74
|
},
|
|
75
|
+
[ExportType.ALLESKRALLE]: {
|
|
76
|
+
config: AlleskralleConfig,
|
|
77
|
+
exporter: Auto24Exporter,
|
|
78
|
+
},
|
|
79
|
+
[ExportType.DASPARKING]: {
|
|
80
|
+
config: DasparkingConfig,
|
|
81
|
+
exporter: Auto24Exporter,
|
|
82
|
+
},
|
|
73
83
|
};
|
|
@@ -26,31 +26,24 @@ export class Auto24Exporter implements Exporter {
|
|
|
26
26
|
exists && (await CronicleUtils.unlink(file));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
const [
|
|
30
|
-
console.log(fileCarXml);
|
|
31
|
-
const carsXmlBuilder = new Auto24XmlBuilder(fileCarXml);
|
|
32
|
-
const motoXmlBuilder = new Auto24XmlBuilder(fileMotoXml);
|
|
33
|
-
const nfzXmlBuilder = new Auto24XmlBuilder(fileNfzXml);
|
|
34
|
-
const womoXmlBuilder = new Auto24XmlBuilder(fileWomoXml);
|
|
29
|
+
const [fileXml, fileGZ] = this.configService.config.outputFiles;
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
await nfzXmlBuilder.buildStart();
|
|
38
|
-
await womoXmlBuilder.buildStart();
|
|
31
|
+
const xmlBuilder = new Auto24XmlBuilder(fileXml);
|
|
39
32
|
|
|
40
33
|
const auto24Transformer = await this.moduleRef.create(Auto24Transformer);
|
|
41
34
|
|
|
42
35
|
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
43
36
|
if (chunk && chunk.data) {
|
|
44
37
|
if (toNumber(chunk.id) === 0) {
|
|
45
|
-
await
|
|
38
|
+
await xmlBuilder.buildStart(chunk.total);
|
|
46
39
|
}
|
|
47
40
|
|
|
48
41
|
for (let i = 0; i < chunk.data.length; i += 1) {
|
|
49
42
|
const data = chunk.data[i];
|
|
50
43
|
const { car, images } = data;
|
|
51
44
|
const ownerId = get(car, 'metaData.ownerId');
|
|
52
|
-
if (this.configService.config.dealersList.indexOf(ownerId) !== -1) {
|
|
53
|
-
await
|
|
45
|
+
if (!this.configService.config.dealersList || this.configService.config.dealersList.indexOf(ownerId) !== -1) {
|
|
46
|
+
await xmlBuilder.addItem(auto24Transformer.transform(car, images), this.configService.config.location);
|
|
54
47
|
this.carService.counter.countCar(images);
|
|
55
48
|
}
|
|
56
49
|
}
|
|
@@ -58,11 +51,11 @@ export class Auto24Exporter implements Exporter {
|
|
|
58
51
|
}
|
|
59
52
|
});
|
|
60
53
|
|
|
61
|
-
await
|
|
62
|
-
|
|
63
|
-
await nfzXmlBuilder.buildEnd();
|
|
64
|
-
await womoXmlBuilder.buildEnd();
|
|
54
|
+
await xmlBuilder.buildEnd();
|
|
55
|
+
console.log(this.carService.counter.getCountedCars());
|
|
65
56
|
|
|
66
|
-
|
|
57
|
+
if (fileGZ) {
|
|
58
|
+
await Zipper.tar({ dest: fileGZ, fileList: [fileXml] });
|
|
59
|
+
}
|
|
67
60
|
}
|
|
68
61
|
}
|
|
@@ -9,13 +9,12 @@ export class Auto24XmlBuilder extends XMLBuilderBase {
|
|
|
9
9
|
<index_totalResults>${totalResults}</index_totalResults>`);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
async addItem(car: Auto24XmlItem): Promise<void> {
|
|
12
|
+
async addItem(car: Auto24XmlItem, location = ''): Promise<void> {
|
|
13
13
|
let item = '';
|
|
14
14
|
|
|
15
15
|
item += '\n<item>\n';
|
|
16
16
|
item += this.getElement('autodeid', car.autodeid);
|
|
17
17
|
item += this.getElement('userlink', car.userlink);
|
|
18
|
-
item += this.getElement('apilink', car.apilink);
|
|
19
18
|
item += this.getElement('brand', car.brand);
|
|
20
19
|
item += this.getElement('modell', car.modell);
|
|
21
20
|
item += this.getElement('cartype', car.cartype);
|
|
@@ -30,8 +29,12 @@ export class Auto24XmlBuilder extends XMLBuilderBase {
|
|
|
30
29
|
item += this.getElementsList('images', 'image', car.images);
|
|
31
30
|
item += this.getElement('price', car.price);
|
|
32
31
|
item += this.getElement('power-kw', car.power);
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
if (location) {
|
|
33
|
+
item += this.getElement('location', location);
|
|
34
|
+
} else {
|
|
35
|
+
item += this.getElement('zip', car.zip);
|
|
36
|
+
item += this.getElement('city', car.city, true);
|
|
37
|
+
}
|
|
35
38
|
item += this.getElement('mileage', car.mileage);
|
|
36
39
|
item += this.getElement('companyname', car.companyname, true);
|
|
37
40
|
item += this.getElement('extras', car.extras, true);
|
|
@@ -41,7 +41,6 @@ export class CarService {
|
|
|
41
41
|
if (!owner) {
|
|
42
42
|
try {
|
|
43
43
|
owner = await this.bottleneck.schedule(() => this.requestService.upaRequest.getDealerProfile(ownerId));
|
|
44
|
-
console.log('TEST');
|
|
45
44
|
} catch (e) {
|
|
46
45
|
console.log(e);
|
|
47
46
|
if (e.statusCode !== HttpStatus.NOT_FOUND) {
|
|
@@ -18,12 +18,16 @@ export class Auto24Transformer {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
transform(car: DataSchemes.Car, imboImages: ImboImageResponseInterface[]): Auto24XmlItem {
|
|
21
|
-
const
|
|
21
|
+
const carId = toString(get(car, '_id', ''));
|
|
22
|
+
|
|
23
|
+
let userlink = `https://www.${this.configService.config.url}/search/vehicle/${carId}`;
|
|
24
|
+
if (this.configService.config.campaign) {
|
|
25
|
+
userlink += `?source=classifieds&medium=listing&campaign=${this.configService.config.campaign}`;
|
|
26
|
+
}
|
|
22
27
|
|
|
23
28
|
return {
|
|
24
|
-
autodeid,
|
|
25
|
-
userlink
|
|
26
|
-
apilink: `https://www.${this.configService.config.url}/service/car-basic-data/api/v1/car/${autodeid}`,
|
|
29
|
+
autodeid: get(car, 'metaData.vehicleId'),
|
|
30
|
+
userlink,
|
|
27
31
|
brand: toString(get(car, 'mainData.make', '')),
|
|
28
32
|
modell: toString(get(car, 'mainData.model', '')),
|
|
29
33
|
cartype: 'pkw',
|
|
@@ -33,9 +37,9 @@ export class Auto24Transformer {
|
|
|
33
37
|
consumptionK: toString(get(car, 'consumption.consumptionCombined', '')),
|
|
34
38
|
co2: toString(get(car, 'environmentEmissions.co2', '')),
|
|
35
39
|
efficiencyclass: this.translateSelector(get(car, 'environmentEmissions.energyEfficiencyClass', '')),
|
|
36
|
-
image: this.getImageField(
|
|
40
|
+
image: this.getImageField(carId, toString(get(car, 'metaData.mainImageId')), imboImages),
|
|
37
41
|
registration: this.getRegistrationField(get(car, 'mainData.firstRegistration') as number),
|
|
38
|
-
images: this.getImagesField(
|
|
42
|
+
images: this.getImagesField(carId, imboImages),
|
|
39
43
|
price: toString(get(car, 'price.currentSalesPrice', '')),
|
|
40
44
|
power: toString(get(car, 'engineData.powerKW', '')),
|
|
41
45
|
zip: toString(get(car, 'location.zipCode', '')),
|
|
@@ -48,6 +48,9 @@ export class GoogleTransformer {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
private async getDescription(car: DataSchemes.Car): Promise<string> {
|
|
51
|
+
if (this.configService.config.isCriteo) {
|
|
52
|
+
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.';
|
|
53
|
+
}
|
|
51
54
|
const dealerId = get(car, 'metaData.ownerId');
|
|
52
55
|
const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
|
|
53
56
|
const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
import { indexOf } from 'lodash';
|
|
1
2
|
import { RuleParser } from '../interfaces/rule-parser.interface';
|
|
2
3
|
|
|
3
4
|
export function parseFields<T>(values: string, fc: RuleParser<T>): T[] {
|
|
4
5
|
const fieldsArr: string[] = values.split(',');
|
|
5
6
|
return fieldsArr.map((e: string): T => fc(e));
|
|
6
7
|
}
|
|
8
|
+
|
|
9
|
+
export function parseDealersList(dealers: string): string[] {
|
|
10
|
+
if (dealers) {
|
|
11
|
+
if (indexOf(dealers, ',') !== -1) {
|
|
12
|
+
return dealers.split(',').map((dealerId: string) => dealerId.trim());
|
|
13
|
+
}
|
|
14
|
+
return [dealers];
|
|
15
|
+
}
|
|
16
|
+
return [];
|
|
17
|
+
}
|