@bytebrand/export-cars 1.21.6 → 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/autouncle.exporter.js +5 -1
- package/dist/exporters/autouncle.exporter.js.map +1 -1
- package/dist/exporters/fb.exporter.js +7 -1
- package/dist/exporters/fb.exporter.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 -58
- 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 -50
- 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,48 +1,48 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { CarService, LoaderService, ConfigService, RulesService } from '../services';
|
|
3
|
-
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
4
|
-
import { Exporter } from '../interfaces/exporter.interface';
|
|
5
|
-
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
6
|
-
import { ModuleRef } from '@nestjs/core';
|
|
7
|
-
import { Zipper } from '@bytebrand/zipper';
|
|
8
|
-
import { OoyyoXmlBuilder } from '../formats/ooyyo-xml.builder';
|
|
9
|
-
import { OoyyoTransformer } from '../transformers/ooyyo.transformer';
|
|
10
|
-
|
|
11
|
-
@Injectable()
|
|
12
|
-
export class OoyyoExporter implements Exporter {
|
|
13
|
-
constructor(
|
|
14
|
-
private carService: CarService,
|
|
15
|
-
private configService: ConfigService,
|
|
16
|
-
private loaderService: LoaderService,
|
|
17
|
-
private moduleRef: ModuleRef,
|
|
18
|
-
private rulesService: RulesService,
|
|
19
|
-
) {}
|
|
20
|
-
|
|
21
|
-
async export(): Promise<void> {
|
|
22
|
-
const [fileXml, fileGZ] = this.configService.config.outputFiles;
|
|
23
|
-
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
24
|
-
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
25
|
-
|
|
26
|
-
const ooyyoXmlBuilder = new OoyyoXmlBuilder(fileXml);
|
|
27
|
-
await ooyyoXmlBuilder.buildStart();
|
|
28
|
-
|
|
29
|
-
const ooyyoTransformer = await this.moduleRef.create(OoyyoTransformer);
|
|
30
|
-
|
|
31
|
-
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
32
|
-
const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
33
|
-
|
|
34
|
-
for (let i = 0; i < chunkData.length; i += 1) {
|
|
35
|
-
const { car, images } = chunkData[i];
|
|
36
|
-
// console.time(`Transform ${car._id}`);
|
|
37
|
-
await ooyyoXmlBuilder.addItem(await ooyyoTransformer.transform(car, images));
|
|
38
|
-
// console.timeEnd(`Transform ${car._id}`);
|
|
39
|
-
this.carService.counter.countCar(images);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
await ooyyoXmlBuilder.buildEnd();
|
|
44
|
-
console.log(this.carService.counter.getCountedCars());
|
|
45
|
-
|
|
46
|
-
fileGZ && await Zipper.tar({ dest: fileGZ, fileList: [fileXml] });
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { CarService, LoaderService, ConfigService, RulesService } from '../services';
|
|
3
|
+
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
4
|
+
import { Exporter } from '../interfaces/exporter.interface';
|
|
5
|
+
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
6
|
+
import { ModuleRef } from '@nestjs/core';
|
|
7
|
+
import { Zipper } from '@bytebrand/zipper';
|
|
8
|
+
import { OoyyoXmlBuilder } from '../formats/ooyyo-xml.builder';
|
|
9
|
+
import { OoyyoTransformer } from '../transformers/ooyyo.transformer';
|
|
10
|
+
|
|
11
|
+
@Injectable()
|
|
12
|
+
export class OoyyoExporter implements Exporter {
|
|
13
|
+
constructor(
|
|
14
|
+
private carService: CarService,
|
|
15
|
+
private configService: ConfigService,
|
|
16
|
+
private loaderService: LoaderService,
|
|
17
|
+
private moduleRef: ModuleRef,
|
|
18
|
+
private rulesService: RulesService,
|
|
19
|
+
) {}
|
|
20
|
+
|
|
21
|
+
async export(): Promise<void> {
|
|
22
|
+
const [fileXml, fileGZ] = this.configService.config.outputFiles;
|
|
23
|
+
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
24
|
+
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
25
|
+
|
|
26
|
+
const ooyyoXmlBuilder = new OoyyoXmlBuilder(fileXml);
|
|
27
|
+
await ooyyoXmlBuilder.buildStart();
|
|
28
|
+
|
|
29
|
+
const ooyyoTransformer = await this.moduleRef.create(OoyyoTransformer);
|
|
30
|
+
|
|
31
|
+
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
32
|
+
const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
33
|
+
|
|
34
|
+
for (let i = 0; i < chunkData.length; i += 1) {
|
|
35
|
+
const { car, images } = chunkData[i];
|
|
36
|
+
// console.time(`Transform ${car._id}`);
|
|
37
|
+
await ooyyoXmlBuilder.addItem(await ooyyoTransformer.transform(car, images));
|
|
38
|
+
// console.timeEnd(`Transform ${car._id}`);
|
|
39
|
+
this.carService.counter.countCar(images);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await ooyyoXmlBuilder.buildEnd();
|
|
44
|
+
console.log(this.carService.counter.getCountedCars());
|
|
45
|
+
|
|
46
|
+
fileGZ && await Zipper.tar({ dest: fileGZ, fileList: [fileXml] });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { ModuleRef } from '@nestjs/core';
|
|
3
|
-
|
|
4
|
-
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
5
|
-
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
6
|
-
import { Zipper } from '@bytebrand/zipper';
|
|
7
|
-
|
|
8
|
-
import { CarService, ConfigService, LoaderService, RulesService } from '../services';
|
|
9
|
-
import { Exporter } from '../interfaces/exporter.interface';
|
|
10
|
-
import { RubrikkTransformer } from '../transformers';
|
|
11
|
-
import { RubrikkXmlBuilder } from '../formats';
|
|
12
|
-
|
|
13
|
-
@Injectable()
|
|
14
|
-
export class RubrikkExporter implements Exporter {
|
|
15
|
-
constructor(
|
|
16
|
-
private carService: CarService,
|
|
17
|
-
private configService: ConfigService,
|
|
18
|
-
private loaderService: LoaderService,
|
|
19
|
-
private moduleRef: ModuleRef,
|
|
20
|
-
private rulesService: RulesService,
|
|
21
|
-
) { }
|
|
22
|
-
|
|
23
|
-
async export(): Promise<void> {
|
|
24
|
-
const [fileXml, fileGZ] = this.configService.config.outputFiles;
|
|
25
|
-
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
26
|
-
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
27
|
-
|
|
28
|
-
const rubrikkXmlBuilder = new RubrikkXmlBuilder(fileXml);
|
|
29
|
-
await rubrikkXmlBuilder.buildStart();
|
|
30
|
-
|
|
31
|
-
const rubrikkTransformer = await this.moduleRef.create(RubrikkTransformer);
|
|
32
|
-
|
|
33
|
-
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
34
|
-
const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
35
|
-
|
|
36
|
-
for (let i = 0; i < chunkData.length; i += 1) {
|
|
37
|
-
const data = chunkData[i];
|
|
38
|
-
|
|
39
|
-
// console.time(`Transform ${data.car._id}`);
|
|
40
|
-
const transformedCar = await rubrikkTransformer.transform(data);
|
|
41
|
-
// console.timeEnd(`Transform ${data.car._id}`);
|
|
42
|
-
|
|
43
|
-
await rubrikkXmlBuilder.addItem(transformedCar);
|
|
44
|
-
this.carService.counter.countCar(data.images);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
await rubrikkXmlBuilder.buildEnd();
|
|
49
|
-
|
|
50
|
-
fileGZ && await Zipper.tar({ dest: fileGZ, fileList: [fileXml] });
|
|
51
|
-
console.log(this.carService.counter.getCountedCars());
|
|
52
|
-
}
|
|
53
|
-
}
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { ModuleRef } from '@nestjs/core';
|
|
3
|
+
|
|
4
|
+
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
5
|
+
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
6
|
+
import { Zipper } from '@bytebrand/zipper';
|
|
7
|
+
|
|
8
|
+
import { CarService, ConfigService, LoaderService, RulesService } from '../services';
|
|
9
|
+
import { Exporter } from '../interfaces/exporter.interface';
|
|
10
|
+
import { RubrikkTransformer } from '../transformers';
|
|
11
|
+
import { RubrikkXmlBuilder } from '../formats';
|
|
12
|
+
|
|
13
|
+
@Injectable()
|
|
14
|
+
export class RubrikkExporter implements Exporter {
|
|
15
|
+
constructor(
|
|
16
|
+
private carService: CarService,
|
|
17
|
+
private configService: ConfigService,
|
|
18
|
+
private loaderService: LoaderService,
|
|
19
|
+
private moduleRef: ModuleRef,
|
|
20
|
+
private rulesService: RulesService,
|
|
21
|
+
) { }
|
|
22
|
+
|
|
23
|
+
async export(): Promise<void> {
|
|
24
|
+
const [fileXml, fileGZ] = this.configService.config.outputFiles;
|
|
25
|
+
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
26
|
+
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
27
|
+
|
|
28
|
+
const rubrikkXmlBuilder = new RubrikkXmlBuilder(fileXml);
|
|
29
|
+
await rubrikkXmlBuilder.buildStart();
|
|
30
|
+
|
|
31
|
+
const rubrikkTransformer = await this.moduleRef.create(RubrikkTransformer);
|
|
32
|
+
|
|
33
|
+
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
34
|
+
const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
35
|
+
|
|
36
|
+
for (let i = 0; i < chunkData.length; i += 1) {
|
|
37
|
+
const data = chunkData[i];
|
|
38
|
+
|
|
39
|
+
// console.time(`Transform ${data.car._id}`);
|
|
40
|
+
const transformedCar = await rubrikkTransformer.transform(data);
|
|
41
|
+
// console.timeEnd(`Transform ${data.car._id}`);
|
|
42
|
+
|
|
43
|
+
await rubrikkXmlBuilder.addItem(transformedCar);
|
|
44
|
+
this.carService.counter.countCar(data.images);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await rubrikkXmlBuilder.buildEnd();
|
|
49
|
+
|
|
50
|
+
fileGZ && await Zipper.tar({ dest: fileGZ, fileList: [fileXml] });
|
|
51
|
+
console.log(this.carService.counter.getCountedCars());
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { ModuleRef } from '@nestjs/core';
|
|
3
|
+
|
|
4
|
+
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
5
|
+
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
6
|
+
|
|
7
|
+
import { CarService, RulesService, LoaderService, ConfigService } from '../services';
|
|
8
|
+
import { MobileTransformer } from '../transformers/mobile.transformer';
|
|
9
|
+
import { Exporter } from '../interfaces/exporter.interface';
|
|
10
|
+
import { SantanderCSVBuilder } from 'src/formats/santander-csv.builder';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class SantanderExporter implements Exporter {
|
|
14
|
+
constructor(
|
|
15
|
+
private carService: CarService,
|
|
16
|
+
private configService: ConfigService,
|
|
17
|
+
private rulesService: RulesService,
|
|
18
|
+
private loaderService: LoaderService,
|
|
19
|
+
private moduleRef: ModuleRef,
|
|
20
|
+
) { }
|
|
21
|
+
|
|
22
|
+
async export(): Promise<void> {
|
|
23
|
+
const [fileCSV] = this.configService.config.outputFiles;
|
|
24
|
+
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
25
|
+
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
26
|
+
|
|
27
|
+
const santanderCSVBuilder = new SantanderCSVBuilder(fileCSV);
|
|
28
|
+
|
|
29
|
+
const mobileTransformer = await this.moduleRef.create(MobileTransformer);
|
|
30
|
+
|
|
31
|
+
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
32
|
+
chunk.data = chunk.data.filter(e => this.carService.filterCar(e, this.rulesService.rules));
|
|
33
|
+
|
|
34
|
+
if (chunk && chunk.data) {
|
|
35
|
+
for (let i = 0; i < chunk.data.length; i += 1) {
|
|
36
|
+
const data = chunk.data[i];
|
|
37
|
+
const { car, images } = data;
|
|
38
|
+
const transformedData = await mobileTransformer.transform(car, images);
|
|
39
|
+
|
|
40
|
+
await santanderCSVBuilder.addItem(transformedData);
|
|
41
|
+
this.carService.counter.countCar(data.images);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
console.log(this.carService.counter.getCountedCars());
|
|
47
|
+
|
|
48
|
+
await santanderCSVBuilder.buildEnd();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { ModuleRef } from '@nestjs/core';
|
|
3
|
-
|
|
4
|
-
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
5
|
-
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
6
|
-
|
|
7
|
-
import { CarService, ConfigService, LoaderService, RulesService } from '../services';
|
|
8
|
-
import { Exporter } from '../interfaces/exporter.interface';
|
|
9
|
-
import { TrovitXmlBuilder } from '../formats';
|
|
10
|
-
import { TrovitTransformer } from '../transformers';
|
|
11
|
-
|
|
12
|
-
@Injectable()
|
|
13
|
-
export class TrovitExporter implements Exporter {
|
|
14
|
-
constructor(
|
|
15
|
-
private carService: CarService,
|
|
16
|
-
private configService: ConfigService,
|
|
17
|
-
private loaderService: LoaderService,
|
|
18
|
-
private moduleRef: ModuleRef,
|
|
19
|
-
private rulesService: RulesService,
|
|
20
|
-
) { }
|
|
21
|
-
|
|
22
|
-
async export(): Promise<void> {
|
|
23
|
-
const [fileXml] = this.configService.config.outputFiles;
|
|
24
|
-
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
25
|
-
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
26
|
-
|
|
27
|
-
const trovitXmlBuilder = new TrovitXmlBuilder(fileXml);
|
|
28
|
-
await trovitXmlBuilder.buildStart();
|
|
29
|
-
|
|
30
|
-
const trovitTransformer = await this.moduleRef.create(TrovitTransformer);
|
|
31
|
-
|
|
32
|
-
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
33
|
-
chunk.data = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
34
|
-
|
|
35
|
-
for (let i = 0; i < chunk.data.length; i += 1) {
|
|
36
|
-
const data = chunk.data[i];
|
|
37
|
-
|
|
38
|
-
// console.time(`Transform ${data.car._id}`);
|
|
39
|
-
const transformedCar = await trovitTransformer.transform(data);
|
|
40
|
-
// console.timeEnd(`Transform ${data.car._id}`);
|
|
41
|
-
|
|
42
|
-
await trovitXmlBuilder.addItem(transformedCar);
|
|
43
|
-
this.carService.counter.countCar(data.images);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
console.log(this.carService.counter.getCountedCars());
|
|
48
|
-
|
|
49
|
-
await trovitXmlBuilder.buildEnd();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { ModuleRef } from '@nestjs/core';
|
|
3
|
+
|
|
4
|
+
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
5
|
+
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
6
|
+
|
|
7
|
+
import { CarService, ConfigService, LoaderService, RulesService } from '../services';
|
|
8
|
+
import { Exporter } from '../interfaces/exporter.interface';
|
|
9
|
+
import { TrovitXmlBuilder } from '../formats';
|
|
10
|
+
import { TrovitTransformer } from '../transformers';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class TrovitExporter implements Exporter {
|
|
14
|
+
constructor(
|
|
15
|
+
private carService: CarService,
|
|
16
|
+
private configService: ConfigService,
|
|
17
|
+
private loaderService: LoaderService,
|
|
18
|
+
private moduleRef: ModuleRef,
|
|
19
|
+
private rulesService: RulesService,
|
|
20
|
+
) { }
|
|
21
|
+
|
|
22
|
+
async export(): Promise<void> {
|
|
23
|
+
const [fileXml] = this.configService.config.outputFiles;
|
|
24
|
+
await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
25
|
+
await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
|
|
26
|
+
|
|
27
|
+
const trovitXmlBuilder = new TrovitXmlBuilder(fileXml);
|
|
28
|
+
await trovitXmlBuilder.buildStart();
|
|
29
|
+
|
|
30
|
+
const trovitTransformer = await this.moduleRef.create(TrovitTransformer);
|
|
31
|
+
|
|
32
|
+
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
33
|
+
chunk.data = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
34
|
+
|
|
35
|
+
for (let i = 0; i < chunk.data.length; i += 1) {
|
|
36
|
+
const data = chunk.data[i];
|
|
37
|
+
|
|
38
|
+
// console.time(`Transform ${data.car._id}`);
|
|
39
|
+
const transformedCar = await trovitTransformer.transform(data);
|
|
40
|
+
// console.timeEnd(`Transform ${data.car._id}`);
|
|
41
|
+
|
|
42
|
+
await trovitXmlBuilder.addItem(transformedCar);
|
|
43
|
+
this.carService.counter.countCar(data.images);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
console.log(this.carService.counter.getCountedCars());
|
|
48
|
+
|
|
49
|
+
await trovitXmlBuilder.buildEnd();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
-
import { Auto24XmlItem } from '../interfaces';
|
|
3
|
-
|
|
4
|
-
export class Auto24XmlBuilder extends XMLBuilderBase {
|
|
5
|
-
async buildStart(totalResults = 0): Promise<void> {
|
|
6
|
-
await this.write(`<autode version="1.1" types="detail">
|
|
7
|
-
<link>https://www.auto.de</link>
|
|
8
|
-
<language>de</language>`);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async addItem(car: Auto24XmlItem, location = ''): Promise<void> {
|
|
12
|
-
let item = '';
|
|
13
|
-
|
|
14
|
-
item += '\n<item>\n';
|
|
15
|
-
item += this.getElement('autodeid', car.autodeid);
|
|
16
|
-
item += this.getElement('userlink', car.userlink);
|
|
17
|
-
item += this.getElement('brand', car.brand);
|
|
18
|
-
item += this.getElement('modell', car.modell);
|
|
19
|
-
item += this.getElement('cartype', car.cartype);
|
|
20
|
-
item += this.getElement('variant', car.variant, true);
|
|
21
|
-
item += this.getElement('bodytype', car.bodytype);
|
|
22
|
-
item += this.getElement('fueltype', car.fueltype);
|
|
23
|
-
item += this.getElement('consumptionK', car.consumptionK);
|
|
24
|
-
item += this.getElement('co2', car.co2);
|
|
25
|
-
item += this.getElement('efficiencyclass', car.efficiencyclass);
|
|
26
|
-
item += this.getElement('image', car.image);
|
|
27
|
-
item += this.getElement('registration', car.registration);
|
|
28
|
-
item += this.getElementsList('images', 'image', car.images);
|
|
29
|
-
item += this.getElement('price', car.price);
|
|
30
|
-
item += this.getElement('power-kw', car.power);
|
|
31
|
-
if (location) {
|
|
32
|
-
item += this.getElement('location', location);
|
|
33
|
-
} else {
|
|
34
|
-
item += this.getElement('zip', car.zip);
|
|
35
|
-
item += this.getElement('city', car.city, true);
|
|
36
|
-
}
|
|
37
|
-
item += this.getElement('mileage', car.mileage);
|
|
38
|
-
item += this.getElement('companyname', car.companyname, true);
|
|
39
|
-
item += this.getElement('extras', car.extras, true);
|
|
40
|
-
item += this.getElement('condition', car.condition);
|
|
41
|
-
item += this.getElement('dealer_homepage_url', car.dealer_homepage_url);
|
|
42
|
-
item += this.getElement('dealer_email', car.dealer_email);
|
|
43
|
-
item += this.getElement('dealer_name', car.dealer_name);
|
|
44
|
-
item += this.getElement('dealer_phone', car.dealer_phone);
|
|
45
|
-
item += '</item>';
|
|
46
|
-
|
|
47
|
-
await this.write(item);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async buildEnd(): Promise<void> {
|
|
51
|
-
await this.write('\n</autode>');
|
|
52
|
-
await this.end();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
1
|
+
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
+
import { Auto24XmlItem } from '../interfaces';
|
|
3
|
+
|
|
4
|
+
export class Auto24XmlBuilder extends XMLBuilderBase {
|
|
5
|
+
async buildStart(totalResults = 0): Promise<void> {
|
|
6
|
+
await this.write(`<autode version="1.1" types="detail">
|
|
7
|
+
<link>https://www.auto.de</link>
|
|
8
|
+
<language>de</language>`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async addItem(car: Auto24XmlItem, location = ''): Promise<void> {
|
|
12
|
+
let item = '';
|
|
13
|
+
|
|
14
|
+
item += '\n<item>\n';
|
|
15
|
+
item += this.getElement('autodeid', car.autodeid);
|
|
16
|
+
item += this.getElement('userlink', car.userlink);
|
|
17
|
+
item += this.getElement('brand', car.brand);
|
|
18
|
+
item += this.getElement('modell', car.modell);
|
|
19
|
+
item += this.getElement('cartype', car.cartype);
|
|
20
|
+
item += this.getElement('variant', car.variant, true);
|
|
21
|
+
item += this.getElement('bodytype', car.bodytype);
|
|
22
|
+
item += this.getElement('fueltype', car.fueltype);
|
|
23
|
+
item += this.getElement('consumptionK', car.consumptionK);
|
|
24
|
+
item += this.getElement('co2', car.co2);
|
|
25
|
+
item += this.getElement('efficiencyclass', car.efficiencyclass);
|
|
26
|
+
item += this.getElement('image', car.image);
|
|
27
|
+
item += this.getElement('registration', car.registration);
|
|
28
|
+
item += this.getElementsList('images', 'image', car.images);
|
|
29
|
+
item += this.getElement('price', car.price);
|
|
30
|
+
item += this.getElement('power-kw', car.power);
|
|
31
|
+
if (location) {
|
|
32
|
+
item += this.getElement('location', location);
|
|
33
|
+
} else {
|
|
34
|
+
item += this.getElement('zip', car.zip);
|
|
35
|
+
item += this.getElement('city', car.city, true);
|
|
36
|
+
}
|
|
37
|
+
item += this.getElement('mileage', car.mileage);
|
|
38
|
+
item += this.getElement('companyname', car.companyname, true);
|
|
39
|
+
item += this.getElement('extras', car.extras, true);
|
|
40
|
+
item += this.getElement('condition', car.condition);
|
|
41
|
+
item += this.getElement('dealer_homepage_url', car.dealer_homepage_url);
|
|
42
|
+
item += this.getElement('dealer_email', car.dealer_email);
|
|
43
|
+
item += this.getElement('dealer_name', car.dealer_name);
|
|
44
|
+
item += this.getElement('dealer_phone', car.dealer_phone);
|
|
45
|
+
item += '</item>';
|
|
46
|
+
|
|
47
|
+
await this.write(item);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async buildEnd(): Promise<void> {
|
|
51
|
+
await this.write('\n</autode>');
|
|
52
|
+
await this.end();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
-
import { AutouncleJsonItem } from '../interfaces';
|
|
3
|
-
|
|
4
|
-
export class AutouncleJsonBuilder extends XMLBuilderBase {
|
|
5
|
-
async buildStart(): Promise<void> {
|
|
6
|
-
await this.write('{"ads":[');
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
async addItem(car: AutouncleJsonItem, firstSym?: boolean): Promise<void> {
|
|
10
|
-
if (firstSym) {
|
|
11
|
-
await this.write(`${JSON.stringify(car)}`);
|
|
12
|
-
}
|
|
13
|
-
await this.write(`,${JSON.stringify(car)}`);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async buildEnd(): Promise<void> {
|
|
17
|
-
await this.write(']}');
|
|
18
|
-
await this.end();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
1
|
+
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
+
import { AutouncleJsonItem } from '../interfaces';
|
|
3
|
+
|
|
4
|
+
export class AutouncleJsonBuilder extends XMLBuilderBase {
|
|
5
|
+
async buildStart(): Promise<void> {
|
|
6
|
+
await this.write('{"ads":[');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async addItem(car: AutouncleJsonItem, firstSym?: boolean): Promise<void> {
|
|
10
|
+
if (firstSym) {
|
|
11
|
+
await this.write(`${JSON.stringify(car)}`);
|
|
12
|
+
}
|
|
13
|
+
await this.write(`,${JSON.stringify(car)}`);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async buildEnd(): Promise<void> {
|
|
17
|
+
await this.write(']}');
|
|
18
|
+
await this.end();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
-
import { Awin } from '../interfaces';
|
|
3
|
-
|
|
4
|
-
export class AwinCSVBuilder extends XMLBuilderBase {
|
|
5
|
-
async buildStart(): Promise<void> {
|
|
6
|
-
await this.write('product_id,product_name,brand_name,product_model,deep_link,image_url,alternate_image,alternate_image_two,alternate_image_three,alternate_image_four,price,currency,rrp_price,saving,savings_percent,colour,condition,delivery_time,last_updated,merchant_category,warranty,energy_label,description \n');
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
async addItem(car: Awin): Promise<void> {
|
|
10
|
-
let values = Object.values(car);
|
|
11
|
-
await this.write('"' + values.join('","') + '"' + '\n');
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
async buildEnd(): Promise<void> {
|
|
15
|
-
await this.end();
|
|
16
|
-
}
|
|
1
|
+
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
+
import { Awin } from '../interfaces';
|
|
3
|
+
|
|
4
|
+
export class AwinCSVBuilder extends XMLBuilderBase {
|
|
5
|
+
async buildStart(): Promise<void> {
|
|
6
|
+
await this.write('product_id,product_name,brand_name,product_model,deep_link,image_url,alternate_image,alternate_image_two,alternate_image_three,alternate_image_four,price,currency,rrp_price,saving,savings_percent,colour,condition,delivery_time,last_updated,merchant_category,warranty,energy_label,description \n');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async addItem(car: Awin): Promise<void> {
|
|
10
|
+
let values = Object.values(car);
|
|
11
|
+
await this.write('"' + values.join('","') + '"' + '\n');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async buildEnd(): Promise<void> {
|
|
15
|
+
await this.end();
|
|
16
|
+
}
|
|
17
17
|
}
|