@bytebrand/export-cars 1.14.9 → 1.15.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 (86) hide show
  1. package/dist/configs/awin.config.d.ts +5 -0
  2. package/dist/configs/awin.config.js +18 -0
  3. package/dist/configs/awin.config.js.map +1 -0
  4. package/dist/configs/index.d.ts +2 -1
  5. package/dist/configs/index.js +2 -1
  6. package/dist/configs/index.js.map +1 -1
  7. package/dist/configs/{kleinanzeigefocus.config.js → kleinanzeigeFocus.config.js} +1 -1
  8. package/dist/configs/{kleinanzeigefocus.config.js.map → kleinanzeigeFocus.config.js.map} +1 -1
  9. package/dist/enums/export-type.enum.d.ts +2 -1
  10. package/dist/enums/export-type.enum.js +1 -0
  11. package/dist/enums/export-type.enum.js.map +1 -1
  12. package/dist/export.schema.d.ts +6 -2
  13. package/dist/export.schema.js +4 -0
  14. package/dist/export.schema.js.map +1 -1
  15. package/dist/exporters/as24.exporter.js +2 -0
  16. package/dist/exporters/as24.exporter.js.map +1 -1
  17. package/dist/exporters/auto24.exporter.js +2 -0
  18. package/dist/exporters/auto24.exporter.js.map +1 -1
  19. package/dist/exporters/autouncle.exporter.js +2 -0
  20. package/dist/exporters/autouncle.exporter.js.map +1 -1
  21. package/dist/exporters/awin.exporter.d.ts +12 -0
  22. package/dist/exporters/awin.exporter.js +61 -0
  23. package/dist/exporters/awin.exporter.js.map +1 -0
  24. package/dist/exporters/facebook-shop.exporter.js +2 -0
  25. package/dist/exporters/facebook-shop.exporter.js.map +1 -1
  26. package/dist/exporters/fb.exporter.js +2 -0
  27. package/dist/exporters/fb.exporter.js.map +1 -1
  28. package/dist/exporters/google.exporter.js +2 -0
  29. package/dist/exporters/google.exporter.js.map +1 -1
  30. package/dist/exporters/index.d.ts +1 -0
  31. package/dist/exporters/index.js +1 -0
  32. package/dist/exporters/index.js.map +1 -1
  33. package/dist/exporters/meinstadt.exporter.js +2 -0
  34. package/dist/exporters/meinstadt.exporter.js.map +1 -1
  35. package/dist/exporters/mobile.exporter.js +2 -0
  36. package/dist/exporters/mobile.exporter.js.map +1 -1
  37. package/dist/exporters/modix.exporter.js +2 -0
  38. package/dist/exporters/modix.exporter.js.map +1 -1
  39. package/dist/exporters/ooyyo.exporter.js +2 -0
  40. package/dist/exporters/ooyyo.exporter.js.map +1 -1
  41. package/dist/exporters/rubrikk.exporter.js +2 -0
  42. package/dist/exporters/rubrikk.exporter.js.map +1 -1
  43. package/dist/exporters/trovit.exporter.js +2 -0
  44. package/dist/exporters/trovit.exporter.js.map +1 -1
  45. package/dist/formats/awin-csv.builder.d.ts +7 -0
  46. package/dist/formats/awin-csv.builder.js +18 -0
  47. package/dist/formats/awin-csv.builder.js.map +1 -0
  48. package/dist/formats/index.d.ts +1 -0
  49. package/dist/formats/index.js +1 -0
  50. package/dist/formats/index.js.map +1 -1
  51. package/dist/interfaces/export-item.interface.d.ts +25 -0
  52. package/dist/transformers/awin.transformer.d.ts +25 -0
  53. package/dist/transformers/awin.transformer.js +200 -0
  54. package/dist/transformers/awin.transformer.js.map +1 -0
  55. package/dist/transformers/fb.transformer.js +4 -0
  56. package/dist/transformers/fb.transformer.js.map +1 -1
  57. package/dist/transformers/index.d.ts +1 -0
  58. package/dist/transformers/index.js +1 -0
  59. package/dist/transformers/index.js.map +1 -1
  60. package/dist/tsconfig.build.tsbuildinfo +1 -1
  61. package/package.json +11 -11
  62. package/src/configs/awin.config.ts +15 -0
  63. package/src/configs/index.ts +2 -1
  64. package/src/enums/export-type.enum.ts +1 -0
  65. package/src/export.schema.ts +6 -0
  66. package/src/exporters/as24.exporter.ts +2 -0
  67. package/src/exporters/auto24.exporter.ts +2 -0
  68. package/src/exporters/autouncle.exporter.ts +2 -0
  69. package/src/exporters/awin.exporter.ts +47 -0
  70. package/src/exporters/facebook-shop.exporter.ts +2 -0
  71. package/src/exporters/fb.exporter.ts +2 -0
  72. package/src/exporters/google.exporter.ts +2 -0
  73. package/src/exporters/index.ts +1 -0
  74. package/src/exporters/meinstadt.exporter.ts +2 -0
  75. package/src/exporters/mobile.exporter.ts +2 -0
  76. package/src/exporters/modix.exporter.ts +4 -5
  77. package/src/exporters/ooyyo.exporter.ts +2 -1
  78. package/src/exporters/rubrikk.exporter.ts +2 -0
  79. package/src/exporters/trovit.exporter.ts +2 -0
  80. package/src/formats/awin-csv.builder.ts +17 -0
  81. package/src/formats/index.ts +1 -0
  82. package/src/interfaces/export-item.interface.ts +26 -0
  83. package/src/transformers/awin.transformer.ts +194 -0
  84. package/src/transformers/fb.transformer.ts +4 -0
  85. package/src/transformers/index.ts +1 -0
  86. /package/dist/configs/{kleinanzeigefocus.config.d.ts → kleinanzeigeFocus.config.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytebrand/export-cars",
3
- "version": "1.14.9",
3
+ "version": "1.15.0",
4
4
  "description": "",
5
5
  "author": "bytebrand",
6
6
  "license": "UNLICENSED",
@@ -15,15 +15,15 @@
15
15
  "start:dev": "nest start --watch"
16
16
  },
