@studyportals/campaign-management-api-interface 16.1.3 → 16.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/index.d.ts +5 -1
  2. package/index.js +8 -1
  3. package/index.js.map +1 -1
  4. package/package.json +52 -52
  5. package/src/auditor-campaign-management-api.client.d.ts +4 -0
  6. package/src/auditor-campaign-management-api.client.js +4 -0
  7. package/src/auditor-campaign-management-api.client.js.map +1 -1
  8. package/src/domain/campaign/enriched-organisation-geotargeting.dto.d.ts +2 -2
  9. package/src/domain/campaign/enriched-study-geotargeting.dto.d.ts +2 -2
  10. package/src/domain/campaign/entity-geotargeting.dto.d.ts +5 -5
  11. package/src/domain/campaign/targeted-countries.dto.d.ts +3 -0
  12. package/src/domain/campaign/targeted-countries.dto.js +3 -0
  13. package/src/domain/campaign/targeted-countries.dto.js.map +1 -1
  14. package/src/domain/types/geotarginator/entity-configs-group.d.ts +5 -0
  15. package/src/domain/types/geotarginator/entity-configs-group.js +3 -0
  16. package/src/domain/types/geotarginator/entity-configs-group.js.map +1 -0
  17. package/src/domain/types/geotarginator/flat-entity-config.d.ts +5 -0
  18. package/src/domain/types/geotarginator/flat-entity-config.js +3 -0
  19. package/src/domain/types/geotarginator/flat-entity-config.js.map +1 -0
  20. package/src/domain/types/geotarginator/geotargeting-entity.d.ts +5 -0
  21. package/src/domain/types/geotarginator/geotargeting-entity.js +3 -0
  22. package/src/domain/types/geotarginator/geotargeting-entity.js.map +1 -0
  23. package/src/domain/types/geotarginator/index.d.ts +5 -0
  24. package/src/domain/types/geotarginator/index.js +3 -0
  25. package/src/domain/types/geotarginator/index.js.map +1 -0
  26. package/src/domain/types/geotarginator/save-campaign-geotargeting-request.d.ts +7 -0
  27. package/src/domain/types/geotarginator/save-campaign-geotargeting-request.js +3 -0
  28. package/src/domain/types/geotarginator/save-campaign-geotargeting-request.js.map +1 -0
  29. package/src/domain/types/geotarginator/targeted-countries.d.ts +5 -0
  30. package/src/domain/types/geotarginator/targeted-countries.js +3 -0
  31. package/src/domain/types/geotarginator/targeted-countries.js.map +1 -0
  32. package/src/geotarginator-front-cma-client.d.ts +16 -0
  33. package/src/geotarginator-front-cma-client.js +33 -0
  34. package/src/geotarginator-front-cma-client.js.map +1 -0
  35. package/src/helper/aws-request-method.d.ts +1 -0
  36. package/src/helper/aws-request-method.js +3 -0
  37. package/src/helper/aws-request-method.js.map +1 -0
  38. package/src/helper/aws-request-signer-props.d.ts +8 -0
  39. package/src/helper/aws-request-signer-props.js +3 -0
  40. package/src/helper/aws-request-signer-props.js.map +1 -0
  41. package/src/helper/aws-request-signer.d.ts +5 -0
  42. package/src/helper/aws-request-signer.js +31 -0
  43. package/src/helper/aws-request-signer.js.map +1 -0
  44. package/src/private-user-campaign-management-api.client.d.ts +1 -0
  45. package/src/private-user-campaign-management-api.client.js +21 -54
  46. package/src/private-user-campaign-management-api.client.js.map +1 -1
  47. package/src/utils/entity-configs.d.ts +17 -0
  48. package/src/utils/entity-configs.js +37 -0
  49. package/src/utils/entity-configs.js.map +1 -0
package/index.d.ts CHANGED
@@ -20,6 +20,10 @@ import { ProductsCampaignManagementAPIClient } from "./src/products-campaign-man
20
20
  import { PublicStatusClient } from "./src/public-status-client";
21
21
  import { CampaignEditorFrontendStatusDto, StatusHealthy, StatusBlocked } from "./src/domain/types/campaign-editor-frontend-status.dto";
22
22
  import { PrivateUserCampaignManagementAPIClient } from "./src/private-user-campaign-management-api.client";
23
+ import { IdDto } from "./src/domain/id.dto";
24
+ import { GeotarginatorFrontCMAClient } from "./src/geotarginator-front-cma-client";
25
+ import { groupEntityConfigs, flattenEntityConfigs } from "./src/utils/entity-configs";
26
+ import { SaveCampaignGeotargetingRequest, GeotargetingEntity, TargetedCountries, EntityConfigsGroup, FlatEntityConfig } from "./src/domain/types/geotarginator";
23
27
  export * from "./src/domain/campaign";
24
28
  export * from "./src/domain/users";
25
29
  export * from "./src/validation";
@@ -27,4 +31,4 @@ export * from "./src/domain/organisations";
27
31
  export * from "./src/domain/products";
28
32
  export * from "./src/domain/degrees";
29
33
  export * from "./src/campaign-saving";
