@bprotsyk/aso-core 2.1.52 → 2.1.53

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.
@@ -1,4 +1,5 @@
1
1
  export interface IKeitaroCampaign {
2
+ position: number[] | any;
2
3
  id: number;
3
4
  alias: string;
4
5
  name: string;
@@ -18,6 +19,10 @@ export interface IKeitaroCampaign {
18
19
  uniqueness_use_cookies: boolean;
19
20
  traffic_loss: number;
20
21
  parameters: IKeitaroCampaignParameters;
22
+ uniqueness_period?: any;
23
+ notes?: any;
24
+ collect_clicks?: any;
25
+ uniqueness_type?: any;
21
26
  }
22
27
  export interface IKeitaroCampaignParameters {
23
28
  [key: string]: IKeitaroCampaignParameter;
@@ -22,7 +22,7 @@ declare function addOffersToKeitaro(offers: IOffer[], affiliateId: number, links
22
22
  declare function createCampaign(campaignData: Partial<IKeitaroCampaign>): Promise<IKeitaroCampaign>;
23
23
  declare function getCampaignById(id: number): Promise<IKeitaroCampaign>;
24
24
  export declare function upsertStreamToCampaign(campaign: IKeitaroCampaign, stream: Partial<IKeitaroStream>): Promise<void>;
25
- declare function cloneOWCampaign(app: IApp): Promise<IKeitaroCampaign>;
25
+ declare function cloneOWCampaign(app: IApp): Promise<IKeitaroCampaign | any>;
26
26
  declare function cloneDCampaign(app: IApp): Promise<IKeitaroCampaign>;
27
27
  declare function changeCampaignsGroup(fromId: number, toId: number, exceptForCampaignIds: number[], onlyForCampaignIds?: number[]): Promise<void>;
28
28
  declare function getDomains(onlyActive?: boolean): Promise<IKeitaroDomain[]>;
@@ -192,42 +192,70 @@ async function upsertStreamToCampaign(campaign, stream) {
192
192
  }
193
193
  exports.upsertStreamToCampaign = upsertStreamToCampaign;
194
194
  async function cloneOWCampaign(app) {
195
- try {
196
- let name = `#${app.id} [◈])`;
197
- let allCampaigns = await getAllCampaigns();
198
- let matchingCampaign = allCampaigns.filter((c) => c.name.includes(`#${app.id}`));
199
- if (matchingCampaign.length > 0)
200
- return matchingCampaign[0];
201
- const { data: campaigns } = await http_1.default.post(`/campaigns/2673/clone`);
202
- if (campaigns.length == 0)
203
- throw Error("Campaign cloning falied");
204
- let clonedCampaign = campaigns[0];
205
- let allDomains = await exports.KeitaroService.getDomains(true);
206
- if (!allDomains) {
207
- throw Error(`Failed to get all domains list`);
208
- }
209
- console.log("clonedCampaign0", campaigns[0]);
210
- console.log("clonedCampaign1", campaigns[1]);
211
- const sourceCampaign = await getCampaignById(2673);
212
- console.log("Campaign to clone:", sourceCampaign);
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
- parameters: (0, keitaro_utils_1.prepareOWCampaignParameters)(app)
219
- };
220
- const { data: campaign } = await http_1.default.put(`/campaigns/${clonedCampaign.id}`, payload);
221
- return campaign;
195
+ let name = `#${app.id} [◈]`;
196
+ const generateAlias = () => {
197
+ const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
198
+ return Array.from({ length: 8 }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join('');
199
+ };
200
+ let allCampaigns = await getAllCampaigns();
201
+ let matchingCampaign = allCampaigns.filter((c) => new RegExp(`#${app.id}.*◈`).test(c.name));
202
+ if (matchingCampaign.length > 0)
203
+ return matchingCampaign[0];
204
+ const originalCampaign = await getCampaignById(2673);
205
+ const maxPosition = Math.max(...allCampaigns.map(c => c.position || 0));
206
+ const originalStreams = await getStreamsByCampaignId(2673);
207
+ let allDomains = await exports.KeitaroService.getDomains(true);
208
+ if (!allDomains) {
209
+ throw Error(`Failed to get all domains list`);
222
210
  }
223
- catch (error) {
224
- console.error('Campaign creation failed. Details:', {
225
- errorStatus: error.response?.status,
226
- errorData: error.response?.data,
227
- errorMessage: error.message
211
+ const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
212
+ const maxGroupId = Math.max(...allCampaigns.map(c => c.group_id || 0));
213
+ let alias = generateAlias();
214
+ let payload = {
215
+ // Унікальні поля
216
+ name: name,
217
+ alias: alias,
218
+ domain_id: domain.id,
219
+ position: [maxPosition + 100],
220
+ group_id: maxGroupId + 1,
221
+ traffic_source_id: keitaro_utils_1.TRAFFIC_SOURCE_ID_FLASH_AI,
222
+ parameters: (0, keitaro_utils_1.prepareOWCampaignParameters)(app),
223
+ // Неунікальні поля з оригінальної кампанії
224
+ type: originalCampaign.type,
225
+ state: originalCampaign.state,
226
+ cost_type: originalCampaign.cost_type,
227
+ cost_value: originalCampaign.cost_value,
228
+ cost_currency: originalCampaign.cost_currency,
229
+ uniqueness_period: originalCampaign.uniqueness_period,
230
+ cookies_ttl: originalCampaign.cookies_ttl,
231
+ notes: originalCampaign.notes,
232
+ collect_clicks: originalCampaign.collect_clicks,
233
+ uniqueness_type: originalCampaign.uniqueness_type, // тип унікальності (IP і user-agent)
234
+ };
235
+ const newCampaign = await createCampaign(payload);
236
+ for (const stream of originalStreams) {
237
+ await http_1.default.post('streams', {
238
+ name: stream.name,
239
+ campaign_id: newCampaign.id,
240
+ schema: stream.schema,
241
+ type: stream.type,
242
+ action_type: stream.action_type,
243
+ weight: stream.weight,
244
+ offers: stream.offers.map((offer) => ({
245
+ offer_id: offer.offer_id,
246
+ share: offer.share,
247
+ state: offer.state
248
+ })),
249
+ filters: stream.filters.map((filter) => ({
250
+ name: filter.name,
251
+ mode: filter.mode,
252
+ payload: filter.payload
253
+ })),
254
+ position: stream.position,
255
+ state: stream.state
228
256
  });
229
- throw error;
230
257
  }
258
+ return newCampaign;
231
259
  }
232
260
  async function cloneDCampaign(app) {
233
261
  let name = `D #${app.id} (${app.bundle})`;
@@ -7,7 +7,7 @@ export declare let removeGeosFromAllRedirectCampaigns: (geoToRemove: string) =>
7
7
  export declare let prepareOWCampaignParameters: (app: IApp) => IKeitaroCampaignParameters;
8
8
  export declare function createOWStreamPartialPayload(app: IApp): Partial<IKeitaroStream>;
9
9
  export declare function createDirectCampaign(app: IApp): Promise<IKeitaroCampaign>;
10
- export declare function createOWCampaign(app: IApp): Promise<IKeitaroCampaign>;
10
+ export declare function createOWCampaign(app: IApp): Promise<any>;
11
11
  type PostbackStatus = 'lead' | 'sale' | 'rejected';
12
12
  export declare function sendPostbacks(subids: string[], status: PostbackStatus, payout?: number): Promise<void>;
13
13
  export {};
@@ -304,8 +304,8 @@ let prepareOWCampaignParameters = (app) => {
304
304
  },
305
305
  sub_id_15: {
306
306
  "name": "offer_id",
307
- "placeholder": "{offer_custom_id}",
308
- "alias": "offer_custom_id"
307
+ "placeholder": "{offer_id}",
308
+ "alias": "offer_id"
309
309
  }
310
310
  };
311
311
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bprotsyk/aso-core",
3
- "version": "2.1.52",
3
+ "version": "2.1.53",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "scripts": {
@@ -1,4 +1,5 @@
1
1
  export interface IKeitaroCampaign {
2
+ position: number[] | any
2
3
  id: number
3
4
  alias: string,
4
5
  name: string
@@ -18,6 +19,11 @@ export interface IKeitaroCampaign {
18
19
  uniqueness_use_cookies: boolean
19
20
  traffic_loss: number
20
21
  parameters: IKeitaroCampaignParameters
22
+ uniqueness_period?: any
23
+ notes?: any
24
+ collect_clicks?: any
25
+ uniqueness_type?: any
26
+
21
27
  }
22
28
 
23
29
  export interface IKeitaroCampaignParameters {
@@ -237,55 +237,100 @@ export async function upsertStreamToCampaign(campaign: IKeitaroCampaign, stream:
237
237
  }
238
238
  }
239
239
 
240
- async function cloneOWCampaign(app: IApp): Promise<IKeitaroCampaign> {
241
- try{
242
- let name = `#${app.id} [◈])`
240
+ async function cloneOWCampaign(app: IApp): Promise<IKeitaroCampaign | any> {
241
+ let name = `#${app.id} [◈]`
242
+ const generateAlias = () => {
243
+ const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
244
+ return Array.from(
245
+ { length: 8 },
246
+ () => chars.charAt(Math.floor(Math.random() * chars.length))
247
+ ).join('');
248
+ };
243
249
 
244
250
  let allCampaigns = await getAllCampaigns()
245
- let matchingCampaign = allCampaigns.filter((c) => c.name.includes(`#${app.id}`))
251
+ let matchingCampaign = allCampaigns.filter((c) => new RegExp(`#${app.id}.*◈`).test(c.name))
246
252
  if (matchingCampaign.length > 0) return matchingCampaign[0]
247
253
 
248
- const { data: campaigns } = await keitaroApi.post(`/campaigns/2673/clone`);
254
+ const originalCampaign : IKeitaroCampaign = await getCampaignById(2673)
255
+ const maxPosition = Math.max(...allCampaigns.map(c => c.position || 0));
256
+ const originalStreams = await getStreamsByCampaignId(2673)
249
257
 
258
+
250
259
 
251
- if (campaigns.length == 0) throw Error("Campaign cloning falied")
260
+
252
261
 
253
- let clonedCampaign: IKeitaroCampaign = campaigns[0]
254
262
 
255
263
  let allDomains = await KeitaroService.getDomains(true)
256
264
  if (!allDomains) {
257
265
  throw Error(`Failed to get all domains list`)
258
266
  }
259
- console.log("clonedCampaign0", campaigns[0])
260
- console.log("clonedCampaign1", campaigns[1])
261
-
262
- const sourceCampaign = await getCampaignById(2673)
263
- console.log("Campaign to clone:", sourceCampaign)
267
+
268
+ const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
269
+ const maxGroupId = Math.max(...allCampaigns.map(c => c.group_id || 0));
270
+
271
+
272
+ let alias = generateAlias()
264
273
 
265
274
 
266
275
 
267
- const domain = allDomains[Math.floor(Math.random() * allDomains.length)];
268
276
 
269
277
  let payload: Partial<IKeitaroCampaign> = {
278
+ // Унікальні поля
270
279
  name: name,
271
- traffic_source_id: TRAFFIC_SOURCE_ID_FLASH_AI,
280
+ alias: alias,
272
281
  domain_id: domain.id,
273
- parameters: prepareOWCampaignParameters(app)
282
+ position: [maxPosition + 100],
283
+ group_id: maxGroupId + 1,
284
+ traffic_source_id: TRAFFIC_SOURCE_ID_FLASH_AI,
285
+ parameters: prepareOWCampaignParameters(app),
286
+
287
+ // Неунікальні поля з оригінальної кампанії
288
+ type: originalCampaign.type, // тип (position)
289
+ state: originalCampaign.state, // стан (active)
290
+ cost_type: originalCampaign.cost_type, // тип оплати (CPS)
291
+ cost_value: originalCampaign.cost_value, // вартість
292
+ cost_currency: originalCampaign.cost_currency, // валюта (USD)
293
+ uniqueness_period: originalCampaign.uniqueness_period, // період унікальності (8760 годин)
294
+ cookies_ttl: originalCampaign.cookies_ttl, // термін дії cookies
295
+ notes: originalCampaign.notes, // нотатки
296
+ collect_clicks: originalCampaign.collect_clicks, // збір кліків
297
+ uniqueness_type: originalCampaign.uniqueness_type, // тип унікальності (IP і user-agent)
274
298
  }
275
299
 
276
- const { data: campaign } = await keitaroApi.put(`/campaigns/${clonedCampaign.id}`, payload)
300
+
277
301
 
278
- return campaign
279
- }
302
+
280
303
 
281
- catch (error: any) {
282
- console.error('Campaign creation failed. Details:', {
283
- errorStatus: error.response?.status,
284
- errorData: error.response?.data,
285
- errorMessage: error.message
286
- })
287
- throw error
288
- }
304
+
305
+ const newCampaign : IKeitaroCampaign = await createCampaign(payload)
306
+
307
+ for (const stream of originalStreams) {
308
+ await keitaroApi.post('streams', {
309
+ name: stream.name,
310
+ campaign_id: newCampaign.id,
311
+ schema: stream.schema,
312
+ type: stream.type,
313
+ action_type: stream.action_type,
314
+ weight: stream.weight,
315
+ offers: stream.offers.map((offer) => ({
316
+ offer_id: offer.offer_id,
317
+ share: offer.share,
318
+ state: offer.state
319
+ })),
320
+ filters: stream.filters.map((filter) => ({
321
+ name: filter.name,
322
+ mode: filter.mode,
323
+ payload: filter.payload
324
+ })),
325
+ position: stream.position,
326
+ state: stream.state
327
+ });
328
+ }
329
+
330
+
331
+
332
+
333
+ return newCampaign
289
334
  }
290
335
 
291
336
  async function cloneDCampaign(app: IApp): Promise<IKeitaroCampaign> {
@@ -339,8 +339,8 @@ export let prepareOWCampaignParameters = (app: IApp): IKeitaroCampaignParameters
339
339
  },
340
340
  sub_id_15: {
341
341
  "name": "offer_id",
342
- "placeholder": "{offer_custom_id}",
343
- "alias": "offer_custom_id"
342
+ "placeholder": "{offer_id}",
343
+ "alias": "offer_id"
344
344
  }
345
345
  }
346
346
  }
@@ -0,0 +1,12 @@
1
+ const { KeitaroService } = require('./lib/network/keitaro/keitaro-service');
2
+
3
+ async function testClone() {
4
+ try {
5
+ const result = await KeitaroService.cloneOWCampaign({ id: 480 });
6
+ console.log('Cloned campaign:', result);
7
+ } catch (error) {
8
+ console.error('Error:', error);
9
+ }
10
+ }
11
+
12
+ testClone();