17
17
  "dependencies": {
18
- "@bytebrand/autode-request": "^1.14.0",
19
- "@bytebrand/car-basic-data-scope": "^9.11.0",
20
- "@bytebrand/car-description": "^1.11.0",
21
- "@bytebrand/car-schema": "^3.14.0",
22
- "@bytebrand/chunkable": "^5.15.0",
23
- "@bytebrand/cronicle-helper": "^1.17.0",
24
- "@bytebrand/i18n-dictionaries": "^1.4.2",
25
- "@bytebrand/import-helper": "^0.39.1",
26
- "@bytebrand/schema-tools": "^3.16.0",
18
+ "@bytebrand/autode-request": "^1.14.12",
19
+ "@bytebrand/car-basic-data-scope": "^9.11.6",
20
+ "@bytebrand/car-description": "^1.11.8",
21
+ "@bytebrand/car-schema": "^3.14.6",
22
+ "@bytebrand/chunkable": "^5.15.12",
23
+ "@bytebrand/cronicle-helper": "^1.17.12",
24
+ "@bytebrand/i18n-dictionaries": "^1.4.3",
25
+ "@bytebrand/import-helper": "^0.42.0",
26
+ "@bytebrand/schema-tools": "^3.16.8",
27
27
  "@bytebrand/zipper": "^2.1.2",
28
28
  "@nestjs/common": "^9.0.0",
29
29
  "@nestjs/core": "^9.0.0",
@@ -60,5 +60,5 @@
60
60
  "engines": {
61
61
  "node": ">=14.0.0"
62
62
  },
63
- "gitHead": "845a3c9625415166d0bdfa6cf6def27339b7308a"
63
+ "gitHead": "79a1a0ee02b40faac76b13d71c455804220e6056"
64
64
  }