30
- export { AuditorCampaignManagementAPIClient, OrganisationsCampaignManagementAPIClient, CampaignManagementAPIClient, PrivateCampaignManagementAPIClient, PrivateUserCampaignManagementAPIClient, UserCampaignManagementAPIClient, StudyCampaignManagementAPIClient, LinksCampaignManagementAPIClient, ProductsCampaignManagementAPIClient, PublicStatusClient, AuditorEntityType, AuditorOperation, LinkType, LinkEntityType, SwappingEnabledLinkTypes, GetAuditorDto, PersistGoogleLinkerResultDto, CampaignsEntitiesConfigDto, MinimalOrganisationDto, CampaignEditorFrontendStatusDto, StatusHealthy, StatusBlocked, NumberMap, Pricing, ICampaignAuditorData, SuperAgentResponseCover };
34
+ export { AuditorCampaignManagementAPIClient, OrganisationsCampaignManagementAPIClient, CampaignManagementAPIClient, PrivateCampaignManagementAPIClient, PrivateUserCampaignManagementAPIClient, UserCampaignManagementAPIClient, StudyCampaignManagementAPIClient, LinksCampaignManagementAPIClient, ProductsCampaignManagementAPIClient, PublicStatusClient, GeotarginatorFrontCMAClient, AuditorEntityType, AuditorOperation, LinkType, LinkEntityType, SwappingEnabledLinkTypes, GetAuditorDto, PersistGoogleLinkerResultDto, IdDto, CampaignsEntitiesConfigDto, MinimalOrganisationDto, CampaignEditorFrontendStatusDto, StatusHealthy, StatusBlocked, SaveCampaignGeotargetingRequest, GeotargetingEntity, TargetedCountries, EntityConfigsGroup, FlatEntityConfig, groupEntityConfigs, flattenEntityConfigs, NumberMap, Pricing, ICampaignAuditorData, SuperAgentResponseCover };
package/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.Pricing = exports.MinimalOrganisationDto = exports.CampaignsEntitiesConfigDto = exports.PersistGoogleLinkerResultDto = exports.GetAuditorDto = exports.SwappingEnabledLinkTypes = exports.LinkEntityType = exports.LinkType = exports.AuditorOperation = exports.AuditorEntityType = exports.PublicStatusClient = exports.ProductsCampaignManagementAPIClient = exports.LinksCampaignManagementAPIClient = exports.StudyCampaignManagementAPIClient = exports.UserCampaignManagementAPIClient = exports.PrivateUserCampaignManagementAPIClient = exports.PrivateCampaignManagementAPIClient = exports.CampaignManagementAPIClient = exports.OrganisationsCampaignManagementAPIClient = exports.AuditorCampaignManagementAPIClient = void 0;
17
+ exports.Pricing = exports.flattenEntityConfigs = exports.groupEntityConfigs = exports.MinimalOrganisationDto = exports.CampaignsEntitiesConfigDto = exports.IdDto = exports.PersistGoogleLinkerResultDto = exports.GetAuditorDto = exports.SwappingEnabledLinkTypes = exports.LinkEntityType = exports.LinkType = exports.AuditorOperation = exports.AuditorEntityType = exports.GeotarginatorFrontCMAClient = exports.PublicStatusClient = exports.ProductsCampaignManagementAPIClient = exports.LinksCampaignManagementAPIClient = exports.StudyCampaignManagementAPIClient = exports.UserCampaignManagementAPIClient = exports.PrivateUserCampaignManagementAPIClient = exports.PrivateCampaignManagementAPIClient = exports.CampaignManagementAPIClient = exports.OrganisationsCampaignManagementAPIClient = exports.AuditorCampaignManagementAPIClient = void 0;
18
18
  const auditor_campaign_management_api_client_1 = require("./src/auditor-campaign-management-api.client");
19
19
  Object.defineProperty(exports, "AuditorCampaignManagementAPIClient", { enumerable: true, get: function () { return auditor_campaign_management_api_client_1.AuditorCampaignManagementAPIClient; } });
20
20
  const organisations_campaign_management_api_client_1 = require("./src/organisations-campaign-management-api.client");
@@ -55,6 +55,13 @@ const public_status_client_1 = require("./src/public-status-client");
55
55
  Object.defineProperty(exports, "PublicStatusClient", { enumerable: true, get: function () { return public_status_client_1.PublicStatusClient; } });
56
56
  const private_user_campaign_management_api_client_1 = require("./src/private-user-campaign-management-api.client");
57
57
  Object.defineProperty(exports, "PrivateUserCampaignManagementAPIClient", { enumerable: true, get: function () { return private_user_campaign_management_api_client_1.PrivateUserCampaignManagementAPIClient; } });
58
+ const id_dto_1 = require("./src/domain/id.dto");
59
+ Object.defineProperty(exports, "IdDto", { enumerable: true, get: function () { return id_dto_1.IdDto; } });
60
+ const geotarginator_front_cma_client_1 = require("./src/geotarginator-front-cma-client");
61
+ Object.defineProperty(exports, "GeotarginatorFrontCMAClient", { enumerable: true, get: function () { return geotarginator_front_cma_client_1.GeotarginatorFrontCMAClient; } });
62
+ const entity_configs_1 = require("./src/utils/entity-configs");
63
+ Object.defineProperty(exports, "groupEntityConfigs", { enumerable: true, get: function () { return entity_configs_1.groupEntityConfigs; } });
64
+ Object.defineProperty(exports, "flattenEntityConfigs", { enumerable: true, get: function () { return entity_configs_1.flattenEntityConfigs; } });
58
65
  __exportStar(require("./src/domain/campaign"), exports);
59
66
  __exportStar(require("./src/domain/users"), exports);
