@bytebrand/export-cars 0.0.2 → 1.0.6
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 -0
- package/.eslintignore +1 -0
- package/.eslintrc.js +24 -0
- package/.prettierrc.js +7 -0
- package/README.md +67 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +47 -0
- package/dist/app.module.js.map +1 -0
- package/dist/config/as24.config.d.ts +5 -0
- package/dist/config/as24.config.js +13 -0
- package/dist/config/as24.config.js.map +1 -0
- package/dist/config/auto24.config.d.ts +6 -0
- package/dist/config/auto24.config.js +31 -0
- package/dist/config/auto24.config.js.map +1 -0
- package/dist/config/autoboerse.config.d.ts +5 -0
- package/dist/config/autoboerse.config.js +15 -0
- package/dist/config/autoboerse.config.js.map +1 -0
- package/dist/config/autouncle.config.d.ts +5 -0
- package/dist/config/autouncle.config.js +14 -0
- package/dist/config/autouncle.config.js.map +1 -0
- package/dist/config/by-owner.config.d.ts +5 -0
- package/dist/config/by-owner.config.js +14 -0
- package/dist/config/by-owner.config.js.map +1 -0
- package/dist/config/config.d.ts +57 -0
- package/dist/config/config.js +78 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/eauto.config.d.ts +5 -0
- package/dist/config/eauto.config.js +15 -0
- package/dist/config/eauto.config.js.map +1 -0
- package/dist/config/fb.config.d.ts +5 -0
- package/dist/config/fb.config.js +14 -0
- package/dist/config/fb.config.js.map +1 -0
- package/dist/config/google.config.d.ts +5 -0
- package/dist/config/google.config.js +13 -0
- package/dist/config/google.config.js.map +1 -0
- package/dist/config/marktde.config.d.ts +5 -0
- package/dist/config/marktde.config.js +14 -0
- package/dist/config/marktde.config.js.map +1 -0
- package/dist/config/meinstadt.config.d.ts +5 -0
- package/dist/config/meinstadt.config.js +14 -0
- package/dist/config/meinstadt.config.js.map +1 -0
- package/dist/config/ooyyo.config.d.ts +5 -0
- package/dist/config/ooyyo.config.js +14 -0
- package/dist/config/ooyyo.config.js.map +1 -0
- package/dist/config/yescar.config.d.ts +5 -0
- package/dist/config/yescar.config.js +14 -0
- package/dist/config/yescar.config.js.map +1 -0
- package/dist/constants/autouncle.contants.d.ts +4 -0
- package/dist/constants/autouncle.contants.js +8 -0
- package/dist/constants/autouncle.contants.js.map +1 -0
- package/dist/constants/fb.constants.d.ts +7 -0
- package/dist/constants/fb.constants.js +11 -0
- package/dist/constants/fb.constants.js.map +1 -0
- package/dist/constants/rule-input.contants.d.ts +3 -0
- package/dist/constants/rule-input.contants.js +7 -0
- package/dist/constants/rule-input.contants.js.map +1 -0
- package/dist/enums/environment.enum.d.ts +5 -0
- package/dist/enums/environment.enum.js +10 -0
- package/dist/enums/environment.enum.js.map +1 -0
- package/dist/enums/export-type.enum.d.ts +14 -0
- package/dist/enums/export-type.enum.js +19 -0
- package/dist/enums/export-type.enum.js.map +1 -0
- package/dist/export.command.d.ts +11 -0
- package/dist/export.command.js +49 -0
- package/dist/export.command.js.map +1 -0
- package/dist/export.schema.d.ts +65 -0
- package/dist/export.schema.js +70 -0
- package/dist/export.schema.js.map +1 -0
- package/dist/exporters/as24.exporter.d.ts +13 -0
- package/dist/exporters/as24.exporter.js +68 -0
- package/dist/exporters/as24.exporter.js.map +1 -0
- package/dist/exporters/auto24.exporter.d.ts +13 -0
- package/dist/exporters/auto24.exporter.js +81 -0
- package/dist/exporters/auto24.exporter.js.map +1 -0
- package/dist/exporters/autouncle.exporter.d.ts +15 -0
- package/dist/exporters/autouncle.exporter.js +79 -0
- package/dist/exporters/autouncle.exporter.js.map +1 -0
- package/dist/exporters/by-owner.exporter.d.ts +11 -0
- package/dist/exporters/by-owner.exporter.js +58 -0
- package/dist/exporters/by-owner.exporter.js.map +1 -0
- package/dist/exporters/fb.exporter.d.ts +15 -0
- package/dist/exporters/fb.exporter.js +67 -0
- package/dist/exporters/fb.exporter.js.map +1 -0
- package/dist/exporters/google.exporter.d.ts +15 -0
- package/dist/exporters/google.exporter.js +67 -0
- package/dist/exporters/google.exporter.js.map +1 -0
- package/dist/exporters/meinstadt.exporter.d.ts +15 -0
- package/dist/exporters/meinstadt.exporter.js +84 -0
- package/dist/exporters/meinstadt.exporter.js.map +1 -0
- package/dist/exporters/mobile.exporter.d.ts +18 -0
- package/dist/exporters/mobile.exporter.js +111 -0
- package/dist/exporters/mobile.exporter.js.map +1 -0
- package/dist/exporters/ooyyo.exporter.d.ts +13 -0
- package/dist/exporters/ooyyo.exporter.js +65 -0
- package/dist/exporters/ooyyo.exporter.js.map +1 -0
- package/dist/formats/auto24-xml.builder.d.ts +7 -0
- package/dist/formats/auto24-xml.builder.js +47 -0
- package/dist/formats/auto24-xml.builder.js.map +1 -0
- package/dist/formats/autouncle-json.builder.d.ts +7 -0
- package/dist/formats/autouncle-json.builder.js +21 -0
- package/dist/formats/autouncle-json.builder.js.map +1 -0
- package/dist/formats/fb-xml.builder.d.ts +11 -0
- package/dist/formats/fb-xml.builder.js +63 -0
- package/dist/formats/fb-xml.builder.js.map +1 -0
- package/dist/formats/google-xml.builder.d.ts +8 -0
- package/dist/formats/google-xml.builder.js +32 -0
- package/dist/formats/google-xml.builder.js.map +1 -0
- package/dist/formats/meinstadt-json.builder.d.ts +7 -0
- package/dist/formats/meinstadt-json.builder.js +22 -0
- package/dist/formats/meinstadt-json.builder.js.map +1 -0
- package/dist/formats/ooyyo-xml.builder.d.ts +7 -0
- package/dist/formats/ooyyo-xml.builder.js +47 -0
- package/dist/formats/ooyyo-xml.builder.js.map +1 -0
- package/dist/input.questions.d.ts +3 -0
- package/dist/input.questions.js +32 -0
- package/dist/input.questions.js.map +1 -0
- package/dist/interfaces/description.interface.d.ts +22 -0
- package/dist/interfaces/description.interface.js +3 -0
- package/dist/interfaces/description.interface.js.map +1 -0
- package/dist/interfaces/export-item.interface.d.ts +147 -0
- package/dist/interfaces/export-item.interface.js +3 -0
- package/dist/interfaces/export-item.interface.js.map +1 -0
- package/dist/interfaces/exporter.interface.d.ts +3 -0
- package/dist/interfaces/exporter.interface.js +3 -0
- package/dist/interfaces/exporter.interface.js.map +1 -0
- package/dist/interfaces/input.interface.d.ts +5 -0
- package/dist/interfaces/input.interface.js +3 -0
- package/dist/interfaces/input.interface.js.map +1 -0
- package/dist/interfaces/mapping-rules.interface.d.ts +10 -0
- package/dist/interfaces/mapping-rules.interface.js +3 -0
- package/dist/interfaces/mapping-rules.interface.js.map +1 -0
- package/dist/interfaces/params.interface.d.ts +18 -0
- package/dist/interfaces/params.interface.js +3 -0
- package/dist/interfaces/params.interface.js.map +1 -0
- package/dist/interfaces/rule-parser.interface.d.ts +3 -0
- package/dist/interfaces/rule-parser.interface.js +3 -0
- package/dist/interfaces/rule-parser.interface.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/dist/rules/abstract.rule.d.ts +13 -0
- package/dist/rules/abstract.rule.js +32 -0
- package/dist/rules/abstract.rule.js.map +1 -0
- package/dist/rules/date.rule.d.ts +7 -0
- package/dist/rules/date.rule.js +20 -0
- package/dist/rules/date.rule.js.map +1 -0
- package/dist/rules/number.rule.d.ts +7 -0
- package/dist/rules/number.rule.js +16 -0
- package/dist/rules/number.rule.js.map +1 -0
- package/dist/rules/string.rule.d.ts +5 -0
- package/dist/rules/string.rule.js +11 -0
- package/dist/rules/string.rule.js.map +1 -0
- package/dist/services/car.service.d.ts +24 -0
- package/dist/services/car.service.js +74 -0
- package/dist/services/car.service.js.map +1 -0
- package/dist/services/config.service.d.ts +6 -0
- package/dist/services/config.service.js +24 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/loader.service.d.ts +9 -0
- package/dist/services/loader.service.js +45 -0
- package/dist/services/loader.service.js.map +1 -0
- package/dist/services/mapping.service.d.ts +11 -0
- package/dist/services/mapping.service.js +73 -0
- package/dist/services/mapping.service.js.map +1 -0
- package/dist/services/marketing-images.service.d.ts +16 -0
- package/dist/services/marketing-images.service.js +58 -0
- package/dist/services/marketing-images.service.js.map +1 -0
- package/dist/services/request.service.d.ts +12 -0
- package/dist/services/request.service.js +48 -0
- package/dist/services/request.service.js.map +1 -0
- package/dist/services/rules.service.d.ts +15 -0
- package/dist/services/rules.service.js +68 -0
- package/dist/services/rules.service.js.map +1 -0
- package/dist/services/user.service.d.ts +11 -0
- package/dist/services/user.service.js +64 -0
- package/dist/services/user.service.js.map +1 -0
- package/dist/transformers/as24.transformer.d.ts +28 -0
- package/dist/transformers/as24.transformer.js +217 -0
- package/dist/transformers/as24.transformer.js.map +1 -0
- package/dist/transformers/auto24.transfomer.d.ts +16 -0
- package/dist/transformers/auto24.transfomer.js +155 -0
- package/dist/transformers/auto24.transfomer.js.map +1 -0
- package/dist/transformers/autouncle.transformer.d.ts +32 -0
- package/dist/transformers/autouncle.transformer.js +234 -0
- package/dist/transformers/autouncle.transformer.js.map +1 -0
- package/dist/transformers/by-owner.transformer.d.ts +12 -0
- package/dist/transformers/by-owner.transformer.js +274 -0
- package/dist/transformers/by-owner.transformer.js.map +1 -0
- package/dist/transformers/fb-description.transformer.d.ts +19 -0
- package/dist/transformers/fb-description.transformer.js +297 -0
- package/dist/transformers/fb-description.transformer.js.map +1 -0
- package/dist/transformers/fb-equipment.transformer.d.ts +8 -0
- package/dist/transformers/fb-equipment.transformer.js +149 -0
- package/dist/transformers/fb-equipment.transformer.js.map +1 -0
- package/dist/transformers/fb.transformer.d.ts +41 -0
- package/dist/transformers/fb.transformer.js +553 -0
- package/dist/transformers/fb.transformer.js.map +1 -0
- package/dist/transformers/google.transformer.d.ts +26 -0
- package/dist/transformers/google.transformer.js +164 -0
- package/dist/transformers/google.transformer.js.map +1 -0
- package/dist/transformers/meinstadt.transformer.d.ts +14 -0
- package/dist/transformers/meinstadt.transformer.js +95 -0
- package/dist/transformers/meinstadt.transformer.js.map +1 -0
- package/dist/transformers/mobile.transformer.d.ts +47 -0
- package/dist/transformers/mobile.transformer.js +471 -0
- package/dist/transformers/mobile.transformer.js.map +1 -0
- package/dist/transformers/ooyyo.transformer.d.ts +17 -0
- package/dist/transformers/ooyyo.transformer.js +127 -0
- package/dist/transformers/ooyyo.transformer.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utils/converter.utils.d.ts +1 -0
- package/dist/utils/converter.utils.js +15 -0
- package/dist/utils/converter.utils.js.map +1 -0
- package/dist/utils/date-time.utils.d.ts +1 -0
- package/dist/utils/date-time.utils.js +21 -0
- package/dist/utils/date-time.utils.js.map +1 -0
- package/dist/utils/parser.utils.d.ts +2 -0
- package/dist/utils/parser.utils.js +9 -0
- package/dist/utils/parser.utils.js.map +1 -0
- package/dist/utils/validator.utils.d.ts +2 -0
- package/dist/utils/validator.utils.js +12 -0
- package/dist/utils/validator.utils.js.map +1 -0
- package/nest-cli.json +5 -0
- package/package.json +55 -31
- package/src/app.module.ts +34 -0
- package/src/config/as24.config.ts +10 -0
- package/src/config/auto24.config.ts +29 -0
- package/src/config/autoboerse.config.ts +12 -0
- package/src/config/autouncle.config.ts +11 -0
- package/src/config/by-owner.config.ts +11 -0
- package/src/config/config.ts +87 -0
- package/src/config/eauto.config.ts +12 -0
- package/src/config/fb.config.ts +11 -0
- package/src/config/google.config.ts +10 -0
- package/src/config/marktde.config.ts +11 -0
- package/src/config/meinstadt.config.ts +11 -0
- package/src/config/ooyyo.config.ts +11 -0
- package/src/config/yescar.config.ts +11 -0
- package/src/constants/autouncle.contants.ts +4 -0
- package/src/constants/fb.constants.ts +7 -0
- package/src/constants/rule-input.contants.ts +3 -0
- package/src/enums/environment.enum.ts +5 -0
- package/src/enums/export-type.enum.ts +14 -0
- package/src/export.command.ts +35 -0
- package/src/export.schema.ts +67 -0
- package/src/exporters/as24.exporter.ts +70 -0
- package/src/exporters/auto24.exporter.ts +68 -0
- package/src/exporters/autouncle.exporter.ts +62 -0
- package/src/exporters/by-owner.exporter.ts +45 -0
- package/src/exporters/fb.exporter.ts +49 -0
- package/src/exporters/google.exporter.ts +48 -0
- package/src/exporters/meinstadt.exporter.ts +70 -0
- package/src/exporters/mobile.exporter.ts +113 -0
- package/src/exporters/ooyyo.exporter.ts +50 -0
- package/src/formats/auto24-xml.builder.ts +48 -0
- package/src/formats/autouncle-json.builder.ts +20 -0
- package/src/formats/fb-xml.builder.ts +71 -0
- package/src/formats/google-xml.builder.ts +35 -0
- package/src/formats/meinstadt-json.builder.ts +19 -0
- package/src/formats/ooyyo-xml.builder.ts +48 -0
- package/src/input.questions.ts +12 -0
- package/src/interfaces/description.interface.ts +24 -0
- package/src/interfaces/export-item.interface.ts +147 -0
- package/src/interfaces/exporter.interface.ts +3 -0
- package/src/interfaces/input.interface.ts +6 -0
- package/src/interfaces/mapping-rules.interface.ts +11 -0
- package/src/interfaces/params.interface.ts +19 -0
- package/src/interfaces/rule-parser.interface.ts +3 -0
- package/src/main.ts +9 -0
- package/src/rules/abstract.rule.ts +37 -0
- package/src/rules/date.rule.ts +18 -0
- package/src/rules/number.rule.ts +15 -0
- package/src/rules/string.rule.ts +8 -0
- package/src/services/car.service.ts +57 -0
- package/src/services/config.service.ts +15 -0
- package/src/services/loader.service.ts +30 -0
- package/src/services/mapping.service.ts +80 -0
- package/src/services/marketing-images.service.ts +67 -0
- package/src/services/request.service.ts +44 -0
- package/src/services/rules.service.ts +61 -0
- package/src/services/user.service.ts +52 -0
- package/src/transformers/as24.transformer.ts +225 -0
- package/src/transformers/auto24.transfomer.ts +155 -0
- package/src/transformers/autouncle.transformer.ts +264 -0
- package/src/transformers/by-owner.transformer.ts +364 -0
- package/src/transformers/fb-description.transformer.ts +316 -0
- package/src/transformers/fb-equipment.transformer.ts +161 -0
- package/src/transformers/fb.transformer.ts +640 -0
- package/src/transformers/google.transformer.ts +166 -0
- package/src/transformers/meinstadt.transformer.ts +80 -0
- package/src/transformers/mobile.transformer.ts +495 -0
- package/src/transformers/ooyyo.transformer.ts +123 -0
- package/src/utils/converter.utils.ts +11 -0
- package/src/utils/date-time.utils.ts +20 -0
- package/src/utils/parser.utils.ts +6 -0
- package/src/utils/validator.utils.ts +7 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +28 -34
- package/.prettierrc +0 -14
- package/dist/config/ConfigBuilder.d.ts +0 -5
- package/dist/config/ConfigBuilder.js +0 -90
- package/dist/config/ConfigBuilder.js.map +0 -1
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.js +0 -7
- package/dist/config/index.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -64
- package/dist/index.js.map +0 -1
- package/dist/interfaces/index.d.ts +0 -0
- package/dist/interfaces/index.js +0 -1
- package/dist/interfaces/index.js.map +0 -1
- package/dist/modules/acrhiver/TarArchiver.d.ts +0 -6
- package/dist/modules/acrhiver/TarArchiver.js +0 -52
- package/dist/modules/acrhiver/TarArchiver.js.map +0 -1
- package/dist/modules/acrhiver/index.d.ts +0 -2
- package/dist/modules/acrhiver/index.js +0 -7
- package/dist/modules/acrhiver/index.js.map +0 -1
- package/dist/modules/car-exporter/index.d.ts +0 -2
- package/dist/modules/car-exporter/index.js +0 -10
- package/dist/modules/car-exporter/index.js.map +0 -1
- package/dist/modules/car-loader/index.d.ts +0 -2
- package/dist/modules/car-loader/index.js +0 -12
- package/dist/modules/car-loader/index.js.map +0 -1
- package/index.js +0 -2
- package/readme.md +0 -7
- package/src/config/ConfigBuilder.ts +0 -91
- package/src/config/index.ts +0 -1
- package/src/index.ts +0 -62
- package/src/interfaces/index.ts +0 -0
- package/src/modules/acrhiver/TarArchiver.ts +0 -32
- package/src/modules/acrhiver/index.ts +0 -6
- package/src/modules/car-exporter/index.ts +0 -11
- package/src/modules/car-loader/index.ts +0 -10
- package/tslint.json +0 -51
- package/types/basic-ftp.d.ts +0 -72
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
3
|
+
import { MappingRules } from '../interfaces/mapping-rules.interface';
|
|
4
|
+
import { HttpService } from '@nestjs/axios';
|
|
5
|
+
import { lastValueFrom } from 'rxjs';
|
|
6
|
+
|
|
7
|
+
@Injectable()
|
|
8
|
+
export class MappingService {
|
|
9
|
+
constructor(private httpService: HttpService) {}
|
|
10
|
+
private rules: MappingRules[];
|
|
11
|
+
|
|
12
|
+
async getRules(): Promise<MappingRules[]> {
|
|
13
|
+
if (!this.rules) {
|
|
14
|
+
const { data } = await lastValueFrom(
|
|
15
|
+
this.httpService.get(
|
|
16
|
+
'https://docs.google.com/spreadsheets/d/e/2PACX-1vRh14TrYZDtk2efsnVsbfKypPWGdtGSSjgJRVlY2qrqHybaQZWP4HptLb3RQhiKfBsxQUdtltCRnwHU/pub?gid=1580940856&single=true&output=csv',
|
|
17
|
+
),
|
|
18
|
+
);
|
|
19
|
+
const rows: MappingRules[] = await CronicleUtils.parseCSV(data);
|
|
20
|
+
|
|
21
|
+
rows.map((row, _i, selfRows) => {
|
|
22
|
+
this.removeEmptyKeys(row);
|
|
23
|
+
if (row.importFieldType && row.importFieldType.includes('selector')) {
|
|
24
|
+
this.groupSelectors(row, selfRows);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
this.rules = this.filterResultedRows(rows);
|
|
29
|
+
}
|
|
30
|
+
return this.rules;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// private rowsToRules(rows: GoogleSpreadsheetRow[]): MappingRulesInterface[] {
|
|
34
|
+
// return rows.map(row =>
|
|
35
|
+
// Object.assign(
|
|
36
|
+
// {},
|
|
37
|
+
// ...Object.entries(Object.getOwnPropertyDescriptors(row))
|
|
38
|
+
// .filter(([_key, descriptor]) => typeof descriptor.get === 'function')
|
|
39
|
+
// .map(([key, descriptor]) => ({
|
|
40
|
+
// [key]: descriptor.get() || '',
|
|
41
|
+
// })),
|
|
42
|
+
// ),
|
|
43
|
+
// );
|
|
44
|
+
// }
|
|
45
|
+
|
|
46
|
+
private filterResultedRows(rows: MappingRules[]): MappingRules[] {
|
|
47
|
+
return rows.filter((value, idx, self) => {
|
|
48
|
+
const mapped = self.map((x: MappingRules) => x.importField);
|
|
49
|
+
const equalSelectors =
|
|
50
|
+
value.importFieldType && value.importFieldType.includes('selector')
|
|
51
|
+
? mapped.indexOf(value.importField) === idx
|
|
52
|
+
: true;
|
|
53
|
+
return value.autodeField && equalSelectors;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private removeEmptyKeys(row: MappingRules): void {
|
|
58
|
+
Object.keys(row).map(key => {
|
|
59
|
+
if (row[key] === '') {
|
|
60
|
+
delete row[key];
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private groupSelectors(row: MappingRules, selfRows: MappingRules[]): void {
|
|
66
|
+
for (let i = 0; i < selfRows.length; i += 1) {
|
|
67
|
+
if (selfRows[i].importField === row.importField) {
|
|
68
|
+
if (!selfRows[i].selectors) {
|
|
69
|
+
selfRows[i].selectors = [];
|
|
70
|
+
}
|
|
71
|
+
if (row.autodeFieldSelector) {
|
|
72
|
+
selfRows[i].selectors.push(`${row.importFieldSelector}:${row.autodeFieldSelector}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
delete row.importFieldSelector;
|
|
78
|
+
delete row.autodeFieldSelector;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { MarketingImageConfigInterface, MarketingImageConfigsInterface } from '@bytebrand/autode-request';
|
|
2
|
+
import { ConfigService } from './config.service';
|
|
3
|
+
import { UserService } from './user.service';
|
|
4
|
+
|
|
5
|
+
export class MarketingImagesService {
|
|
6
|
+
constructor(private readonly configService: ConfigService, private readonly userService: UserService) {}
|
|
7
|
+
|
|
8
|
+
async getImagesUrl(images: any, imageUrl: string, carId: string): Promise<{ url: string }[]> {
|
|
9
|
+
const transformedImages = this.transformImagesArrayIntoObject(images);
|
|
10
|
+
const configs = (await this.getMarketingImageConfigs()) as any;
|
|
11
|
+
const marketingImageConfigs = this.transform(configs);
|
|
12
|
+
|
|
13
|
+
const imageUrls = [];
|
|
14
|
+
|
|
15
|
+
for (let i = 0; i < marketingImageConfigs.length; i++) {
|
|
16
|
+
const marketingImage = marketingImageConfigs[i];
|
|
17
|
+
for (let i = 0; i < marketingImage.marketingImageCodes.length; i++) {
|
|
18
|
+
const imageCode = marketingImage.marketingImageCodes[i];
|
|
19
|
+
const imageId = transformedImages[imageCode];
|
|
20
|
+
if (imageId) {
|
|
21
|
+
imageUrls.push({ url: this.getImagePathWithExtenstion(imageUrl, carId, imageId, configs) });
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return imageUrls;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async getMarketingImageConfigs(): Promise<MarketingImageConfigsInterface> {
|
|
31
|
+
const configs = await this.userService.getMarketingImageConfigs();
|
|
32
|
+
const { id } = configs.find(config => config.channelCode.includes(this.configService.config.exportType));
|
|
33
|
+
|
|
34
|
+
return this.userService.getMarketingImageConfig(id);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private transformImagesArrayIntoObject(images: { [imageCode: string]: string }[]) {
|
|
38
|
+
const result: { [imageCode: string]: string } = {};
|
|
39
|
+
images.forEach(image => {
|
|
40
|
+
const imageCode = image.imageCodePredicted.split('-')[0];
|
|
41
|
+
result[imageCode] = image.imageIdentifier;
|
|
42
|
+
});
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private transform(config: MarketingImageConfigInterface): { marketingImageCodes: string[] }[] {
|
|
47
|
+
return config.marketingImages.map(marketingImage => {
|
|
48
|
+
return {
|
|
49
|
+
marketingImageCodes: marketingImage.imageCodes,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected getChannelPath(imageUrl: string, carId: string): string {
|
|
55
|
+
return `${imageUrl}/${[carId[0], carId[1], carId[2], carId].join('/')}`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
protected getImagePathWithExtenstion(
|
|
59
|
+
imageUrl: string,
|
|
60
|
+
carId: string,
|
|
61
|
+
imageId: string,
|
|
62
|
+
config: MarketingImageConfigsInterface,
|
|
63
|
+
): string {
|
|
64
|
+
const { channelCode, imageExtension } = config;
|
|
65
|
+
return `${this.getChannelPath(imageUrl, carId)}/${channelCode.replace(/ /g, '-')}-${imageId}.${imageExtension}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { ImageImboRequest, UserActionsRequest, UserProfileAdminRequest } from '@bytebrand/autode-request';
|
|
3
|
+
import { ConfigService } from './config.service';
|
|
4
|
+
|
|
5
|
+
@Injectable()
|
|
6
|
+
export class RequestService {
|
|
7
|
+
constructor(private configService: ConfigService) {}
|
|
8
|
+
|
|
9
|
+
private _upaRequest: UserProfileAdminRequest;
|
|
10
|
+
|
|
11
|
+
get upaRequest() {
|
|
12
|
+
if (!this._upaRequest) {
|
|
13
|
+
this._upaRequest = new UserProfileAdminRequest(
|
|
14
|
+
this.configService.config.apikey,
|
|
15
|
+
this.configService.config.upaUrl,
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
return this._upaRequest;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private _userActionsRequest: UserActionsRequest;
|
|
22
|
+
|
|
23
|
+
get userActionsRequest() {
|
|
24
|
+
if (!this._userActionsRequest) {
|
|
25
|
+
this._userActionsRequest = new UserActionsRequest(
|
|
26
|
+
this.configService.config.apikey,
|
|
27
|
+
this.configService.config.userActionsUrl,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return this._userActionsRequest;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private _imageImboRequest: ImageImboRequest;
|
|
34
|
+
|
|
35
|
+
get imageImboRequest() {
|
|
36
|
+
if (!this._imageImboRequest) {
|
|
37
|
+
this._imageImboRequest = new ImageImboRequest(
|
|
38
|
+
this.configService.config.apikey,
|
|
39
|
+
this.configService.config.userActionsUrl,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
return this._imageImboRequest;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Injectable, Logger } from '@nestjs/common';
|
|
2
|
+
import { concat, toSafeInteger, toString } from 'lodash';
|
|
3
|
+
import { DateRule } from '../rules/date.rule';
|
|
4
|
+
import { NumberRule } from '../rules/number.rule';
|
|
5
|
+
import { StringRule } from '../rules/string.rule';
|
|
6
|
+
import { ConfigService } from './config.service';
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class RulesService {
|
|
10
|
+
private readonly logger = new Logger(RulesService.name);
|
|
11
|
+
constructor(private configService: ConfigService) {}
|
|
12
|
+
|
|
13
|
+
private _rules: Array<StringRule | NumberRule | DateRule>;
|
|
14
|
+
|
|
15
|
+
get rules() {
|
|
16
|
+
if (!this._rules) {
|
|
17
|
+
this._rules = concat(
|
|
18
|
+
[],
|
|
19
|
+
this.buildStringRules(this.configService.config.input.stringIN),
|
|
20
|
+
this.buildNumberRules(this.configService.config.input.numberIN),
|
|
21
|
+
this.buildDateRules(this.configService.config.input.dateIN),
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return this._rules;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private buildRules(
|
|
28
|
+
value: string,
|
|
29
|
+
ruleBuilder: (key: string, params: string) => StringRule | DateRule | NumberRule,
|
|
30
|
+
): Array<StringRule | NumberRule | DateRule> {
|
|
31
|
+
const rulesArr: Array<StringRule | NumberRule | DateRule> = [];
|
|
32
|
+
try {
|
|
33
|
+
const expressions = value.split(';');
|
|
34
|
+
if (expressions.length === 0) return [];
|
|
35
|
+
|
|
36
|
+
expressions.forEach(e => {
|
|
37
|
+
const values = e.split(':');
|
|
38
|
+
if (values.length > 1) {
|
|
39
|
+
const rule = ruleBuilder(values[0], values[1]);
|
|
40
|
+
rulesArr.push(rule);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return rulesArr;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
this.logger.error(error);
|
|
46
|
+
return rulesArr;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private buildStringRules(value: string): Array<StringRule | NumberRule | DateRule> {
|
|
51
|
+
return this.buildRules(value, (key, params) => new StringRule(key, params, (e: string) => toString(e)));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private buildNumberRules(value: string): Array<StringRule | NumberRule | DateRule> {
|
|
55
|
+
return this.buildRules(value, (key, params) => new NumberRule(key, params, (e: string) => toSafeInteger(e)));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private buildDateRules(value: string): Array<StringRule | NumberRule | DateRule> {
|
|
59
|
+
return this.buildRules(value, (key, params) => new DateRule(key, params, (e: string) => toSafeInteger(e)));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { RequestService } from './request.service';
|
|
3
|
+
import { Cache } from 'cache-manager';
|
|
4
|
+
import { get } from 'lodash';
|
|
5
|
+
import { MarketingImageConfigInterface, MarketingImageConfigsInterface } from '@bytebrand/autode-request';
|
|
6
|
+
|
|
7
|
+
@Injectable()
|
|
8
|
+
export class UserService {
|
|
9
|
+
constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache, private readonly requestService: RequestService) {}
|
|
10
|
+
|
|
11
|
+
async getDefaultSummaryByDealerId(dealerId: string): Promise<any> {
|
|
12
|
+
const cacheKey = `${dealerId}_default_summary`;
|
|
13
|
+
const cachedResponse = await this.cacheManager.get(cacheKey);
|
|
14
|
+
|
|
15
|
+
if (cachedResponse) {
|
|
16
|
+
return cachedResponse;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const defaultSummary = await this.requestService.userActionsRequest.getDefaultSummaryByDealerId(dealerId);
|
|
20
|
+
const result = get(defaultSummary, 'data.schema', {});
|
|
21
|
+
await this.cacheManager.set(cacheKey, result);
|
|
22
|
+
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async getMarketingImageConfig(configId: number): Promise<MarketingImageConfigInterface> {
|
|
27
|
+
const key = `marketingImageConfig_${configId}`;
|
|
28
|
+
let result = (await this.cacheManager.get(key)) as MarketingImageConfigInterface;
|
|
29
|
+
if (result) {
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
result = await this.requestService.upaRequest.getMarketingImageConfigById(configId);
|
|
34
|
+
|
|
35
|
+
await this.cacheManager.set(key, result);
|
|
36
|
+
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async getMarketingImageConfigs(): Promise<MarketingImageConfigsInterface[]> {
|
|
41
|
+
const key = 'marketingImagesConfigs';
|
|
42
|
+
let result = (await this.cacheManager.get(key)) as MarketingImageConfigsInterface[];
|
|
43
|
+
if (result) {
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
result = await this.requestService.upaRequest.getMarketingImageConfigs();
|
|
48
|
+
await this.cacheManager.set(key, result);
|
|
49
|
+
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { get, isEmpty, isNil, set, upperFirst } from 'lodash';
|
|
2
|
+
import { DataSchemes } from '@bytebrand/car-schema';
|
|
3
|
+
import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
|
|
4
|
+
import { MappingService } from '../services/mapping.service';
|
|
5
|
+
import { MappingRules } from '../interfaces/mapping-rules.interface';
|
|
6
|
+
import { Injectable, Logger } from '@nestjs/common';
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class As24Transformer {
|
|
10
|
+
private readonly logger = new Logger(As24Transformer.name);
|
|
11
|
+
private currentCar: DataSchemes.Car;
|
|
12
|
+
private descriptionSchemas: unknown;
|
|
13
|
+
|
|
14
|
+
constructor(private mappingService: MappingService) {}
|
|
15
|
+
|
|
16
|
+
async transform(carData: DataSchemes.Car, descriptionSchemas: unknown): Promise<unknown> {
|
|
17
|
+
this.currentCar = carData;
|
|
18
|
+
this.descriptionSchemas = descriptionSchemas;
|
|
19
|
+
const transformedCarData = {};
|
|
20
|
+
const rules = await this.mappingService.getRules();
|
|
21
|
+
for (const rule of rules) {
|
|
22
|
+
if (rule.custom === 'yes') {
|
|
23
|
+
const transformedField = await this.customTransformers(rule, carData);
|
|
24
|
+
if (transformedField) {
|
|
25
|
+
set(transformedCarData, `${rule.importField}`, transformedField);
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
const fieldValue: any = get(carData, `${rule.autodeField}`, null);
|
|
29
|
+
if (!isNil(fieldValue)) {
|
|
30
|
+
const transformedField = await this.transformField(fieldValue, rule);
|
|
31
|
+
|
|
32
|
+
if (!isNil(transformedField)) {
|
|
33
|
+
set(transformedCarData, `${rule.importField}`, transformedField);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const ownerId = get(carData, 'metaData.ownerId', '');
|
|
40
|
+
const carId = get(carData, '_id', '');
|
|
41
|
+
ownerId && set(transformedCarData, 0, ownerId);
|
|
42
|
+
carId && set(transformedCarData, 1, carId);
|
|
43
|
+
|
|
44
|
+
return transformedCarData;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private async transformField(fieldValue: any, rule: MappingRules): Promise<string | void> {
|
|
48
|
+
const transformProcedureName = `${rule.autodeFieldType}To${upperFirst(rule.importFieldType)}`;
|
|
49
|
+
|
|
50
|
+
switch (transformProcedureName) {
|
|
51
|
+
case 'stringToString': {
|
|
52
|
+
if (rule.autodeField === 'offer.offerDescription') {
|
|
53
|
+
return await this.offerStringToString();
|
|
54
|
+
}
|
|
55
|
+
return this.stringToString(fieldValue);
|
|
56
|
+
}
|
|
57
|
+
case 'integerToString': {
|
|
58
|
+
return this.numberToString(fieldValue);
|
|
59
|
+
}
|
|
60
|
+
case 'numberToString': {
|
|
61
|
+
return this.numberToString(fieldValue);
|
|
62
|
+
}
|
|
63
|
+
case 'booleanToString': {
|
|
64
|
+
return this.booleanToString(fieldValue);
|
|
65
|
+
}
|
|
66
|
+
case 'selectorToSelector': {
|
|
67
|
+
return this.selectorToSelector(fieldValue, rule);
|
|
68
|
+
}
|
|
69
|
+
case 'selectorToString': {
|
|
70
|
+
return this.selectorToString(fieldValue, rule);
|
|
71
|
+
}
|
|
72
|
+
case 'selector[]ToSelector': {
|
|
73
|
+
return this.selectorArrayToSelector(fieldValue, rule);
|
|
74
|
+
}
|
|
75
|
+
case 'selector[]ToString': {
|
|
76
|
+
return this.selectorArrayToString(fieldValue, rule);
|
|
77
|
+
}
|
|
78
|
+
case 'dateToString': {
|
|
79
|
+
return this.dateToString(fieldValue, rule);
|
|
80
|
+
}
|
|
81
|
+
case 'dateToMobile_delivery': {
|
|
82
|
+
return this.dateToString(fieldValue, rule);
|
|
83
|
+
}
|
|
84
|
+
case 'stringToMobile_model': {
|
|
85
|
+
return this.stringToMobile_model(fieldValue);
|
|
86
|
+
}
|
|
87
|
+
case 'numberToMobile_consumption': {
|
|
88
|
+
return this.numberToMobile_consumption(fieldValue);
|
|
89
|
+
}
|
|
90
|
+
case 'booleanToMobile_vatCalc': {
|
|
91
|
+
return this.booleanToMobile_vatCalc(fieldValue);
|
|
92
|
+
}
|
|
93
|
+
case 'selectorToMobile_extColor_selector': {
|
|
94
|
+
return this.selectorToSelector(fieldValue, rule);
|
|
95
|
+
}
|
|
96
|
+
case 'selectorToCategoryOrClass_selector': {
|
|
97
|
+
return this.selectorToCategoryOrClass_selector(fieldValue, rule);
|
|
98
|
+
}
|
|
99
|
+
default:
|
|
100
|
+
this.logger.log(`missing transform: ${transformProcedureName}`);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private async customTransformers(rule: MappingRules, car: DataSchemes.Car): Promise<any> {
|
|
106
|
+
switch (rule.autodeField) {
|
|
107
|
+
case 'price.vatDeductible': {
|
|
108
|
+
return this.getVatDeductible(car);
|
|
109
|
+
}
|
|
110
|
+
case 'price.originalSalesPrice': {
|
|
111
|
+
return this.getOriginalSalesPrice(car);
|
|
112
|
+
}
|
|
113
|
+
case 'price.vatRate': {
|
|
114
|
+
return this.getVatRate(car);
|
|
115
|
+
}
|
|
116
|
+
default:
|
|
117
|
+
return '';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private async getVatDeductible(car: DataSchemes.Car): Promise<string> {
|
|
122
|
+
return this.booleanToString(!get(car, 'price.vatDeductible', null));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private async getOriginalSalesPrice(car: DataSchemes.Car): Promise<string> {
|
|
126
|
+
const vat = !get(car, 'price.vatDeductible', false);
|
|
127
|
+
const price = get(car, 'price.originalSalesPrice', null);
|
|
128
|
+
if (price && !vat) {
|
|
129
|
+
return (price / 1.19).toFixed(2) + '';
|
|
130
|
+
}
|
|
131
|
+
return price + '';
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private async getVatRate(car: DataSchemes.Car): Promise<'19' | '0'> {
|
|
135
|
+
const vat = get(car, 'price.vatDeductible', false);
|
|
136
|
+
if (vat) {
|
|
137
|
+
return '19';
|
|
138
|
+
}
|
|
139
|
+
return '0';
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private async offerStringToString(): Promise<string> {
|
|
143
|
+
const dealerID = get(this.currentCar, 'metaData.ownerId');
|
|
144
|
+
const descriptionSchema = get(this.descriptionSchemas, dealerID);
|
|
145
|
+
const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, this.currentCar);
|
|
146
|
+
return descriptionBuilder.transform(descriptionSchema);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private stringToString(fieldValue: string): string {
|
|
150
|
+
return isEmpty(fieldValue) ? null : fieldValue;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private numberToString(fieldValue: number): string {
|
|
154
|
+
return String(fieldValue);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private booleanToString(fieldValue: boolean): string {
|
|
158
|
+
return String(Number(fieldValue));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private selectorToSelector(fieldValue: string, rule: MappingRules): string | void {
|
|
162
|
+
if (fieldValue === 'selector_unknown' && rule.autodeField === 'heatingCooling.climatisation') {
|
|
163
|
+
return 'default';
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (fieldValue === 'selector_unknown' || fieldValue === 'selector_interiorColor_rainbow') {
|
|
167
|
+
return '';
|
|
168
|
+
}
|
|
169
|
+
const pairs = rule.selectors.map(p => p.split(':').reverse());
|
|
170
|
+
const [match] = pairs.filter(p => p[0] === fieldValue);
|
|
171
|
+
// consider adding values not mapped in table
|
|
172
|
+
if (match) {
|
|
173
|
+
return match[1];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private selectorToString(fieldValue: string, rule: MappingRules): string {
|
|
178
|
+
return this.booleanToString(fieldValue === rule.autodeFieldSelector);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private selectorArrayToSelector(fieldValue: string[], rule: MappingRules): string | void {
|
|
182
|
+
const lastVal = fieldValue[fieldValue.length - 1];
|
|
183
|
+
const match = this.selectorToSelector(lastVal, rule);
|
|
184
|
+
|
|
185
|
+
if (match && match !== 'default') {
|
|
186
|
+
return match;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private selectorArrayToString(fieldValue: string[], rule: MappingRules): string {
|
|
191
|
+
const match = fieldValue.includes(rule.autodeFieldSelector);
|
|
192
|
+
return this.booleanToString(match);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private dateToString(fieldValue: number, rule: MappingRules): string {
|
|
196
|
+
const date = new Date(fieldValue * 1000);
|
|
197
|
+
if (["['6']", "['7']", "['8']"].includes(rule.importField)) {
|
|
198
|
+
return `${date.getMonth() + 1}.${date.getFullYear()}`;
|
|
199
|
+
}
|
|
200
|
+
return `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private stringToMobile_model(fieldValue: string): string {
|
|
204
|
+
const model = fieldValue;
|
|
205
|
+
const subModel = get(this.currentCar, 'mainData.subModel');
|
|
206
|
+
return subModel && subModel !== model ? `${model} ${subModel}` : model;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private numberToMobile_consumption(fieldValue: number): string {
|
|
210
|
+
const consumption = this.numberToString(fieldValue);
|
|
211
|
+
return consumption.replace('.', ',');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
private booleanToMobile_vatCalc(fieldValue: boolean): string {
|
|
215
|
+
return this.booleanToString(fieldValue);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
private selectorToCategoryOrClass_selector(fieldValue: string, rule: MappingRules): string | void {
|
|
219
|
+
const pairs = rule.selectors.map(p => p.split(':'));
|
|
220
|
+
const found = pairs.find(p => p[1] === fieldValue);
|
|
221
|
+
if (found) {
|
|
222
|
+
return found[0];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Translator } from '@bytebrand/schema-tools';
|
|
2
|
+
import { de } from '@bytebrand/i18n-dictionaries';
|
|
3
|
+
import { get, toString, isNil, isEmpty, first } from 'lodash';
|
|
4
|
+
import * as moment from 'moment';
|
|
5
|
+
import { DataSchemes } from '@bytebrand/car-schema';
|
|
6
|
+
import { ImboImageResponseInterface } from '@bytebrand/chunkable';
|
|
7
|
+
import { Auto24XmlItem } from '../interfaces/export-item.interface';
|
|
8
|
+
import { Injectable } from '@nestjs/common';
|
|
9
|
+
import { ConfigService } from '../services/config.service';
|
|
10
|
+
import { isNotEmptyArray } from '../utils/validator.utils';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class Auto24Transformer {
|
|
14
|
+
private translator: Translator;
|
|
15
|
+
|
|
16
|
+
constructor(private configService: ConfigService) {
|
|
17
|
+
this.translator = new Translator(de);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
transform(car: DataSchemes.Car, imboImages: ImboImageResponseInterface[]): Auto24XmlItem {
|
|
21
|
+
const autodeid = toString(get(car, '_id', ''));
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
autodeid,
|
|
25
|
+
userlink: `https://www.${this.configService.config.url}/search/vehicle/${autodeid}`,
|
|
26
|
+
apilink: `https://www.${this.configService.config.url}/service/car-basic-data/api/v1/car/${autodeid}`,
|
|
27
|
+
brand: toString(get(car, 'mainData.make', '')),
|
|
28
|
+
modell: toString(get(car, 'mainData.model', '')),
|
|
29
|
+
cartype: 'pkw',
|
|
30
|
+
variant: toString(get(car, 'mainData.subModel', '')),
|
|
31
|
+
bodytype: this.translateSelector(get(car, 'mainData.category', '')),
|
|
32
|
+
fueltype: this.translateSelector(get(car, 'consumption.fuel', '')),
|
|
33
|
+
consumptionK: toString(get(car, 'consumption.consumptionCombined', '')),
|
|
34
|
+
co2: toString(get(car, 'environmentEmissions.co2', '')),
|
|
35
|
+
efficiencyclass: this.translateSelector(get(car, 'environmentEmissions.energyEfficiencyClass', '')),
|
|
36
|
+
image: this.getImageField(autodeid, toString(get(car, 'metaData.mainImageId')), imboImages),
|
|
37
|
+
registration: this.getRegistrationField(get(car, 'mainData.firstRegistration') as number),
|
|
38
|
+
images: this.getImagesField(autodeid, imboImages),
|
|
39
|
+
price: toString(get(car, 'price.currentSalesPrice', '')),
|
|
40
|
+
power: toString(get(car, 'engineData.powerKW', '')),
|
|
41
|
+
zip: toString(get(car, 'location.zipCode', '')),
|
|
42
|
+
city: toString(get(car, 'location.city', '')),
|
|
43
|
+
mileage: toString(get(car, 'mainData.mileage', '')),
|
|
44
|
+
companyname: 'www.auto.de',
|
|
45
|
+
extras: this.getExtrasField(car),
|
|
46
|
+
sellertype: 'dealer',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private translateSelector(selector: string): string {
|
|
51
|
+
if (isEmpty(selector) || selector === 'selector_unknown') {
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
return this.translator.translateVal(selector);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private getRegistrationField(registration: number): string {
|
|
58
|
+
if (isNil(registration)) {
|
|
59
|
+
return '';
|
|
60
|
+
}
|
|
61
|
+
return moment(registration * 1000).format('YYYY-MM');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private getExtrasField(car: DataSchemes.Car): string {
|
|
65
|
+
const booleanFields: string[] = [
|
|
66
|
+
'engineData.startStopSystem',
|
|
67
|
+
'window.panoramicGlassRoof',
|
|
68
|
+
'assistants.automaticRainSensor',
|
|
69
|
+
'assistants.cruiseControl',
|
|
70
|
+
'assistants.headUpDisplay',
|
|
71
|
+
'assistants.abs',
|
|
72
|
+
'assistants.esp',
|
|
73
|
+
'assistants.collisionAvoidance',
|
|
74
|
+
'assistants.trafficSignRecognition',
|
|
75
|
+
'lights.xenonHeadlights',
|
|
76
|
+
'lights.ledHeadlights',
|
|
77
|
+
'lights.laserHeadlights',
|
|
78
|
+
'lights.lightSensor',
|
|
79
|
+
'wheel.multifunctionalWheel',
|
|
80
|
+
'heatingCooling.auxiliaryHeating',
|
|
81
|
+
'trailerCoupling.trailerCouplingFix',
|
|
82
|
+
'trailerCoupling.trailerCouplingRemovable',
|
|
83
|
+
'trailerCoupling.trailerCouplingRotatable',
|
|
84
|
+
'multimedia.navigationSystem',
|
|
85
|
+
'multimedia.bluetooth',
|
|
86
|
+
'multimedia.handsFreePhoneSystem',
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const selectorFields: string[] = [
|
|
90
|
+
'driveSuspension.driveType',
|
|
91
|
+
'interior.interiorType',
|
|
92
|
+
'heatingCooling.climatisation',
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
const selectorListFields: string[] = [
|
|
96
|
+
'seats.driverSeats',
|
|
97
|
+
'seats.coDriverSeats',
|
|
98
|
+
'seats.backSeats',
|
|
99
|
+
'assistants.parkingAssistants',
|
|
100
|
+
'airbags.airbag',
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
const filteredBooleanFields = booleanFields.filter((field: string) => {
|
|
104
|
+
return get(car, field, false);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const filteredSelectorFields = selectorFields.filter((field: string) => {
|
|
108
|
+
const value = get(car, field);
|
|
109
|
+
return value && value !== 'selector_unknown';
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const filteredSelectorListFields = selectorListFields.filter((field: string) => {
|
|
113
|
+
const list: string[] = get(car, field);
|
|
114
|
+
if (isNotEmptyArray(list)) {
|
|
115
|
+
const filtered: string[] = list.filter((selector: string) => {
|
|
116
|
+
return selector && selector !== 'selector_unknown';
|
|
117
|
+
});
|
|
118
|
+
return filtered.length;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return filteredBooleanFields
|
|
124
|
+
.concat(filteredSelectorFields)
|
|
125
|
+
.concat(filteredSelectorListFields)
|
|
126
|
+
.map((field: string) => {
|
|
127
|
+
return this.translator.translateVal(field.replace('.', '_'));
|
|
128
|
+
})
|
|
129
|
+
.join(', ');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private getImagesField(carId: string, images: ImboImageResponseInterface[]): string[] {
|
|
133
|
+
if (isNotEmptyArray(images)) {
|
|
134
|
+
return images.map((image: ImboImageResponseInterface) => {
|
|
135
|
+
return this.buildLargeImageUrl(carId, image.imageIdentifier);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private getImageField(carId: string, mainImageId: string, images: ImboImageResponseInterface[]): string {
|
|
142
|
+
if (isNil(mainImageId) || isEmpty(mainImageId)) {
|
|
143
|
+
if (isNotEmptyArray(images)) {
|
|
144
|
+
const firstImageId = first(images);
|
|
145
|
+
return this.buildLargeImageUrl(carId, firstImageId.imageIdentifier);
|
|
146
|
+
}
|
|
147
|
+
return '';
|
|
148
|
+
}
|
|
149
|
+
return this.buildLargeImageUrl(carId, mainImageId);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private buildLargeImageUrl(carId: string, imageId: string): string {
|
|
153
|
+
return `${this.configService.config.imageUrl}/carimage/${carId}/${imageId}/large`;
|
|
154
|
+
}
|
|
155
|
+
}
|