@@ -0,0 +1,15 @@
1
+ import { Params } from '../interfaces/params.interface';
2
+ import { Config } from './config';
3
+ import { ExportType, FileType, ImageType } from '../enums';
4
+
5
+ export class AwinConfig extends Config {
6
+ constructor(params: Params) {
7
+ super(params);
8
+ this.pathesConfig.localConvertedDirectory = `resources/${ExportType.AWIN}-export`;
9
+ this.imageUrl = this.environmentConfig[params.environment].baseImageUrl;
10
+ this.imageType = ImageType.default;
11
+ this.outputFiles = [
12
+ `${this.pathesConfig.localConvertedDirectory}/api_export_cars_${ExportType.AWIN}.${FileType.CSV}`,
13
+ ];
14
+ }
15
+ }
@@ -8,7 +8,7 @@ export * from './dasparking.config';
8
8
  export * from './eauto.config';
9
9
  export * from './fb.config';
10
10
  export * from './google.config';
11
- export * from './kleinanzeigefocus.config';
11
+ export * from './kleinanzeigeFocus.config';
12
12
  export * from './marktde.config';
13
13
  export * from './meinstadt.config';
14
14
  export * from './ooyyo.config';
@@ -17,3 +17,4 @@ export * from './autoboerse.config';
17
17
  export * from './facebook-shop.config';
18
18
  export * from './trovit.config';
19
19
  export * from './mitula.config';
20
+ export * from './awin.config';
@@ -27,4 +27,5 @@ export enum ExportType {
27
27
  FACEBOOK_SHOP = 'facebookshop',
28
28
  TROVIT = 'trovit',
29
29
  MITULA = 'mitula',
30
+ AWIN = 'awin',
30
31
  }
@@ -20,6 +20,7 @@ import {
20
20
  CriteoConfig,
21
21
  TrovitConfig,
22
22
  MitulaConfig,
23
+ AwinConfig,
23
24
  } from './configs';
24
25
  import {
25
26
  As24Exporter,
@@ -35,6 +36,7 @@ import {
35
36
  RubrikkExporter,
36
37
  FacebookShopExporter,
37
38
  TrovitExporter,
39
+ AwinExporter,
38
40
  } from './exporters';
39
41
 
40
42
  export const exportSchema = {
@@ -114,4 +116,8 @@ export const exportSchema = {
114
116
  config: MitulaConfig,
115
117
  exporter: TrovitExporter,
116
118
  },
119
+ [ExportType.AWIN]: {
120
+ config: AwinConfig,
121
+ exporter: AwinExporter,
122
+ },
117
123
  };
@@ -40,7 +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
44
  const transformedData = await as24Transformer.transform(data.car);
45
+ console.timeEnd(`Transform ${data.car._id}`);
44
46
  const transformedDataCSV = `${convertToCSV(transformedData)}\n`;
45
47
 
46
48
  const filename = `${this.configService.config.pathesConfig.localConvertedDirectory}/${ownerId}.${FileType.CSV}`
@@ -35,7 +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
39
  await xmlBuilder.addItem(await auto24Transformer.transform(car, images), 'Deutschland');
40
+ console.timeEnd(`Transform ${data.car._id}`);
39
41
  this.carService.counter.countCar(images);
40
42
  }
41
43
  });
@@ -38,7 +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
42
  const car = await autouncleTransformer.transform({ owner, ...data });
43
+ console.timeEnd(`Transform ${data.car._id}`);
42
44
 
43
45
  await autouncleJsonBuilder.addItem(car, firstCar);
44
46
 
@@ -0,0 +1,47 @@
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 { AwinCSVBuilder } from '../formats';
10
+ import { AwinTransformer } from '../transformers';
11
+
12
+ @Injectable()
13
+ export class AwinExporter 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 [fileCSV] = this.configService.config.outputFiles;
24
+ await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
25
+ await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
26
+
27
+ const awinCSVBuilder = new AwinCSVBuilder(fileCSV);
28
+ await awinCSVBuilder.buildStart();
29
+
30
+ const awinTransformer = await this.moduleRef.create(AwinTransformer);
31
+
32
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
33
+ chunk.data = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
34
+
35
+ for (let i = 0; i < chunk.data.length; i += 1) {
36
+ const data = chunk.data[i];
37
+ const transformedCar = await awinTransformer.transform(data);
38
+ await awinCSVBuilder.addItem(transformedCar);
39
+ this.carService.counter.countCar(data.images);
40
+ }
41
+ });
42
+
43
+ console.log(this.carService.counter.getCountedCars());
44
+
45
+ await awinCSVBuilder.buildEnd();
46
+ }
47
+ }
@@ -35,7 +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
39
  const transformedCar = await facebookShopTransformer.transform(data);