60
67
  __exportStar(require("./src/validation"), exports);
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yGAAkG;AAiCjG,mHAjCQ,2EAAkC,OAiCR;AAhCnC,qHAA8G;AAiC7G,yHAjCQ,uFAAwC,OAiCR;AAhCzC,yFAAmF;AAiClF,4GAjCQ,4DAA2B,OAiCR;AAhC5B,kGAAwF;AA0CvF,kGA1CQ,4CAAiB,OA0CR;AAzClB,8FAAqF;AA0CpF,iGA1CQ,yCAAgB,OA0CR;AAzCjB,0EAAqE;AA+CpE,8FA/CQ,+BAAa,OA+CR;AA9Cd,qGAAgG;AAkD/F,2GAlDQ,yDAA0B,OAkDR;AAjD3B,gGAAgH;AA4D/G,wFA5DmB,+BAAO,OA4DnB;AA3DR,yGAAkG;AA4BjG,mHA5BQ,2EAAkC,OA4BR;AA3BnC,mGAA4F;AA6B3F,gHA7BQ,qEAA+B,OA6BR;AA5BhC,qGAA8F;AA6B7F,iHA7BQ,uEAAgC,OA6BR;AA5BjC,oGAA8F;AAgD7F,uGAhDQ,kDAAsB,OAgDR;AA/CvB,8EAAqE;AAmCpE,yFAnCQ,yBAAQ,OAmCR;AAlCT,6GAAsG;AAwCrG,6GAxCQ,+DAA4B,OAwCR;AAvC7B,oFAA0E;AAkCzE,+FAlCQ,sCAAc,OAkCR;AAjCf,qGAA8F;AAyB7F,iHAzBQ,uEAAgC,OAyBR;AAxBjC,0GAA+F;AAiC9F,yGAjCQ,2DAAwB,OAiCR;AA/BzB,2GAAoG;AAuBnG,oHAvBQ,6EAAmC,OAuBR;AAtBpC,qEAAgE;AAuB/D,mGAvBQ,yCAAkB,OAuBR;AArBnB,mHAA2G;AAgB1G,uHAhBQ,oFAAsC,OAgBR;AAdvC,wDAAsC;AACtC,qDAAmC;AACnC,mDAAiC;AACjC,6DAA2C;AAC3C,wDAAsC;AACtC,uDAAqC;AACrC,wDAAsC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yGAAkG;AA2CjG,mHA3CQ,2EAAkC,OA2CR;AA1CnC,qHAA8G;AA2C7G,yHA3CQ,uFAAwC,OA2CR;AA1CzC,yFAAmF;AA2ClF,4GA3CQ,4DAA2B,OA2CR;AA1C5B,kGAAwF;AAqDvF,kGArDQ,4CAAiB,OAqDR;AApDlB,8FAAqF;AAqDpF,iGArDQ,yCAAgB,OAqDR;AApDjB,0EAAqE;AA0DpE,8FA1DQ,+BAAa,OA0DR;AAzDd,qGAAgG;AA8D/F,2GA9DQ,yDAA0B,OA8DR;AA7D3B,gGAAgH;AAmF/G,wFAnFmB,+BAAO,OAmFnB;AAlFR,yGAAkG;AAsCjG,mHAtCQ,2EAAkC,OAsCR;AArCnC,mGAA4F;AAuC3F,gHAvCQ,qEAA+B,OAuCR;AAtChC,qGAA8F;AAuC7F,iHAvCQ,uEAAgC,OAuCR;AAtCjC,oGAA8F;AA4D7F,uGA5DQ,kDAAsB,OA4DR;AA3DvB,8EAAqE;AA8CpE,yFA9CQ,yBAAQ,OA8CR;AA7CT,6GAAsG;AAmDrG,6GAnDQ,+DAA4B,OAmDR;AAlD7B,oFAA0E;AA6CzE,+FA7CQ,sCAAc,OA6CR;AA5Cf,qGAA8F;AAmC7F,iHAnCQ,uEAAgC,OAmCR;AAlCjC,0GAA+F;AA4C9F,yGA5CQ,2DAAwB,OA4CR;AA1CzB,2GAAoG;AAiCnG,oHAjCQ,6EAAmC,OAiCR;AAhCpC,qEAAgE;AAiC/D,mGAjCQ,yCAAkB,OAiCR;AA/BnB,mHAA2G;AA0B1G,uHA1BQ,oFAAsC,OA0BR;AAzBvC,gDAA4C;AA2C3C,sFA3CQ,cAAK,OA2CR;AA1CN,yFAAmF;AA8BlF,4GA9BQ,4DAA2B,OA8BR;AA7B5B,+DAAsF;AA8DrF,mGA9DQ,mCAAkB,OA8DR;AAClB,qGA/D4B,qCAAoB,OA+D5B;AAtDrB,wDAAsC;AACtC,qDAAmC;AACnC,mDAAiC;AACjC,6DAA2C;AAC3C,wDAAsC;AACtC,uDAAqC;AACrC,wDAAsC"}
package/package.json CHANGED
@@ -1,52 +1,52 @@
1
- {
2
- "name": "@studyportals/campaign-management-api-interface",
3
- "version": "16.1.3",
4
- "scripts": {
5
- "compile": "rm -fR bin && npx tsc",
6
- "test-u": "jest -c jest.config.unit.json --maxWorkers=1",
7
- "test-i": "nyc mocha src tests-i",
8
- "prepare-deployment": "npm run test-u && npm run compile && cp package.json bin/package.json && rm -fR bin/tests-u",
9
- "predeploy": "npm run prepare-deployment",
10
- "deploy": "npm publish ./bin --access=public",
11
- "deploy-patch": "npm version patch && npm run deploy",
12
- "deploy-minor": "npm version minor && npm run deploy",
13
- "deploy-major": "npm version major && npm run deploy",
14
- "deploy-beta": "npm version prerelease && npm run deploy -- --tag beta"
15
- },
16
- "author": "SPNightsWatch",
17
- "license": "ISC",
18
- "types": "bin/index.d.ts",
19
- "devDependencies": {
20
- "@studyportals/code-style": "^2.2.1",
21
- "@testdeck/jest": "^0.3.3",
22
- "@types/chai": "^4.3.20",
23
- "@types/jest": "^29.5.14",
24
- "@types/node": "^22.19.7",
25
- "@types/superagent": "^8.1.9",
26
- "chai": "^4.5.0",
27
- "eslint": "^8.57.1",
28
- "jest": "^29.7.0",
29
- "jest-mock-extended": "^3.0.7",
30
- "superagent-mocker": "^0.5.2",
31
- "ts-jest": "^29.4.6",
32
- "ts-node": "^10.9.2",
33
- "typescript": "^5.9.3"
34
- },
35
- "dependencies": {
36
- "@aws-crypto/sha256-js": "^5.2.0",
37
- "@aws-sdk/credential-provider-node": "^3.972.2",
38
- "@smithy/signature-v4": "^5.3.8",
39
- "@studyportals/mb-platform-date-time": "^1.3.1",
40
- "@studyportals/mb-platform-http-requests": "^2.8.0",
41
- "@studyportals/university-scheduler-interface": "^0.7.0",
42
- "class-transformer": "^0.5.1",
43
- "class-validator": "^0.14.3",
44
- "inversify": "^6.2.2",
45
- "reflect-metadata": "^0.2.2",
46
- "superagent": "^8.1.2"
47
- },
48
- "engines": {
49
- "node": ">=18.x <=22.x",
50
- "npm ": ">=10.x <=11.x"
51
- }
52
- }
1
+ {
2
+ "name": "@studyportals/campaign-management-api-interface",
3
+ "version": "16.2.0",
4
+ "scripts": {
5
+ "compile": "rm -fR bin && npx tsc",
6
+ "test-u": "jest -c jest.config.unit.json --maxWorkers=1",
7
+ "test-i": "nyc mocha src tests-i",
8
+ "prepare-deployment": "npm run test-u && npm run compile && cp package.json bin/package.json && rm -fR bin/tests-u",
9
+ "predeploy": "npm run prepare-deployment",
10
+ "deploy": "npm publish ./bin --access=public",
11
+ "deploy-patch": "npm version patch && npm run deploy",
12
+ "deploy-minor": "npm version minor && npm run deploy",
13
+ "deploy-major": "npm version major && npm run deploy",
14
+ "deploy-beta": "npm version prerelease && npm run deploy -- --tag beta"
15
+ },
16
+ "author": "SPNightsWatch",
17
+ "license": "ISC",
18
+ "types": "bin/index.d.ts",
19
+ "devDependencies": {
20
+ "@studyportals/code-style": "^2.2.1",
21
+ "@testdeck/jest": "^0.3.3",
22
+ "@types/chai": "^4.3.20",
23
+ "@types/jest": "^29.5.14",
24
+ "@types/node": "^22.19.7",
25
+ "@types/superagent": "^8.1.9",
26
+ "chai": "^4.5.0",
27
+ "eslint": "^8.57.1",
28
+ "jest": "^29.7.0",
29
+ "jest-mock-extended": "^3.0.7",
30
+ "superagent-mocker": "^0.5.2",
31
+ "ts-jest": "^29.4.6",
32
+ "ts-node": "^10.9.2",
33
+ "typescript": "^5.9.3"
34
+ },
35
+ "dependencies": {
36
+ "@aws-crypto/sha256-js": "^5.2.0",
37
+ "@aws-sdk/credential-provider-node": "^3.972.2",
38
+ "@smithy/signature-v4": "^5.3.8",
39
+ "@studyportals/mb-platform-date-time": "^1.3.1",
40
+ "@studyportals/mb-platform-http-requests": "^2.8.0",
41
+ "@studyportals/university-scheduler-interface": "^0.7.0",
42
+ "class-transformer": "^0.5.1",
43
+ "class-validator": "^0.14.3",
44
+ "inversify": "^6.2.2",
45
+ "reflect-metadata": "^0.2.2",
46
+ "superagent": "^8.1.2"
47
+ },
48
+ "engines": {
49
+ "node": ">=18.x <=22.x",
50
+ "npm ": ">=10.x <=11.x"
51
+ }
52
+ }
@@ -6,6 +6,10 @@ export declare class AuditorCampaignManagementAPIClient {
6
6
  constructor(baseUrl: string);
7
7
  getCampaignAuditorData(campaignID: number, jwt?: string): Promise<GetAuditorDto[]>;
8
8
  getStudyAuditorData(studyID: number, jwt?: string): Promise<GetAuditorDto[]>;
9
+ /**
10
+ * @deprecated Auditing is now handled internally by CMA as part of write operations.
11
+ * Use GeotarginatorFrontCMAClient.saveCampaignGeotargeting() instead—auditing is automatic.
12
+ */
9
13
  storeCampaignAuditorData(operation: AuditorOperation, campaignID: number, username: string, isUserAction: boolean, data: any, jwt?: string): Promise<GetAuditorDto>;
10
14
  storeStudyAuditorData(operation: AuditorOperation, studyID: number, username: string, isUserAction: boolean, messageType: string, message: any, jwt?: string): Promise<GetAuditorDto>;
11
15
  storeStudiesAuditorData(operation: AuditorOperation, studyIDs: number[], username: string, isUserAction: boolean, messageType: string, message: any, jwt?: string): Promise<GetAuditorDto[]>;
@@ -27,6 +27,10 @@ let AuditorCampaignManagementAPIClient = class AuditorCampaignManagementAPIClien
27
27
  const getAuditorDtos = result.body;
28
28
  return getAuditorDtos;
29
29
  }
