@adtrackify/at-service-common 3.2.26 → 3.2.27

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 (31) hide show
  1. package/dist/cjs/clients/third-party/exchange-rate-api-client.d.ts +17 -0
  2. package/dist/cjs/clients/third-party/exchange-rate-api-client.js +20 -0
  3. package/dist/cjs/clients/third-party/exchange-rate-api-client.js.map +1 -0
  4. package/dist/cjs/services/currency-exchange-rate-lookup-service.d.ts +11 -0
  5. package/dist/cjs/services/currency-exchange-rate-lookup-service.js +51 -0
  6. package/dist/cjs/services/currency-exchange-rate-lookup-service.js.map +1 -0
  7. package/dist/cjs/services/db/currency-exchange-rates-db-service.d.ts +21 -0
  8. package/dist/cjs/services/db/currency-exchange-rates-db-service.js +40 -0
  9. package/dist/cjs/services/db/currency-exchange-rates-db-service.js.map +1 -0
  10. package/dist/cjs/services/db/index.d.ts +1 -0
  11. package/dist/cjs/services/db/index.js +1 -0
  12. package/dist/cjs/services/db/index.js.map +1 -1
  13. package/dist/cjs/services/index.d.ts +1 -0
  14. package/dist/cjs/services/index.js +1 -0
  15. package/dist/cjs/services/index.js.map +1 -1
  16. package/dist/esm/clients/third-party/exchange-rate-api-client.d.ts +17 -0
  17. package/dist/esm/clients/third-party/exchange-rate-api-client.js +16 -0
  18. package/dist/esm/clients/third-party/exchange-rate-api-client.js.map +1 -0
  19. package/dist/esm/services/currency-exchange-rate-lookup-service.d.ts +11 -0
  20. package/dist/esm/services/currency-exchange-rate-lookup-service.js +47 -0
  21. package/dist/esm/services/currency-exchange-rate-lookup-service.js.map +1 -0
  22. package/dist/esm/services/db/currency-exchange-rates-db-service.d.ts +21 -0
  23. package/dist/esm/services/db/currency-exchange-rates-db-service.js +36 -0
  24. package/dist/esm/services/db/currency-exchange-rates-db-service.js.map +1 -0
  25. package/dist/esm/services/db/index.d.ts +1 -0
  26. package/dist/esm/services/db/index.js +1 -0
  27. package/dist/esm/services/db/index.js.map +1 -1
  28. package/dist/esm/services/index.d.ts +1 -0
  29. package/dist/esm/services/index.js +1 -0
  30. package/dist/esm/services/index.js.map +1 -1
  31. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ import { ApiResponse } from '../../types/api-response';