40
+ console.timeEnd(`Transform ${data.car._id}`);
39
41
 
40
42
  await facebookShopXmkBuilder.addItem(transformedCar);
41
43
  this.carService.counter.countCar(data.images);
@@ -35,7 +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
39
  const car = await fbTransformer.transform({ owner, ...data });
40
+ console.timeEnd(`Transform ${data.car._id}`);
39
41
 
40
42
  await fbXmlBuilder.addItem(car as FbXmlItem);
41
43
  this.carService.counter.countCar(data.images);
@@ -33,7 +33,9 @@ export class GoogleExporter implements Exporter {
33
33
  chunk.data = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
34
34
 
35
35
  for (const data of chunk.data) {
36
+ console.time(`Transform ${data.car._id}`);
36
37
  const car = await googleTransformer.transform(data);
38
+ console.timeEnd(`Transform ${data.car._id}`);
37
39
  await googleXmlBuilder.addItem(car);
38
40
  this.carService.counter.countCar(data.images);
39
41
  }
@@ -11,3 +11,4 @@ export * from './ooyyo.exporter';
11
11
  export * from './rubrikk.exporter';
12
12
  export * from './facebook-shop.exporter';
13
13
  export * from './trovit.exporter';
14
+ export * from './awin.exporter';
@@ -36,7 +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
40
  const car = await meinstadtTransformer.transform(data);
41
+ console.timeEnd(`Transform ${data.car._id}`);
40
42
  await meinstadtJsonBuilder.addItem(car as MeinstadtJsonItem, firstCar);
41
43
  this.carService.counter.countCar(data.images);
42
44
 
@@ -38,7 +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
42
  const transformedData = await mobileTransformer.transform(car, images);
43
+ console.timeEnd(`Transform ${data.car._id}`);
42
44
 
43
45
  await writeFile(fileName, Buffer.from(`${convertToCSV(transformedData)}\n`), { flag: 'a' });
44
46
 
@@ -18,7 +18,7 @@ export class ModixExporter implements Exporter {
18
18
  private rulesService: RulesService,
19
19
  private loaderService: LoaderService,
20
20
  private moduleRef: ModuleRef,
21
- ) {}
21
+ ) { }
22
22
  async export(): Promise<void> {
23
23
  const [fileXml] = this.configService.config.outputFiles;
24
24
 
@@ -40,10 +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
- const transformedCar = await modixTransformer.transform(
44
- data,
45
- mappingBuilder.getMappingRules({ reversTransforming: true }),
46
- );
43
+ console.time(`Transform ${data.car._id}`);
44
+ const transformedCar = await modixTransformer.transform(data, mappingBuilder.getMappingRules({ reversTransforming: true }));
45
+ console.timeEnd(`Transform ${data.car._id}`);
47
46
  await modixXmlBuilder.addItem(transformedCar);
48
47
 
49
48
  this.carService.counter.countCar(data.images);
@@ -33,8 +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
37
  await ooyyoXmlBuilder.addItem(await ooyyoTransformer.transform(car, images));
37
-
38
+ console.timeEnd(`Transform ${car._id}`);
38
39
  this.carService.counter.countCar(images);
39
40
  }
40
41
  });
@@ -36,7 +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
40
  const transformedCar = await rubrikkTransformer.transform(data);
41
+ console.timeEnd(`Transform ${data.car._id}`);
40
42
 
41
43
  await rubrikkXmlBuilder.addItem(transformedCar);
42
44
  this.carService.counter.countCar(data.images);
@@ -35,7 +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
39
  const transformedCar = await trovitTransformer.transform(data);
40
+ console.timeEnd(`Transform ${data.car._id}`);
39
41
 
40
42
  await trovitXmlBuilder.addItem(transformedCar);
41
43
  this.carService.counter.countCar(data.images);
