@uplab/vendure-plugin-exchange-rates 0.1.0 → 0.1.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @uplab/vendure-plugin-exchange-rates
2
2
 
3
+ ## 0.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#33](https://github.com/Uplab/uplab-vendure-plugins/pull/33) [`c586872`](https://github.com/Uplab/uplab-vendure-plugins/commit/c586872710e16bdcccd1be7a45c614905d7c6a4b) Thanks [@brmk](https://github.com/brmk)! - Rows from before the `baseCurrency` column are now also adopted when MySQL filled the column with `''`, and until they are, the Admin API lists them with the base they will get instead of failing the whole list on a null.
8
+
9
+ An adoption publishes a `synced` event; to see the one on boot, subscribe in `onModuleInit` (the README example now does).
10
+
11
+ The worker adopts such rows on bootstrap too, so it no longer depends on the server booting first, and the boot backfill no longer throws on a database error.
12
+
13
+ ## 0.1.1
14
+
15
+ ### Patch Changes
16
+
17
+ - [#31](https://github.com/Uplab/uplab-vendure-plugins/pull/31) [`a1899fe`](https://github.com/Uplab/uplab-vendure-plugins/commit/a1899fe1422faec3f96b0f4259f713ab26b5deaf) Thanks [@brmk](https://github.com/brmk)! - The `baseCurrency` column is nullable, so a generated migration adds it to a table that already has rows without hand edits. On boot (and in every sync) rows without a base are given the current one and keep their custom rates.
18
+
3
19
  ## 0.1.0
4
20
 
5
21
  ### Minor Changes
package/README.md CHANGED
@@ -312,20 +312,23 @@ Turning on `useCustomRate` without a positive `customRate` is rejected.
312
312
  ## Event
313
313
 
314
314
  `CurrencyExchangeRateEvent` is published once the transaction has committed: `type: 'synced'` when a sync
315
- changed anything, with every rate now stored in the base currency, or `'updated'` with the one rate an
316
- admin saved. Use it to drop caches
317
- that embed the rates:
315
+ changed anything, or when the plugin adopts rows without a base on boot, with every rate now stored in the
316
+ base currency; `'updated'` with the one rate an admin saved. Use it to drop caches that embed the rates —
317
+ subscribe in `onModuleInit`, which runs before any plugin's bootstrap, so the boot event is not missed.
318
+ Events stay in the process that published them: a scheduled sync publishes in the worker, the boot adoption
319
+ in whichever process adopted the rows. Register the subscriber in both, and keep a cache it must drop
320
+ shared between them (e.g. Redis), or let it expire:
318
321
 
319
322
  ```ts
320
- import { OnApplicationBootstrap } from '@nestjs/common';
323
+ import { OnModuleInit } from '@nestjs/common';
321
324
  import { EventBus, PluginCommonModule, VendurePlugin } from '@vendure/core';
322
325
  import { CurrencyExchangeRateEvent } from '@uplab/vendure-plugin-exchange-rates';
323
326
 
324
327
  @VendurePlugin({ imports: [PluginCommonModule] })
325
- export class RatesCachePlugin implements OnApplicationBootstrap {
328
+ export class RatesCachePlugin implements OnModuleInit {
326
329
  constructor(private readonly eventBus: EventBus) {}
327
330
 
328
- onApplicationBootstrap() {
331
+ onModuleInit() {
329
332
  this.eventBus.ofType(CurrencyExchangeRateEvent).subscribe(() => {
330
333
  // drop whatever caches the rates, e.g. a cached Shop API response
331
334
  });
@@ -337,14 +340,18 @@ export class RatesCachePlugin implements OnApplicationBootstrap {
337
340
 
338
341
  One table, `currency_exchange_rate`:
339
342
 
340
- | Column | Type |
341
- | --------------- | ------------------------------------------- |
342
- | `code` | varchar, unique |
343
- | `baseCurrency` | varchar — the currency `rate` is counted in |
344
- | `rate` | decimal(19, 8) — the fetched one |
345
- | `enabled` | boolean, default `false` |
346
- | `useCustomRate` | boolean, default `false` |
347
- | `customRate` | decimal(19, 8), nullable |
343
+ | Column | Type |
344
+ | --------------- | -------------------------------------------- |
345
+ | `code` | varchar, unique |
346
+ | `baseCurrency` | varchar — the currency `rate` is counted in¹ |
347
+ | `rate` | decimal(19, 8) — the fetched one |
348
+ | `enabled` | boolean, default `false` |
349
+ | `useCustomRate` | boolean, default `false` |
350
+ | `customRate` | decimal(19, 8), nullable |
351
+
352
+ ¹ Nullable so that a generated migration can add it to a filled table. On the next boot (and in every
353
+ sync) the plugin gives rows without one the current base, keeping their custom rates — it assumes they are
354
+ already in that base, so change the base only after the upgrade has booted once.
348
355
 
349
356
  A sync updates `rate` and inserts new currencies, in one transaction; on a [base change](#base-currency) it
350
357
  also rewrites `baseCurrency`, clears custom rates and deletes the currencies the new base does not cover.
@@ -13,4 +13,15 @@ export declare class CurrencyExchangeRateAdminResolver {
13
13
  }): Promise<CurrencyExchangeRate | null>;
14
14
  updateCurrencyExchangeRate(ctx: RequestContext, args: MutationUpdateCurrencyExchangeRateArgs): Promise<CurrencyExchangeRate>;
15
15
  }
16
+ export declare class CurrencyExchangeRateAdminFieldResolver {
17
+ private currencyExchangeRateService;
18
+ constructor(currencyExchangeRateService: CurrencyExchangeRateService);
19
+ /**
20
+ * A row from before the `baseCurrency` column is adopted on boot and in every sync; one that is listed
21
+ * before that (e.g. while an older instance still runs a rolling deploy) shows the base it will get,
22
+ * instead of failing the whole non-null list. Filtering and sorting on `baseCurrency` still see the
23
+ * stored value until then.
24
+ */
25
+ baseCurrency(ctx: RequestContext, row: CurrencyExchangeRate): Promise<import("@vendure/core").CurrencyCode>;
26
+ }
16
27
  //# sourceMappingURL=admin.resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.resolver.d.ts","sourceRoot":"","sources":["../../src/api/admin.resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,EAAE,EACF,gBAAgB,EAChB,aAAa,EAEb,cAAc,EAEf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,sCAAsC,EAAE,MAAM,UAAU,CAAC;AAElE,qBACa,iCAAiC;IAChC,OAAO,CAAC,2BAA2B;gBAA3B,2BAA2B,EAAE,2BAA2B;IAI5E,qBAAqB,CACZ,GAAG,EAAE,cAAc,EAClB,IAAI,EAAE;QAAE,OAAO,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAA;KAAE,GAChE,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAM/C,oBAAoB,CAAQ,GAAG,EAAE,cAAc,EAAU,IAAI,EAAE;QAAE,EAAE,EAAE,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAOhH,0BAA0B,CACjB,GAAG,EAAE,cAAc,EAClB,IAAI,EAAE,sCAAsC,GACnD,OAAO,CAAC,oBAAoB,CAAC;CAGjC"}
1
+ {"version":3,"file":"admin.resolver.d.ts","sourceRoot":"","sources":["../../src/api/admin.resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,EAAE,EACF,gBAAgB,EAChB,aAAa,EAEb,cAAc,EAEf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,sCAAsC,EAAE,MAAM,UAAU,CAAC;AAElE,qBACa,iCAAiC;IAChC,OAAO,CAAC,2BAA2B;gBAA3B,2BAA2B,EAAE,2BAA2B;IAI5E,qBAAqB,CACZ,GAAG,EAAE,cAAc,EAClB,IAAI,EAAE;QAAE,OAAO,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAA;KAAE,GAChE,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAM/C,oBAAoB,CAAQ,GAAG,EAAE,cAAc,EAAU,IAAI,EAAE;QAAE,EAAE,EAAE,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAOhH,0BAA0B,CACjB,GAAG,EAAE,cAAc,EAClB,IAAI,EAAE,sCAAsC,GACnD,OAAO,CAAC,oBAAoB,CAAC;CAGjC;AAED,qBACa,sCAAsC;IACrC,OAAO,CAAC,2BAA2B;gBAA3B,2BAA2B,EAAE,2BAA2B;IAE5E;;;;;OAKG;IAEG,YAAY,CAAQ,GAAG,EAAE,cAAc,EAAY,GAAG,EAAE,oBAAoB;CAGnF"}
@@ -12,9 +12,10 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.CurrencyExchangeRateAdminResolver = void 0;
15
+ exports.CurrencyExchangeRateAdminFieldResolver = exports.CurrencyExchangeRateAdminResolver = void 0;
16
16
  const graphql_1 = require("@nestjs/graphql");
17
17
  const core_1 = require("@vendure/core");
18
+ const currency_exchange_rate_entity_1 = require("../entities/currency-exchange-rate.entity");
18
19
  const currency_exchange_rate_service_1 = require("../services/currency-exchange-rate.service");
19
20
  let CurrencyExchangeRateAdminResolver = class CurrencyExchangeRateAdminResolver {
20
21
  constructor(currencyExchangeRateService) {
@@ -63,4 +64,31 @@ exports.CurrencyExchangeRateAdminResolver = CurrencyExchangeRateAdminResolver =
63
64
  (0, graphql_1.Resolver)(),
64
65
  __metadata("design:paramtypes", [currency_exchange_rate_service_1.CurrencyExchangeRateService])
65
66
  ], CurrencyExchangeRateAdminResolver);
67
+ let CurrencyExchangeRateAdminFieldResolver = class CurrencyExchangeRateAdminFieldResolver {
68
+ constructor(currencyExchangeRateService) {
69
+ this.currencyExchangeRateService = currencyExchangeRateService;
70
+ }
71
+ /**
72
+ * A row from before the `baseCurrency` column is adopted on boot and in every sync; one that is listed
73
+ * before that (e.g. while an older instance still runs a rolling deploy) shows the base it will get,
74
+ * instead of failing the whole non-null list. Filtering and sorting on `baseCurrency` still see the
75
+ * stored value until then.
76
+ */
77
+ async baseCurrency(ctx, row) {
78
+ return row.baseCurrency || this.currencyExchangeRateService.getBaseCurrency(ctx);
79
+ }
80
+ };
81
+ exports.CurrencyExchangeRateAdminFieldResolver = CurrencyExchangeRateAdminFieldResolver;
82
+ __decorate([
83
+ (0, graphql_1.ResolveField)(),
84
+ __param(0, (0, core_1.Ctx)()),
85
+ __param(1, (0, graphql_1.Parent)()),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [core_1.RequestContext, currency_exchange_rate_entity_1.CurrencyExchangeRate]),
88
+ __metadata("design:returntype", Promise)
89
+ ], CurrencyExchangeRateAdminFieldResolver.prototype, "baseCurrency", null);
90
+ exports.CurrencyExchangeRateAdminFieldResolver = CurrencyExchangeRateAdminFieldResolver = __decorate([
91
+ (0, graphql_1.Resolver)('CurrencyExchangeRate'),
92
+ __metadata("design:paramtypes", [currency_exchange_rate_service_1.CurrencyExchangeRateService])
93
+ ], CurrencyExchangeRateAdminFieldResolver);
66
94
  //# sourceMappingURL=admin.resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.resolver.js","sourceRoot":"","sources":["../../src/api/admin.resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAAkE;AAClE,wCASuB;AAEvB,+FAAyF;AAIlF,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAC5C,YAAoB,2BAAwD;QAAxD,gCAA2B,GAA3B,2BAA2B,CAA6B;IAAG,CAAC;IAIhF,qBAAqB,CACZ,GAAmB,EAClB,IAAyD;QAEjE,OAAO,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAID,oBAAoB,CAAQ,GAAmB,EAAU,IAAgB;QACvE,OAAO,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAKD,0BAA0B,CACjB,GAAmB,EAClB,IAA4C;QAEpD,OAAO,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF,CAAA;AA3BY,8EAAiC;AAK5C;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,YAAK,EAAC,iBAAU,CAAC,YAAY,CAAC;IAE5B,WAAA,IAAA,UAAG,GAAE,CAAA;IACL,WAAA,IAAA,cAAI,GAAE,CAAA;;qCADK,qBAAc;;8EAI3B;AAID;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,YAAK,EAAC,iBAAU,CAAC,YAAY,CAAC;IACT,WAAA,IAAA,UAAG,GAAE,CAAA;IAAuB,WAAA,IAAA,cAAI,GAAE,CAAA;;qCAAvB,qBAAc;;6EAE9C;AAKD;IAHC,IAAA,kBAAW,GAAE;IACb,IAAA,kBAAQ,GAAE;IACV,IAAA,YAAK,EAAC,iBAAU,CAAC,cAAc,CAAC;IAE9B,WAAA,IAAA,UAAG,GAAE,CAAA;IACL,WAAA,IAAA,cAAI,GAAE,CAAA;;qCADK,qBAAc;;mFAI3B;4CA1BU,iCAAiC;IAD7C,IAAA,kBAAQ,GAAE;qCAEwC,4DAA2B;GADjE,iCAAiC,CA2B7C"}
1
+ {"version":3,"file":"admin.resolver.js","sourceRoot":"","sources":["../../src/api/admin.resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAAwF;AACxF,wCASuB;AACvB,6FAAiF;AACjF,+FAAyF;AAIlF,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAC5C,YAAoB,2BAAwD;QAAxD,gCAA2B,GAA3B,2BAA2B,CAA6B;IAAG,CAAC;IAIhF,qBAAqB,CACZ,GAAmB,EAClB,IAAyD;QAEjE,OAAO,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAID,oBAAoB,CAAQ,GAAmB,EAAU,IAAgB;QACvE,OAAO,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAKD,0BAA0B,CACjB,GAAmB,EAClB,IAA4C;QAEpD,OAAO,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF,CAAA;AA3BY,8EAAiC;AAK5C;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,YAAK,EAAC,iBAAU,CAAC,YAAY,CAAC;IAE5B,WAAA,IAAA,UAAG,GAAE,CAAA;IACL,WAAA,IAAA,cAAI,GAAE,CAAA;;qCADK,qBAAc;;8EAI3B;AAID;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,YAAK,EAAC,iBAAU,CAAC,YAAY,CAAC;IACT,WAAA,IAAA,UAAG,GAAE,CAAA;IAAuB,WAAA,IAAA,cAAI,GAAE,CAAA;;qCAAvB,qBAAc;;6EAE9C;AAKD;IAHC,IAAA,kBAAW,GAAE;IACb,IAAA,kBAAQ,GAAE;IACV,IAAA,YAAK,EAAC,iBAAU,CAAC,cAAc,CAAC;IAE9B,WAAA,IAAA,UAAG,GAAE,CAAA;IACL,WAAA,IAAA,cAAI,GAAE,CAAA;;qCADK,qBAAc;;mFAI3B;4CA1BU,iCAAiC;IAD7C,IAAA,kBAAQ,GAAE;qCAEwC,4DAA2B;GADjE,iCAAiC,CA2B7C;AAGM,IAAM,sCAAsC,GAA5C,MAAM,sCAAsC;IACjD,YAAoB,2BAAwD;QAAxD,gCAA2B,GAA3B,2BAA2B,CAA6B;IAAG,CAAC;IAEhF;;;;;OAKG;IAEG,AAAN,KAAK,CAAC,YAAY,CAAQ,GAAmB,EAAY,GAAyB;QAChF,OAAO,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;CACF,CAAA;AAbY,wFAAsC;AAU3C;IADL,IAAA,sBAAY,GAAE;IACK,WAAA,IAAA,UAAG,GAAE,CAAA;IAAuB,WAAA,IAAA,gBAAM,GAAE,CAAA;;qCAAzB,qBAAc,EAAiB,oDAAoB;;0EAEjF;iDAZU,sCAAsC;IADlD,IAAA,kBAAQ,EAAC,sBAAsB,CAAC;qCAEkB,4DAA2B;GADjE,sCAAsC,CAalD"}
@@ -2,7 +2,11 @@ import { CurrencyCode, DeepPartial, VendureEntity } from '@vendure/core';
2
2
  export declare class CurrencyExchangeRate extends VendureEntity {
3
3
  constructor(input?: DeepPartial<CurrencyExchangeRate>);
4
4
  code: CurrencyCode;
5
- /** The currency `rate` and `customRate` are expressed in. */
5
+ /**
6
+ * The currency `rate` and `customRate` are expressed in. Nullable only so that a host's generated
7
+ * migration can add the column to a filled table; the plugin fills it on bootstrap and in every sync.
8
+ * Code that reads the table itself before the plugin's bootstrap can still see `null` (or `''`).
9
+ */
6
10
  baseCurrency: CurrencyCode;
7
11
  enabled: boolean;
8
12
  /** Units of `baseCurrency` per one unit of `code`, as fetched from the source. */
@@ -1 +1 @@
1
- {"version":3,"file":"currency-exchange-rate.entity.d.ts","sourceRoot":"","sources":["../../src/entities/currency-exchange-rate.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASzE,qBACa,oBAAqB,SAAQ,aAAa;gBACzC,KAAK,CAAC,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAMrD,IAAI,EAAE,YAAY,CAAC;IAEnB,6DAA6D;IAE7D,YAAY,EAAE,YAAY,CAAC;IAG3B,OAAO,EAAE,OAAO,CAAC;IAEjB,kFAAkF;IAElF,IAAI,EAAE,MAAM,CAAC;IAGb,aAAa,EAAE,OAAO,CAAC;IAGvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
1
+ {"version":3,"file":"currency-exchange-rate.entity.d.ts","sourceRoot":"","sources":["../../src/entities/currency-exchange-rate.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASzE,qBACa,oBAAqB,SAAQ,aAAa;gBACzC,KAAK,CAAC,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAMrD,IAAI,EAAE,YAAY,CAAC;IAEnB;;;;OAIG;IAEH,YAAY,EAAE,YAAY,CAAC;IAG3B,OAAO,EAAE,OAAO,CAAC;IAEjB,kFAAkF;IAElF,IAAI,EAAE,MAAM,CAAC;IAGb,aAAa,EAAE,OAAO,CAAC;IAGvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
@@ -29,7 +29,7 @@ __decorate([
29
29
  __metadata("design:type", String)
30
30
  ], CurrencyExchangeRate.prototype, "code", void 0);
31
31
  __decorate([
32
- (0, typeorm_1.Column)({ type: 'varchar' }),
32
+ (0, typeorm_1.Column)({ type: 'varchar', nullable: true }),
33
33
  __metadata("design:type", String)
34
34
  ], CurrencyExchangeRate.prototype, "baseCurrency", void 0);
35
35
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"currency-exchange-rate.entity.js","sourceRoot":"","sources":["../../src/entities/currency-exchange-rate.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAyE;AACzE,qCAAkE;AAElE,yFAAyF;AACzF,MAAM,eAAe,GAAqB;IACxC,EAAE,EAAE,CAAC,KAAgC,EAAE,EAAE,CAAC,KAAK;IAC/C,IAAI,EAAE,CAAC,KAA6B,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CACjF,CAAC;AAGK,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,oBAAa;IACrD,YAAY,KAAyC;QACnD,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;CAsBF,CAAA;AAzBY,oDAAoB;AAO/B;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3B,IAAA,eAAK,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;kDACL;AAInB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0DACD;AAG3B;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;qDACV;AAIjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;kDACtE;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;2DACJ;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;wDACxE;+BAxBhB,oBAAoB;IADhC,IAAA,gBAAM,GAAE;;GACI,oBAAoB,CAyBhC"}
1
+ {"version":3,"file":"currency-exchange-rate.entity.js","sourceRoot":"","sources":["../../src/entities/currency-exchange-rate.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAyE;AACzE,qCAAkE;AAElE,yFAAyF;AACzF,MAAM,eAAe,GAAqB;IACxC,EAAE,EAAE,CAAC,KAAgC,EAAE,EAAE,CAAC,KAAK;IAC/C,IAAI,EAAE,CAAC,KAA6B,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CACjF,CAAC;AAGK,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,oBAAa;IACrD,YAAY,KAAyC;QACnD,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;CA0BF,CAAA;AA7BY,oDAAoB;AAO/B;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3B,IAAA,eAAK,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;kDACL;AAQnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0DACjB;AAG3B;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;qDACV;AAIjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;kDACtE;AAGb;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;2DACJ;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;wDACxE;+BA5BhB,oBAAoB;IADhC,IAAA,gBAAM,GAAE;;GACI,oBAAoB,CA6BhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-rates.plugin.d.ts","sourceRoot":"","sources":["../src/exchange-rates.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAIL,cAAc,EACd,qBAAqB,EACrB,IAAI,EAEL,MAAM,eAAe,CAAC;AAOvB,OAAO,EAAE,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AAEjG,OAAO,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,MAAM,SAAS,CAAC;AAgBzF;;;;;GAKG;AACH,qBA4Ba,mBAAoB,YAAW,sBAAsB,EAAE,qBAAqB;IAKrF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAP9B,gBAAgB;IAChB,MAAM,CAAC,OAAO,EAAE,kCAAkC,CAAC;gBAGhC,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,qBAAqB,EAAE,qBAAqB,EAC5C,WAAW,EAAE,+BAA+B;IAG/D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAC,mBAAmB,CAAC;IAMrE,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
1
+ {"version":3,"file":"exchange-rates.plugin.d.ts","sourceRoot":"","sources":["../src/exchange-rates.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAKL,cAAc,EAEd,qBAAqB,EACrB,IAAI,EAEL,MAAM,eAAe,CAAC;AAOvB,OAAO,EAAE,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AAEjG,OAAO,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,MAAM,SAAS,CAAC;AAgBzF;;;;;GAKG;AACH,qBA+Ba,mBAAoB,YAAW,sBAAsB,EAAE,qBAAqB;IAKrF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAP9B,gBAAgB;IAChB,MAAM,CAAC,OAAO,EAAE,kCAAkC,CAAC;gBAGhC,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,qBAAqB,EAAE,qBAAqB,EAC5C,WAAW,EAAE,+BAA+B;IAG/D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAC,mBAAmB,CAAC;IAMrE,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
@@ -55,8 +55,20 @@ let ExchangeRatesPlugin = class ExchangeRatesPlugin {
55
55
  // Source first: the backfill needs it.
56
56
  async onApplicationBootstrap() {
57
57
  await ExchangeRatesPlugin_1.options.source.init?.(new core_2.Injector(this.moduleRef));
58
+ let ctx;
59
+ try {
60
+ ctx = await this.requestContextService.create({ apiType: 'admin' });
61
+ }
62
+ catch (e) {
63
+ core_2.Logger.warn(`Could not check the stored exchange rates: ${e.message}`, constants_1.loggerCtx);
64
+ return;
65
+ }
58
66
  if (this.processContext.isServer) {
59
- await this.syncService.backfillIfEmpty(await this.requestContextService.create({ apiType: 'admin' }));
67
+ await this.syncService.backfillIfEmpty(ctx);
68
+ }
69
+ else {
70
+ // The worker converts too (feeds, jobs): it must not depend on the server having booted first.
71
+ await this.syncService.adoptRowsWithoutBase(ctx);
60
72
  }
61
73
  }
62
74
  async onApplicationShutdown() {
@@ -72,7 +84,10 @@ exports.ExchangeRatesPlugin = ExchangeRatesPlugin = ExchangeRatesPlugin_1 = __de
72
84
  resolvers: [shop_resolver_1.CurrencyExchangeRateShopResolver, shop_resolver_1.CurrencyExchangeRateShopFieldResolver],
73
85
  schema: api_extensions_1.shopApiExtensions,
74
86
  },
75
- adminApiExtensions: { resolvers: [admin_resolver_1.CurrencyExchangeRateAdminResolver], schema: api_extensions_1.adminApiExtensions },
87
+ adminApiExtensions: {
88
+ resolvers: [admin_resolver_1.CurrencyExchangeRateAdminResolver, admin_resolver_1.CurrencyExchangeRateAdminFieldResolver],
89
+ schema: api_extensions_1.adminApiExtensions,
90
+ },
76
91
  // Resolved relative to the compiled plugin file; the sources are copied to `dist/dashboard/`.
77
92
  dashboard: './dashboard/index.tsx',
78
93
  providers: [
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-rates.plugin.js","sourceRoot":"","sources":["../src/exchange-rates.plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,uCAAyC;AACzC,wCAQuB;AACvB,yDAAyE;AACzE,yDAA6E;AAC7E,uDAA8G;AAC9G,2CAAmF;AACnF,uEAAuE;AACvE,4FAAgF;AAChF,wGAAiG;AACjG,8FAAwF;AAGxF,SAAS,cAAc,CAAC,OAAmC;IACzD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,IAAI,CAAE,MAAM,CAAC,MAAM,CAAC,mBAAY,CAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,YAAY,yBAAyB,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,iCAAqB,EAAE;KACrG,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AA6BI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;;IAI9B,YACmB,SAAoB,EACpB,cAA8B,EAC9B,qBAA4C,EAC5C,WAA4C;QAH5C,cAAS,GAAT,SAAS,CAAW;QACpB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,gBAAW,GAAX,WAAW,CAAiC;IAC5D,CAAC;IAEJ,MAAM,CAAC,IAAI,CAAC,OAAmC;QAC7C,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,qBAAmB,CAAC;IAC7B,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,sBAAsB;QAC1B,MAAM,qBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,eAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,MAAM,qBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACvD,CAAC;CACF,CAAA;AA3BY,kDAAmB;8BAAnB,mBAAmB;IA5B/B,IAAA,oBAAa,EAAC;QACb,OAAO,EAAE,CAAC,yBAAkB,CAAC;QAC7B,QAAQ,EAAE,CAAC,oDAAoB,CAAC;QAChC,iBAAiB,EAAE;YACjB,SAAS,EAAE,CAAC,gDAAgC,EAAE,qDAAqC,CAAC;YACpF,MAAM,EAAE,kCAAiB;SAC1B;QACD,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC,kDAAiC,CAAC,EAAE,MAAM,EAAE,mCAAkB,EAAE;QAClG,8FAA8F;QAC9F,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE;YACT,EAAE,OAAO,EAAE,yCAA6B,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACzF,4DAA2B;YAC3B,qEAA+B;SAChC;QACD,OAAO,EAAE,CAAC,4DAA2B,EAAE,qEAA+B,CAAC;QACvE,aAAa,EAAE,QAAQ;QACvB,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;YACxB,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC;YAC7C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,gBAAgB,CAAC,KAAK,GAAG;oBAC9B,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;oBACxC,IAAA,oDAA0B,EAAC,IAAI,CAAC,QAAQ,CAAC;iBAC1C,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;qCAM8B,gBAAS;QACJ,qBAAc;QACP,4BAAqB;QAC/B,qEAA+B;GARpD,mBAAmB,CA2B/B"}
1
+ {"version":3,"file":"exchange-rates.plugin.js","sourceRoot":"","sources":["../src/exchange-rates.plugin.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { EventBus, RequestContext, TransactionalConnection } from '@vendure/core';
1
+ import { CurrencyCode, EventBus, RequestContext, TransactionalConnection } from '@vendure/core';
2
2
  import { CurrencyExchangeRateService } from './currency-exchange-rate.service';
3
3
  import { CurrencyExchangeRate } from '../entities/currency-exchange-rate.entity';
4
4
  import { ResolvedExchangeRatesPluginOptions } from '../types';
@@ -22,8 +22,18 @@ export declare class CurrencyExchangeRateSyncService {
22
22
  */
23
23
  syncRates(ctx: RequestContext): Promise<CurrencyExchangeRate[]>;
24
24
  /**
25
- * Syncs when no rate is stored in the current base: on the first boot, and after a restart that changed
26
- * the base. Never throws: a source outage must not stop the server.
25
+ * Gives rows from before the `baseCurrency` column the current base, and announces them: they only now
26
+ * show on the Shop API and in `getRate`. Run on bootstrap in every process, so neither depends on the
27
+ * other having booted first. Returns the base, or `undefined` when the database could not be read; never
28
+ * throws.
29
+ *
30
+ * @internal the plugin runs it on bootstrap; there is no need to call it.
31
+ */
32
+ adoptRowsWithoutBase(ctx: RequestContext): Promise<CurrencyCode | undefined>;
33
+ /**
34
+ * {@link CurrencyExchangeRateSyncService.adoptRowsWithoutBase}, then syncs when no rate is stored in the
35
+ * current base: on the first boot, and after a restart that changed the base. Never throws: neither a
36
+ * source outage nor a database hiccup may stop the server.
27
37
  */
28
38
  backfillIfEmpty(ctx: RequestContext): Promise<void>;
29
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"currency-exchange-rate-sync.service.d.ts","sourceRoot":"","sources":["../../src/services/currency-exchange-rate-sync.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,QAAQ,EAAU,cAAc,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExG,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAqB,kCAAkC,EAAE,MAAM,UAAU,CAAC;AAajF;;;;;;GAMG;AACH,qBACa,+BAA+B;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAH4B,OAAO,EAAE,kCAAkC,EAClF,UAAU,EAAE,uBAAuB,EACnC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,2BAA2B;IAG3D;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAoErE;;;OAGG;IACG,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAa1D"}
1
+ {"version":3,"file":"currency-exchange-rate-sync.service.d.ts","sourceRoot":"","sources":["../../src/services/currency-exchange-rate-sync.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAU,cAAc,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExG,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAqB,kCAAkC,EAAE,MAAM,UAAU,CAAC;AAgCjF;;;;;;GAMG;AACH,qBACa,+BAA+B;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAH4B,OAAO,EAAE,kCAAkC,EAClF,UAAU,EAAE,uBAAuB,EACnC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,2BAA2B;IAG3D;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAqErE;;;;;;;OAOG;IACG,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAelF;;;;OAIG;IACG,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB1D"}
@@ -29,6 +29,21 @@ function isUsable(quote) {
29
29
  function lastPerCode(quotes) {
30
30
  return [...new Map(quotes.map((q) => [q.currencyCode, q]))].map(([, q]) => q);
31
31
  }
32
+ /**
33
+ * A row without a base predates the `baseCurrency` column. Its rates are in the base the shop used then,
34
+ * taken to be the current one, so it keeps its custom rate. "Without" is NULL, or `''` where MySQL filled
35
+ * a NOT NULL column added to a filled table. Returns how many rows it adopted.
36
+ */
37
+ async function fillMissingBase(repository, baseCurrency) {
38
+ let adopted = 0;
39
+ for (const missing of [(0, typeorm_1.IsNull)(), '']) {
40
+ adopted += (await repository.update({ baseCurrency: missing }, { baseCurrency })).affected ?? 0;
41
+ }
42
+ if (adopted) {
43
+ core_1.Logger.info(`Took ${adopted} stored rates without a base currency to be in ${baseCurrency}`, constants_1.loggerCtx);
44
+ }
45
+ return adopted;
46
+ }
32
47
  /**
33
48
  * @description
34
49
  * Pulls rates from the configured {@link ExchangeRateSource} into the `CurrencyExchangeRate` table,
@@ -64,6 +79,7 @@ let CurrencyExchangeRateSyncService = class CurrencyExchangeRateSyncService {
64
79
  // One transaction: a failure part-way leaves every rate as it was, not half of them refreshed.
65
80
  const { rows, changed } = await this.connection.withTransaction(ctx, async (txCtx) => {
66
81
  const repository = this.connection.getRepository(txCtx, currency_exchange_rate_entity_1.CurrencyExchangeRate);
82
+ const adopted = await fillMissingBase(repository, baseCurrency);
67
83
  const stored = await repository.find();
68
84
  const storedByCode = new Map(stored.map((r) => [r.code, r]));
69
85
  const rebased = [];
@@ -106,7 +122,7 @@ let CurrencyExchangeRateSyncService = class CurrencyExchangeRateSyncService {
106
122
  return {
107
123
  // Read back, so `updatedAt` and the rest are what the database now holds.
108
124
  rows: await repository.find({ where: { baseCurrency }, order: { code: 'ASC' } }),
109
- changed: created.length > 0 || updated > 0 || deleted,
125
+ changed: adopted > 0 || created.length > 0 || updated > 0 || deleted,
110
126
  };
111
127
  });
112
128
  core_1.Logger.verbose(`Synced ${rows.length} rates in ${baseCurrency} from ${source.name} (base ${base})`, constants_1.loggerCtx);
@@ -116,15 +132,42 @@ let CurrencyExchangeRateSyncService = class CurrencyExchangeRateSyncService {
116
132
  return rows;
117
133
  }
118
134
  /**
119
- * Syncs when no rate is stored in the current base: on the first boot, and after a restart that changed
120
- * the base. Never throws: a source outage must not stop the server.
135
+ * Gives rows from before the `baseCurrency` column the current base, and announces them: they only now
136
+ * show on the Shop API and in `getRate`. Run on bootstrap in every process, so neither depends on the
137
+ * other having booted first. Returns the base, or `undefined` when the database could not be read; never
138
+ * throws.
139
+ *
140
+ * @internal the plugin runs it on bootstrap; there is no need to call it.
141
+ */
142
+ async adoptRowsWithoutBase(ctx) {
143
+ try {
144
+ const baseCurrency = await this.rateService.getBaseCurrency(ctx);
145
+ const repository = this.connection.getRepository(ctx, currency_exchange_rate_entity_1.CurrencyExchangeRate);
146
+ if (await fillMissingBase(repository, baseCurrency)) {
147
+ const rows = await repository.find({ where: { baseCurrency }, order: { code: 'ASC' } });
148
+ await this.eventBus.publish(new currency_exchange_rate_event_1.CurrencyExchangeRateEvent(ctx, rows, 'synced'));
149
+ }
150
+ return baseCurrency;
151
+ }
152
+ catch (e) {
153
+ core_1.Logger.warn(`Could not check the stored exchange rates: ${e.message}`, constants_1.loggerCtx);
154
+ return undefined;
155
+ }
156
+ }
157
+ /**
158
+ * {@link CurrencyExchangeRateSyncService.adoptRowsWithoutBase}, then syncs when no rate is stored in the
159
+ * current base: on the first boot, and after a restart that changed the base. Never throws: neither a
160
+ * source outage nor a database hiccup may stop the server.
121
161
  */
122
162
  async backfillIfEmpty(ctx) {
123
- const baseCurrency = await this.rateService.getBaseCurrency(ctx);
124
- if ((await this.connection.getRepository(ctx, currency_exchange_rate_entity_1.CurrencyExchangeRate).count({ where: { baseCurrency } })) > 0) {
163
+ const baseCurrency = await this.adoptRowsWithoutBase(ctx);
164
+ if (!baseCurrency) {
125
165
  return;
126
166
  }
127
167
  try {
168
+ if ((await this.connection.getRepository(ctx, currency_exchange_rate_entity_1.CurrencyExchangeRate).count({ where: { baseCurrency } })) > 0) {
169
+ return;
170
+ }
128
171
  const persisted = await this.syncRates(ctx);
129
172
  core_1.Logger.info(`Loaded ${persisted.length} exchange rates from ${this.options.source.name}`, constants_1.loggerCtx);
130
173
  }
@@ -1 +1 @@
1
- {"version":3,"file":"currency-exchange-rate-sync.service.js","sourceRoot":"","sources":["../../src/services/currency-exchange-rate-sync.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"currency-exchange-rate-sync.service.js","sourceRoot":"","sources":["../../src/services/currency-exchange-rate-sync.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,wCAAwG;AACxG,qCAAkD;AAClD,qFAA+E;AAC/E,4CAAwE;AACxE,kDAA8C;AAC9C,6FAAiF;AACjF,yFAAmF;AAGnF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,mBAAY,CAAC,CAAC,CAAC;AAE1E,SAAS,QAAQ,CAAC,KAAwB;IACxC,OAAO,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,yFAAyF;AACzF,SAAS,WAAW,CAAC,MAA2B;IAC9C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,eAAe,CAC5B,UAA4C,EAC5C,YAA0B;IAE1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,CAAC,IAAA,gBAAM,GAAE,EAAE,EAAkB,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,aAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,kDAAkD,YAAY,EAAE,EAAE,qBAAS,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AAEI,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAC1C,YAC0D,OAA2C,EAClF,UAAmC,EACnC,QAAkB,EAClB,WAAwC;QAHD,YAAO,GAAP,OAAO,CAAoC;QAClF,eAAU,GAAV,UAAU,CAAyB;QACnC,aAAQ,GAAR,QAAQ,CAAU;QAClB,gBAAW,GAAX,WAAW,CAA6B;IACxD,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,GAAmB;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAChC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,aAAM,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,4BAA4B,EAAE,qBAAS,CAAC,CAAC;QACjH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,0BAAW,EAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,aAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,oDAAoD,EAAE,qBAAS,CAAC,CAAC;YAC3F,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,+FAA+F;QAC/F,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACnF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,oDAAoB,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,CAAC,IAAI,CAAC,IAAI,oDAAoB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACnF,SAAS;gBACX,CAAC;gBACD,IAAI,OAAO,GAAkG,EAAE,CAAC;gBAChH,IAAI,QAAQ,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;oBAC3C,8DAA8D;oBAC9D,OAAO,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;oBACzE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClC,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC;gBACrB,CAAC;gBACD,iGAAiG;gBACjG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;oBAChC,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;oBACtD,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,+FAA+F;YAC/F,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,IAAA,aAAG,EAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,aAAM,CAAC,IAAI,CAAC,oBAAoB,YAAY,iCAAiC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAS,CAAC,CAAC;YAChH,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1G,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,aAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,qBAAqB,KAAK,6BAA6B,EAAE,qBAAS,CAAC,CAAC;YAChG,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;YACpE,OAAO;gBACL,0EAA0E;gBAC1E,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAChF,OAAO,EAAE,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO;aACrE,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,aAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,aAAa,YAAY,SAAS,MAAM,CAAC,IAAI,UAAU,IAAI,GAAG,EAAE,qBAAS,CAAC,CAAC;QAC/G,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,wDAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,oBAAoB,CAAC,GAAmB;QAC5C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,oDAAoB,CAAC,CAAC;YAC5E,IAAI,MAAM,eAAe,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxF,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,wDAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,aAAM,CAAC,IAAI,CAAC,8CAA+C,CAAW,CAAC,OAAO,EAAE,EAAE,qBAAS,CAAC,CAAC;YAC7F,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,GAAmB;QACvC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,oDAAoB,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5G,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5C,aAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,wBAAwB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,qBAAS,CAAC,CAAC;QACvG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,kGAAkG;YAClG,aAAM,CAAC,IAAI,CAAC,8CAA+C,CAAW,CAAC,OAAO,EAAE,EAAE,qBAAS,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;CACF,CAAA;AA9HY,0EAA+B;0CAA/B,+BAA+B;IAD3C,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,yCAA6B,CAAC,CAAA;6CACT,8BAAuB;QACzB,eAAQ;QACL,4DAA2B;GALhD,+BAA+B,CA8H3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uplab/vendure-plugin-exchange-rates",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Exchange rates for Vendure in any base currency, from the ECB, Frankfurter, Monobank, the NBU or your own source, overridable per currency in the dashboard",
5
5
  "license": "MIT",
6
6
  "author": "Uplab",