@bytebrand/export-cars 1.19.0 → 1.20.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.
Files changed (114) hide show
  1. package/dist/app.module.js +4 -3
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/constants/images.d.ts +1 -0
  4. package/dist/constants/images.js +73 -0
  5. package/dist/constants/images.js.map +1 -0
  6. package/dist/enums/environment.enum.js +1 -1
  7. package/dist/enums/environment.enum.js.map +1 -1
  8. package/dist/enums/export-type.enum.js +1 -1
  9. package/dist/enums/export-type.enum.js.map +1 -1
  10. package/dist/enums/file-types.enum.js +1 -1
  11. package/dist/enums/file-types.enum.js.map +1 -1
  12. package/dist/enums/image-type.enum.js +1 -1
  13. package/dist/enums/image-type.enum.js.map +1 -1
  14. package/dist/export.command.js +2 -2
  15. package/dist/export.command.js.map +1 -1
  16. package/dist/exporters/as24.exporter.js +2 -4
  17. package/dist/exporters/as24.exporter.js.map +1 -1
  18. package/dist/exporters/auto24.exporter.js +2 -4
  19. package/dist/exporters/auto24.exporter.js.map +1 -1
  20. package/dist/exporters/autouncle.exporter.js +2 -4
  21. package/dist/exporters/autouncle.exporter.js.map +1 -1
  22. package/dist/exporters/awin.exporter.js +2 -2
  23. package/dist/exporters/awin.exporter.js.map +1 -1
  24. package/dist/exporters/by-owner.exporter.js +2 -2
  25. package/dist/exporters/by-owner.exporter.js.map +1 -1
  26. package/dist/exporters/facebook-shop.exporter.js +2 -4
  27. package/dist/exporters/facebook-shop.exporter.js.map +1 -1
  28. package/dist/exporters/fb.exporter.js +2 -4
  29. package/dist/exporters/fb.exporter.js.map +1 -1
  30. package/dist/exporters/google.exporter.js +2 -2
  31. package/dist/exporters/google.exporter.js.map +1 -1
  32. package/dist/exporters/meinstadt.exporter.js +2 -4
  33. package/dist/exporters/meinstadt.exporter.js.map +1 -1
  34. package/dist/exporters/mobile.exporter.js +2 -4
  35. package/dist/exporters/mobile.exporter.js.map +1 -1
  36. package/dist/exporters/modix.exporter.js +2 -4
  37. package/dist/exporters/modix.exporter.js.map +1 -1
  38. package/dist/exporters/ooyyo.exporter.js +2 -4
  39. package/dist/exporters/ooyyo.exporter.js.map +1 -1
  40. package/dist/exporters/rubrikk.exporter.js +2 -4
  41. package/dist/exporters/rubrikk.exporter.js.map +1 -1
  42. package/dist/exporters/trovit.exporter.js +2 -4
  43. package/dist/exporters/trovit.exporter.js.map +1 -1
  44. package/dist/formats/modix-xml.builder.js +1 -1
  45. package/dist/formats/modix-xml.builder.js.map +1 -1
  46. package/dist/services/car.service.js +4 -3
  47. package/dist/services/car.service.js.map +1 -1
  48. package/dist/services/config.service.js +2 -2
  49. package/dist/services/config.service.js.map +1 -1
  50. package/dist/services/images.service.d.ts +2 -1
  51. package/dist/services/images.service.js +79 -34
  52. package/dist/services/images.service.js.map +1 -1
  53. package/dist/services/loader.service.js +2 -2
  54. package/dist/services/loader.service.js.map +1 -1
  55. package/dist/services/mapping.service.js +2 -2
  56. package/dist/services/mapping.service.js.map +1 -1
  57. package/dist/services/request.service.js +2 -2
  58. package/dist/services/request.service.js.map +1 -1
  59. package/dist/services/rules.service.js +2 -2
  60. package/dist/services/rules.service.js.map +1 -1
  61. package/dist/services/transformer.service.js +2 -2
  62. package/dist/services/transformer.service.js.map +1 -1
  63. package/dist/services/user.service.js +4 -3
  64. package/dist/services/user.service.js.map +1 -1
  65. package/dist/transformers/as24.transformer.js +2 -2
  66. package/dist/transformers/as24.transformer.js.map +1 -1
  67. package/dist/transformers/auto24.transfomer.js +2 -2
  68. package/dist/transformers/auto24.transfomer.js.map +1 -1
  69. package/dist/transformers/autouncle.transformer.js +2 -2
  70. package/dist/transformers/autouncle.transformer.js.map +1 -1
  71. package/dist/transformers/awin.transformer.js +2 -2
  72. package/dist/transformers/awin.transformer.js.map +1 -1
  73. package/dist/transformers/by-owner.transformer.js +2 -2
  74. package/dist/transformers/by-owner.transformer.js.map +1 -1
  75. package/dist/transformers/facebook-shop.transformer.js +2 -2
  76. package/dist/transformers/facebook-shop.transformer.js.map +1 -1
  77. package/dist/transformers/fb.transformer.js +4 -7
  78. package/dist/transformers/fb.transformer.js.map +1 -1
  79. package/dist/transformers/google.transformer.js +2 -2
  80. package/dist/transformers/google.transformer.js.map +1 -1
  81. package/dist/transformers/meinstadt.transformer.js +2 -2
  82. package/dist/transformers/meinstadt.transformer.js.map +1 -1
  83. package/dist/transformers/mobile.transformer.js +2 -2
  84. package/dist/transformers/mobile.transformer.js.map +1 -1
  85. package/dist/transformers/modix.transformer.d.ts +3 -2
  86. package/dist/transformers/modix.transformer.js +7 -5
  87. package/dist/transformers/modix.transformer.js.map +1 -1
  88. package/dist/transformers/ooyyo.transformer.js +2 -2
  89. package/dist/transformers/ooyyo.transformer.js.map +1 -1
  90. package/dist/transformers/rubrikk.transformer.js +2 -2
  91. package/dist/transformers/rubrikk.transformer.js.map +1 -1
  92. package/dist/transformers/trovit.transformer.js +2 -2
  93. package/dist/transformers/trovit.transformer.js.map +1 -1
  94. package/dist/tsconfig.build.tsbuildinfo +1 -1
  95. package/package.json +21 -20
  96. package/src/app.module.ts +2 -1
  97. package/src/constants/images.ts +69 -0
  98. package/src/exporters/as24.exporter.ts +2 -2
  99. package/src/exporters/auto24.exporter.ts +2 -2
  100. package/src/exporters/autouncle.exporter.ts +2 -2
  101. package/src/exporters/facebook-shop.exporter.ts +2 -2
  102. package/src/exporters/fb.exporter.ts +2 -2
  103. package/src/exporters/meinstadt.exporter.ts +2 -2
  104. package/src/exporters/mobile.exporter.ts +2 -2
  105. package/src/exporters/modix.exporter.ts +2 -2
  106. package/src/exporters/ooyyo.exporter.ts +2 -2
  107. package/src/exporters/rubrikk.exporter.ts +2 -2
  108. package/src/exporters/trovit.exporter.ts +2 -2
  109. package/src/formats/modix-xml.builder.ts +1 -1
  110. package/src/services/car.service.ts +2 -1
  111. package/src/services/images.service.ts +81 -35
  112. package/src/services/user.service.ts +2 -1
  113. package/src/transformers/fb.transformer.ts +6 -5
  114. package/src/transformers/modix.transformer.ts +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytebrand/export-cars",
