@bprotsyk/aso-core 2.1.37 → 2.1.39

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 (105) hide show
  1. package/README.md +1 -1
  2. package/lib/app/app-integration.d.ts +53 -53
  3. package/lib/app/app-integration.js +63 -63
  4. package/lib/app/app-list-item.d.ts +5 -5
  5. package/lib/app/app-list-item.js +2 -2
  6. package/lib/app/app-type.d.ts +4 -4
  7. package/lib/app/app-type.js +8 -8
  8. package/lib/app/app.d.ts +208 -290
  9. package/lib/app/app.js +156 -156
  10. package/lib/general/cloudflare-domain.d.ts +42 -42
  11. package/lib/general/cloudflare-domain.js +12 -12
  12. package/lib/general/domain.d.ts +110 -169
  13. package/lib/general/domain.js +62 -62
  14. package/lib/general/namecheap-domain.d.ts +85 -132
  15. package/lib/general/namecheap-domain.js +14 -14
  16. package/lib/general/push.d.ts +6 -6
  17. package/lib/general/push.js +2 -2
  18. package/lib/general/queue.d.ts +2 -2
  19. package/lib/general/queue.js +1 -1
  20. package/lib/general/shape.d.ts +18 -18
  21. package/lib/general/shape.js +36 -36
  22. package/lib/index.d.ts +26 -26
  23. package/lib/index.js +69 -69
  24. package/lib/keitaro/keitaro-campaign.d.ts +31 -31
  25. package/lib/keitaro/keitaro-campaign.js +5 -5
  26. package/lib/keitaro/keitaro-domain.d.ts +6 -6
  27. package/lib/keitaro/keitaro-domain.js +2 -2
  28. package/lib/keitaro/keitaro-offer.d.ts +7 -7
  29. package/lib/keitaro/keitaro-offer.js +2 -2
  30. package/lib/keitaro/keitaro-stream.d.ts +20 -20
  31. package/lib/keitaro/keitaro-stream.js +2 -2
  32. package/lib/network/keitaro/http.d.ts +2 -2
  33. package/lib/network/keitaro/http.js +12 -12
  34. package/lib/network/keitaro/keitaro-service.d.ts +50 -48
  35. package/lib/network/keitaro/keitaro-service.js +283 -293
  36. package/lib/offers/list.d.ts +42 -435
  37. package/lib/offers/list.js +12 -12
  38. package/lib/offers/offer.d.ts +91 -152
  39. package/lib/offers/offer.js +42 -42
  40. package/lib/offers/offerwall/offerwall-home-dialog-data.d.ts +6 -6
  41. package/lib/offers/offerwall/offerwall-home-dialog-data.js +2 -2
  42. package/lib/offers/offerwall/offerwall-offer.d.ts +12 -12
  43. package/lib/offers/offerwall/offerwall-offer.js +2 -2
  44. package/lib/offers/offerwall/offerwall-response.d.ts +6 -6
  45. package/lib/offers/offerwall/offerwall-response.js +2 -2
  46. package/lib/offers/offerwall/offerwall-section.d.ts +6 -6
  47. package/lib/offers/offerwall/offerwall-section.js +2 -2
  48. package/lib/offers/section.d.ts +47 -60
  49. package/lib/offers/section.js +20 -20
  50. package/lib/panel/app/upsert-flash-app-request.d.ts +31 -31
  51. package/lib/panel/app/upsert-flash-app-request.js +2 -2
  52. package/lib/panel/auth.d.ts +9 -9
  53. package/lib/panel/auth.js +2 -2
  54. package/lib/panel/flash/upsert-flash-app-request.d.ts +31 -31
  55. package/lib/panel/flash/upsert-flash-app-request.js +2 -2
  56. package/lib/panel/user.d.ts +46 -59
  57. package/lib/panel/user.js +28 -28
  58. package/lib/templates/nginx-template.conf +35 -35
  59. package/lib/templates/nginx-template.d.ts +1 -1
  60. package/lib/templates/nginx-template.js +39 -39
  61. package/lib/templates/nginx-template.ts +35 -35
  62. package/lib/utils/general.d.ts +11 -11
  63. package/lib/utils/general.js +40 -40
  64. package/lib/utils/huawei/converter.d.ts +2 -2
  65. package/lib/utils/huawei/converter.js +53 -53
  66. package/lib/utils/keitaro-utils.d.ts +13 -13
  67. package/lib/utils/keitaro-utils.js +614 -569
  68. package/lib/utils/server-util.js +303 -303
  69. package/package.json +51 -51
  70. package/src/app/app-integration.ts +66 -66
  71. package/src/app/app-list-item.ts +4 -4
  72. package/src/app/app-type.ts +3 -3
  73. package/src/app/app.ts +317 -317
  74. package/src/general/cloudflare-domain.ts +44 -44
  75. package/src/general/domain.ts +106 -106
  76. package/src/general/namecheap-domain.ts +63 -63
  77. package/src/general/push.ts +5 -5
  78. package/src/general/queue.ts +4 -4
  79. package/src/general/shape.tsx +55 -55
  80. package/src/index.ts +32 -32
  81. package/src/keitaro/keitaro-campaign.ts +35 -35
  82. package/src/keitaro/keitaro-domain.ts +5 -5
  83. package/src/keitaro/keitaro-offer.ts +6 -6
  84. package/src/keitaro/keitaro-stream.ts +19 -19
  85. package/src/network/keitaro/http.ts +8 -8
  86. package/src/network/keitaro/keitaro-service.ts +348 -364
  87. package/src/offers/list.ts +22 -19
  88. package/src/offers/offer.ts +80 -80
  89. package/src/offers/offerwall/offerwall-home-dialog-data.ts +6 -6
  90. package/src/offers/offerwall/offerwall-offer.ts +12 -12
  91. package/src/offers/offerwall/offerwall-response.ts +7 -7
  92. package/src/offers/offerwall/offerwall-section.ts +7 -7
  93. package/src/offers/section.ts +29 -29
  94. package/src/panel/app/upsert-flash-app-request.ts +39 -39
  95. package/src/panel/auth.ts +9 -9
  96. package/src/panel/user.ts +38 -38
  97. package/src/templates/nginx-template.ts +35 -35
  98. package/src/utils/data.csv +65 -65
  99. package/src/utils/general.ts +36 -36
  100. package/src/utils/huawei/converter.ts +55 -55
  101. package/src/utils/keitaro-utils.ts +717 -664
  102. package/src/utils/map-apps.json +4747 -4747
  103. package/src/utils/server-util.ts +368 -368
  104. package/src/utils/update-postbacks.js +27 -27
  105. package/tsconfig.json +20 -20
