@bytebrand/export-cars 1.26.18 → 1.26.19-hotfix.2

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 (85) hide show
  1. package/README.md +58 -0
  2. package/dist/configs/config.d.ts +4 -1
  3. package/dist/configs/config.js +3 -0
  4. package/dist/configs/config.js.map +1 -1
  5. package/dist/configs/facebook-shop.config.js +1 -1
  6. package/dist/configs/facebook-shop.config.js.map +1 -1
  7. package/dist/configs/fb.config.js +1 -1
  8. package/dist/configs/fb.config.js.map +1 -1
  9. package/dist/configs/google.config.js +26 -1
  10. package/dist/configs/google.config.js.map +1 -1
  11. package/dist/constants/feed-price.constants.d.ts +1 -0
  12. package/dist/constants/feed-price.constants.js +4 -1
  13. package/dist/constants/feed-price.constants.js.map +1 -1
  14. package/dist/export.command.js +1 -0
  15. package/dist/export.command.js.map +1 -1
  16. package/dist/exporters/facebook-shop.exporter.js +1 -3
  17. package/dist/exporters/facebook-shop.exporter.js.map +1 -1
  18. package/dist/exporters/google.exporter.js +20 -2
  19. package/dist/exporters/google.exporter.js.map +1 -1
  20. package/dist/formats/facebook-shop.builder.d.ts +1 -1
  21. package/dist/formats/facebook-shop.builder.js +6 -9
  22. package/dist/formats/facebook-shop.builder.js.map +1 -1
  23. package/dist/interfaces/export-item.interface.d.ts +2 -2
  24. package/dist/interfaces/params.interface.d.ts +19 -0
  25. package/dist/services/feed-items-bigquery.writer.d.ts +17 -0
  26. package/dist/services/feed-items-bigquery.writer.js +96 -0
  27. package/dist/services/feed-items-bigquery.writer.js.map +1 -0
  28. package/dist/services/publication-gate.d.ts +15 -0
  29. package/dist/services/publication-gate.js +107 -0
  30. package/dist/services/publication-gate.js.map +1 -0
  31. package/dist/transformers/auto24.transfomer.js +1 -1
  32. package/dist/transformers/auto24.transfomer.js.map +1 -1
  33. package/dist/transformers/autouncle.transformer.js +1 -1
  34. package/dist/transformers/autouncle.transformer.js.map +1 -1
  35. package/dist/transformers/awin.transformer.js +1 -1
  36. package/dist/transformers/awin.transformer.js.map +1 -1
  37. package/dist/transformers/criteo.transformer.js +1 -1
  38. package/dist/transformers/criteo.transformer.js.map +1 -1
  39. package/dist/transformers/fb.transformer.js +2 -2
  40. package/dist/transformers/fb.transformer.js.map +1 -1
  41. package/dist/transformers/google-feed-envkv.d.ts +10 -0
  42. package/dist/transformers/google-feed-envkv.js +126 -0
  43. package/dist/transformers/google-feed-envkv.js.map +1 -0
  44. package/dist/transformers/google-feed-item-row.d.ts +30 -0
  45. package/dist/transformers/google-feed-item-row.js +39 -0
  46. package/dist/transformers/google-feed-item-row.js.map +1 -0
  47. package/dist/transformers/google.transformer.d.ts +0 -4
  48. package/dist/transformers/google.transformer.js +10 -48
  49. package/dist/transformers/google.transformer.js.map +1 -1
  50. package/dist/transformers/mobile.transformer.js +3 -2
  51. package/dist/transformers/mobile.transformer.js.map +1 -1
  52. package/dist/transformers/rubrikk.transformer.js +1 -1
  53. package/dist/transformers/rubrikk.transformer.js.map +1 -1
  54. package/dist/transformers/santander.transformer.js +3 -2
  55. package/dist/transformers/santander.transformer.js.map +1 -1
  56. package/dist/tsconfig.build.tsbuildinfo +1 -1
  57. package/package.json +4 -2
  58. package/schema/feed-items.json +134 -0
  59. package/src/configs/config.ts +7 -1
  60. package/src/configs/facebook-shop.config.ts +2 -2
  61. package/src/configs/fb.config.ts +2 -2
  62. package/src/configs/google.config.ts +28 -3
  63. package/src/constants/feed-price.constants.ts +7 -0
  64. package/src/export.command.ts +1 -0
  65. package/src/exporters/facebook-shop.exporter.ts +1 -3
  66. package/src/exporters/google.exporter.ts +23 -2
  67. package/src/formats/facebook-shop.builder.ts +8 -9
  68. package/src/interfaces/export-item.interface.ts +2 -2
  69. package/src/interfaces/params.interface.ts +29 -0
  70. package/src/services/feed-items-bigquery.writer.ts +101 -0
  71. package/src/services/publication-gate.ts +120 -0
  72. package/src/transformers/auto24.transfomer.ts +2 -1
  73. package/src/transformers/autouncle.transformer.ts +2 -1
  74. package/src/transformers/awin.transformer.ts +2 -1
  75. package/src/transformers/criteo.transformer.ts +2 -1
  76. package/src/transformers/fb.transformer.ts +5 -2
  77. package/src/transformers/google-feed-envkv.ts +168 -0
  78. package/src/transformers/google-feed-item-row.ts +78 -0
  79. package/src/transformers/google.transformer.ts +24 -50
  80. package/src/transformers/mobile.transformer.ts +6 -2
  81. package/src/transformers/rubrikk.transformer.ts +2 -1
  82. package/src/transformers/santander.transformer.ts +6 -2
  83. package/test/google-feed-envkv.test.ts +132 -0
  84. package/test/google-feed-item-row.test.ts +135 -0
  85. package/test/publication-gate.test.ts +86 -0
package/README.md CHANGED
@@ -15,6 +15,64 @@
15
15
  <!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer)