@@ -0,0 +1,17 @@
1
+ import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
2
+ import { Awin } from '../interfaces';
3
+
4
+ export class AwinCSVBuilder extends XMLBuilderBase {
5
+ async buildStart(): Promise<void> {
6
+ await this.write('product_id,product_name,brand_name,product_model,deep_link,image_url,alternate_image,alternate_image_two,alternate_image_three,alternate_image_four,price,currency,rrp_price,saving,savings_percent,colour,condition,delivery_time,last_updated,merchant_category,warranty,energy_label,description \n');
7
+ }
8
+
9
+ async addItem(car: Awin): Promise<void> {
10
+ let values = Object.values(car);
11
+ await this.write('"' + values.join('","') + '"' + '\n');
12
+ }
13
+
14
+ async buildEnd(): Promise<void> {
15
+ await this.end();
16
+ }
17
+ }
@@ -2,3 +2,4 @@ export * from './rubrikk-xml.builder';
2
2
  export * from './modix-xml.builder';
3
3
  export * from './facebook-shop.builder';
4
4
  export * from './trovit-xml.builder';
5
+ export * from './awin-csv.builder';
@@ -338,3 +338,29 @@ export interface TrovitXmlItem {
338
338
  pictures: Array<string>;
339
339
  is_new: IAtributeWrapItem;
340
340
  }