3
- "version": "1.19.0",
3
+ "version": "1.20.0",
4
4
  "description": "",
5
5
  "author": "bytebrand",
6
6
  "license": "UNLICENSED",
@@ -15,20 +15,21 @@
15
15
  "start:dev": "nest start --watch"
16
16
  },
17
17
  "dependencies": {
18
- "@bytebrand/autode-request": "^1.14.17",
19
- "@bytebrand/car-basic-data-scope": "^9.11.8",
20
- "@bytebrand/car-description": "^1.12.1",
21
- "@bytebrand/car-schema": "^3.14.7",
22
- "@bytebrand/chunkable": "^5.15.19",
23
- "@bytebrand/cronicle-helper": "^1.17.20",
24
- "@bytebrand/i18n-dictionaries": "^1.4.3",
25
- "@bytebrand/import-helper": "^0.42.8",
26
- "@bytebrand/schema-tools": "^3.17.1",
18
+ "@bytebrand/autode-request": "^1.19.0",
19
+ "@bytebrand/car-basic-data-scope": "^9.11.22",
20
+ "@bytebrand/car-description": "^1.13.8",
21
+ "@bytebrand/car-schema": "^3.14.15",
22
+ "@bytebrand/chunkable": "^5.19.6",
23
+ "@bytebrand/cronicle-helper": "^1.21.6",
24
+ "@bytebrand/i18n-dictionaries": "^1.5.0",
25
+ "@bytebrand/import-helper": "^0.45.0",
26
+ "@bytebrand/schema-tools": "^3.18.8",
27
27
  "@bytebrand/zipper": "^2.2.0",
28
- "@nestjs/common": "^9.0.0",
29
- "@nestjs/core": "^9.0.0",
28
+ "@nestjs/cache-manager": "^2.1.0",
29
+ "@nestjs/common": "^10.2.7",
30
+ "@nestjs/core": "^10.2.7",
30
31
  "bottleneck": "^2.19.5",
31
- "cache-manager": "^5.1.1",
32
+ "cache-manager": "^5.2.4",
32
33
  "csv-write-stream": "^2.0.0",
33
34
  "google-spreadsheet": "^3.3.0",
34
35
  "lodash": "^4.17.21",
@@ -38,14 +39,14 @@
38
39
  "vin-generator": "^1.0.1"
39
40
  },