2
+ export interface GetCurrencyExchangeRateResponse {
3
+ result: string;
4
+ documentation?: string;
5
+ terms_of_use?: string;
6
+ time_last_update_unix: number;
7
+ time_last_update_utc: string;
8
+ time_next_update_unix: number;
9
+ time_next_update_utc: string;
10
+ base_code: string;
11
+ conversion_rates: Record<string, number>;
12
+ }
13
+ export declare class ExchangeRateApiClient {
14
+ private EXCHANGE_RATE_API_KEY;
15
+ constructor(exchangeRateApiKey: string);
16
+ getCurrencyExchangeRate: (currency: string) => Promise<ApiResponse<GetCurrencyExchangeRateResponse>>;
17
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExchangeRateApiClient = void 0;
4
+ const generic_1 = require("../generic");
5
+ const EXCHANGE_RATE_API_URL = 'https://v6.exchangerate-api.com/v6';
6
+ const client = (0, generic_1.axiosHttpService)({
7
+ baseURL: EXCHANGE_RATE_API_URL
8
+ });
9
+ class ExchangeRateApiClient {
10
+ EXCHANGE_RATE_API_KEY;
11
+ constructor(exchangeRateApiKey) {
12
+ this.EXCHANGE_RATE_API_KEY = exchangeRateApiKey;
13
+ }
14
+ getCurrencyExchangeRate = async (currency) => {
15
+ const response = await client.get(`/${this.EXCHANGE_RATE_API_KEY}/latest/${currency}`);
16
+ return response;
17
+ };
18
+ }
19
+ exports.ExchangeRateApiClient = ExchangeRateApiClient;
20
+ //# sourceMappingURL=exchange-rate-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange-rate-api-client.js","sourceRoot":"","sources":["../../../../src/clients/third-party/exchange-rate-api-client.ts"],"names":[],"mappings":";;;AAAA,wCAA8C;AAe9C,MAAM,qBAAqB,GAAG,oCAAoC,CAAC;AACnE,MAAM,MAAM,GAAG,IAAA,0BAAgB,EAAC;IAC9B,OAAO,EAAE,qBAAqB;CAC/B,CAAC,CAAC;AAEH,MAAa,qBAAqB;IACxB,qBAAqB,CAAS;IAEtC,YAAY,kBAA0B;QACpC,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC;IAClD,CAAC;IAEM,uBAAuB,GAAG,KAAK,EAAE,QAAgB,EAAyD,EAAE;QACjH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,qBAAqB,WAAW,QAAQ,EAAE,CAAC,CAAC;QACvF,OAAO,QAAwD,CAAC;IAClE,CAAC,CAAA;CACF;AAXD,sDAWC"}
@@ -0,0 +1,11 @@
1
+ import { CurrencyExchangeRateRecord } from './db/currency-exchange-rates-db-service';
2
+ export declare class CurrencyExchangeRateLookupService {
3
+ private TABLE_NAME;
4
+ private TABLE_KEY;
5
+ private EXCHANGE_RATE_API_KEY;
6
+ private TTL_IN_DAYS;
7
+ private currencyExchangeRatesDbService;
8
+ private exchangeRateApiClient;
9
+ constructor(tableName: string, tableKey: string, exchangeRateApiKey: string, ttlInDays?: number);
10
+ lookupCurrencyExchangeRate: (currency: string) => Promise<CurrencyExchangeRateRecord | null>;
11
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurrencyExchangeRateLookupService = void 0;
4
+ const luxon_1 = require("luxon");
5
+ const helpers_1 = require("../helpers");
6
+ const currency_exchange_rates_db_service_1 = require("./db/currency-exchange-rates-db-service");
7
+ const exchange_rate_api_client_1 = require("../clients/third-party/exchange-rate-api-client");
8
+ class CurrencyExchangeRateLookupService {
9
+ TABLE_NAME;
10
+ TABLE_KEY;
11
+ EXCHANGE_RATE_API_KEY;
12
+ TTL_IN_DAYS;
13
+ currencyExchangeRatesDbService;
14
+ exchangeRateApiClient;
15
+ constructor(tableName, tableKey, exchangeRateApiKey, ttlInDays) {
16
+ this.TABLE_NAME = tableName;
17
+ this.TABLE_KEY = tableKey;
18
+ this.EXCHANGE_RATE_API_KEY = exchangeRateApiKey;
19
+ this.TTL_IN_DAYS = ttlInDays || 7;
20
+ this.currencyExchangeRatesDbService = new currency_exchange_rates_db_service_1.CurrencyExchangeRatesDbService(this.TABLE_NAME, this.TABLE_KEY);
21
+ this.exchangeRateApiClient = new exchange_rate_api_client_1.ExchangeRateApiClient(this.EXCHANGE_RATE_API_KEY);
22
+ }
23
+ lookupCurrencyExchangeRate = async (currency) => {
24
+ try {
25
+ const record = await this.currencyExchangeRatesDbService.getCurrencyExchangeRate(currency);
26
+ if (record && record?.expiresAt && record.expiresAt < luxon_1.DateTime.utc().toSeconds()) {
27
+ helpers_1.Logger.debug('Currency exchange rate record found in db cache', { currency, record, expiresAt: record.expiresAt, currentEpoch: luxon_1.DateTime.utc().toSeconds() });
28
+ return record;
29
+ }
30
+ const response = await this.exchangeRateApiClient.getCurrencyExchangeRate(currency);
31
+ if (response.status !== 200 || response?.data?.result !== 'success' || !response?.data) {
32
+ helpers_1.Logger.error('Failed to lookup currency exchange rate', { response });
33
+ return null;
34
+ }
35
+ const exchangeRateResponse = response.data;
36
+ const currencyRates = exchangeRateResponse?.conversion_rates;
37
+ const providerLastUpdatedAtEpoch = exchangeRateResponse?.time_last_update_unix;
38
+ const providerNextUpdateAtEpoch = exchangeRateResponse?.time_next_update_unix;
39
+ const currencyExchangeRateRecord = this.currencyExchangeRatesDbService.buildCurrencyExchangeRateRecord(currency, currencyRates, this.TTL_IN_DAYS, 'exchangerate-api', providerLastUpdatedAtEpoch, providerNextUpdateAtEpoch);
40
+ await this.currencyExchangeRatesDbService.putCurrencyExchangeRate(currencyExchangeRateRecord);
41
+ helpers_1.Logger.debug('Currency exchange rate record put in db cache', { currency, currencyExchangeRateRecord, expiresAt: currencyExchangeRateRecord.expiresAt, currentEpoch: luxon_1.DateTime.utc().toSeconds() });
42
+ return currencyExchangeRateRecord ?? null;
43
+ }
44
+ catch (error) {
45
+ helpers_1.Logger.error('Failed to lookup currency exchange rate', { error, currency, tableName: this.TABLE_NAME, tableKey: this.TABLE_KEY, exchangeRateApiKey: this.EXCHANGE_RATE_API_KEY });
46
+ return null;
47
+ }
48
+ };
49
+ }
50
+ exports.CurrencyExchangeRateLookupService = CurrencyExchangeRateLookupService;
51
+ //# sourceMappingURL=currency-exchange-rate-lookup-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-exchange-rate-lookup-service.js","sourceRoot":"","sources":["../../../src/services/currency-exchange-rate-lookup-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type CurrencyRates = Record<string, number>;
2
+ export interface CurrencyExchangeRateRecord {
3
+ currency: string;
4
+ rates: CurrencyRates;
5
+ expiresAt: number;
6
+ cachedAt: string;
7
+ cachedAtEpoch: number;
8
+ provider?: string;
9
+ providerLastUpdatedAtEpoch?: number;
10
+ providerNextUpdateAtEpoch?: number;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ export declare class CurrencyExchangeRatesDbService {
15
+ TABLE_NAME: string;
16
+ TABLE_KEY: string;
17
+ constructor(tableName: string, tableKey: string);
18
+ getCurrencyExchangeRate: (currencyCode: string) => Promise<CurrencyExchangeRateRecord | null>;
19
+ buildCurrencyExchangeRateRecord: (currency: string, rates: CurrencyRates, ttlInDays: number, provider?: string, providerLastUpdatedAtEpoch?: number, providerNextUpdateAtEpoch?: number) => CurrencyExchangeRateRecord;
20
+ putCurrencyExchangeRate: (record: CurrencyExchangeRateRecord) => Promise<CurrencyExchangeRateRecord>;
21
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CurrencyExchangeRatesDbService = void 0;
4
+ const luxon_1 = require("luxon");
5
+ const clients_1 = require("../../clients");
6
+ const dates_1 = require("../../libs/dates");
7
+ class CurrencyExchangeRatesDbService {
8
+ TABLE_NAME;
9
+ TABLE_KEY;
10
+ constructor(tableName, tableKey) {
11
+ this.TABLE_NAME = tableName;
12
+ this.TABLE_KEY = tableKey;
13
+ }
14
+ getCurrencyExchangeRate = async (currencyCode) => {
15
+ const record = await clients_1.DynamoDbClient.safeGet(this.TABLE_NAME, this.TABLE_KEY, currencyCode);
16
+ return record ?? null;
17
+ };
18
+ buildCurrencyExchangeRateRecord = (currency, rates, ttlInDays, provider, providerLastUpdatedAtEpoch, providerNextUpdateAtEpoch) => {
19
+ const expiresAt = luxon_1.DateTime.utc().plus({ days: ttlInDays }).toSeconds();
20
+ const currentTimestamp = (0, dates_1.getCurrentTimestamp)();
21
+ return {
22
+ currency,
23
+ rates,
24
+ expiresAt,
25
+ cachedAt: currentTimestamp,
26
+ cachedAtEpoch: luxon_1.DateTime.utc().toSeconds(),
27
+ createdAt: currentTimestamp,
28
+ updatedAt: currentTimestamp,
29
+ provider,
30
+ providerLastUpdatedAtEpoch,
31
+ providerNextUpdateAtEpoch,
32
+ };
33
+ };
34
+ putCurrencyExchangeRate = async (record) => {
35
+ await clients_1.DynamoDbClient.safePut(this.TABLE_NAME, record);
36
+ return record;
37
+ };
38
+ }
39
+ exports.CurrencyExchangeRatesDbService = CurrencyExchangeRatesDbService;
40
+ //# sourceMappingURL=currency-exchange-rates-db-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-exchange-rates-db-service.js","sourceRoot":"","sources":["../../../../src/services/db/currency-exchange-rates-db-service.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,2CAA+C;AAC/C,4CAAuD;AAgBvD,MAAa,8BAA8B;IAClC,UAAU,CAAS;IACnB,SAAS,CAAS;IAEzB,YAAY,SAAiB,EAAE,QAAgB;QAC7C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEM,uBAAuB,GAAG,KAAK,EAAE,YAAoB,EAA8C,EAAE;QAC1G,MAAM,MAAM,GAAG,MAAM,wBAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC3F,OAAQ,MAAqC,IAAI,IAAI,CAAC;IACxD,CAAC,CAAA;IAEM,+BAA+B,GAAG,CAAC,QAAgB,EAAE,KAAoB,EAAE,SAAiB,EAAE,QAAiB,EAAE,0BAAmC,EAAE,yBAAkC,EAA8B,EAAE;QAC7N,MAAM,SAAS,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACvE,MAAM,gBAAgB,GAAG,IAAA,2BAAmB,GAAE,CAAC;QAC/C,OAAO;YACL,QAAQ;YACR,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,gBAAgB;YAC1B,aAAa,EAAE,gBAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE;YACzC,SAAS,EAAE,gBAAgB;YAC3B,SAAS,EAAE,gBAAgB;YAC3B,QAAQ;YACR,0BAA0B;YAC1B,yBAAyB;SAC1B,CAAC;IACJ,CAAC,CAAA;IAEM,uBAAuB,GAAG,KAAK,EAAE,MAAkC,EAAuC,EAAE;QACjH,MAAM,wBAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAA;CACF;AAnCD,wEAmCC"}
@@ -6,3 +6,4 @@ export * from './tracking-events-db-service.js';
6
6
  export * from './shopify-products-cache-db-service.js';
7
7
  export * from './shopify-app-installs-db-service.js';
8
8
  export * from './identity-cache-db-service.js';
9
+ export * from './currency-exchange-rates-db-service.js';
@@ -22,4 +22,5 @@ __exportStar(require("./tracking-events-db-service.js"), exports);
22
22
  __exportStar(require("./shopify-products-cache-db-service.js"), exports);
23
23
  __exportStar(require("./shopify-app-installs-db-service.js"), exports);
24
24
  __exportStar(require("./identity-cache-db-service.js"), exports);
25
+ __exportStar(require("./currency-exchange-rates-db-service.js"), exports);
25
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/db/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,6DAA2C;AAC3C,uEAAqD;AACrD,qEAAmD;AACnD,kEAAgD;AAChD,yEAAuD;AACvD,uEAAqD;AACrD,iEAA+C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/db/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,6DAA2C;AAC3C,uEAAqD;AACrD,qEAAmD;AACnD,kEAAgD;AAChD,yEAAuD;AACvD,uEAAqD;AACrD,iEAA+C;AAC/C,0EAAwD"}
@@ -1,6 +1,7 @@
1
1
  export * from './eventbridge-integration-service.js';
2
2
  export * from './ipdata-lookup-service.js';
3
3
  export * from './generic-cache-service.js';
4
+ export * from './currency-exchange-rate-lookup-service.js';
4
5
  export * from './db';
5
6
  export * from './shopify';
6
7
  export * from './cache';
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./eventbridge-integration-service.js"), exports);
18
18
  __exportStar(require("./ipdata-lookup-service.js"), exports);
19
19
  __exportStar(require("./generic-cache-service.js"), exports);
20
+ __exportStar(require("./currency-exchange-rate-lookup-service.js"), exports);
20
21
  __exportStar(require("./db"), exports);
21
22
  __exportStar(require("./shopify"), exports);
22
23
  __exportStar(require("./cache"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uEAAqD;AACrD,6DAA2C;AAC3C,6DAA2C;AAC3C,uCAAqB;AACrB,4CAA0B;AAC1B,0CAAwB;AACxB,2CAAyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uEAAqD;AACrD,6DAA2C;AAC3C,6DAA2C;AAC3C,6EAA2D;AAC3D,uCAAqB;AACrB,4CAA0B;AAC1B,0CAAwB;AACxB,2CAAyB"}
@@ -0,0 +1,17 @@
1
+ import { ApiResponse } from '../../types/api-response';
2
+ export interface GetCurrencyExchangeRateResponse {
3
+ result: string;
4
+ documentation?: string;
5
+ terms_of_use?: string;
6
+ time_last_update_unix: number;
7
+ time_last_update_utc: string;
8
+ time_next_update_unix: number;
9
+ time_next_update_utc: string;
10
+ base_code: string;
11
+ conversion_rates: Record<string, number>;
12
+ }
13
+ export declare class ExchangeRateApiClient {
14
+ private EXCHANGE_RATE_API_KEY;
15
+ constructor(exchangeRateApiKey: string);
16
+ getCurrencyExchangeRate: (currency: string) => Promise<ApiResponse<GetCurrencyExchangeRateResponse>>;
17
+ }
@@ -0,0 +1,16 @@
1
+ import { axiosHttpService } from '../generic';
2
+ const EXCHANGE_RATE_API_URL = 'https://v6.exchangerate-api.com/v6';
3
+ const client = axiosHttpService({
4
+ baseURL: EXCHANGE_RATE_API_URL
5
+ });
6
+ export class ExchangeRateApiClient {
7
+ EXCHANGE_RATE_API_KEY;
8
+ constructor(exchangeRateApiKey) {
9
+ this.EXCHANGE_RATE_API_KEY = exchangeRateApiKey;
10
+ }
11
+ getCurrencyExchangeRate = async (currency) => {
12
+ const response = await client.get(`/${this.EXCHANGE_RATE_API_KEY}/latest/${currency}`);
13
+ return response;
14
+ };
15
+ }
16
+ //# sourceMappingURL=exchange-rate-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange-rate-api-client.js","sourceRoot":"","sources":["../../../../src/clients/third-party/exchange-rate-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAe9C,MAAM,qBAAqB,GAAG,oCAAoC,CAAC;AACnE,MAAM,MAAM,GAAG,gBAAgB,CAAC;IAC9B,OAAO,EAAE,qBAAqB;CAC/B,CAAC,CAAC;AAEH,MAAM,OAAO,qBAAqB;IACxB,qBAAqB,CAAS;IAEtC,YAAY,kBAA0B;QACpC,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC;IAClD,CAAC;IAEM,uBAAuB,GAAG,KAAK,EAAE,QAAgB,EAAyD,EAAE;QACjH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,qBAAqB,WAAW,QAAQ,EAAE,CAAC,CAAC;QACvF,OAAO,QAAwD,CAAC;IAClE,CAAC,CAAA;CACF"}
@@ -0,0 +1,11 @@
1
+ import { CurrencyExchangeRateRecord } from './db/currency-exchange-rates-db-service';
2
+ export declare class CurrencyExchangeRateLookupService {
3
+ private TABLE_NAME;
4
+ private TABLE_KEY;
5
+ private EXCHANGE_RATE_API_KEY;
6
+ private TTL_IN_DAYS;
7
+ private currencyExchangeRatesDbService;
8
+ private exchangeRateApiClient;
9
+ constructor(tableName: string, tableKey: string, exchangeRateApiKey: string, ttlInDays?: number);
10
+ lookupCurrencyExchangeRate: (currency: string) => Promise<CurrencyExchangeRateRecord | null>;
11
+ }
@@ -0,0 +1,47 @@
1
+ import { DateTime } from 'luxon';
2
+ import { Logger } from '../helpers';
3
+ import { CurrencyExchangeRatesDbService } from './db/currency-exchange-rates-db-service';
4
+ import { ExchangeRateApiClient } from '../clients/third-party/exchange-rate-api-client';
5
+ export class CurrencyExchangeRateLookupService {
6
+ TABLE_NAME;
7
+ TABLE_KEY;
8
+ EXCHANGE_RATE_API_KEY;
9
+ TTL_IN_DAYS;
10
+ currencyExchangeRatesDbService;
11
+ exchangeRateApiClient;
12
+ constructor(tableName, tableKey, exchangeRateApiKey, ttlInDays) {
13
+ this.TABLE_NAME = tableName;
14
+ this.TABLE_KEY = tableKey;
15
+ this.EXCHANGE_RATE_API_KEY = exchangeRateApiKey;
16
+ this.TTL_IN_DAYS = ttlInDays || 7;
17
+ this.currencyExchangeRatesDbService = new CurrencyExchangeRatesDbService(this.TABLE_NAME, this.TABLE_KEY);
18
+ this.exchangeRateApiClient = new ExchangeRateApiClient(this.EXCHANGE_RATE_API_KEY);
19
+ }
20
+ lookupCurrencyExchangeRate = async (currency) => {
21
+ try {
22
+ const record = await this.currencyExchangeRatesDbService.getCurrencyExchangeRate(currency);
23
+ if (record && record?.expiresAt && record.expiresAt < DateTime.utc().toSeconds()) {
24
+ Logger.debug('Currency exchange rate record found in db cache', { currency, record, expiresAt: record.expiresAt, currentEpoch: DateTime.utc().toSeconds() });
25
+ return record;
26
+ }
27
+ const response = await this.exchangeRateApiClient.getCurrencyExchangeRate(currency);
28
+ if (response.status !== 200 || response?.data?.result !== 'success' || !response?.data) {
29
+ Logger.error('Failed to lookup currency exchange rate', { response });
30
+ return null;
31
+ }
32
+ const exchangeRateResponse = response.data;
33
+ const currencyRates = exchangeRateResponse?.conversion_rates;
34
+ const providerLastUpdatedAtEpoch = exchangeRateResponse?.time_last_update_unix;
35
+ const providerNextUpdateAtEpoch = exchangeRateResponse?.time_next_update_unix;
36
+ const currencyExchangeRateRecord = this.currencyExchangeRatesDbService.buildCurrencyExchangeRateRecord(currency, currencyRates, this.TTL_IN_DAYS, 'exchangerate-api', providerLastUpdatedAtEpoch, providerNextUpdateAtEpoch);
37
+ await this.currencyExchangeRatesDbService.putCurrencyExchangeRate(currencyExchangeRateRecord);
38
+ Logger.debug('Currency exchange rate record put in db cache', { currency, currencyExchangeRateRecord, expiresAt: currencyExchangeRateRecord.expiresAt, currentEpoch: DateTime.utc().toSeconds() });
39
+ return currencyExchangeRateRecord ?? null;
40
+ }
41
+ catch (error) {
42
+ Logger.error('Failed to lookup currency exchange rate', { error, currency, tableName: this.TABLE_NAME, tableKey: this.TABLE_KEY, exchangeRateApiKey: this.EXCHANGE_RATE_API_KEY });
43
+ return null;
44
+ }
45
+ };
46
+ }
47
+ //# sourceMappingURL=currency-exchange-rate-lookup-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-exchange-rate-lookup-service.js","sourceRoot":"","sources":["../../../src/services/currency-exchange-rate-lookup-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAA8B,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACrH,OAAO,EAAE,qBAAqB,EAAmC,MAAM,iDAAiD,CAAC;AAEzH,MAAM,OAAO,iCAAiC;IACpC,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,qBAAqB,CAAS;IAC9B,WAAW,CAAS;IAEpB,8BAA8B,CAAiC;IAC/D,qBAAqB,CAAwB;IAErD,YAAY,SAAiB,EAAE,QAAgB,EAAE,kBAA0B,EAAE,SAAkB;QAC7F,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,qBAAqB,GAAG,kBAAkB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,SAAS,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC,8BAA8B,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1G,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrF,CAAC;IAED,0BAA0B,GAAG,KAAK,EAAE,QAAgB,EAA8C,EAAE;QAClG,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YAC3F,IAAI,MAAM,IAAI,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE;gBAChF,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC7J,OAAO,MAAM,CAAC;aACf;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;gBACtF,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;aACb;YAED,MAAM,oBAAoB,GAAoC,QAAQ,CAAC,IAAI,CAAC;YAC5E,MAAM,aAAa,GAAG,oBAAoB,EAAE,gBAAgB,CAAC;YAC7D,MAAM,0BAA0B,GAAG,oBAAoB,EAAE,qBAAqB,CAAC;YAC/E,MAAM,yBAAyB,GAAG,oBAAoB,EAAE,qBAAqB,CAAC;YAC9E,MAAM,0BAA0B,GAAG,IAAI,CAAC,8BAA8B,CAAC,+BAA+B,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,yBAAyB,CAAC,CAAC;YAC7N,MAAM,IAAI,CAAC,8BAA8B,CAAC,uBAAuB,CAAC,0BAA0B,CAAC,CAAC;YAC9F,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,EAAE,QAAQ,EAAE,0BAA0B,EAAE,SAAS,EAAE,0BAA0B,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACnM,OAAO,0BAA0B,IAAI,IAAI,CAAC;SAC3C;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACnL,OAAO,IAAI,CAAC;SACb;IACH,CAAC,CAAA;CACF"}
@@ -0,0 +1,21 @@
1
+ export type CurrencyRates = Record<string, number>;
2
+ export interface CurrencyExchangeRateRecord {
3
+ currency: string;
4
+ rates: CurrencyRates;
5
+ expiresAt: number;
6
+ cachedAt: string;
7
+ cachedAtEpoch: number;
8
+ provider?: string;
9
+ providerLastUpdatedAtEpoch?: number;
10
+ providerNextUpdateAtEpoch?: number;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ export declare class CurrencyExchangeRatesDbService {
15
+ TABLE_NAME: string;
16
+ TABLE_KEY: string;
17
+ constructor(tableName: string, tableKey: string);
18
+ getCurrencyExchangeRate: (currencyCode: string) => Promise<CurrencyExchangeRateRecord | null>;
19
+ buildCurrencyExchangeRateRecord: (currency: string, rates: CurrencyRates, ttlInDays: number, provider?: string, providerLastUpdatedAtEpoch?: number, providerNextUpdateAtEpoch?: number) => CurrencyExchangeRateRecord;
20
+ putCurrencyExchangeRate: (record: CurrencyExchangeRateRecord) => Promise<CurrencyExchangeRateRecord>;
21
+ }
@@ -0,0 +1,36 @@
1
+ import { DateTime } from 'luxon';
2
+ import { DynamoDbClient } from '../../clients';
3
+ import { getCurrentTimestamp } from '../../libs/dates';
4
+ export class CurrencyExchangeRatesDbService {
5
+ TABLE_NAME;
6
+ TABLE_KEY;
7
+ constructor(tableName, tableKey) {
8
+ this.TABLE_NAME = tableName;
9
+ this.TABLE_KEY = tableKey;
10
+ }
11
+ getCurrencyExchangeRate = async (currencyCode) => {
12
+ const record = await DynamoDbClient.safeGet(this.TABLE_NAME, this.TABLE_KEY, currencyCode);
13
+ return record ?? null;
14
+ };
15
+ buildCurrencyExchangeRateRecord = (currency, rates, ttlInDays, provider, providerLastUpdatedAtEpoch, providerNextUpdateAtEpoch) => {
16
+ const expiresAt = DateTime.utc().plus({ days: ttlInDays }).toSeconds();
17
+ const currentTimestamp = getCurrentTimestamp();
18
+ return {
19
+ currency,
20
+ rates,
21
+ expiresAt,
22
+ cachedAt: currentTimestamp,
23
+ cachedAtEpoch: DateTime.utc().toSeconds(),
24
+ createdAt: currentTimestamp,
25
+ updatedAt: currentTimestamp,
26
+ provider,
27
+ providerLastUpdatedAtEpoch,
28
+ providerNextUpdateAtEpoch,
29
+ };
30
+ };
31
+ putCurrencyExchangeRate = async (record) => {
32
+ await DynamoDbClient.safePut(this.TABLE_NAME, record);
33
+ return record;
34
+ };
35
+ }
36
+ //# sourceMappingURL=currency-exchange-rates-db-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-exchange-rates-db-service.js","sourceRoot":"","sources":["../../../../src/services/db/currency-exchange-rates-db-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgBvD,MAAM,OAAO,8BAA8B;IAClC,UAAU,CAAS;IACnB,SAAS,CAAS;IAEzB,YAAY,SAAiB,EAAE,QAAgB;QAC7C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEM,uBAAuB,GAAG,KAAK,EAAE,YAAoB,EAA8C,EAAE;QAC1G,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC3F,OAAQ,MAAqC,IAAI,IAAI,CAAC;IACxD,CAAC,CAAA;IAEM,+BAA+B,GAAG,CAAC,QAAgB,EAAE,KAAoB,EAAE,SAAiB,EAAE,QAAiB,EAAE,0BAAmC,EAAE,yBAAkC,EAA8B,EAAE;QAC7N,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACvE,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;QAC/C,OAAO;YACL,QAAQ;YACR,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,gBAAgB;YAC1B,aAAa,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE;YACzC,SAAS,EAAE,gBAAgB;YAC3B,SAAS,EAAE,gBAAgB;YAC3B,QAAQ;YACR,0BAA0B;YAC1B,yBAAyB;SAC1B,CAAC;IACJ,CAAC,CAAA;IAEM,uBAAuB,GAAG,KAAK,EAAE,MAAkC,EAAuC,EAAE;QACjH,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAA;CACF"}
@@ -6,3 +6,4 @@ export * from './tracking-events-db-service.js';
6
6
  export * from './shopify-products-cache-db-service.js';
7
7
  export * from './shopify-app-installs-db-service.js';
8
8
  export * from './identity-cache-db-service.js';
9
+ export * from './currency-exchange-rates-db-service.js';
@@ -6,4 +6,5 @@ export * from './tracking-events-db-service.js';
6
6
  export * from './shopify-products-cache-db-service.js';
7
7
  export * from './shopify-app-installs-db-service.js';
8
8
  export * from './identity-cache-db-service.js';
9
+ export * from './currency-exchange-rates-db-service.js';
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './eventbridge-integration-service.js';
2
2
  export * from './ipdata-lookup-service.js';
3
3
  export * from './generic-cache-service.js';
4
+ export * from './currency-exchange-rate-lookup-service.js';
4
5
  export * from './db';
5
6
  export * from './shopify';
6
7
  export * from './cache';
@@ -1,6 +1,7 @@
1
1
  export * from './eventbridge-integration-service.js';
2
2
  export * from './ipdata-lookup-service.js';
3
3
  export * from './generic-cache-service.js';
4
+ export * from './currency-exchange-rate-lookup-service.js';
4
5
  export * from './db';
5
6
  export * from './shopify';
6
7
  export * from './cache';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adtrackify/at-service-common",
3
- "version": "3.2.26",
3
+ "version": "3.2.27",
4
4
  "description": "",
5
5
  "files": [
6
6
  "dist/*"