16
16
  [![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)-->
17
17
 
18
+ ## Google feed items in BigQuery (opt-in)
19
+
20
+ The Google export can record every item it writes to the XML in a BigQuery table, one row per item
21
+ per run, so a Merchant Center issue can be traced back to what was sent (EnVKV values, the field the
22
+ electric range came from, price, ...). Schema: `schema/feed-items.json`.
23
+
24
+ Job params (all three must be set, otherwise no BigQuery call is made):
25
+
26
+ | Param | Example |
27
+ |----------------------|------------------|
28
+ | `feedItemsBqProject` | `my-gcp-project` |
29
+ | `feedItemsBqDataset` | `feeds` |
30
+ | `feedItemsBqTable` | `feed_items` |
31
+
32
+ Credentials come from `credentials/google-cloud-project-id.json` in the plugin's working directory
33
+ (as in the import plugins). Rows are streamed in batches of 500 in the background; a BigQuery error
34
+ is logged and never fails the export (after 3 failed batches the run stops trying). `exportedAt` is
35
+ the start of the run, `partitionDay` its UTC day.
36
+
37
+ Create the table once, partitioned by day on `partitionDay`:
38
+
39
+ ```bash
40
+ bq mk --table \
41
+ --time_partitioning_field=partitionDay \
42
+ --time_partitioning_type=DAY \
43
+ --description="Items sent in the Google feed, one row per item per export run" \
44
+ my-gcp-project:feeds.feed_items \
45
+ schema/feed-items.json
46
+ ```
47
+
48
+ Tables created before 1.26.28 need the two gate columns: `bq update <table> schema/feed-items.json`.
49
+
50
+ ## Publication gate for estimated EnVKV values (EnVKV C8)
51
+
52
+ car-basic-data fills missing or implausible consumption / CO2 values from the CO2 estimator, the
53
+ make-model template sheet or global defaults, and logs each such change to its enrichment log in
54
+ BigQuery. The car itself does not say which of its values are estimates, so the Google export reads
55
+ the log: a field counts as estimated when its latest log row has `finalValueSource` `co2-estimate`,
56
+ `mmm` or `globalDefault` and that row's final value is still the value stored on the car.
57
+
58
+ | Param | Example |
59
+ |----------------------------|----------------------------|
60
+ | `publicationGate` | `off` (default) / `audit` / `enforce` |
61
+ | `publicationGateBqProject` | `auto-de-not-production` |
62
+ | `publicationGateBqDataset` | `develop_auto_de` |
63
+ | `publicationGateBqTable` | `develop_cbd_enrichment_log` |
64
+
65
+ - `audit`: the feed is unchanged; the estimated attributes of each item go to the feed items table
66
+ (`estimatedAttributes`, with `publicationGate`). If the log cannot be read the gate is off for the run.
67
+ - `enforce`: estimated `fuel_consumption`, `fuel_consumption_discharged_battery`,
68
+ `energy_consumption`, `co2_emissions` (and `electric_range`, which CBD never estimates) are left out
69
+ of the item. If the log cannot be read the export fails before the output is touched, so the last
70
+ published feed stays.
71
+
72
+ Only the field an attribute was actually taken from counts (e.g. `wltpCombined` for an ICE car, the
73
+ legacy `consumptionCombined` only when it was the fallback). Values set before the enrichment log
74
+ existed are not covered.
75
+
18
76
  ## Description
19
77
 
20
78
  [Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
@@ -1,5 +1,5 @@
1
1
  import { ExportType, ImageType } from '../enums';
2
- import { Params } from '../interfaces/params.interface';
2
+ import { FeedItemsBigQueryTarget, Params, PublicationGateConfig } from '../interfaces/params.interface';
3
3
  export declare class Config {
4
4
  apikey: string;
5
5
  campaign: string;
@@ -35,6 +35,9 @@ export declare class Config {
35
35
  dealersSpreadsheetId: string;
36
36
  dealersSpreadsheetTitle: string;
37
37
  metaPushPriorityCsvUrl: string;
38
+ runId?: string;
39
+ feedItemsBigQuery?: FeedItemsBigQueryTarget;
40
+ publicationGate?: PublicationGateConfig;
38
41
  protected environmentConfig: {
39
42
  develop: {
40
43
  domain: string;
@@ -29,6 +29,9 @@ class Config {
29
29
  dealersSpreadsheetId;
30
30
  dealersSpreadsheetTitle;
31
31
  metaPushPriorityCsvUrl;
32
+ runId;
33
+ feedItemsBigQuery;
34
+ publicationGate;
32
35
  environmentConfig = {
33
36
  [enums_1.Environment.DEVELOP]: {
34
37
  domain: 'autode-dev.de',
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/configs/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/configs/config.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ class FacebookShopConfig extends config_1.Config {
8
8
  constructor(params) {
9
9
  super(params);
10
10
  this.pathesConfig.localConvertedDirectory = `resources/${enums_1.ExportType.FACEBOOK_SHOP}-export`;
11
- this.maxCurrentSalesPrice = feed_price_constants_1.MAX_FEED_SALES_PRICE_EUR;
11
+ this.maxCurrentSalesPrice = (0, feed_price_constants_1.resolveMaxFeedSalesPrice)(params.maxCurrentSalesPrice);
12
12
  this.imageUrl = this.environmentConfig[params.environment].baseImageUrl;
13
13
  this.outputFiles = [
14
14
  `${this.pathesConfig.localConvertedDirectory}/api_export_cars_${enums_1.ExportType.FACEBOOK_SHOP}.${enums_1.FileType.XML}`,
@@ -1 +1 @@
1
- {"version":3,"file":"facebook-shop.config.js","sourceRoot":"","sources":["../../src/configs/facebook-shop.config.ts"],"names":[],"mappings":";;;AACA,qCAAkC;AAClC,oCAAgD;AAChD,4EAA6E;AAE7E,MAAa,kBAAmB,SAAQ,eAAM;IAC5C,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,aAAa,kBAAU,CAAC,aAAa,SAAS,CAAC;QAC3F,IAAI,CAAC,oBAAoB,GAAG,+CAAwB,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC;QACxE,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,oBAAoB,kBAAU,CAAC,aAAa,IAAI,gBAAQ,CAAC,GAAG,EAAE;SAC3G,CAAC;IACJ,CAAC;CACF;AAVD,gDAUC"}
1
+ {"version":3,"file":"facebook-shop.config.js","sourceRoot":"","sources":["../../src/configs/facebook-shop.config.ts"],"names":[],"mappings":";;;AACA,qCAAkC;AAClC,oCAAgD;AAChD,4EAA6E;AAE7E,MAAa,kBAAmB,SAAQ,eAAM;IAC5C,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,aAAa,kBAAU,CAAC,aAAa,SAAS,CAAC;QAC3F,IAAI,CAAC,oBAAoB,GAAG,IAAA,+CAAwB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC;QACxE,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,oBAAoB,kBAAU,CAAC,aAAa,IAAI,gBAAQ,CAAC,GAAG,EAAE;SAC3G,CAAC;IACJ,CAAC;CACF;AAVD,gDAUC"}
@@ -8,7 +8,7 @@ class FbConfig extends config_1.Config {
8
8
  constructor(params) {
9
9
  super(params);
10
10
  this.pathesConfig.localConvertedDirectory = `resources/${enums_1.ExportType.FB}-export`;
11
- this.maxCurrentSalesPrice = feed_price_constants_1.MAX_FEED_SALES_PRICE_EUR;
11
+ this.maxCurrentSalesPrice = (0, feed_price_constants_1.resolveMaxFeedSalesPrice)(params.maxCurrentSalesPrice);
12
12
  this.imageUrl = this.environmentConfig[params.environment].imageUrl;
13
13
  this.imageType = enums_1.ImageType.marketing;
14
14
  this.marketingImageConfigId = this.environmentConfig[params.environment].fbMarketingImageId;
@@ -1 +1 @@
1
- {"version":3,"file":"fb.config.js","sourceRoot":"","sources":["../../src/configs/fb.config.ts"],"names":[],"mappings":";;;AAAA,oCAA4D;AAC5D,4EAA6E;AAE7E,qCAAkC;AAElC,MAAa,QAAS,SAAQ,eAAM;IAClC,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,aAAa,kBAAU,CAAC,EAAE,SAAS,CAAC;QAChF,IAAI,CAAC,oBAAoB,GAAG,+CAAwB,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,iBAAS,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC;QAC5F,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,oBAAoB,kBAAU,CAAC,EAAE,IAAI,gBAAQ,CAAC,GAAG,EAAE;SAChG,CAAC;IACJ,CAAC;CACF;AAZD,4BAYC"}
1
+ {"version":3,"file":"fb.config.js","sourceRoot":"","sources":["../../src/configs/fb.config.ts"],"names":[],"mappings":";;;AAAA,oCAA4D;AAC5D,4EAA6E;AAE7E,qCAAkC;AAElC,MAAa,QAAS,SAAQ,eAAM;IAClC,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,aAAa,kBAAU,CAAC,EAAE,SAAS,CAAC;QAChF,IAAI,CAAC,oBAAoB,GAAG,IAAA,+CAAwB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,iBAAS,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC;QAC5F,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,oBAAoB,kBAAU,CAAC,EAAE,IAAI,gBAAQ,CAAC,GAAG,EAAE;SAChG,CAAC;IACJ,CAAC;CACF;AAZD,4BAYC"}
@@ -4,12 +4,37 @@ exports.GoogleConfig = void 0;
4
4
  const enums_1 = require("../enums");
5
5
  const feed_price_constants_1 = require("../constants/feed-price.constants");
6
6
  const config_1 = require("./config");
7
+ const trimmed = (value) => (typeof value === 'string' ? value.trim() : '');
7
8
  class GoogleConfig extends config_1.Config {
8
9
  constructor(params) {
9
10
  super(params);
10
11
  this.pathesConfig.localConvertedDirectory = `resources/${enums_1.ExportType.GOOGLE}-export`;
11
12
  this.imageType = enums_1.ImageType.default;
12
- this.maxCurrentSalesPrice = feed_price_constants_1.MAX_FEED_SALES_PRICE_EUR;
13
+ this.maxCurrentSalesPrice = (0, feed_price_constants_1.resolveMaxFeedSalesPrice)(params.maxCurrentSalesPrice);
14
+ const feedItemsBigQuery = {
15
+ project: trimmed(params.feedItemsBqProject),
16
+ dataset: trimmed(params.feedItemsBqDataset),
17
+ table: trimmed(params.feedItemsBqTable),
18
+ };
19
+ if (feedItemsBigQuery.project && feedItemsBigQuery.dataset && feedItemsBigQuery.table) {
20
+ this.feedItemsBigQuery = feedItemsBigQuery;
21
+ }
22
+ const gateMode = trimmed(params.publicationGate).toLowerCase();
23
+ if (gateMode === 'audit' || gateMode === 'enforce') {
24
+ const gate = {
25
+ mode: gateMode,
26
+ project: trimmed(params.publicationGateBqProject),
27
+ dataset: trimmed(params.publicationGateBqDataset),
28
+ table: trimmed(params.publicationGateBqTable),
29
+ };
30
+ if (!gate.project || !gate.dataset || !gate.table) {
31
+ throw new Error(`publicationGate=${gateMode} needs publicationGateBqProject, publicationGateBqDataset and publicationGateBqTable`);
32
+ }
33
+ this.publicationGate = gate;
34
+ }
35
+ else if (gateMode && gateMode !== 'off') {
36
+ throw new Error(`publicationGate must be off, audit or enforce, got "${gateMode}"`);
37
+ }
13
38
  this.outputFiles = [
14
39
  `${this.pathesConfig.localConvertedDirectory}/api_export_cars_${enums_1.ExportType.GOOGLE}.${enums_1.FileType.XML}`,
15
40
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"google.config.js","sourceRoot":"","sources":["../../src/configs/google.config.ts"],"names":[],"mappings":";;;AAAA,oCAA4D;AAC5D,4EAA6E;AAE7E,qCAAkC;AAElC,MAAa,YAAa,SAAQ,eAAM;IACtC,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,aAAa,kBAAU,CAAC,MAAM,SAAS,CAAC;QACpF,IAAI,CAAC,SAAS,GAAG,iBAAS,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,oBAAoB,GAAG,+CAAwB,CAAC;QACrD,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,oBAAoB,kBAAU,CAAC,MAAM,IAAI,gBAAQ,CAAC,GAAG,EAAE;SACpG,CAAC;IACJ,CAAC;CACF;AAVD,oCAUC"}
1
+ {"version":3,"file":"google.config.js","sourceRoot":"","sources":["../../src/configs/google.config.ts"],"names":[],"mappings":";;;AAAA,oCAA4D;AAC5D,4EAA6E;AAE7E,qCAAkC;AAElC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE5F,MAAa,YAAa,SAAQ,eAAM;IACtC,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,aAAa,kBAAU,CAAC,MAAM,SAAS,CAAC;QACpF,IAAI,CAAC,SAAS,GAAG,iBAAS,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,oBAAoB,GAAG,IAAA,+CAAwB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClF,MAAM,iBAAiB,GAAG;YACxB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC3C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC3C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;SACxC,CAAC;QACF,IAAI,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE;YACrF,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;SAC5C;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/D,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,EAAE;YAClD,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,QAAyC;gBAC/C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC;gBACjD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC;gBACjD,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC;aAC9C,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,sFAAsF,CAAC,CAAC;aACpI;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;SAC7B;aAAM,IAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,uDAAuD,QAAQ,GAAG,CAAC,CAAC;SACrF;QACD,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,oBAAoB,kBAAU,CAAC,MAAM,IAAI,gBAAQ,CAAC,GAAG,EAAE;SACpG,CAAC;IACJ,CAAC;CACF;AAjCD,oCAiCC"}
@@ -1 +1,2 @@
1
1
  export declare const MAX_FEED_SALES_PRICE_EUR = 80000;
2
+ export declare const resolveMaxFeedSalesPrice: (raw?: string) => number;
@@ -1,5 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAX_FEED_SALES_PRICE_EUR = void 0;
3
+ exports.resolveMaxFeedSalesPrice = exports.MAX_FEED_SALES_PRICE_EUR = void 0;
4
+ const lodash_1 = require("lodash");
4
5
  exports.MAX_FEED_SALES_PRICE_EUR = 80000;
6
+ const resolveMaxFeedSalesPrice = (raw) => (0, lodash_1.toNumber)(raw) > 0 ? (0, lodash_1.toNumber)(raw) : exports.MAX_FEED_SALES_PRICE_EUR;
7
+ exports.resolveMaxFeedSalesPrice = resolveMaxFeedSalesPrice;
5
8
  //# sourceMappingURL=feed-price.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feed-price.constants.js","sourceRoot":"","sources":["../../src/constants/feed-price.constants.ts"],"names":[],"mappings":";;;AAGa,QAAA,wBAAwB,GAAG,KAAM,CAAC"}
1
+ {"version":3,"file":"feed-price.constants.js","sourceRoot":"","sources":["../../src/constants/feed-price.constants.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAKrB,QAAA,wBAAwB,GAAG,KAAM,CAAC;AAIxC,MAAM,wBAAwB,GAAG,CAAC,GAAY,EAAU,EAAE,CAC/D,IAAA,iBAAQ,EAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAQ,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAwB,CAAC;AADlD,QAAA,wBAAwB,4BAC0B"}
@@ -31,6 +31,7 @@ let ExportRunner = class ExportRunner extends nest_commander_1.CommandRunner {
31
31
  const input = JSON.parse(data);
32
32
  cronicle_helper_1.LoggerService.log(`Running job: ${input.id} - ${JSON.stringify(input)} \n`);
33
33
  this.configService.config = new export_schema_1.exportSchema[input.params.exportType].config(input.params);
34
+ this.configService.config.runId = input.id;
34
35
  const exporter = await this.moduleRef.create(export_schema_1.exportSchema[input.params.exportType].exporter);
35
36
  await exporter.export().catch(reject);
36
37
  resolve(rl.close());
@@ -1 +1 @@
1
- {"version":3,"file":"export.command.js","sourceRoot":"","sources":["../src/export.command.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAA2C;AAC3C,mDAAwD;AACxD,yCAA2C;AAE3C,mDAA+C;AAC/C,uCAAyC;AAEzC,gEAA2D;AAMpD,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,8BAAa;IAEnC;IACA;IAFV,YACU,aAA4B,EAC5B,SAAoB;QAE5B,KAAK,EAAE,CAAC;QAHA,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;IAG9B,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC;gBACxC,+BAAa,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE5E,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,4BAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAW,4BAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACvG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAvBY,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;KAC7B,CAAC;qCAGyB,wBAAa;QACjB,gBAAS;GAHnB,YAAY,CAuBxB"}
1
+ {"version":3,"file":"export.command.js","sourceRoot":"","sources":["../src/export.command.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAA2C;AAC3C,mDAAwD;AACxD,yCAA2C;AAE3C,mDAA+C;AAC/C,uCAAyC;AAEzC,gEAA2D;AAMpD,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,8BAAa;IAEnC;IACA;IAFV,YACU,aAA4B,EAC5B,SAAoB;QAE5B,KAAK,EAAE,CAAC;QAHA,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;IAG9B,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC;gBACxC,+BAAa,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE5E,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,4BAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3F,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAW,4BAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACvG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAxBY,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;KAC7B,CAAC;qCAGyB,wBAAa;QACjB,gBAAS;GAHnB,YAAY,CAwBxB"}
@@ -12,7 +12,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.FacebookShopExporter = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const core_1 = require("@nestjs/core");
15
- const path_1 = require("path");
16
15
  const cronicle_helper_1 = require("@bytebrand/cronicle-helper");
17
16
  const services_1 = require("../services");
18
17
  const transformers_1 = require("../transformers");
@@ -34,9 +33,8 @@ let FacebookShopExporter = class FacebookShopExporter {
34
33
  const [fileXml] = this.configService.config.outputFiles;
35
34
  await cronicle_helper_1.CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
36
35
  await cronicle_helper_1.CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
37
- const selfUrl = `https://ftp.${this.configService.config.domain}/feeds/${(0, path_1.basename)(fileXml)}`;
38
36
  const facebookShopXmlBuilder = new formats_1.FacebookShopXmlBuilder(fileXml);
39
- await facebookShopXmlBuilder.buildStart(selfUrl);
37
+ await facebookShopXmlBuilder.buildStart();
40
38
  const facebookShopTransformer = await this.moduleRef.create(transformers_1.FacebookShopTransformer);
41
39
  await this.loaderService.process(async (chunk) => {
42
40
  const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
@@ -1 +1 @@
1
- {"version":3,"file":"facebook-shop.exporter.js","sourceRoot":"","sources":["../../src/exporters/facebook-shop.exporter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,uCAAyC;AACzC,+BAAgC;AAEhC,gEAA2D;AAG3D,0CAAqF;AAErF,kDAA0D;AAC1D,wCAAoD;AAG7C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAErB;IACA;IACA;IACA;IACA;IALV,YACU,UAAsB,EACtB,aAA4B,EAC5B,aAA4B,EAC5B,SAAoB,EACpB,YAA0B;QAJ1B,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;QAC5B,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;QACpB,iBAAY,GAAZ,YAAY,CAAc;IAChC,CAAC;IAEL,KAAK,CAAC,MAAM;QACV,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;QACxD,MAAM,+BAAa,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAC9F,MAAM,+BAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAE7F,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,UAAU,IAAA,eAAQ,EAAC,OAAO,CAAC,EAAE,CAAC;QAC7F,MAAM,sBAAsB,GAAG,IAAI,gCAAsB,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,sBAAsB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEjD,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,sCAAuB,CAAC,CAAC;QAErF,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAuB,EAAE,EAAE;YACjE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAEpG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;gBAG5C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAG1B,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAG5D,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;oBACjB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,gCAAgC,CAAC,CAAC;oBACtE,SAAS;iBACV;gBAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,MAAM,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBAC5C;gBACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC/C;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,sBAAsB,CAAC,QAAQ,EAAE,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AAhDY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAGW,qBAAU;QACP,wBAAa;QACb,wBAAa;QACjB,gBAAS;QACN,uBAAY;GANzB,oBAAoB,CAgDhC"}
1
+ {"version":3,"file":"facebook-shop.exporter.js","sourceRoot":"","sources":["../../src/exporters/facebook-shop.exporter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,uCAAyC;AAEzC,gEAA2D;AAG3D,0CAAqF;AAErF,kDAA0D;AAC1D,wCAAoD;AAG7C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAErB;IACA;IACA;IACA;IACA;IALV,YACU,UAAsB,EACtB,aAA4B,EAC5B,aAA4B,EAC5B,SAAoB,EACpB,YAA0B;QAJ1B,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;QAC5B,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;QACpB,iBAAY,GAAZ,YAAY,CAAc;IAChC,CAAC;IAEL,KAAK,CAAC,MAAM;QACV,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;QACxD,MAAM,+BAAa,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAC9F,MAAM,+BAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAE7F,MAAM,sBAAsB,GAAG,IAAI,gCAAsB,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,sBAAsB,CAAC,UAAU,EAAE,CAAC;QAE1C,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,sCAAuB,CAAC,CAAC;QAErF,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAuB,EAAE,EAAE;YACjE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAEpG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;gBAG5C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAG1B,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAG5D,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;oBACjB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,GAAG,gCAAgC,CAAC,CAAC;oBACtE,SAAS;iBACV;gBAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,MAAM,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBAC5C;gBACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC/C;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,sBAAsB,CAAC,QAAQ,EAAE,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AA/CY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAGW,qBAAU;QACP,wBAAa;QACb,wBAAa;QACjB,gBAAS;QACN,uBAAY;GANzB,oBAAoB,CA+ChC"}
@@ -15,6 +15,9 @@ const core_1 = require("@nestjs/core");
15
15
  const cronicle_helper_1 = require("@bytebrand/cronicle-helper");
16
16
  const services_1 = require("../services");
17
17
  const google_transformer_1 = require("../transformers/google.transformer");
18
+ const google_feed_item_row_1 = require("../transformers/google-feed-item-row");
19
+ const feed_items_bigquery_writer_1 = require("../services/feed-items-bigquery.writer");
20
+ const publication_gate_1 = require("../services/publication-gate");
18
21
  const google_xml_builder_1 = require("../formats/google-xml.builder");
19
22
  let GoogleExporter = class GoogleExporter {
20
23
  carService;
@@ -30,22 +33,37 @@ let GoogleExporter = class GoogleExporter {
30
33
  this.moduleRef = moduleRef;
31
34
  }
32
35
  async export() {
36
+ const gate = await (0, publication_gate_1.loadPublicationGate)(this.configService.config.publicationGate);
33
37
  const [fileName] = this.configService.config.outputFiles;
34
38
  await cronicle_helper_1.CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
35
39
  await cronicle_helper_1.CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
36
40
  const googleXmlBuilder = new google_xml_builder_1.GoogleXmlBuilder(fileName);
37
41
  await googleXmlBuilder.buildStart(this.configService.config.domain);
38
42
  const googleTransformer = await this.moduleRef.create(google_transformer_1.GoogleTransformer);
43
+ const { feedItemsBigQuery, runId } = this.configService.config;
44
+ const feedItemsWriter = feedItemsBigQuery ? new feed_items_bigquery_writer_1.FeedItemsBigQueryWriter(feedItemsBigQuery) : null;
45
+ const exportedAt = new Date();
46
+ let gatedItems = 0;
39
47
  await this.loaderService.process(async (chunk) => {
40
48
  chunk.data = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
41
49
  for (const data of chunk.data) {
42
50
  const car = await googleTransformer.transform(data);
43
- if (car)
44
- await googleXmlBuilder.addItem(car);
51
+ if (car) {
52
+ const estimatedAttributes = gate.estimatedAttributes(data.car);
53
+ if (estimatedAttributes.length)
54
+ gatedItems += 1;
55
+ await googleXmlBuilder.addItem(gate.apply(car, estimatedAttributes));
56
+ const gateInfo = gate.mode === 'off' ? null : { mode: gate.mode, estimatedAttributes };
57
+ feedItemsWriter?.add((0, google_feed_item_row_1.buildGoogleFeedItemRow)(data.car, car, runId, exportedAt, gateInfo));
58
+ }
45
59
  this.carService.counter.countCar(data.images);
46
60
  }
47
61
  });
48
62
  await googleXmlBuilder.buildEnd();
63
+ if (gate.mode !== 'off') {
64
+ console.log(`Publication gate ${gate.mode}: ${gatedItems} items with estimated EnVKV values${gate.mode === 'enforce' ? ' (attributes left out)' : ''}`);
65
+ }
66
+ await feedItemsWriter?.close();
49
67
  console.log(this.carService.counter.getCountedCars());
50
68
  }
51
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"google.exporter.js","sourceRoot":"","sources":["../../src/exporters/google.exporter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,uCAAyC;AAEzC,gEAA2D;AAG3D,0CAAqF;AACrF,2EAAuE;AACvE,sEAAiE;AAI1D,IAAM,cAAc,GAApB,MAAM,cAAc;IAEf;IACA;IACA;IACA;IACA;IALV,YACU,UAAsB,EACtB,aAA4B,EAC5B,YAA0B,EAC1B,aAA4B,EAC5B,SAAoB;QAJpB,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;QAC5B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;IAC1B,CAAC;IAEL,KAAK,CAAC,MAAM;QACV,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;QACzD,MAAM,+BAAa,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAC9F,MAAM,+BAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAE7F,MAAM,gBAAgB,GAAG,IAAI,qCAAgB,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpE,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,sCAAiB,CAAC,CAAC;QAEzE,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAuB,EAAE,EAAE;YACjE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAE/F,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;gBAC7B,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,GAAG;oBACL,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC/C;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AAjCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAGW,qBAAU;QACP,wBAAa;QACd,uBAAY;QACX,wBAAa;QACjB,gBAAS;GANnB,cAAc,CAiC1B"}
1
+ {"version":3,"file":"google.exporter.js","sourceRoot":"","sources":["../../src/exporters/google.exporter.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
2
2
  import { FacebookShopItem } from '../interfaces';
3
3
  export declare class FacebookShopXmlBuilder extends XMLBuilderBase {
4
- buildStart(selfUrl?: string): Promise<void>;
4
+ buildStart(): Promise<void>;
5
5
  addItem(car: FacebookShopItem): Promise<void>;
6
6
  private buildTagElement;
7
7
  buildEnd(): Promise<void>;
@@ -5,15 +5,12 @@ const lodash_1 = require("lodash");
5
5
  const cronicle_helper_1 = require("@bytebrand/cronicle-helper");
6
6
  const MAX_IMAGES = 2;
7
7
  class FacebookShopXmlBuilder extends cronicle_helper_1.XMLBuilderBase {
8
- async buildStart(selfUrl) {
9
- await this.write('<?xml version="1.0" encoding="utf-8"?>\n<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">' +
10
- '\n<channel>\n<title>auto.de Vehicle Offers Feed</title>' +
11
- '\n<description>Automotive Model Ads Vehicle Offers Feed für auto.de</description>' +
12
- '\n<link>https://www.auto.de/</link>' +
13
- `\n<atom:link href="${(0, lodash_1.escape)(selfUrl)}" rel="self" type="application/rss+xml" />\n`);
8
+ async buildStart() {
9
+ await this.write('<?xml version="1.0" encoding="utf-8"?>\n<listings>' +
10
+ '\n<title>auto.de Vehicle Offers Feed</title>\n');
14
11
  }
15
12
  async addItem(car) {
16
- let item = '\n<item>\n';
13
+ let item = '\n<listing>\n';
17
14
  const { image, ...tags } = car;
18
15
  for (const [tag, value] of Object.entries(tags)) {
19
16
  item += this.buildTagElement(tag, value);
@@ -22,7 +19,7 @@ class FacebookShopXmlBuilder extends cronicle_helper_1.XMLBuilderBase {
22
19
  .slice(0, MAX_IMAGES)
23
20
  .map((url) => `<image><url>${(0, lodash_1.escape)(url)}</url></image>\n`)
24
21
  .join('');
25
- item += '</item>';
22
+ item += '</listing>';
26
23
  await this.write(item);
27
24
  }
28
25
  buildTagElement(tag, value) {
@@ -38,7 +35,7 @@ class FacebookShopXmlBuilder extends cronicle_helper_1.XMLBuilderBase {
38
35
  return this.getElement(tag, value);
39
36
  }
40
37
  async buildEnd() {
41
- await this.write('\n</channel>\n</rss>\n');
38
+ await this.write('\n</listings>\n');
42
39
  await this.end();
43
40
  }
44
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"facebook-shop.builder.js","sourceRoot":"","sources":["../../src/formats/facebook-shop.builder.ts"],"names":[],"mappings":";;;AAAA,mCAA2D;AAC3D,gEAA4D;AAG5D,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAa,sBAAuB,SAAQ,gCAAc;IAIxD,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,MAAM,IAAI,CAAC,KAAK,CACd,sGAAsG;YACpG,yDAAyD;YACzD,mFAAmF;YACnF,qCAAqC;YACrC,sBAAsB,IAAA,eAAM,EAAC,OAAO,CAAC,8CAA8C,CACtF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,IAAI,IAAI,GAAG,YAAY,CAAC;QAExB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;QAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC/C,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC1C;QAED,IAAI,IAAI,KAAK;aACV,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;aACpB,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,eAAe,IAAA,eAAM,EAAC,GAAG,CAAC,kBAAkB,CAAC;aAClE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,IAAI,IAAI,SAAS,CAAC;QAElB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,eAAe,CAAC,GAAW,EAAE,KAAc;QACjD,IAAI,IAAA,cAAK,EAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE;YAChC,OAAO,EAAE,CAAC;SACX;QAGD,IAAI,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,CAAC;SAC5C;QACD,IAAI,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;SAC5C;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;CACF;AApDD,wDAoDC"}
1
+ {"version":3,"file":"facebook-shop.builder.js","sourceRoot":"","sources":["../../src/formats/facebook-shop.builder.ts"],"names":[],"mappings":";;;AAAA,mCAA2D;AAC3D,gEAA4D;AAG5D,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAa,sBAAuB,SAAQ,gCAAc;IAMxD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,KAAK,CACd,oDAAoD;YAClD,gDAAgD,CACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,IAAI,IAAI,GAAG,eAAe,CAAC;QAE3B,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;QAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC/C,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC1C;QAED,IAAI,IAAI,KAAK;aACV,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;aACpB,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,eAAe,IAAA,eAAM,EAAC,GAAG,CAAC,kBAAkB,CAAC;aAClE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,IAAI,IAAI,YAAY,CAAC;QAErB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,eAAe,CAAC,GAAW,EAAE,KAAc;QACjD,IAAI,IAAA,cAAK,EAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE;YAChC,OAAO,EAAE,CAAC;SACX;QAGD,IAAI,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,CAAC;SAC5C;QACD,IAAI,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;SAC5C;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;CACF;AAnDD,wDAmDC"}
@@ -198,11 +198,11 @@ export interface GoogleXmlItem {
198
198
  doors?: number;
199
199
  capacity?: number;
200
200
  date_first_registered: string;
201
- fuel_consumption: string;
201
+ fuel_consumption?: string;
202
202
  energy_consumption?: string;
203
203
  electric_range?: string;
204
204
  fuel_consumption_discharged_battery?: string;
205
- co2_emissions: string;
205
+ co2_emissions?: string;
206
206
  identifier_exists: string;
207
207
  ads_redirect?: string;
208
208
  "certified_pre-owned"?: boolean;
@@ -10,4 +10,23 @@ export interface Params {
10
10
  cpc?: string;
11
11
  ownerId?: string;
12
12
  metaPushPriorityCsvUrl?: string;
13
+ maxCurrentSalesPrice?: string;
14
+ feedItemsBqProject?: string;
15
+ feedItemsBqDataset?: string;
16
+ feedItemsBqTable?: string;
17
+ publicationGate?: string;
18
+ publicationGateBqProject?: string;
19
+ publicationGateBqDataset?: string;
20
+ publicationGateBqTable?: string;
21
+ }
22
+ export interface FeedItemsBigQueryTarget {
23
+ project: string;
24
+ dataset: string;
25
+ table: string;
26
+ }
27
+ export interface PublicationGateConfig {
28
+ mode: 'off' | 'audit' | 'enforce';
29
+ project: string;
30
+ dataset: string;
31
+ table: string;
13
32
  }
@@ -0,0 +1,17 @@
1
+ import { FeedItemsBigQueryTarget } from '../interfaces/params.interface';
2
+ import { FeedItemRow } from '../transformers/google-feed-item-row';
3
+ export declare class FeedItemsBigQueryWriter {
4
+ private target;
5
+ private logger;
6
+ private buffer;
7
+ private queue;
8
+ private failedBatches;
9
+ private insertedRows;
10
+ constructor(target: FeedItemsBigQueryTarget);
11
+ add(row: FeedItemRow): void;
12
+ close(): Promise<void>;
13
+ private get enabled();
14
+ private get tableName();
15
+ private flush;
16
+ private insert;
17
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FeedItemsBigQueryWriter = void 0;
4
+ const path_1 = require("path");
5
+ const bigquery_logger_1 = require("@bytebrand/bigquery-logger");
6
+ const BATCH_SIZE = 500;
7
+ const MAX_FAILED_BATCHES = 3;
8
+ const CLOSE_TIMEOUT_MS = 60000;
9
+ class FeedItemsBigQueryLogger extends bigquery_logger_1.BigQueryLogger {
10
+ async insertRows(rows) {
11
+ await this.client
12
+ .dataset(this.options.BigQueryDataset)
13
+ .table(this.options.BigQueryLogTable)
14
+ .insert(rows, { skipInvalidRows: true, ignoreUnknownValues: true });
15
+ }
16
+ }
17
+ class FeedItemsBigQueryWriter {
18
+ target;
19
+ logger;
20
+ buffer = [];
21
+ queue = Promise.resolve();
22
+ failedBatches = 0;
23
+ insertedRows = 0;
24
+ constructor(target) {
25
+ this.target = target;
26
+ try {
27
+ const credentials = require((0, path_1.join)(process.cwd(), 'credentials/google-cloud-project-id.json'));
28
+ this.logger = new FeedItemsBigQueryLogger(credentials, {
29
+ BigQueryProject: target.project,
30
+ BigQueryDataset: target.dataset,
31
+ BigQueryLogTable: target.table,
32
+ });
33
+ }
34
+ catch (e) {
35
+ console.log(`Feed items BigQuery disabled: ${String(e?.message || e).split('\n')[0]}`);
36
+ }
37
+ }
38
+ add(row) {
39
+ if (!this.enabled)
40
+ return;
41
+ this.buffer.push(row);
42
+ if (this.buffer.length >= BATCH_SIZE)
43
+ this.flush();
44
+ }
45
+ async close() {
46
+ this.flush();
47
+ let timer;
48
+ const timeout = new Promise((resolve) => {
49
+ timer = setTimeout(() => resolve('timeout'), CLOSE_TIMEOUT_MS);
50
+ });
51
+ const outcome = await Promise.race([this.queue.then(() => 'done'), timeout]);
52
+ if (timer)
53
+ clearTimeout(timer);
54
+ if (outcome === 'timeout')
55
+ console.error(`Feed items BigQuery: gave up waiting after ${CLOSE_TIMEOUT_MS} ms`);
56
+ if (this.logger) {
57
+ console.log(`Feed items BigQuery: ${this.insertedRows} rows to ${this.tableName}, ${this.failedBatches} failed batches`);
58
+ }
59
+ }
60
+ get enabled() {
61
+ return !!this.logger && this.failedBatches < MAX_FAILED_BATCHES;
62
+ }
63
+ get tableName() {
64
+ return `${this.target.project}.${this.target.dataset}.${this.target.table}`;
65
+ }
66
+ flush() {
67
+ if (!this.buffer.length)
68
+ return;
69
+ const rows = this.buffer;
70
+ this.buffer = [];
71
+ this.queue = this.queue.then(() => this.insert(rows));
72
+ }
73
+ async insert(rows) {
74
+ if (!this.enabled)
75
+ return;
76
+ try {
77
+ await this.logger.insertRows(rows);
78
+ this.insertedRows += rows.length;
79
+ }
80
+ catch (e) {
81
+ const rejected = e?.name === 'PartialFailureError' && Array.isArray(e.errors) ? e.errors : null;
82
+ const firstRowError = rejected?.[0]?.errors?.[0];
83
+ const detail = firstRowError ? ` (${firstRowError.reason}: ${firstRowError.message})` : '';
84
+ if (rejected) {
85
+ this.insertedRows += rows.length - rejected.length;
86
+ console.log(`Feed items BigQuery rejected ${rejected.length} of ${rows.length} rows${detail}`);
87
+ }
88
+ else {
89
+ this.failedBatches++;
90
+ console.log(`Feed items BigQuery insert of ${rows.length} rows failed: ${e?.message || e}`);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ exports.FeedItemsBigQueryWriter = FeedItemsBigQueryWriter;
96
+ //# sourceMappingURL=feed-items-bigquery.writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-items-bigquery.writer.js","sourceRoot":"","sources":["../../src/services/feed-items-bigquery.writer.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,gEAA4D;AAI5D,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,uBAAwB,SAAQ,gCAAc;IAClD,KAAK,CAAC,UAAU,CAAC,IAAmB;QAClC,MAAM,IAAI,CAAC,MAAM;aACd,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;aACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;aACpC,MAAM,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;CACF;AAKD,MAAa,uBAAuB;IAOd;IANZ,MAAM,CAA0B;IAChC,MAAM,GAAkB,EAAE,CAAC;IAC3B,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,aAAa,GAAG,CAAC,CAAC;IAClB,YAAY,GAAG,CAAC,CAAC;IAEzB,YAAoB,MAA+B;QAA/B,WAAM,GAAN,MAAM,CAAyB;QACjD,IAAI;YACF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0CAA0C,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAuB,CAAC,WAAW,EAAE;gBACrD,eAAe,EAAE,MAAM,CAAC,OAAO;gBAC/B,eAAe,EAAE,MAAM,CAAC,OAAO;gBAC/B,gBAAgB,EAAE,MAAM,CAAC,KAAK;aAC/B,CAAC,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;YAEV,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACxF;IACH,CAAC;IAED,GAAG,CAAC,GAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC;IAID,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,KAAiC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;YACjD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACtF,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,CAAC,8CAA8C,gBAAgB,KAAK,CAAC,CAAC;QAC9G,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,aAAa,iBAAiB,CAAC,CAAC;SAC1H;IACH,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC;IAClE,CAAC;IAED,IAAY,SAAS;QACnB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9E,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAmB;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC;SAClC;QAAC,OAAO,CAAC,EAAE;YAGV,MAAM,QAAQ,GAAU,CAAC,EAAE,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACvG,MAAM,aAAa,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,QAAQ,MAAM,EAAE,CAAC,CAAC;aAChG;iBAAM;gBACL,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,MAAM,iBAAiB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;aAC7F;SACF;IACH,CAAC;CACF;AA9ED,0DA8EC"}
@@ -0,0 +1,15 @@
1
+ import { DataSchemes } from '@bytebrand/car-schema';
2
+ import { PublicationGateConfig } from '../interfaces/params.interface';
3
+ import { GoogleEnvkvAttribute } from '../transformers/google-feed-envkv';
4
+ export declare const ESTIMATE_SOURCES: string[];
5
+ export declare const GATED_FIELDS: string[];
6
+ export declare class PublicationGate {
7
+ readonly mode: 'off' | 'audit' | 'enforce';
8
+ private estimates;
9
+ constructor(mode: 'off' | 'audit' | 'enforce', estimates: Map<string, string>);
10
+ static off(): PublicationGate;
11
+ get size(): number;
12
+ estimatedAttributes(car: DataSchemes.Car): GoogleEnvkvAttribute[];
13
+ apply<T extends Partial<Record<GoogleEnvkvAttribute, string>>>(item: T, attributes: GoogleEnvkvAttribute[]): T;
14
+ }
15
+ export declare function loadPublicationGate(config: PublicationGateConfig | undefined): Promise<PublicationGate>;