@bytebrand/export-cars 1.10.12 → 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 +63 -36
- 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 +2 -2
- 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 +2 -2
- 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 -1
- package/dist/utils/converter.utils.js +4 -4
- package/dist/utils/converter.utils.js.map +1 -1
- 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 +64 -36
- 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 +8 -3
- package/src/transformers/mobile.transformer.ts +8 -4
- package/src/transformers/modix.transformer.ts +14 -15
- 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 +2 -2
- 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
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare function convertToCSV(data: unknown): string;
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const xmlStringReplacer: (str: string) => string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.xmlStringReplacer = exports.convertToCSV = void 0;
|
|
4
4
|
const lodash_1 = require("lodash");
|
|
5
5
|
function convertToCSV(data) {
|
|
6
6
|
const converted = [];
|
|
@@ -12,8 +12,8 @@ function convertToCSV(data) {
|
|
|
12
12
|
return converted.join(';');
|
|
13
13
|
}
|
|
14
14
|
exports.convertToCSV = convertToCSV;
|
|
15
|
-
const
|
|
16
|
-
return typeof str === 'string' ? str.replace(/&/g, '&') : '';
|
|
15
|
+
const xmlStringReplacer = (str) => {
|
|
16
|
+
return typeof str === 'string' ? str.replace(/&/g, '&').replace(/[<>]/g, '') : '';
|
|
17
17
|
};
|
|
18
|
-
exports.
|
|
18
|
+
exports.xmlStringReplacer = xmlStringReplacer;
|
|
19
19
|
//# sourceMappingURL=converter.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.utils.js","sourceRoot":"","sources":["../../src/utils/converter.utils.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAE7B,SAAgB,YAAY,CAAC,IAAa;IACxC,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAa,CAAC;QAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,IAAA,YAAG,EAAC,SAAS,EAAE,CAAC,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AARD,oCAQC;AAEM,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE;IACvD,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"converter.utils.js","sourceRoot":"","sources":["../../src/utils/converter.utils.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAE7B,SAAgB,YAAY,CAAC,IAAa;IACxC,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAa,CAAC;QAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,IAAA,YAAG,EAAC,SAAS,EAAE,CAAC,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AARD,oCAQC;AAEM,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAU,EAAE;IACvD,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxF,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytebrand/export-cars",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "bytebrand",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@bytebrand/car-basic-data-scope": "^9.8.23",
|
|
20
20
|
"@bytebrand/car-description": "^1.7.24",
|
|
21
21
|
"@bytebrand/car-schema": "^3.12.24",
|
|
22
|
-
"@bytebrand/chunkable": "^5.13.
|
|
22
|
+
"@bytebrand/chunkable": "^5.13.10",
|
|
23
23
|
"@bytebrand/cronicle-helper": "^1.15.1",
|
|
24
24
|
"@bytebrand/i18n-dictionaries": "^1.4.2",
|
|
25
25
|
"@bytebrand/import-helper": "^0.35.1",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"engines": {
|
|
61
61
|
"node": ">=14.0.0"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "52e8a6afc5e3392fbdd35795da8fffc24f5ca754"
|
|
64
64
|
}
|
package/src/app.module.ts
CHANGED
|
@@ -2,16 +2,22 @@ import Bottleneck from 'bottleneck';
|
|
|
2
2
|
|
|
3
3
|
import { CacheModule, Module } from '@nestjs/common';
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import {
|
|
6
|
+
TransformerService,
|
|
7
|
+
MappingService,
|
|
8
|
+
RequestService,
|
|
9
|
+
ConfigService,
|
|
10
|
+
RulesService,
|
|
11
|
+
LoaderService,
|
|
12
|
+
UserService,
|
|
13
|
+
CarService,
|
|
14
|
+
ImagesService,
|
|
15
|
+
} from './services';
|
|
8
16
|
import { InputQuestions } from './input.questions';
|
|
9
17
|
import { ExportRunner } from './export.command';
|
|
10
18
|
|
|
11
19
|
@Module({
|
|
12
|
-
imports: [
|
|
13
|
-
CacheModule.register(),
|
|
14
|
-
],
|
|
20
|
+
imports: [CacheModule.register()],
|
|
15
21
|
providers: [
|
|
16
22
|
InputQuestions,
|
|
17
23
|
ExportRunner,
|
|
@@ -23,11 +29,11 @@ import { ExportRunner } from './export.command';
|
|
|
23
29
|
LoaderService,
|
|
24
30
|
RulesService,
|
|
25
31
|
ImagesService,
|
|
32
|
+
TransformerService,
|
|
26
33
|
{
|
|
27
34
|
provide: Bottleneck,
|
|
28
35
|
useValue: new Bottleneck({ maxConcurrent: 10 }),
|
|
29
36
|
},
|
|
30
37
|
],
|
|
31
38
|
})
|
|
32
|
-
|
|
33
|
-
export class AppModule { }
|
|
39
|
+
export class AppModule {}
|
package/src/configs/index.ts
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ExportType, FileType, ImageType } from 'src/enums';
|
|
2
|
+
import { Params } from '../interfaces/params.interface';
|
|
3
|
+
import { Config } from './config';
|
|
4
|
+
|
|
5
|
+
export class TrovitConfig extends Config {
|
|
6
|
+
constructor(params: Params) {
|
|
7
|
+
super(params);
|
|
8
|
+
this.pathesConfig.localConvertedDirectory = `resources/${ExportType.TROVIT}-export`;
|
|
9
|
+
this.imageType = ImageType.default;
|
|
10
|
+
this.outputFiles = [
|
|
11
|
+
`${this.pathesConfig.localConvertedDirectory}/api_export_cars_${ExportType.TROVIT}.${FileType.XML}`,
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -8,6 +8,5 @@ export const CategoryList: IModixItemsList = {
|
|
|
8
8
|
selector_category_convertible: { value: 'Convertible', atributes: { id: 1 } },
|
|
9
9
|
selector_category_suv: { value: 'Off - Road', atributes: { id: 11 } },
|
|
10
10
|
selector_category_van: { value: 'Van', atributes: { id: 388 } },
|
|
11
|
-
// selector_category_transporter - there are 14 diffrenet
|
|
12
11
|
selector_category_minibus: { value: 'Minibusses', atributes: { id: 251 } },
|
|
13
12
|
};
|
package/src/export.schema.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
ByOwnerConfig,
|
|
19
19
|
FacebookShopConfig,
|
|
20
20
|
CriteoConfig,
|
|
21
|
+
TrovitConfig,
|
|
21
22
|
} from './configs';
|
|
22
23
|
import {
|
|
23
24
|
As24Exporter,
|
|
@@ -32,6 +33,7 @@ import {
|
|
|
32
33
|
ModixExporter,
|
|
33
34
|
RubrikkExporter,
|
|
34
35
|
FacebookShopExporter,
|
|
36
|
+
TrovitExporter,
|
|
35
37
|
} from './exporters';
|
|
36
38
|
|
|
37
39
|
export const exportSchema = {
|
|
@@ -103,4 +105,8 @@ export const exportSchema = {
|
|
|
103
105
|
config: FacebookShopConfig,
|
|
104
106
|
exporter: FacebookShopExporter,
|
|
105
107
|
},
|
|
108
|
+
[ExportType.TROVIT]: {
|
|
109
|
+
config: TrovitConfig,
|
|
110
|
+
exporter: TrovitExporter,
|
|
111
|
+
},
|
|
106
112
|
};
|
package/src/exporters/index.ts
CHANGED
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
|
|
34
|
+
|
|
35
|
+
if (chunk && chunkData) {
|
|
36
|
+
for (let i = 0; i < chunk.data.length; i += 1) {
|
|
37
|
+
const data = chunk.data[i];
|
|
38
|
+
|
|
39
|
+
const transformedCar = await trovitTransformer.transform(data);
|
|
40
|
+
|
|
41
|
+
await trovitXmlBuilder.addItem(transformedCar);
|
|
42
|
+
this.carService.counter.countCar(data.images);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
await trovitXmlBuilder.buildEnd();
|
|
48
|
+
}
|
|
49
|
+
}
|
package/src/formats/index.ts
CHANGED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
+
import { TrovitXmlItem } from '../interfaces';
|
|
3
|
+
|
|
4
|
+
export class TrovitXmlBuilder extends XMLBuilderBase {
|
|
5
|
+
async buildStart(): Promise<void> {
|
|
6
|
+
await this.write('<?xml version="1.0" encoding="utf-8"?>\n<trovit>\n');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async addItem(car: TrovitXmlItem): Promise<void> {
|
|
10
|
+
let item = '\n<ad>\n';
|
|
11
|
+
|
|
12
|
+
const tags = Object.keys(car);
|
|
13
|
+
|
|
14
|
+
for (const tag of tags) {
|
|
15
|
+
if (tag === 'pictures') {
|
|
16
|
+
item += this.mapPictures(car[tag]);
|
|
17
|
+
} else {
|
|
18
|
+
item += this.getElement(tag, car[tag]?.value, true, car[tag]?.atributes);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
item += '</ad>';
|
|
22
|
+
|
|
23
|
+
await this.write(item);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async buildEnd(): Promise<void> {
|
|
27
|
+
await this.write('</trovit>');
|
|
28
|
+
await this.end();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
mapPictures(images: Array<string>) {
|
|
32
|
+
let item = '<pictures>';
|
|
33
|
+
|
|
34
|
+
images.map(url => {
|
|
35
|
+
item += '<picture>\n';
|
|
36
|
+
item += this.getElement('picture_url', url, true);
|
|
37
|
+
item += '</picture>\n';
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
item += '</pictures>\n';
|
|
41
|
+
|
|
42
|
+
return item;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DataSchemes } from '@bytebrand/car-schema';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { IAtributeWrapItem } from './atributes-wrap-item.intreface';
|
|
4
4
|
import { Description } from './description.interface';
|
|
5
5
|
|
|
6
6
|
export interface FbXmlItem {
|
|
@@ -205,19 +205,19 @@ export interface RubrikkXmlItem {
|
|
|
205
205
|
|
|
206
206
|
export interface ModixXmlItem {
|
|
207
207
|
maindata: {
|
|
208
|
-
category:
|
|
209
|
-
manufacturer:
|
|
210
|
-
model:
|
|
211
|
-
submodel:
|
|
212
|
-
mileage:
|
|
213
|
-
cylinderCapacity:
|
|
214
|
-
enginePower:
|
|
215
|
-
fuel:
|
|
216
|
-
accident:
|
|
217
|
-
transmission:
|
|
218
|
-
usageCategory:
|
|
219
|
-
bodyStyle:
|
|
220
|
-
isOnline:
|
|
208
|
+
category: IAtributeWrapItem;
|
|
209
|
+
manufacturer: IAtributeWrapItem;
|
|
210
|
+
model: IAtributeWrapItem;
|
|
211
|
+
submodel: IAtributeWrapItem;
|
|
212
|
+
mileage: IAtributeWrapItem;
|
|
213
|
+
cylinderCapacity: IAtributeWrapItem;
|
|
214
|
+
enginePower: IAtributeWrapItem;
|
|
215
|
+
fuel: IAtributeWrapItem;
|
|
216
|
+
accident: IAtributeWrapItem;
|
|
217
|
+
transmission: IAtributeWrapItem;
|
|
218
|
+
usageCategory: IAtributeWrapItem;
|
|
219
|
+
bodyStyle: IAtributeWrapItem;
|
|
220
|
+
isOnline: IAtributeWrapItem;
|
|
221
221
|
};
|
|
222
222
|
bodyColors: bodyColorItem;
|
|
223
223
|
dates: mapSameTagsItem[];
|
|
@@ -241,48 +241,48 @@ export interface tagWrapperItem {
|
|
|
241
241
|
export interface bodyColorItem {
|
|
242
242
|
id: number;
|
|
243
243
|
data: {
|
|
244
|
-
name:
|
|
245
|
-
description:
|
|
246
|
-
paint:
|
|
244
|
+
name: IAtributeWrapItem;
|
|
245
|
+
description: IAtributeWrapItem;
|
|
246
|
+
paint: IAtributeWrapItem;
|
|
247
247
|
};
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
export interface identificationItem {
|
|
251
251
|
hsnTsn: {
|
|
252
|
-
hsn:
|
|
253
|
-
tsn:
|
|
252
|
+
hsn: IAtributeWrapItem;
|
|
253
|
+
tsn: IAtributeWrapItem;
|
|
254
254
|
};
|
|
255
|
-
vin:
|
|
256
|
-
datEuropacode:
|
|
257
|
-
schwackecode:
|
|
255
|
+
vin: IAtributeWrapItem;
|
|
256
|
+
datEuropacode: IAtributeWrapItem;
|
|
257
|
+
schwackecode: IAtributeWrapItem;
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
export interface imageItem {
|
|
261
261
|
url: string;
|
|
262
|
-
imageList:
|
|
262
|
+
imageList: IAtributeWrapItem[];
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
export interface priceItem {
|
|
266
266
|
vatReclaimable: boolean;
|
|
267
|
-
grossPrice:
|
|
267
|
+
grossPrice: IAtributeWrapItem;
|
|
268
268
|
}
|
|
269
269
|
|
|
270
270
|
export interface dealerItem {
|
|
271
271
|
address: {
|
|
272
|
-
company:
|
|
273
|
-
street:
|
|
274
|
-
city:
|
|
275
|
-
zip:
|
|
276
|
-
country:
|
|
277
|
-
phone:
|
|
278
|
-
fax:
|
|
279
|
-
email:
|
|
280
|
-
homepage:
|
|
272
|
+
company: IAtributeWrapItem;
|
|
273
|
+
street: IAtributeWrapItem;
|
|
274
|
+
city: IAtributeWrapItem;
|
|
275
|
+
zip: IAtributeWrapItem;
|
|
276
|
+
country: IAtributeWrapItem;
|
|
277
|
+
phone: IAtributeWrapItem;
|
|
278
|
+
fax: IAtributeWrapItem;
|
|
279
|
+
email: IAtributeWrapItem;
|
|
280
|
+
homepage: IAtributeWrapItem;
|
|
281
281
|
};
|
|
282
282
|
imprint: {
|
|
283
|
-
registerId:
|
|
284
|
-
representitive:
|
|
285
|
-
vatid:
|
|
283
|
+
registerId: IAtributeWrapItem;
|
|
284
|
+
representitive: IAtributeWrapItem;
|
|
285
|
+
vatid: IAtributeWrapItem;
|
|
286
286
|
};
|
|
287
287
|
}
|
|
288
288
|
|
|
@@ -310,3 +310,31 @@ export interface FacebookShopTag {
|
|
|
310
310
|
isGoogle: boolean;
|
|
311
311
|
value: any;
|
|
312
312
|
}
|
|
313
|
+
|
|
314
|
+
export interface TrovitXmlItem {
|
|
315
|
+
id: IAtributeWrapItem;
|
|
316
|
+
url: IAtributeWrapItem;
|
|
317
|
+
title: IAtributeWrapItem;
|
|
318
|
+
content: IAtributeWrapItem;
|
|
319
|
+
price: IAtributeWrapItem;
|
|
320
|
+
car_type: IAtributeWrapItem;
|
|
321
|
+
dealer: IAtributeWrapItem;
|
|
322
|
+
postcode: IAtributeWrapItem;
|
|
323
|
+
vin_database: IAtributeWrapItem;
|
|
324
|
+
make: IAtributeWrapItem;
|
|
325
|
+
model: IAtributeWrapItem;
|
|
326
|
+
color: IAtributeWrapItem;
|
|
327
|
+
year: IAtributeWrapItem;
|
|
328
|
+
mileage: IAtributeWrapItem;
|
|
329
|
+
doors: IAtributeWrapItem;
|
|
330
|
+
seats: IAtributeWrapItem;
|
|
331
|
+
engine_size: IAtributeWrapItem;
|
|
332
|
+
cylinders: IAtributeWrapItem;
|
|
333
|
+
fuel: IAtributeWrapItem;
|
|
334
|
+
transmission: IAtributeWrapItem;
|
|
335
|
+
power: IAtributeWrapItem;
|
|
336
|
+
fuel_consumption: IAtributeWrapItem;
|
|
337
|
+
co2_emissions: IAtributeWrapItem;
|
|
338
|
+
pictures: Array<string>;
|
|
339
|
+
is_new: IAtributeWrapItem;
|
|
340
|
+
}
|
package/src/interfaces/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { get
|
|
1
|
+
import { get } from 'lodash';
|
|
2
2
|
|
|
3
3
|
import { Injectable } from '@nestjs/common';
|
|
4
4
|
|
|
@@ -7,7 +7,7 @@ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
|
|
|
7
7
|
import { DataSchemes } from '@bytebrand/car-schema';
|
|
8
8
|
|
|
9
9
|
import { FB_MAX_IMAGE_COUNT_FOR_DEAFULT } from '../constants/fb.constants';
|
|
10
|
-
import { isNotEmptyArray } from '../utils
|
|
10
|
+
import { isNotEmptyArray } from '../utils';
|
|
11
11
|
import { ConfigService } from './config.service';
|
|
12
12
|
import { UserService } from './user.service';
|
|
13
13
|
import { ImageType } from '../enums';
|
|
@@ -20,21 +20,26 @@ export class ImagesService {
|
|
|
20
20
|
'https://images.auto.de/carimage/noimage/pFyfBsqBHEso/large-cached.jpeg',
|
|
21
21
|
];
|
|
22
22
|
|
|
23
|
-
constructor(private readonly configService: ConfigService, private readonly userService: UserService) {
|
|
23
|
+
constructor(private readonly configService: ConfigService, private readonly userService: UserService) {}
|
|
24
24
|
|
|
25
25
|
async getImages(
|
|
26
26
|
car: DataSchemes.Car,
|
|
27
27
|
images: ImboImageResponseInterface[],
|
|
28
28
|
imageType: ImageType,
|
|
29
|
+
ignoreDefImages: boolean,
|
|
29
30
|
): Promise<Array<string>> {
|
|
30
31
|
if (imageType === ImageType.default) {
|
|
31
|
-
return this.getDefaultImages(car, images);
|
|
32
|
+
return this.getDefaultImages(car, images, ignoreDefImages);
|
|
32
33
|
} else {
|
|
33
|
-
return await this.getMarketingImages(car, images);
|
|
34
|
+
return await this.getMarketingImages(car, images, ignoreDefImages);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
getDefaultImages(
|
|
38
|
+
getDefaultImages(
|
|
39
|
+
car: DataSchemes.Car,
|
|
40
|
+
images: ImboImageResponseInterface[],
|
|
41
|
+
ignoreDefImages: boolean,
|
|
42
|
+
): Array<string> {
|
|
38
43
|
if (!isNotEmptyArray(images)) {
|
|
39
44
|
return this.DEFAULT_IMAGES;
|
|
40
45
|
}
|
|
@@ -42,7 +47,7 @@ export class ImagesService {
|
|
|
42
47
|
const sortedImages = this.sortImages(images, car);
|
|
43
48
|
const transformedImages = this.generateImageLinks(sortedImages, get(car, '_id'));
|
|
44
49
|
|
|
45
|
-
if (transformedImages.length < 17) {
|
|
50
|
+
if (!ignoreDefImages && transformedImages.length < 17) {
|
|
46
51
|
transformedImages.push(...this.DEFAULT_IMAGES);
|
|
47
52
|
}
|
|
48
53
|
|
|
@@ -55,7 +60,11 @@ export class ImagesService {
|
|
|
55
60
|
});
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
async getMarketingImages(
|
|
63
|
+
async getMarketingImages(
|
|
64
|
+
car: DataSchemes.Car,
|
|
65
|
+
images: ImboImageResponseInterface[],
|
|
66
|
+
ignoreDefImages: boolean,
|
|
67
|
+
): Promise<string[]> {
|
|
59
68
|
const imageUrl = this.configService.config.marketingImageUrl;
|
|
60
69
|
|
|
61
70
|
const transformedImages = this.transformImagesArrayIntoObject(images);
|
|
@@ -75,7 +84,7 @@ export class ImagesService {
|
|
|
75
84
|
}
|
|
76
85
|
}
|
|
77
86
|
|
|
78
|
-
if (imageUrls.length < FB_MAX_IMAGE_COUNT_FOR_DEAFULT) {
|
|
87
|
+
if (!ignoreDefImages && imageUrls.length < FB_MAX_IMAGE_COUNT_FOR_DEAFULT) {
|
|
79
88
|
imageUrls.push(...this.DEFAULT_IMAGES);
|
|
80
89
|
}
|
|
81
90
|
|
|
@@ -85,7 +94,7 @@ export class ImagesService {
|
|
|
85
94
|
private transformImagesArrayIntoObject(images: ImboImageResponseInterface[]) {
|
|
86
95
|
const result: { [imageCode: string]: string } = {};
|
|
87
96
|
images.forEach(image => {
|
|
88
|
-
const imageCode = image
|
|
97
|
+
const imageCode = image?.imageCodePredicted?.split('-')[0];
|
|
89
98
|
result[imageCode] = image.imageIdentifier;
|
|
90
99
|
});
|
|
91
100
|
return result;
|
package/src/services/index.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './rules.service';
|
|
3
|
-
export * from './car.service';
|
|
4
|
-
export * from './loader.service';
|
|
5
|
-
export * from './config.service';
|
|
1
|
+
export * from './transformer.service';
|
|
6
2
|
export * from './request.service';
|
|
7
3
|
export * from './mapping.service';
|
|
4
|
+
export * from './loader.service';
|
|
5
|
+
export * from './config.service';
|
|
8
6
|
export * from './images.service';
|
|
7
|
+
export * from './rules.service';
|
|
8
|
+
export * from './user.service';
|
|
9
|
+
export * from './car.service';
|
|
@@ -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
|
+
}
|