341
+
342
+ export interface Awin {
343
+ product_id: string;
344
+ product_name: string;
345
+ brand_name: string;
346
+ product_model: string;
347
+ deep_link: string;
348
+ image_url: string;
349
+ alternate_image: string;
350
+ alternate_image_two: string;
351
+ alternate_image_three: string;
352
+ alternate_image_four: string;
353
+ price: number | string;
354
+ currency: string;
355
+ rrp_price: number | string;
356
+ saving: number| string;
357
+ savings_percent: number| string;
358
+ colour: string;
359
+ condition: string;
360
+ delivery_time: string;
361
+ last_updated: string;
362
+ merchant_category: string;
363
+ warranty: string;
364
+ energy_label: string;
365
+ description: string;
366
+ }
@@ -0,0 +1,194 @@
1
+ import { toString, get, isNull } from 'lodash';
2
+ import * as moment from 'moment';
3
+
4
+ import { Injectable } from '@nestjs/common';
5
+
6
+ import { CarDescriptionFactory, DescriptionTypeEnum } from '@bytebrand/car-description';
7
+ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
8
+ import { DataSchemes } from '@bytebrand/car-schema';
9
+
10
+ import { ConfigService, ImagesService, UserService } from '../services';
11
+ import { Awin } from '../interfaces';
12
+
13
+ @Injectable()
14
+ export class AwinTransformer {
15
+ constructor(
16
+ private configService: ConfigService,
17
+ private imageService: ImagesService,
18
+ private userService: UserService
19
+ ) { }
20
+
21
+ async transform({ car, images, }: { car: DataSchemes.Car; images: ImboImageResponseInterface[]; }): Promise<Awin> {
22
+ const carId = toString(get(car, '_id', ''));
23
+ const imageLinks = await this.imageService.getImages(car, images, this.configService.config.imageType, false);
24
+
25
+ return {
26
+ product_id: get(car, 'metaData.vehicleId'),
27
+ product_name: this.getProductName(car),
28
+ brand_name: get(car, 'mainData.make', ''),
29
+ product_model: get(car, 'mainData.model', ''),
30
+ deep_link: `https://www.${this.configService.config.domain}/search/vehicle/${carId}`,
31
+ image_url: imageLinks[0] || '',
32
+ alternate_image: imageLinks[1] || '',
33
+ alternate_image_two: imageLinks[2] || '',
34
+ alternate_image_three: imageLinks[3] || '',
35
+ alternate_image_four: imageLinks[4] || '',
36
+ price: this.numberToDecimalNumber(get(car, 'price.currentSalesPrice')),
37
+ currency: get(car, 'price.currency', ''),
38
+ rrp_price: this.numberToDecimalNumber(get(car, 'price.recomendedRetailPrice')),
39
+ saving: this.numberToDecimalNumber(get(car, 'price.historyPriceDifference')),
40
+ savings_percent: this.numberToDecimalNumber(get(car, 'price.historyPriceDifferencePerCent')),
41
+ colour: this.getColor(car),
42
+ condition: this.getCondition(car),
43
+ delivery_time: this.getDeliveryTime(car),
44
+ last_updated: this.timestampToDate(get(car, 'metaData.modificationDate') as number),
45
+ merchant_category: 'New & Used Cars',
46
+ warranty: this.getWarranty(car),
47
+ energy_label: this.getEnergyEfficiencyClass(car),
48
+ description: await this.getDescription(car),
49
+ }
50
+ }
51
+
52
+ private getProductName(car: DataSchemes.Car): string {
53
+ const make = get(car, 'mainData.make', '');
54
+ const model = get(car, 'mainData.model', '');
55
+ const subModel = get(car, 'mainData.subModel', '');
56
+ return `${make + ' ' + model + ' ' + subModel}`;
57
+ }
58
+
59
+ private numberToDecimalNumber(number: number): number | string {
60
+ if (isNull(number)) return '';
61
+ return number.toFixed(2);
62
+ }
63
+
64
+ private getColor(car: DataSchemes.Car): string {
65
+ const manufacturerColorName = get(car, 'exterior.manufacturerColorName');
66
+ if (manufacturerColorName) {
67
+ return manufacturerColorName;
68
+ }
69
+ const available = {
70
+ selector_exteriorColor_black: 'Black',
71
+ selector_exteriorColor_grey: 'Grey',
72
+ selector_exteriorColor_silver: 'Silver',
73
+ selector_exteriorColor_white: 'White',
74
+ selector_exteriorColor_blue: 'Blue',
75
+ selector_exteriorColor_orange: 'Orange',
76
+ selector_exteriorColor_red: 'Red',
77
+ selector_exteriorColor_brown: 'Brown',
78
+ selector_exteriorColor_beige: 'Beige',
79
+ selector_exteriorColor_yellow: 'Yellow',
80
+ selector_exteriorColor_purple: 'Purple',
81
+ selector_exteriorColor_green: 'Green',
82
+ selector_exteriorColor_bronze: 'Bronze',
83
+ selector_exteriorColor_gold: 'Gold',
84
+ selector_exteriorColor_rainbow: '',
85
+ selector_unknown: '',
86
+ };
87
+ const color = get(car, 'exterior.exteriorColor', 'selector_unknown');
88
+ return get(available, color);
89
+ }
90
+
91
+ private getCondition(car: DataSchemes.Car): string {
92
+ const available = {
93
+ selector_condition_new: 'New',
94
+ selector_condition_used: 'Used',
95
+ selector_unknown: 'Used',
96
+ };
97
+ const condition = get(car, 'mainData.condition', 'selector_unknown');
98
+ return get(available, condition);
99
+ }
100
+
101
+ private timestampToDate(date: number): string {
102
+ return moment.unix(date).format("YYYY-MM-DD");
103
+ }
104
+
105
+ private getDeliveryTime(car: DataSchemes.Car): string {
106
+ const deliveryPeriod = get(car, 'offer.deliveryPeriod');
107
+ if (deliveryPeriod !== 'selector_unknown') {
108
+ return this.getDeliveryPeriod(car);
109
+ } else {
110
+ return this.getAvailability(car);
111
+ };
112
+ }
113
+
114
+ private getDeliveryPeriod(car: DataSchemes.Car): string {
115
+ const available = {
116
+ selector_deliveryPeriod_days1: '1 day',
117
+ selector_deliveryPeriod_days2: '2 days',
118
+ selector_deliveryPeriod_days3: '3 days',
119
+ selector_deliveryPeriod_days4: '4 days',
120
+ selector_deliveryPeriod_days5: '5 days',
121
+ selector_deliveryPeriod_days6: '6 days',
122
+ selector_deliveryPeriod_days7: '7 days',
123
+ selector_deliveryPeriod_days14: '14 days',
124
+ selector_deliveryPeriod_days30: '30 days',
125
+ selector_deliveryPeriod_days42: '42 days',
126
+ selector_deliveryPeriod_days60: '60 days',
127
+ selector_deliveryPeriod_days90: '90 days',
128
+ selector_deliveryPeriod_days120: '120 days',
129
+ selector_deliveryPeriod_days150: '150 days',
130
+ selector_deliveryPeriod_days180: '180 days',
131
+ selector_deliveryPeriod_days210: '210 days',
132
+ selector_deliveryPeriod_days270: '270 days',
133
+ selector_deliveryPeriod_days360: '360 days'
134
+ }
135
+ const deliveryPeriod = get(car, 'offer.deliveryPeriod', 'selector_unknown');
136
+ return get(available, deliveryPeriod);
137
+ }
138
+
139
+ private getAvailability(car: DataSchemes.Car): string {
140
+ const available = {
141
+ selector_availabilityMode_fromDate: 'Available from a certain date',
142
+ selector_availabilityMode_always: 'Available immediately',
143
+ };
144
+ const availabilityMode = get(car, 'offer.availabilityMode', 'selector_availabilityMode_fromDate');
145
+ const availabilityFrom = get(car, 'offer.availabilityFrom', null);
146
+
147
+ if (!isNull(availabilityFrom) && availabilityMode == 'selector_availabilityMode_fromDate') {
148
+ const availabilityFromDate = this.timestampToDate(availabilityFrom);
149
+ const daysDifference = Math.floor((availabilityFrom - Math.floor(new Date().getTime() / 1000)) / (3600 * 24));
150
+ if (daysDifference > 0) {
151
+ return `${daysDifference} days`
152
+ } else {
153
+ return ''
154
+ }
155
+ } else {
156
+ return get(available, availabilityMode);
157
+ }
158
+ }
159
+
160
+ private getEnergyEfficiencyClass(car: DataSchemes.Car): string {
161
+ const available = {
162
+ selector_energyEfficiencyClass_appp: 'A+++',
163
+ selector_energyEfficiencyClass_app: 'A++',
164
+ selector_energyEfficiencyClass_ap: 'A+',
165
+ selector_energyEfficiencyClass_a: 'A',
166
+ selector_energyEfficiencyClass_b: 'B',
167
+ selector_energyEfficiencyClass_c: 'C',
168
+ selector_energyEfficiencyClass_d: 'D',
169
+ selector_energyEfficiencyClass_e: 'E',
170
+ selector_energyEfficiencyClass_f: 'F',
171
+ selector_energyEfficiencyClass_g: 'G',
172
+ selector_unknown: '',
173
+ };
174
+ const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
175
+ return get(available, energyClass);
176
+ }
177
+
178
+ private getWarranty(car: DataSchemes.Car): string {
179
+ const available = {
180
+ true: 'There is a warranty',
181
+ false: 'No warranty',
182
+ null: ''
183
+ }
184
+ const warranty = get(car, 'offer.warranty', null);
185
+ return get(available, warranty);
186
+ }
187
+
188
+ private async getDescription(car: DataSchemes.Car): Promise<string> {
189
+ const dealerId = get(car, 'metaData.ownerId');
190
+ const descriptionSchema = await this.userService.getDefaultSummaryByDealerId(dealerId);
191
+ const descriptionBuilder = CarDescriptionFactory.create(DescriptionTypeEnum.Mobile, car);
192
+ return descriptionBuilder.transform(descriptionSchema);
193
+ }
194
+ }
@@ -70,8 +70,12 @@ export class FbTransformer {
70
70
  const autodeId = toString(get(car, '_id', ''));
71
71
  const year = this.getYear(car);
72
72
  const dealerInfo = this.getDealerItems(car);
73
+ console.time(`Address ${car._id}`);
73
74
  const address = await this.getAddress(car, owner);
75
+ console.timeEnd(`Address ${car._id}`);
76
+ console.time(`Images ${car._id}`);
74
77
  const image_links = await this.imagesService.getImages(car, images, ImageType.marketing, false);
78
+ console.timeEnd(`Images ${car._id}`);
75
79
  const transformedImages = image_links.map(el => {
76
80
  return { url: el };
77
81
  });
@@ -2,3 +2,4 @@ export * from './rubrikk.transformer';
2
2
  export * from './modix.transformer';
3
3
  export * from './facebook-shop.transformer';
4
4
  export * from './trovit.transformer';
5
+ export * from './awin.transformer';