@@ -1,293 +1,283 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.KeitaroService = exports.upsertStreamToCampaign = void 0;
7
- const http_1 = __importDefault(require("./http"));
8
- const keitaro_utils_1 = require("../../utils/keitaro-utils");
9
- const general_1 = require("../../utils/general");
10
- async function getStreamsByCampaignId(campaignId) {
11
- const { data: streams } = await http_1.default.get(`campaigns/${campaignId}/streams`);
12
- return streams;
13
- }
14
- async function getAllCampaigns() {
15
- const { data: campaigns } = await http_1.default.get('campaigns');
16
- console.log("Campaigns fetched:", campaigns);
17
- return campaigns;
18
- }
19
- async function cloneStreams(originalCampaignId, streamPositionsToClone, campaignRegExp) {
20
- // Get the original campaign's streams
21
- const originalStreams = await getStreamsByCampaignId(originalCampaignId);
22
- // Filter the original streams by the given stream positions to clone
23
- const streamsToClone = originalStreams.filter(stream => streamPositionsToClone.includes(stream.position));
24
- // Get a list of all campaigns
25
- const allCampaigns = await getAllCampaigns();
26
- // Filter the campaigns by the given RegExp
27
- const matchingCampaigns = allCampaigns.filter(campaign => campaignRegExp.exec(campaign.name) && campaign.id != originalCampaignId);
28
- // console.log(matchingCampaigns)
29
- // For each matching campaign, clone the streams
30
- for (const matchingCampaign of matchingCampaigns) {
31
- for (const streamToClone of streamsToClone) {
32
- await http_1.default.post('streams', {
33
- name: streamToClone.name,
34
- campaign_id: matchingCampaign.id,
35
- schema: streamToClone.schema,
36
- type: streamToClone.type,
37
- action_type: streamToClone.action_type,
38
- weight: 100,
39
- offers: streamToClone.offers.map((offer) => {
40
- return {
41
- offer_id: offer.offer_id,
42
- share: 100
43
- };
44
- }),
45
- filters: streamToClone.filters.map((filter) => {
46
- return {
47
- name: filter.name,
48
- mode: filter.mode,
49
- payload: filter.payload
50
- };
51
- }),
52
- });
53
- }
54
- }
55
- }
56
- async function updateCampaign(id, payload) {
57
- await http_1.default.put(`campaigns/${id}`, payload);
58
- }
59
- async function createStreamForMatchingCampaigns(streamPartialPayload, offerId, campaignRegExp, avoidGroup) {
60
- // Get a list of all campaigns
61
- const allCampaigns = await getAllCampaigns();
62
- // Filter the campaigns by the given RegExp
63
- const matchingCampaigns = allCampaigns.filter(campaign => (avoidGroup ? campaign.group_id != avoidGroup : true) && campaignRegExp.exec(campaign.name));
64
- // console.log(matchingCampaigns)
65
- // For each matching campaign, clone the streams
66
- for (const matchingCampaign of matchingCampaigns) {
67
- let streams = await getStreamsByCampaignId(matchingCampaign.id);
68
- let identicalStream = streams.find((stream) => stream.name.includes(offerId));
69
- if (identicalStream) {
70
- await http_1.default.put(`streams/${identicalStream.id}`, {
71
- campaign_id: matchingCampaign.id,
72
- ...streamPartialPayload
73
- });
74
- }
75
- else {
76
- await http_1.default.post('streams', {
77
- campaign_id: matchingCampaign.id,
78
- ...streamPartialPayload
79
- });
80
- }
81
- }
82
- }
83
- async function getAllOffers() {
84
- const { data: offers } = await http_1.default.get('offers');
85
- return offers;
86
- }
87
- async function findKeitaroOffers(filter) {
88
- let offers = await getAllOffers();
89
- if (filter.caption)
90
- offers = offers.filter((o) => o.name.includes(filter.caption));
91
- if (filter.keitaroId)
92
- offers = offers.filter((o) => o.id == filter.keitaroId);
93
- if (filter.name)
94
- offers = offers.filter((o) => o.name.includes(filter.name));
95
- return offers;
96
- }
97
- async function getOfferByKeitaroId(id) {
98
- const { data: offer } = await http_1.default.get(`offers/${id}`);
99
- return offer;
100
- }
101
- async function updateOffer(offer) {
102
- const { data: o } = await http_1.default.put(`offers/${offer.id}`, offer);
103
- return o;
104
- }
105
- function createStreamPartialPayload(keitaroOfferId, offerName, offerId, offerGeo) {
106
- return {
107
- name: `${offerName} ${offerGeo} (${offerId})`,
108
- schema: "landings",
109
- type: "regular",
110
- action_type: "http",
111
- weight: 100,
112
- offers: [{
113
- offer_id: keitaroOfferId,
114
- share: 100,
115
- state: "active"
116
- }],
117
- filters: [{
118
- name: "sub_id_15",
119
- mode: "accept",
120
- payload: [offerId]
121
- }],
122
- };
123
- }
124
- async function addOfferToKeitaro(offer, affiliateId, link, avoidGroup, groupId) {
125
- // TODO look if offer already exists by offer.name
126
- let allOffers = await getAllOffers();
127
- let identicalOffer = allOffers.find((o) => { return o.name.includes(offer.name); });
128
- let keitaroOfferId;
129
- if (identicalOffer) {
130
- keitaroOfferId = identicalOffer.id;
131
- }
132
- else {
133
- let offerPayload = {
134
- name: `${offer.caption} ${offer.geo} (${offer.name})`,
135
- group_id: groupId || 1,
136
- action_payload: link,
137
- affiliate_network_id: affiliateId,
138
- country: [offer.geo],
139
- action_type: "http",
140
- offer_type: "external",
141
- payout_auto: true,
142
- payout_upsell: true,
143
- };
144
- const { data: keitaroOffer } = await http_1.default.post(`offers`, offerPayload);
145
- keitaroOfferId = keitaroOffer.id;
146
- }
147
- let streamPartialPayload = createStreamPartialPayload(keitaroOfferId, offer.caption, offer.name, offer.geo);
148
- await createStreamForMatchingCampaigns(streamPartialPayload, offer.name, /◈/, avoidGroup);
149
- }
150
- async function createCampaign(campaignData) {
151
- let { data: campaign } = await http_1.default.post(`/campaigns`, campaignData);
152
- return campaign;
153
- }
154
- async function getCampaignById(id) {
155
- const { data: campaign } = await http_1.default.get(`/campaigns/${id}`);
156
- return campaign;
157
- }
158
- async function upsertStreamToCampaign(campaign, stream) {
159
- let streams = await getStreamsByCampaignId(campaign.id);
160
- let identicalStream = streams.find((s) => stream.name == s.name);
161
- if (identicalStream) {
162
- console.log(`Found identical! Name: ${stream.name}`);
163
- await http_1.default.put(`streams/${identicalStream.id}`, {
164
- campaign_id: campaign.id,
165
- ...stream
166
- });
167
- }
168
- else {
169
- await http_1.default.post('streams', {
170
- campaign_id: campaign.id,
171
- ...stream
172
- });
173
- }
174
- }
175
- exports.upsertStreamToCampaign = upsertStreamToCampaign;
176
- // async function cloneOWCampaign(app: IApp): Promise<IKeitaroCampaign> {
177
- // let name = `#${app.id} [◈]`
178
- // let allCampaigns = await getAllCampaigns()
179
- // let matchingCampaign = allCampaigns.filter((c) => new RegExp(`#${app.id}.*◈`).test(c.name))
180
- // if (matchingCampaign.length > 0) return matchingCampaign[0]
181
- // const { data: campaigns } = await keitaroApi.post(`/campaigns/2673/clone`);
182
- // if (campaigns.length == 0) throw Error("Campaign cloning falied")
183
- // let clonedCampaign: IKeitaroCampaign = campaigns[0]
184
- // let allDomains = await KeitaroService.getDomains(true)
185
- // if (!allDomains) {
186
- // throw Error(`Failed to get all domains list`)
187
- // }
188
- // const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
189
- // let payload: Partial<IKeitaroCampaign> = {
190
- // name: name,
191
- // traffic_source_id: TRAFFIC_SOURCE_ID_FLASH_AI,
192
- // domain_id: domain.id,
193
- // parameters: prepareOWCampaignParameters(app)
194
- // }
195
- // const { data: campaign } = await keitaroApi.put(`/campaigns/${clonedCampaign.id}`, payload)
196
- // return campaign
197
- // }
198
- async function cloneOWCampaign(app) {
199
- let name = `#${app.id} [◈]`;
200
- console.log("Fetching all campaigns...");
201
- let allCampaigns = await getAllCampaigns();
202
- let matchingCampaign = allCampaigns.filter((c) => new RegExp(`#${app.id}.*◈`).test(c.name));
203
- if (matchingCampaign.length > 0)
204
- return matchingCampaign[0];
205
- console.log("Cloning campaign...");
206
- console.log(`Campaigns Data:`, await http_1.default.post(`/campaigns/2673/clone`));
207
- const { data: campaigns } = await http_1.default.post(`/campaigns/2673/clone`);
208
- console.log("Campaigns cloned:", campaigns);
209
- if (campaigns.length == 0)
210
- throw Error("Campaign cloning failed");
211
- let clonedCampaign = campaigns[0];
212
- console.log("Fetching all domains...");
213
- let allDomains = await exports.KeitaroService.getDomains(true);
214
- if (!allDomains) {
215
- throw Error(`Failed to get all domains list`);
216
- }
217
- const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
218
- let payload = {
219
- name: name,
220
- traffic_source_id: keitaro_utils_1.TRAFFIC_SOURCE_ID_FLASH_AI,
221
- domain_id: domain.id,
222
- parameters: (0, keitaro_utils_1.prepareOWCampaignParameters)(app)
223
- };
224
- console.log("Updating cloned campaign...");
225
- const { data: campaign } = await http_1.default.put(`/campaigns/${clonedCampaign.id}`, payload);
226
- console.log("Campaign updated:", campaign);
227
- return campaign;
228
- }
229
- async function cloneDCampaign(app) {
230
- let name = `D #${app.id} (${app.bundle})`;
231
- let allCampaigns = await getAllCampaigns();
232
- let matchingCampaign = allCampaigns.filter((c) => c.name.includes(`D #${app.id}`));
233
- if (matchingCampaign.length > 0)
234
- return matchingCampaign[0];
235
- const { data: campaigns } = await http_1.default.post(`/campaigns/2693/clone`);
236
- if (campaigns.length == 0)
237
- throw Error("Campaign cloning falied");
238
- let clonedCampaign = campaigns[0];
239
- let allDomains = await exports.KeitaroService.getDomains(true);
240
- if (!allDomains) {
241
- throw Error(`Failed to get all domains list`);
242
- }
243
- const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
244
- let payload = {
245
- name: name,
246
- traffic_source_id: keitaro_utils_1.TRAFFIC_SOURCE_ID_FLASH_AI,
247
- domain_id: domain.id,
248
- group_id: 93,
249
- };
250
- const { data: campaign } = await http_1.default.put(`/campaigns/${clonedCampaign.id}`, payload);
251
- return campaign;
252
- }
253
- async function changeCampaignsGroup(fromId, toId, exceptForCampaignIds, onlyForCampaignIds) {
254
- let campaigns = await getAllCampaigns();
255
- const matchingCampaigns = campaigns.filter(campaign => campaign.group_id == fromId
256
- && exceptForCampaignIds.length > 0 ? !exceptForCampaignIds.includes(campaign.id) : onlyForCampaignIds?.includes(campaign.id));
257
- for (let campaign of matchingCampaigns) {
258
- await updateCampaign(campaign.id, { group_id: toId });
259
- }
260
- }
261
- // Domain
262
- async function getDomains(onlyActive) {
263
- const { data: domains } = await http_1.default.get(`/domains`);
264
- return onlyActive ? domains.filter((d) => d.network_status == "active") : domains;
265
- }
266
- async function getProfitForTimeRange(from, to) {
267
- let fromString = (0, general_1.convertMillisToDate)(from);
268
- let toString = (0, general_1.convertMillisToDate)(to);
269
- let { data: data } = await http_1.default.post(`/report/build`, {
270
- range: {
271
- from: fromString,
272
- to: toString,
273
- timezone: 'Europe/Kyiv'
274
- },
275
- metrics: ['profit']
276
- });
277
- return data.rows[0].profit;
278
- }
279
- // async function getProfitForTodayAndYesterday(): Promise<any> {
280
- // let timestamps = getTimestampsForTodayAndYesterday()
281
- // let today = await KeitaroService.getProfitForTimeRange(timestamps.today.start, timestamps.today.end)
282
- // let yesterday = await KeitaroService.getProfitForTimeRange(timestamps.yesterday.start, timestamps.yesterday.end)
283
- // return {
284
- // today: today,
285
- // yesterday: yesterday
286
- // }
287
- // }
288
- exports.KeitaroService = {
289
- getStreamsByCampaignId, updateCampaign, getAllCampaigns, getAllOffers, cloneStreams, addOfferToKeitaro, getOfferByKeitaroId, getDomains, createCampaign, getCampaignById, upsertStreamToCampaign, cloneOWCampaign,
290
- updateOffer, changeCampaignsGroup, getProfitForTimeRange,
291
- // getProfitForTodayAndYesterday,
292
- cloneDCampaign, findKeitaroOffers
293
- };
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KeitaroService = exports.upsertStreamToCampaign = void 0;
7
+ const http_1 = __importDefault(require("./http"));
8
+ const keitaro_utils_1 = require("../../utils/keitaro-utils");
9
+ const general_1 = require("../../utils/general");
10
+ async function getStreamsByCampaignId(campaignId) {
11
+ const { data: streams } = await http_1.default.get(`campaigns/${campaignId}/streams`);
12
+ return streams;
13
+ }
14
+ async function getAllCampaigns() {
15
+ const { data: campaigns } = await http_1.default.get('campaigns');
16
+ return campaigns;
17
+ }
18
+ async function cloneStreams(originalCampaignId, streamPositionsToClone, campaignRegExp) {
19
+ // Get the original campaign's streams
20
+ const originalStreams = await getStreamsByCampaignId(originalCampaignId);
21
+ // Filter the original streams by the given stream positions to clone
22
+ const streamsToClone = originalStreams.filter(stream => streamPositionsToClone.includes(stream.position));
23
+ // Get a list of all campaigns
24
+ const allCampaigns = await getAllCampaigns();
25
+ // Filter the campaigns by the given RegExp
26
+ const matchingCampaigns = allCampaigns.filter(campaign => campaignRegExp.exec(campaign.name) && campaign.id != originalCampaignId);
27
+ // console.log(matchingCampaigns)
28
+ // For each matching campaign, clone the streams
29
+ for (const matchingCampaign of matchingCampaigns) {
30
+ for (const streamToClone of streamsToClone) {
31
+ await http_1.default.post('streams', {
32
+ name: streamToClone.name,
33
+ campaign_id: matchingCampaign.id,
34
+ schema: streamToClone.schema,
35
+ type: streamToClone.type,
36
+ action_type: streamToClone.action_type,
37
+ weight: 100,
38
+ offers: streamToClone.offers.map((offer) => {
39
+ return {
40
+ offer_id: offer.offer_id,
41
+ share: 100
42
+ };
43
+ }),
44
+ filters: streamToClone.filters.map((filter) => {
45
+ return {
46
+ name: filter.name,
47
+ mode: filter.mode,
48
+ payload: filter.payload
49
+ };
50
+ }),
51
+ });
52
+ }
53
+ }
54
+ }
55
+ async function updateCampaign(id, payload) {
56
+ await http_1.default.put(`campaigns/${id}`, payload);
57
+ }
58
+ async function createStreamForMatchingCampaigns(streamPartialPayload, offerId, campaignRegExp, avoidGroup) {
59
+ // Get a list of all campaigns
60
+ const allCampaigns = await getAllCampaigns();
61
+ // Filter the campaigns by the given RegExp
62
+ const matchingCampaigns = allCampaigns.filter(campaign => (avoidGroup ? campaign.group_id != avoidGroup : true) && campaignRegExp.exec(campaign.name));
63
+ // console.log(matchingCampaigns)
64
+ // For each matching campaign, clone the streams
65
+ for (const matchingCampaign of matchingCampaigns) {
66
+ let streams = await getStreamsByCampaignId(matchingCampaign.id);
67
+ let identicalStream = streams.find((stream) => stream.name.includes(offerId));
68
+ if (identicalStream) {
69
+ await http_1.default.put(`streams/${identicalStream.id}`, {
70
+ campaign_id: matchingCampaign.id,
71
+ ...streamPartialPayload
72
+ });
73
+ }
74
+ else {
75
+ await http_1.default.post('streams', {
76
+ campaign_id: matchingCampaign.id,
77
+ ...streamPartialPayload
78
+ });
79
+ }
80
+ }
81
+ }
82
+ async function getAllOffers() {
83
+ const { data: offers } = await http_1.default.get('offers');
84
+ return offers;
85
+ }
86
+ async function findKeitaroOffers(filter) {
87
+ let offers = await getAllOffers();
88
+ if (filter.caption)
89
+ offers = offers.filter((o) => o.name.includes(filter.caption));
90
+ if (filter.keitaroId)
91
+ offers = offers.filter((o) => o.id == filter.keitaroId);
92
+ if (filter.name)
93
+ offers = offers.filter((o) => o.name.includes(filter.name));
94
+ return offers;
95
+ }
96
+ async function getOfferByKeitaroId(id) {
97
+ const { data: offer } = await http_1.default.get(`offers/${id}`);
98
+ return offer;
99
+ }
100
+ async function updateOffer(offer) {
101
+ const { data: o } = await http_1.default.put(`offers/${offer.id}`, offer);
102
+ return o;
103
+ }
104
+ function createStreamPartialPayload(keitaroOfferId, offerName, offerId, offerGeo) {
105
+ return {
106
+ name: `${offerName} ${offerGeo} (${offerId})`,
107
+ schema: "landings",
108
+ type: "regular",
109
+ action_type: "http",
110
+ weight: 100,
111
+ offers: [{
112
+ offer_id: keitaroOfferId,
113
+ share: 100,
114
+ state: "active"
115
+ }],
116
+ filters: [{
117
+ name: "sub_id_15",
118
+ mode: "accept",
119
+ payload: [offerId]
120
+ }],
121
+ };
122
+ }
123
+ async function addOfferToKeitaro(offer, affiliateId, link, avoidGroup, groupId) {
124
+ // TODO look if offer already exists by offer.name
125
+ let allOffers = await getAllOffers();
126
+ let identicalOffer = allOffers.find((o) => { return o.name.includes(offer.name); });
127
+ let keitaroOfferId;
128
+ if (identicalOffer) {
129
+ keitaroOfferId = identicalOffer.id;
130
+ }
131
+ else {
132
+ let offerPayload = {
133
+ name: `${offer.caption} ${offer.geo} (${offer.name})`,
134
+ group_id: groupId || 1,
135
+ action_payload: link,
136
+ affiliate_network_id: affiliateId,
137
+ country: [offer.geo],
138
+ action_type: "http",
139
+ offer_type: "external",
140
+ payout_auto: true,
141
+ payout_upsell: true,
142
+ };
143
+ const { data: keitaroOffer } = await http_1.default.post(`offers`, offerPayload);
144
+ keitaroOfferId = keitaroOffer.id;
145
+ }
146
+ let streamPartialPayload = createStreamPartialPayload(keitaroOfferId, offer.caption, offer.name, offer.geo);
147
+ await createStreamForMatchingCampaigns(streamPartialPayload, offer.name, /◈/, avoidGroup);
148
+ }
149
+ async function createCampaign(campaignData) {
150
+ let { data: campaign } = await http_1.default.post(`/campaigns`, campaignData);
151
+ return campaign;
152
+ }
153
+ async function getCampaignById(id) {
154
+ const { data: campaign } = await http_1.default.get(`/campaigns/${id}`);
155
+ return campaign;
156
+ }
157
+ async function upsertStreamToCampaign(campaign, stream) {
158
+ let streams = await getStreamsByCampaignId(campaign.id);
159
+ let identicalStream = streams.find((s) => stream.name == s.name);
160
+ if (identicalStream) {
161
+ console.log(`Found identical! Name: ${stream.name}`);
162
+ await http_1.default.put(`streams/${identicalStream.id}`, {
163
+ campaign_id: campaign.id,
164
+ ...stream
165
+ });
166
+ }
167
+ else {
168
+ await http_1.default.post('streams', {
169
+ campaign_id: campaign.id,
170
+ ...stream
171
+ });
172
+ }
173
+ }
174
+ exports.upsertStreamToCampaign = upsertStreamToCampaign;
175
+ async function cloneOWCampaign(app) {
176
+ let name = `#${app.id} [◈]`;
177
+ let allCampaigns = await getAllCampaigns();
178
+ let matchingCampaign = allCampaigns.filter((c) => new RegExp(`#${app.id}.*◈`).test(c.name));
179
+ if (matchingCampaign.length > 0)
180
+ return matchingCampaign[0];
181
+ const { data: campaigns } = await http_1.default.post(`/campaigns/2673/clone`);
182
+ if (campaigns.length == 0)
183
+ throw Error("Campaign cloning falied");
184
+ let clonedCampaign = campaigns[0];
185
+ let allDomains = await exports.KeitaroService.getDomains(true);
186
+ if (!allDomains) {
187
+ throw Error(`Failed to get all domains list`);
188
+ }
189
+ const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
190
+ let payload = {
191
+ name: name,
192
+ traffic_source_id: keitaro_utils_1.TRAFFIC_SOURCE_ID_FLASH_AI,
193
+ domain_id: domain.id,
194
+ parameters: (0, keitaro_utils_1.prepareOWCampaignParameters)(app)
195
+ };
196
+ const { data: campaign } = await http_1.default.put(`/campaigns/${clonedCampaign.id}`, payload);
197
+ return campaign;
198
+ }
199
+ async function cloneDCampaign(app) {
200
+ let name = `D #${app.id} (${app.bundle})`;
201
+ let allCampaigns = await getAllCampaigns();
202
+ let matchingCampaign = allCampaigns.filter((c) => c.name.includes(`D #${app.id}`));
203
+ if (matchingCampaign.length > 0)
204
+ return matchingCampaign[0];
205
+ const { data: campaigns } = await http_1.default.post(`/campaigns/2693/clone`);
206
+ if (campaigns.length == 0)
207
+ throw Error("Campaign cloning falied");
208
+ let clonedCampaign = campaigns[0];
209
+ let allDomains = await exports.KeitaroService.getDomains(true);
210
+ if (!allDomains) {
211
+ throw Error(`Failed to get all domains list`);
212
+ }
213
+ const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
214
+ let payload = {
215
+ name: name,
216
+ traffic_source_id: keitaro_utils_1.TRAFFIC_SOURCE_ID_FLASH_AI,
217
+ domain_id: domain.id,
218
+ group_id: 93,
219
+ };
220
+ const { data: campaign } = await http_1.default.put(`/campaigns/${clonedCampaign.id}`, payload);
221
+ return campaign;
222
+ }
223
+ async function changeCampaignsGroup(fromId, toId, exceptForCampaignIds, onlyForCampaignIds) {
224
+ let campaigns = await getAllCampaigns();
225
+ const matchingCampaigns = campaigns.filter(campaign => campaign.group_id == fromId
226
+ && exceptForCampaignIds.length > 0 ? !exceptForCampaignIds.includes(campaign.id) : onlyForCampaignIds?.includes(campaign.id));
227
+ for (let campaign of matchingCampaigns) {
228
+ await updateCampaign(campaign.id, { group_id: toId });
229
+ }
230
+ }
231
+ // Domain
232
+ async function getDomains(onlyActive) {
233
+ const { data: domains } = await http_1.default.get(`/domains`);
234
+ return onlyActive ? domains.filter((d) => d.network_status == "active") : domains;
235
+ }
236
+ async function getProfitForTimeRange(from, to) {
237
+ let fromString = (0, general_1.convertMillisToDate)(from);
238
+ let toString = (0, general_1.convertMillisToDate)(to);
239
+ let { data: data } = await http_1.default.post(`/report/build`, {
240
+ range: {
241
+ from: fromString,
242
+ to: toString,
243
+ timezone: 'Europe/Kyiv'
244
+ },
245
+ metrics: ['profit']
246
+ });
247
+ return data.rows[0].profit;
248
+ }
249
+ // async function getProfitForTodayAndYesterday(): Promise<any> {
250
+ // let timestamps = getTimestampsForTodayAndYesterday()
251
+ // let today = await KeitaroService.getProfitForTimeRange(timestamps.today.start, timestamps.today.end)
252
+ // let yesterday = await KeitaroService.getProfitForTimeRange(timestamps.yesterday.start, timestamps.yesterday.end)
253
+ // return {
254
+ // today: today,
255
+ // yesterday: yesterday
256
+ // }
257
+ // }
258
+ async function fixBrokenClickCosts(startDate, endDate) {
259
+ // Get all campaigns to update
260
+ const campaigns = await getAllCampaigns();
261
+ const campaignIds = campaigns.map(campaign => campaign.id);
262
+ // Prepare the payload for the API request
263
+ const payload = {
264
+ campaign_ids: campaignIds,
265
+ costs: [{
266
+ start_date: startDate,
267
+ end_date: endDate,
268
+ cost: 0,
269
+ filters: {}
270
+ }],
271
+ timezone: "Europe/Kyiv",
272
+ currency: "USD",
273
+ only_campaign_uniques: 0
274
+ };
275
+ // Make the API request to update costs
276
+ await http_1.default.post('/clicks/update_costs', payload);
277
+ }
278
+ exports.KeitaroService = {
279
+ getStreamsByCampaignId, updateCampaign, getAllCampaigns, getAllOffers, cloneStreams, addOfferToKeitaro, getOfferByKeitaroId, getDomains, createCampaign, getCampaignById, upsertStreamToCampaign, cloneOWCampaign,
280
+ updateOffer, changeCampaignsGroup, getProfitForTimeRange,
281
+ // getProfitForTodayAndYesterday,
282
+ cloneDCampaign, findKeitaroOffers, fixBrokenClickCosts
283
+ };