40
41
  "devDependencies": {
41
- "@nestjs/cli": "^9.0.0",
42
- "@nestjs/schematics": "^9.0.0",
42
+ "@nestjs/cli": "^10.1.18",
43
+ "@nestjs/schematics": "^10.0.2",
43
44
  "@types/google-spreadsheet": "^3.3.0",
44
45
  "@types/inquirer": "^8.2.4",
45
46
  "@types/lodash": "^4.14.186",
46
- "@types/node": "^16.0.0",
47
- "@typescript-eslint/eslint-plugin": "^5.0.0",
48
- "@typescript-eslint/parser": "^5.0.0",
47
+ "@types/node": "^16.18.58",
48
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
49
+ "@typescript-eslint/parser": "^6.8.0",
49
50
  "eslint": "^8.0.1",
50
51
  "eslint-config-prettier": "^8.3.0",
51
52
  "eslint-plugin-prettier": "^4.0.0",
@@ -55,10 +56,10 @@
55
56
  "ts-loader": "^9.2.3",
56
57
  "ts-node": "^10.0.0",
57
58
  "tsconfig-paths": "4.1.0",
58
- "typescript": "^4.7.4"
59
+ "typescript": "^5.2.2"
59
60
  },
60
61
  "engines": {
61
62
  "node": ">=14.0.0"
62
63
  },
63
- "gitHead": "ff779c8780b8b848e84973a151f3a2fdaf3059e8"
64
+ "gitHead": "e755a559caae3bd7088cfed459bb8f80e8adc012"
64
65
  }
package/src/app.module.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import Bottleneck from 'bottleneck';
2
2
 
3
- import { CacheModule, Module } from '@nestjs/common';
3
+ import { Module } from '@nestjs/common';
4
+ import { CacheModule } from '@nestjs/cache-manager';
4
5
 