30
+ /**
31
+ * @deprecated Auditing is now handled internally by CMA as part of write operations.
32
+ * Use GeotarginatorFrontCMAClient.saveCampaignGeotargeting() instead—auditing is automatic.
33
+ */
30
34
  async storeCampaignAuditorData(operation, campaignID, username, isUserAction, data, jwt = "") {
31
35
  const sendData = {
32
36
  "operation": operation,
@@ -1 +1 @@
1
- {"version":3,"file":"auditor-campaign-management-api.client.js","sourceRoot":"","sources":["../../src/auditor-campaign-management-api.client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auditor-campaign-management-api.client.js","sourceRoot":"","sources":["../../src/auditor-campaign-management-api.client.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { EntityGeotargetingDto } from "./entity-geotargeting.dto";
1
+ import { GeotargetingEntity } from "../types/geotarginator/geotargeting-entity";
2
2
  import { GeotarginatorEntityType } from "./enums";
3
- export type EnrichedOrganisationGeotargetingDto = EntityGeotargetingDto & {
3
+ export type EnrichedOrganisationGeotargetingDto = GeotargetingEntity & {
4
4
  name: string;
5
5
  entityType: GeotarginatorEntityType.ORGANISATION;
6
6
  };
@@ -1,8 +1,8 @@
1
- import { EntityGeotargetingDto } from "./entity-geotargeting.dto";
1
+ import { GeotargetingEntity } from "../types/geotarginator/geotargeting-entity";
2
2
  import { BachelorDegrees, MasterDegrees, PHDDegrees, PreparationDegrees, ShortDegrees } from "../degrees/enums";
3
3
  import { GeotarginatorEntityType, StudyTypes } from "./enums";
4
4
  export type StudyDegrees = BachelorDegrees | MasterDegrees | PHDDegrees | PreparationDegrees | ShortDegrees;
5
- export type EnrichedStudyGeotargetingDto = EntityGeotargetingDto & {
5
+ export type EnrichedStudyGeotargetingDto = GeotargetingEntity & {
6
6
  name: string;
7
7
  degree: StudyDegrees | null;
8
8
  level: StudyTypes;
@@ -1,5 +1,5 @@
1
- import { TargetedCountriesDto } from "./targeted-countries.dto";
2
- export type EntityGeotargetingDto = {
3
- id: number;
4
- targeted_countries: TargetedCountriesDto;
5
- };
1
+ import { GeotargetingEntity } from "../types/geotarginator/geotargeting-entity";
2
+ /**
3
+ * @deprecated Use GeotargetingEntity instead.
4
+ */
5
+ export type EntityGeotargetingDto = GeotargetingEntity;
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @deprecated Use TargetedCountries instead.
3
+ */
1
4
  export declare class TargetedCountriesDto {
2
5
  lp: number[];
3
6
  p: number[];
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TargetedCountriesDto = void 0;
4
+ /**
5
+ * @deprecated Use TargetedCountries instead.
6
+ */
4
7
  class TargetedCountriesDto {
5
8
  }
6
9
  exports.TargetedCountriesDto = TargetedCountriesDto;
@@ -1 +1 @@
1
- {"version":3,"file":"targeted-countries.dto.js","sourceRoot":"","sources":["../../../../src/domain/campaign/targeted-countries.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,oBAAoB;CAIhC;AAJD,oDAIC"}
1
+ {"version":3,"file":"targeted-countries.dto.js","sourceRoot":"","sources":["../../../../src/domain/campaign/targeted-countries.dto.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,oBAAoB;CAIhC;AAJD,oDAIC"}
@@ -0,0 +1,5 @@
1
+ export type EntityConfigsGroup = {
2
+ entityID: number;
3
+ entityType: 'study' | 'organisation';
4
+ productIDs: number[];
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=entity-configs-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-configs-group.js","sourceRoot":"","sources":["../../../../../src/domain/types/geotarginator/entity-configs-group.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type FlatEntityConfig = {
2
+ entityID: number;
3
+ productID: number;
4
+ entityType: 'study' | 'organisation';
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=flat-entity-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flat-entity-config.js","sourceRoot":"","sources":["../../../../../src/domain/types/geotarginator/flat-entity-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { TargetedCountries } from "./targeted-countries";
2
+ export type GeotargetingEntity = {
3
+ id: number;
4
+ targeted_countries: TargetedCountries;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=geotargeting-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geotargeting-entity.js","sourceRoot":"","sources":["../../../../../src/domain/types/geotarginator/geotargeting-entity.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export { TargetedCountries } from "./targeted-countries";
2
+ export { GeotargetingEntity } from "./geotargeting-entity";
3
+ export { EntityConfigsGroup } from "./entity-configs-group";
4
+ export { SaveCampaignGeotargetingRequest } from "./save-campaign-geotargeting-request";
5
+ export { FlatEntityConfig } from "./flat-entity-config";
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/domain/types/geotarginator/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { GeotargetingEntity } from "./geotargeting-entity";
2
+ import { EntityConfigsGroup } from "./entity-configs-group";
3
+ export type SaveCampaignGeotargetingRequest = {
4
+ studies: GeotargetingEntity[];
5
+ organisations: GeotargetingEntity[];
6
+ changedEntityConfigGroups: EntityConfigsGroup[];
7
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=save-campaign-geotargeting-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-campaign-geotargeting-request.js","sourceRoot":"","sources":["../../../../../src/domain/types/geotarginator/save-campaign-geotargeting-request.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type TargetedCountries = {
2
+ sp: number[];
3
+ p: number[];
4
+ lp: number[];
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=targeted-countries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targeted-countries.js","sourceRoot":"","sources":["../../../../../src/domain/types/geotarginator/targeted-countries.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { SaveCampaignGeotargetingRequest } from "./domain/types/geotarginator";
2
+ export declare class GeotarginatorFrontCMAClient {
3
+ private readonly baseUrl;
4
+ constructor(baseUrl: string);
5
+ /**
6
+ * Save campaign geotargeting and pricing configuration.
7
+ *
8
+ * CMA handles routing (active vs future campaign) and auditing internally.
9
+ * The front-end does not need to make separate audit calls.
10
+ *
11
+ * @param campaignId - The campaign ID (used in URL path).
12
+ * @param data - The full save payload (geotargeting + pricing).
13
+ * @param tokenId - JWT token ID from the hs-sso-token-id cookie.
14
+ */
15
+ saveCampaignGeotargeting(campaignId: number, data: SaveCampaignGeotargetingRequest, tokenId: string): Promise<void>;
16
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeotarginatorFrontCMAClient = void 0;
4
+ class GeotarginatorFrontCMAClient {
5
+ constructor(baseUrl) {
6
+ this.baseUrl = baseUrl;
7
+ }
8
+ /**
9
+ * Save campaign geotargeting and pricing configuration.
10
+ *
11
+ * CMA handles routing (active vs future campaign) and auditing internally.
12
+ * The front-end does not need to make separate audit calls.
13
+ *
14
+ * @param campaignId - The campaign ID (used in URL path).
15
+ * @param data - The full save payload (geotargeting + pricing).
16
+ * @param tokenId - JWT token ID from the hs-sso-token-id cookie.
17
+ */
18
+ async saveCampaignGeotargeting(campaignId, data, tokenId) {
19
+ const response = await fetch(`${this.baseUrl}/campaigns/${campaignId}/geotargeting`, {
20
+ method: 'POST',
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ 'Authorization': tokenId
24
+ },
25
+ body: JSON.stringify(data)
26
+ });
27
+ if (!response.ok) {
28
+ throw new Error(`Failed to save campaign geotargeting: ${response.status} ${response.statusText}`);
29
+ }
30
+ }
31
+ }
32
+ exports.GeotarginatorFrontCMAClient = GeotarginatorFrontCMAClient;
33
+ //# sourceMappingURL=geotarginator-front-cma-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geotarginator-front-cma-client.js","sourceRoot":"","sources":["../../src/geotarginator-front-cma-client.ts"],"names":[],"mappings":";;;AAEA,MAAa,2BAA2B;IACvC,YACkB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAC9B,CAAC;IAEJ;;;;;;;;;OASG;IACI,KAAK,CAAC,wBAAwB,CACpC,UAAkB,EAClB,IAAqC,EACrC,OAAe;QAEf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,GAAG,IAAI,CAAC,OAAO,cAAc,UAAU,eAAe,EACtD;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,OAAO;aACxB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC1B,CACD,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpG,CAAC;IACF,CAAC;CACD;AApCD,kEAoCC"}
@@ -0,0 +1 @@
1
+ export type AwsRequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=aws-request-method.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-request-method.js","sourceRoot":"","sources":["../../../src/helper/aws-request-method.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { AwsRequestMethod } from "./aws-request-method";
2
+ export type AwsRequestSignerProps = {
3
+ url: URL;
4
+ region: string;
5
+ method: AwsRequestMethod;
6
+ headers?: Record<string, string>;
7
+ body?: any;
8
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=aws-request-signer-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-request-signer-props.js","sourceRoot":"","sources":["../../../src/helper/aws-request-signer-props.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { HttpRequest } from "@smithy/types";
2
+ import { AwsRequestSignerProps } from "./aws-request-signer-props";
3
+ export declare class AwsRequestSigner {
4
+ static sign(props: AwsRequestSignerProps): Promise<HttpRequest>;
5
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AwsRequestSigner = void 0;
4
+ const sha256_js_1 = require("@aws-crypto/sha256-js");
5
+ const credential_provider_node_1 = require("@aws-sdk/credential-provider-node");
6
+ const signature_v4_1 = require("@smithy/signature-v4");
7
+ class AwsRequestSigner {
8
+ static async sign(props) {
9
+ const requestHeaders = Object.assign({ 'Content-Type': 'application/json', 'Host': props.url.hostname }, (props.headers || {}));
10
+ const requestBody = props.body ? JSON.stringify(props.body) : undefined;
11
+ const signer = new signature_v4_1.SignatureV4({
12
+ service: "execute-api",
13
+ region: props.region,
14
+ credentials: (0, credential_provider_node_1.defaultProvider)(),
15
+ sha256: sha256_js_1.Sha256
16
+ });
17
+ const signedRequest = await signer.sign({
18
+ method: props.method,
19
+ headers: requestHeaders,
20
+ body: requestBody,
21
+ protocol: props.url.protocol,
22
+ hostname: props.url.hostname,
23
+ port: props.url.port ? parseInt(props.url.port) : undefined,
24
+ path: props.url.pathname,
25
+ query: Object.fromEntries(props.url.searchParams.entries())
26
+ });
27
+ return signedRequest;
28
+ }
29
+ }
30
+ exports.AwsRequestSigner = AwsRequestSigner;
31
+ //# sourceMappingURL=aws-request-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-request-signer.js","sourceRoot":"","sources":["../../../src/helper/aws-request-signer.ts"],"names":[],"mappings":";;;AAAA,qDAA+C;AAC/C,gFAAoE;AACpE,uDAAmD;AAInD,MAAa,gBAAgB;IAErB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAA4B;QACpD,MAAM,cAAc,mBACnB,cAAc,EAAE,kBAAkB,EAClC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,IACvB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CACxB,CAAC;QACF,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,0BAAW,CAAC;YAC9B,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,IAAA,0CAAe,GAAE;YAC9B,MAAM,EAAE,kBAAM;SACd,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;YAC5B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;YAC5B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;YACxB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;SAC3D,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACtB,CAAC;CACD;AA9BD,4CA8BC"}
@@ -10,4 +10,5 @@ export declare class PrivateUserCampaignManagementAPIClient {
10
10
  private buildBaseUrl;
11
11
  private signedGetRequest;
12
12
  private signedPostRequest;
13
+ private extractBody;
13
14
  }
@@ -12,86 +12,53 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.PrivateUserCampaignManagementAPIClient = void 0;
13
13
  require("reflect-metadata");
14
14
  const inversify_1 = require("inversify");
15
- const signature_v4_1 = require("@smithy/signature-v4");
16
- const credential_provider_node_1 = require("@aws-sdk/credential-provider-node");
17
- const sha256_js_1 = require("@aws-crypto/sha256-js");
15
+ const aws_request_signer_1 = require("./helper/aws-request-signer");
18
16
  let PrivateUserCampaignManagementAPIClient = class PrivateUserCampaignManagementAPIClient {
19
17
  constructor(baseUrl) {
20
18
  this.baseUrl = baseUrl;
21
19
  }
22
20
  async getUserById(id) {
23
- const url = this.buildBaseUrl(`private/users/get-user-by-id?id=${id}`);
21
+ const url = this.buildBaseUrl(`private/users?id=${id}`);
24
22
  return await this.signedGetRequest(url);
25
23
  }
26
24
  async getUserByEmail(email) {
27
- const url = this.buildBaseUrl(`private/users/get-user-by-email?email=${encodeURIComponent(email)}`);
25
+ const url = this.buildBaseUrl(`private/users?email=${encodeURIComponent(email)}`);
28
26
  return await this.signedGetRequest(url);
29
27
  }
30
28
  async createClient(user) {
31
- const url = this.buildBaseUrl('private/users/create-client');
29
+ const url = this.buildBaseUrl('private/users/clients');
32
30
  return await this.signedPostRequest(url, user);
33
31
  }
34
32
  buildBaseUrl(relative) {
35
33
  return new URL(`${this.baseUrl}/${relative}`);
36
34
  }
37
35
  async signedGetRequest(endpointUrl, headers = {}) {
38
- const requestMethod = 'GET';
39
- const requestHeaders = Object.assign({ 'Content-Type': 'application/json', 'Host': endpointUrl.hostname }, headers);
40
- const request = {
41
- method: requestMethod,
42
- headers: requestHeaders,
43
- protocol: endpointUrl.protocol,
44
- hostname: endpointUrl.hostname,
45
- path: endpointUrl.pathname,
46
- query: Object.fromEntries(endpointUrl.searchParams.entries()),
47
- };
48
- const signer = new signature_v4_1.SignatureV4({
49
- service: "execute-api",
36
+ const signedRequest = await aws_request_signer_1.AwsRequestSigner.sign({
37
+ url: endpointUrl,
50
38
  region: process.env.region || process.env.REGION || "eu-central-1",
51
- credentials: (0, credential_provider_node_1.defaultProvider)(),
52
- sha256: sha256_js_1.Sha256
39
+ method: 'GET',
40
+ headers: headers
53
41
  });
54
- const signedRequest = await signer.sign(request);
55
- const response = await fetch(endpointUrl, {
56
- method: signedRequest.method,
57
- headers: signedRequest.headers
58
- });
59
- if (!response.ok) {
60
- const errorResponse = await response.text().catch(() => 'Unable to read response body');
61
- throw new Error(`Request to ${endpointUrl.toString()} failed with status ${response.status} ${response.statusText}: ${errorResponse}`);
62
- }
63
- return await response.json();
42
+ const response = await fetch(endpointUrl, signedRequest);
43
+ return await this.extractBody(response, endpointUrl);
64
44
  }
65
45
  async signedPostRequest(endpointUrl, payload, headers = {}) {
66
- const requestMethod = 'POST';
67
- const requestHeaders = Object.assign({ 'Content-Type': 'application/json', 'Host': endpointUrl.hostname }, headers);
68
- const requestBody = payload ? JSON.stringify(payload) : {};
69
- const request = {
70
- method: requestMethod,
71
- headers: requestHeaders,
72
- body: requestBody,
73
- protocol: endpointUrl.protocol,
74
- hostname: endpointUrl.hostname,
75
- path: endpointUrl.pathname,
76
- query: Object.fromEntries(endpointUrl.searchParams.entries()),
77
- };
78
- const signer = new signature_v4_1.SignatureV4({
79
- service: "execute-api",
46
+ const signedRequest = await aws_request_signer_1.AwsRequestSigner.sign({
47
+ url: endpointUrl,
80
48
  region: process.env.region || process.env.REGION || "eu-central-1",
81
- credentials: (0, credential_provider_node_1.defaultProvider)(),
82
- sha256: sha256_js_1.Sha256
83
- });
84
- const signedRequest = await signer.sign(request);
85
- const response = await fetch(endpointUrl, {
86
- method: signedRequest.method,
87
- headers: signedRequest.headers,
88
- body: signedRequest.body
49
+ method: 'POST',
50
+ headers: headers,
51
+ body: payload
89
52
  });
53
+ const response = await fetch(endpointUrl, signedRequest);
54
+ return await this.extractBody(response, endpointUrl);
55
+ }
56
+ async extractBody(response, url) {
90
57
  if (!response.ok) {
91
58
  const errorResponse = await response.text().catch(() => 'Unable to read response body');
92
- throw new Error(`Request to ${endpointUrl.toString()} failed with status ${response.status} ${response.statusText}: ${errorResponse}`);
59
+ throw new Error(`Request to ${url ? url.toString() : 'Unknown URL'} failed with status ${response.status} ${response.statusText}: ${errorResponse}`);
93
60
  }
94
- return await response.json();
61
+ return response.json();
95
62
  }
96
63
  };
97
64
  exports.PrivateUserCampaignManagementAPIClient = PrivateUserCampaignManagementAPIClient;
@@ -1 +1 @@
1
- {"version":3,"file":"private-user-campaign-management-api.client.js","sourceRoot":"","sources":["../../src/private-user-campaign-management-api.client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private-user-campaign-management-api.client.js","sourceRoot":"","sources":["../../src/private-user-campaign-management-api.client.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4BAA0B;AAC1B,yCAAuC;AAGvC,oEAA+D;AAGxD,IAAM,sCAAsC,GAA5C,MAAM,sCAAsC;IAElD,YACkB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAC7B,CAAC;IAEE,KAAK,CAAC,WAAW,CAAC,EAAU;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAU,GAAG,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,KAAa;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAU,GAAG,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,IAAqB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QACvD,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAQ,GAAG,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAGO,YAAY,CAAC,QAAgB;QACpC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAI,WAAgB,EAAE,UAAkC,EAAE;QACvF,MAAM,aAAa,GAAG,MAAM,qCAAgB,CAAC,IAAI,CAAC;YACjD,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,cAAc;YAClE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACzD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAI,QAAQ,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAI,WAAgB,EAAE,OAAY,EAAE,UAAkC,EAAE;QACtG,MAAM,aAAa,GAAG,MAAM,qCAAgB,CAAC,IAAI,CAAC;YACjD,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,cAAc;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,OAAO;SACb,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACzD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAI,QAAQ,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,WAAW,CAAI,QAAkB,EAAE,GAAS;QACzD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,8BAA8B,CAAC,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,aAAa,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC,CAAC;QACtJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAO,CAAC;IAC7B,CAAC;CACD,CAAA;AAzDY,wFAAsC;iDAAtC,sCAAsC;IADlD,IAAA,sBAAU,GAAE;;GACA,sCAAsC,CAyDlD"}
@@ -0,0 +1,17 @@
1
+ import { EntityConfigsGroup, FlatEntityConfig } from "../domain/types/geotarginator";
2
+ /**
3
+ * Converts a flat list of entity-product assignments into grouped form
4
+ * for use in SaveCampaignGeotargetingRequest.
5
+ *
6
+ * @param flatConfigs - Flat list of entity-product assignments
7
+ * @returns Grouped entity configs
8
+ */
9
+ export declare function groupEntityConfigs(flatConfigs: FlatEntityConfig[]): EntityConfigsGroup[];
10
+ /**
11
+ * Converts EntityConfigsGroup[] back into a flat list of FlatEntityConfig.
12
+ * Useful for consumers that need to iterate over individual (entity, product) pairs.
13
+ *
14
+ * @param groups - Grouped entity configs
15
+ * @returns Flat list of entity-product assignments
16
+ */
17
+ export declare function flattenEntityConfigs(groups: EntityConfigsGroup[]): FlatEntityConfig[];
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.groupEntityConfigs = groupEntityConfigs;
4
+ exports.flattenEntityConfigs = flattenEntityConfigs;
5
+ /**
6
+ * Converts a flat list of entity-product assignments into grouped form
7
+ * for use in SaveCampaignGeotargetingRequest.
8
+ *
9
+ * @param flatConfigs - Flat list of entity-product assignments
10
+ * @returns Grouped entity configs
11
+ */
12
+ function groupEntityConfigs(flatConfigs) {
13
+ const map = new Map();
14
+ for (const config of flatConfigs) {
15
+ const key = `${config.entityType}-${config.entityID}`;
16
+ if (!map.has(key)) {
17
+ map.set(key, { entityID: config.entityID, entityType: config.entityType, productIDs: [] });
18
+ }
19
+ map.get(key).productIDs.push(config.productID);
20
+ }
21
+ return [...map.values()];
22
+ }
23
+ /**
24
+ * Converts EntityConfigsGroup[] back into a flat list of FlatEntityConfig.
25
+ * Useful for consumers that need to iterate over individual (entity, product) pairs.
26
+ *
27
+ * @param groups - Grouped entity configs
28
+ * @returns Flat list of entity-product assignments
29
+ */
30
+ function flattenEntityConfigs(groups) {
31
+ return groups.flatMap(group => group.productIDs.map(productID => ({
32
+ entityID: group.entityID,
33
+ productID,
34
+ entityType: group.entityType
35
+ })));
36
+ }
37
+ //# sourceMappingURL=entity-configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-configs.js","sourceRoot":"","sources":["../../../src/utils/entity-configs.ts"],"names":[],"mappings":";;AASA,gDAUC;AASD,oDAQC;AAlCD;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,WAA+B;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,MAA4B;IAChE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAC7B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS;QACT,UAAU,EAAE,KAAK,CAAC,UAAU;KAC5B,CAAC,CAAC,CACH,CAAC;AACH,CAAC"}