5
6
  import {
6
7
  TransformerService,
@@ -0,0 +1,69 @@
1
+ export const IMAGES_SORT_ORDER: any = {
2
+ ext_f_right: { order: 1 },
3
+ ext_f_cowl: { order: 2 },
4
+ ext_f_left: { order: 3 },
5
+ ext_l_main: { order: 4 },
6
+ ext_b_left: { order: 5 },
7
+ ext_b_main: { order: 6 },
8
+ ext_b_trunk: { order: 7 },
9
+ ext_b_right: { order: 8 },
10
+ ext_r_main: { order: 9 },
11
+ ext_f_main: { order: 10 },
12
+ ext_f_main_opened: { order: 11 },
13
+ ext_f_left_opened: { order: 12 },
14
+ ext_l_main_opened: { order: 13 },
15
+ ext_b_left_opened: { order: 14 },
16
+ ext_b_main_opened: { order: 15 },
17
+ ext_b_right_opened: { order: 16 },
18
+ ext_r_main_opened: { order: 17 },
19
+ ext_f_right_opened: { order: 18 },
20
+ conext_f_main: { order: 19 },
21
+ conext_f_left: { order: 20 },
22
+ conext_l_main: { order: 21 },
23
+ conext_b_left: { order: 22 },
24
+ conext_b_main: { order: 23 },
25
+ conext_b_right: { order: 24 },
26
+ conext_r_main: { order: 25 },
27
+ conext_f_right: { order: 26 },
28
+ ext_feat_engine: { order: 27 },
29
+ int_f_ipanel1: { order: 28 },
30
+ int_f_ipanel2: { order: 29 },
31
+ int_f_ipanel5: { order: 30 },
32
+ int_f_driverseats: { order: 31 },
33
+ int_f_assistantseats: { order: 32 },
34
+ int_b_rearseats: { order: 33 },
35
+ int_f_fandrseats: { order: 34 },
36
+ int_f_driverdashboard: { order: 35 },
37
+ int_f_doordriverside: { order: 36 },
38
+ int_f_stickshift: { order: 37 },
39
+ int_b_trunk: { order: 38 },
40
+ int_t_sunroof: { order: 39 },
41
+ int_t_panorama_sunroof: { order: 40 },
42
+ int_f_ipanel3: { order: 41 },
43
+ int_f_ipanel4: { order: 42 },
44
+ int_feat_seatheating: { order: 43 },
45
+ ext_feat_ledlights: { order: 44 },
46
+ ext_feat_cruisecontrol: { order: 45 },
47
+ int_feat_climatization: { order: 46 },
48
+ int_feat_bluetooth: { order: 47 },
49
+ ext_feat_rainsensor: { order: 48 },
50
+ ext_feat_rims: { order: 49 },
51
+ ext_feat_parkassistant: { order: 50 },
52
+ ext_feat_lightsensor: { order: 51 },
53
+ int_feat_handsfree: { order: 52 },
54
+ int_feat_headupdisplay: { order: 53 },
55
+ ext_feat_trafficsignrec: { order: 54 },
56
+ ext_feat_auxiliaryheating: { order: 55 },
57
+ ext_feat_laneassistant: { order: 56 },
58
+ int_feat_startstop: { order: 57 },
59
+ int_feat_breakassistant: { order: 58 },
60
+ ext_feat_nightassistant: { order: 59 },
61
+ dam_out_left: { order: 1000 },
62
+ dam_out_front: { order: 2000 },
63
+ dam_out_back: { order: 3000 },
64
+ dam_out_right: { order: 4000 },
65
+ dam_out_top: { order: 5000 },
66
+ gen_feature: { order: 6000 },
67
+ simple_temp: { order: 7000 },
68
+ simple_: { order: 8000 }
69
+ };
@@ -40,9 +40,9 @@ export class As24Exporter implements Exporter {
40
40
  const data = chunkData[i];
41
41
  const ownerId = get(data.car, 'metaData.ownerId');
42
42
 
43
- console.time(`Transform ${data.car._id}`);
43
+ // console.time(`Transform ${data.car._id}`);
44
44
  const transformedData = await as24Transformer.transform(data.car);
45
- console.timeEnd(`Transform ${data.car._id}`);
45
+ // console.timeEnd(`Transform ${data.car._id}`);
46
46
  const transformedDataCSV = `${convertToCSV(transformedData)}\n`;
47
47
 
48
48
  const filename = `${this.configService.config.pathesConfig.localConvertedDirectory}/${ownerId}.${FileType.CSV}`
@@ -35,9 +35,9 @@ export class Auto24Exporter implements Exporter {
35
35
  for (let i = 0; i < chunkData.length; i += 1) {
36
36
  const data = chunk.data[i];
37
37
  const { car, images } = data;
38
- console.time(`Transform ${data.car._id}`);
38
+ // console.time(`Transform ${data.car._id}`);
39
39
  await xmlBuilder.addItem(await auto24Transformer.transform(car, images), 'Deutschland');
40
- console.timeEnd(`Transform ${data.car._id}`);
40
+ // console.timeEnd(`Transform ${data.car._id}`);
41
41
  this.carService.counter.countCar(images);
42
42
  }
43
43
  });
@@ -38,9 +38,9 @@ export class AutouncleExporter implements Exporter {
38
38
  for (const data of chunk.data) {
39
39
  const ownerId = get(data.car, 'metaData.ownerId');
40
40
  const owner = await this.carService.getOwner(ownerId);
41
- console.time(`Transform ${data.car._id}`);
41
+ // console.time(`Transform ${data.car._id}`);
42
42
  const car = await autouncleTransformer.transform({ owner, ...data });
43
- console.timeEnd(`Transform ${data.car._id}`);
43
+ // console.timeEnd(`Transform ${data.car._id}`);
44
44
 
45
45
  await autouncleJsonBuilder.addItem(car, firstCar);
46
46
 
@@ -35,9 +35,9 @@ export class FacebookShopExporter implements Exporter {
35
35
  for (let i = 0; i < chunkData.length; i += 1) {
36
36
  const data = chunk.data[i];
37
37
 
38
- console.time(`Transform ${data.car._id}`);
38
+ // console.time(`Transform ${data.car._id}`);
39
39
  const transformedCar = await facebookShopTransformer.transform(data);
40
- console.timeEnd(`Transform ${data.car._id}`);
40
+ // console.timeEnd(`Transform ${data.car._id}`);
41
41
 
42
42
  await facebookShopXmkBuilder.addItem(transformedCar);
43
43
  this.carService.counter.countCar(data.images);
@@ -35,9 +35,9 @@ export class FbExporter implements Exporter {
35
35
  for (const data of chunkData) {
36
36
  const ownerId = get(data.car, 'metaData.ownerId', null);
37
37
  const owner = await this.carService.getOwner(ownerId);
38
- console.time(`Transform ${data.car._id}`);
38
+ // console.time(`Transform ${data.car._id}`);
39
39
  const car = await fbTransformer.transform({ owner, ...data });
40
- console.timeEnd(`Transform ${data.car._id}`);
40
+ // console.timeEnd(`Transform ${data.car._id}`);
41
41
 
42
42
  await fbXmlBuilder.addItem(car as FbXmlItem);
43
43
  this.carService.counter.countCar(data.images);
@@ -36,9 +36,9 @@ export class MeinstadtExporter implements Exporter {
36
36
  chunk.data = chunk.data.filter(e => this.carService.filterCar(e, this.rulesService.rules));
37
37
 
38
38
  for (const data of chunk.data) {
39
- console.time(`Transform ${data.car._id}`);
39
+ // console.time(`Transform ${data.car._id}`);
40
40
  const car = await meinstadtTransformer.transform(data);
41
- console.timeEnd(`Transform ${data.car._id}`);
41
+ // console.timeEnd(`Transform ${data.car._id}`);
42
42
  await meinstadtJsonBuilder.addItem(car as MeinstadtJsonItem, firstCar);
43
43
  this.carService.counter.countCar(data.images);
44
44
 
@@ -38,9 +38,9 @@ export class MobileExporter implements Exporter {
38
38
  for (let i = 0; i < chunk.data.length; i += 1) {
39
39
  const data = chunk.data[i];
40
40
  const { car, images } = data;
41
- console.time(`Transform ${data.car._id}`);
41
+ // console.time(`Transform ${data.car._id}`);
42
42
  const transformedData = await mobileTransformer.transform(car, images);
43
- console.timeEnd(`Transform ${data.car._id}`);
43
+ // console.timeEnd(`Transform ${data.car._id}`);
44
44
 
45
45
  await writeFile(fileName, Buffer.from(`${convertToCSV(transformedData)}\n`), { flag: 'a' });
46
46
 
@@ -40,9 +40,9 @@ export class ModixExporter implements Exporter {
40
40
  for (let i = 0; i < chunk.data.length; i += 1) {
41
41
  const data = chunk.data[i];
42
42
 
43
- console.time(`Transform ${data.car._id}`);
43
+ // console.time(`Transform ${data.car._id}`);
44
44
  const transformedCar = await modixTransformer.transform(data, mappingBuilder.getMappingRules({ reversTransforming: true }));
45
- console.timeEnd(`Transform ${data.car._id}`);
45
+ // console.timeEnd(`Transform ${data.car._id}`);
46
46
  await modixXmlBuilder.addItem(transformedCar);
47
47
 
48
48
  this.carService.counter.countCar(data.images);
@@ -33,9 +33,9 @@ export class OoyyoExporter implements Exporter {
33
33
 
34
34
  for (let i = 0; i < chunkData.length; i += 1) {
35
35
  const { car, images } = chunkData[i];
36
- console.time(`Transform ${car._id}`);
36
+ // console.time(`Transform ${car._id}`);
37
37
  await ooyyoXmlBuilder.addItem(await ooyyoTransformer.transform(car, images));
38
- console.timeEnd(`Transform ${car._id}`);
38
+ // console.timeEnd(`Transform ${car._id}`);
39
39
  this.carService.counter.countCar(images);
40
40
  }
41
41
  });
@@ -36,9 +36,9 @@ export class RubrikkExporter implements Exporter {
36
36
  for (let i = 0; i < chunkData.length; i += 1) {
37
37
  const data = chunkData[i];
38
38
 
39
- console.time(`Transform ${data.car._id}`);
39
+ // console.time(`Transform ${data.car._id}`);
40
40
  const transformedCar = await rubrikkTransformer.transform(data);
41
- console.timeEnd(`Transform ${data.car._id}`);
41
+ // console.timeEnd(`Transform ${data.car._id}`);
42
42
 
43
43
  await rubrikkXmlBuilder.addItem(transformedCar);
44
44
  this.carService.counter.countCar(data.images);
@@ -35,9 +35,9 @@ export class TrovitExporter implements Exporter {
35
35
  for (let i = 0; i < chunk.data.length; i += 1) {
36
36
  const data = chunk.data[i];
37
37
 
38
- console.time(`Transform ${data.car._id}`);
38
+ // console.time(`Transform ${data.car._id}`);
39
39
  const transformedCar = await trovitTransformer.transform(data);
40
- console.timeEnd(`Transform ${data.car._id}`);
40
+ // console.timeEnd(`Transform ${data.car._id}`);
41
41
 
42
42
  await trovitXmlBuilder.addItem(transformedCar);
43
43
  this.carService.counter.countCar(data.images);
@@ -139,7 +139,7 @@ export class ModixXmlBuilder extends XMLBuilderBase {
139
139
  let item = `\n<media>\n<images url="${imageData.url}/">\n`;
140
140
 
141
141
  imageData.imageList.forEach(image => {
142
- item += `<image name="${image.atributes?.name}" />\n`;
142
+ item += `<image name="${image.atributes?.name}" position="${image.atributes?.position}" />\n`;
143
143
  });
144
144
 
145
145
  item += '\n</images>\n</media>';
@@ -1,4 +1,5 @@
1
- import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
1
+ import { CACHE_MANAGER } from '@nestjs/cache-manager';
2
+ import { Inject, Injectable } from '@nestjs/common';
2
3
  import { getMonthsDiff } from '../utils/date-time.utils';
3
4
  import { DataSchemes } from '@bytebrand/car-schema';
4
5
  import { Cache } from 'cache-manager';
@@ -14,13 +14,75 @@ import { ImageType } from '../enums';
14
14
 
15
15
  @Injectable()
16
16
  export class ImagesService {
17
+ private readonly IMAGES_SORT_ORDER: { [imageCode: string]: number } = {
18
+ ext_f_right: 1,
19
+ ext_f_cowl: 2,
20
+ ext_f_left: 3,
21
+ ext_l_main: 4,
22
+ ext_b_left: 5,
23
+ ext_b_main: 6,
24
+ ext_b_trunk: 7,
25
+ ext_b_right: 8,
26
+ ext_r_main: 9,
27
+ ext_f_main: 10,
28
+ ext_f_main_opened: 11,
29
+ ext_f_left_opened: 12,
30
+ ext_l_main_opened: 13,
31
+ ext_b_left_opened: 14,
32
+ ext_b_main_opened: 15,
33
+ ext_b_right_opened: 16,
34
+ ext_r_main_opened: 17,
35
+ ext_f_right_opened: 18,
36
+ conext_f_main: 19,
37
+ conext_f_left: 20,
38
+ conext_l_main: 21,
39
+ conext_b_left: 22,
40
+ conext_b_main: 23,
41
+ conext_b_right: 24,
42
+ conext_r_main: 25,
43
+ conext_f_right: 26,
44
+ ext_feat_engine: 27,
45
+ int_f_ipanel1: 28,
46
+ int_f_ipanel2: 29,
47
+ int_f_ipanel5: 30,
48
+ int_f_driverseats: 31,
49
+ int_f_assistantseats: 32,
50
+ int_b_rearseats: 33,
51
+ int_f_fandrseats: 34,
52
+ int_f_driverdashboard: 35,
53
+ int_f_doordriverside: 36,
54
+ int_f_stickshift: 37,
55
+ int_b_trunk: 38,
56
+ int_t_sunroof: 39,
57
+ int_t_panorama_sunroof: 40,
58
+ int_f_ipanel3: 41,
59
+ int_f_ipanel4: 42,
60
+ int_feat_seatheating: 43,
61
+ ext_feat_ledlights: 44,
62
+ ext_feat_cruisecontrol: 45,
63
+ int_feat_climatization: 46,
64
+ int_feat_bluetooth: 47,
65
+ ext_feat_rainsensor: 48,
66
+ ext_feat_rims: 49,
67
+ ext_feat_parkassistant: 50,
68
+ ext_feat_lightsensor: 51,
69
+ int_feat_handsfree: 52,
70
+ int_feat_headupdisplay: 53,
71
+ ext_feat_trafficsignrec: 54,
72
+ ext_feat_auxiliaryheating: 55,
73
+ ext_feat_laneassistant: 56,
74
+ int_feat_startstop: 57,
75
+ int_feat_breakassistant: 58,
76
+ ext_feat_nightassistant: 59,
77
+ };
78
+
17
79
  private readonly DEFAULT_IMAGES = [
18
80
  'https://images.auto.de/carimage/noimage/7pNvWELuWhZX/large-cached.jpeg',
19
81
  'https://images.auto.de/carimage/noimage/GvyXmrpaf1D6/large-cached.jpeg',
20
82
  'https://images.auto.de/carimage/noimage/pFyfBsqBHEso/large-cached.jpeg',
21
83
  ];
22
84
 
23
- constructor(private readonly configService: ConfigService, private readonly userService: UserService) {}
85
+ constructor(private readonly configService: ConfigService, private readonly userService: UserService) { }
24
86
 
25
87
  async getImages(
26
88
  car: DataSchemes.Car,
@@ -44,7 +106,7 @@ export class ImagesService {
44
106
  return this.DEFAULT_IMAGES;
45
107
  }
46
108
 
47
- const sortedImages = this.sortImages(images, car);
109
+ const sortedImages = this.sortImages(images);
48
110
  const transformedImages = this.generateImageLinks(sortedImages, get(car, '_id'));
49
111
 
50
112
  if (!ignoreDefImages && transformedImages.length < 17) {
@@ -67,7 +129,7 @@ export class ImagesService {
67
129
  ): Promise<string[]> {
68
130
  const imageUrl = this.configService.config.marketingImageUrl;
69
131
 
70
- const transformedImages = this.transformImagesArrayIntoObject(images);
132
+ const transformedImages = this.transformImagesArrayIntoObject(this.sortImages(images));
71
133
  const config = await this.userService.getMarketingImageConfig(this.configService.config.marketingImageConfigId);
72
134
  const marketingImageConfigs = config.marketingImages.map(i => ({ marketingImageCodes: i.imageCodes }));
73
135
 
@@ -91,13 +153,14 @@ export class ImagesService {
91
153
  return imageUrls;
92
154
  }
93
155
 
94
- private transformImagesArrayIntoObject(images: ImboImageResponseInterface[]) {
95
- const result: { [imageCode: string]: string } = {};
96
- images.forEach(image => {
156
+ private transformImagesArrayIntoObject(images: ImboImageResponseInterface[]): { [imageCode: string]: string } {
157
+ return images.reduce((result, image) => {
97
158
  const imageCode = image?.imageCodePredicted?.split('-')[0];
98
- result[imageCode] = image.imageIdentifier;
99
- });
100
- return result;
159
+ if (imageCode) {
160
+ result[imageCode] = image.imageIdentifier;
161
+ }
162
+ return result;
163
+ }, {});
101
164
  }
102
165
 
103
166
  protected getChannelPath(imageUrl: string, carId: string): string {
@@ -114,31 +177,14 @@ export class ImagesService {
114
177
  return `${this.getChannelPath(imageUrl, carId)}/${channelCode.replace(/ /g, '-')}-${imageId}.${imageExtension}`;
115
178
  }
116
179
 
117
- private sortImages(images: ImboImageResponseInterface[], car: DataSchemes.Car): ImboImageResponseInterface[] {
118
- const firstImageId = get(car, 'metaData.mainImageId', null);
119
- const secondImageId = get(car, 'metaData.secImageId', null);
120
- const thirdImageId = get(car, 'metaData.thirdImageId', null);
121
-
122
- if (firstImageId) {
123
- images.forEach((image, index) => {
124
- if (firstImageId === image?.imageIdentifier) {
125
- const tmp = images[index];
126
- images[index] = images[0];
127
- images[0] = tmp;
128
- }
129
- if (secondImageId === image?.imageIdentifier) {
130
- const tmp = images[index];
131
- images[index] = images[1];
132
- images[1] = tmp;
133
- }
134
- if (thirdImageId === image?.imageIdentifier) {
135
- const tmp = images[index];
136
- images[index] = images[2];
137
- images[2] = tmp;
138
- }
139
- });
140
- return images.filter(i => i); // sometimes thirdImageId exists but image is not
141
- }
142
- return images;
180
+ sortImages(images: ImboImageResponseInterface[]): ImboImageResponseInterface[] {
181
+ return images.sort((a, b) => {
182
+ const imageCodePredictedA = a.imageCodePredicted.includes('-') ? a.imageCodePredicted.split('-')[1] : a.imageCodePredicted;
183
+ const imageCodePredictedB = b.imageCodePredicted.includes('-') ? b.imageCodePredicted.split('-')[1] : b.imageCodePredicted;
184
+ const orderA = this.IMAGES_SORT_ORDER[imageCodePredictedA] || 100;
185
+ const orderB = this.IMAGES_SORT_ORDER[imageCodePredictedB] || 100;
186
+
187
+ return orderA - orderB;
188
+ });
143
189
  }
144
190
  }
@@ -1,4 +1,5 @@
1
- import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
1
+ import { CACHE_MANAGER } from '@nestjs/cache-manager';
2
+ import { Inject, Injectable } from '@nestjs/common';
2
3
 
3
4
  import { MarketingImageConfigInterface, MarketingImageConfigsInterface } from '@bytebrand/autode-request';
4
5
  import { CronicleUtils } from '@bytebrand/cronicle-helper';
@@ -16,7 +16,8 @@ import {
16
16
  truncate,
17
17
  } from 'lodash';
18
18
 
19
- import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
19
+ import { CACHE_MANAGER } from '@nestjs/cache-manager';
20
+ import { Inject, Injectable } from '@nestjs/common';
20
21
 
21
22
  import { DePostalCodesEntryInterface } from '@bytebrand/car-basic-data-scope/dist/interfaces/DePostalCodesInterface';
22
23
  import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
@@ -70,12 +71,12 @@ export class FbTransformer {
70
71
  const autodeId = toString(get(car, '_id', ''));
71
72
  const year = this.getYear(car);
72
73
  const dealerInfo = this.getDealerItems(car);
73
- console.time(`Address ${car._id}`);
74
+ // console.time(`Address ${car._id}`);
74
75
  const address = await this.getAddress(car, owner);
75
- console.timeEnd(`Address ${car._id}`);
76
- console.time(`Images ${car._id}`);
76
+ // console.timeEnd(`Address ${car._id}`);
77
+ // console.time(`Images ${car._id}`);
77
78
  const image_links = await this.imagesService.getImages(car, images, ImageType.marketing, false);
78
- console.timeEnd(`Images ${car._id}`);
79
+ // console.timeEnd(`Images ${car._id}`);
79
80
  const transformedImages = image_links.map(el => {
80
81
  return { url: el };
81
82
  });
@@ -11,7 +11,7 @@ import { DataSchemes } from '@bytebrand/car-schema';
11
11
 
12
12
  import { imageItem, IAtributeWrapItem, ModixXmlItem } from '../interfaces';
13
13
  import { isNotEmptyArray, isValidVin, xmlStringReplacer } from '../utils';
14
- import { ConfigService } from '../services';
14
+ import { ConfigService, ImagesService } from '../services';
15
15
  import {
16
16
  BodyColorList,
17
17
  VehicleClassList,
@@ -25,7 +25,7 @@ import {
25
25
 
26
26
  @Injectable()
27
27
  export class ModixTransformer {
28
- constructor(private readonly configService: ConfigService) {}
28
+ constructor(private readonly configService: ConfigService, private readonly imagesService: ImagesService) {}
29
29
 
30
30
  async transform(
31
31
  chunkData: { car: DataSchemes.Car; images: ImboImageResponseInterface[] },
@@ -205,7 +205,7 @@ export class ModixTransformer {
205
205
  const imageList: IAtributeWrapItem[] = [];
206
206
 
207
207
  if (isNotEmptyArray(images)) {
208
- images.forEach((image: ImboImageResponseInterface, index) => {
208
+ this.imagesService.sortImages(images).forEach((image: ImboImageResponseInterface, index) => {
209
209
  imageList.push({ value: null, atributes: { name: `${image.imageIdentifier}/large`, position: index + 1 } });
210
210
  });
211
211
  }