Skip to content

Commit

Permalink
fix: active campaign usage report, fetch campaigns in batches
Browse files Browse the repository at this point in the history
  • Loading branch information
leogermani committed Sep 11, 2024
1 parent 3bd78d4 commit a4a9dfc
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ class Newspack_Newsletters_Active_Campaign_Usage_Reports {
*/
private $ac_instance;

/**
* Number of campaigns to fetch in a single request.
*
* @var integer
*/
public $campaign_fetch_batch_size = 20;

/**
* Constructor with dependency injection for the sake of tests.
*
Expand Down Expand Up @@ -178,23 +185,50 @@ private function get_campaign_data( $last_n_days ) {
* @param int $last_n_days Number of last days to get the data about.
*/
private function get_current_campaign_data( $last_n_days ) {
$ac = $this->ac_instance;
$params = [
'query' => [
'limit' => 100, // Assuming there will be no more than 100 campaigns in the requested period (last n days).
'orders' => [ 'sdate' => 'DESC' ],
],
];
$campaigns_result = $ac->api_v3_request( 'campaigns', 'GET', $params );
$cutoff_datetime = strtotime( '-' . $last_n_days . ' days' );
$ac = $this->ac_instance;

$cutoff_datetime = strtotime( '-' . $last_n_days . ' days' );

// Avoid timeouts by fetching campaigns in batches.
$batch_size = $this->campaign_fetch_batch_size;
$batch = 0;
$campaigns_result = [];

while ( $batch < 5 ) { // Assuming there will be no more than 100 campaigns in the requested period (last n days).
$offset = $batch_size * $batch;
$params = [
'query' => [
'limit' => $batch_size,
'offset' => $offset,
'orders' => [ 'sdate' => 'DESC' ],
],
];

$campaigns_response = $ac->api_v3_request( 'campaigns', 'GET', $params );

if ( \is_wp_error( $campaigns_response ) ) {
return $campaigns_response;
}

$campaigns_result = array_merge( $campaigns_result, $campaigns_response['campaigns'] );

// if oldest campaign is older than the cutoff date, break out.
$oldest_campaign = end( $campaigns_response['campaigns'] );
$campaign_send_date = strtotime( $oldest_campaign['sdate'] );
if ( $campaign_send_date < $cutoff_datetime ) {
break;
}

if ( count( $campaigns_response['campaigns'] ) < $batch_size ) {
break;
}

if ( \is_wp_error( $campaigns_result ) ) {
return $campaigns_result;
$batch++;
}

$campaigns_data = [];

foreach ( $campaigns_result['campaigns'] as $campaign ) {
foreach ( $campaigns_result as $campaign ) {
if (
! isset( $campaign['sdate'] )
|| 5 != $campaign['status'] // Status "5" is "completed. See https://www.activecampaign.com/api/example.php?call=campaign_list.
Expand Down
10 changes: 7 additions & 3 deletions tests/test-active-campaign-usage-report.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ function ( $contact ) use ( $params ) {
'uniquelinkclicks' => 99,
],
];
$response['campaigns'] = $campaigns;
$response['campaigns'] = [ $campaigns[ (int) $params['query']['offset'] ] ]; // return one item per page.
$response['meta']['total'] = count( $campaigns );
break;
}
Expand All @@ -109,7 +109,9 @@ public function test_get_usage_report_initial() { // phpcs:ignore Squiz.Commenti
$expected_report->unsubscribes = 0; // unsubs also rely on prior data.
$expected_report->total_contacts = 2;

$actual_report = ( new Newspack_Newsletters_Active_Campaign_Usage_Reports( new Newspack_Newsletters_Active_Campaign_Test_Wrapper() ) )->get_usage_report();
$usage_report_object = new Newspack_Newsletters_Active_Campaign_Usage_Reports( new Newspack_Newsletters_Active_Campaign_Test_Wrapper() );
$usage_report_object->campaign_fetch_batch_size = 1;
$actual_report = $usage_report_object->get_usage_report();

$this->assertEquals( $expected_report->to_array(), $actual_report->to_array() );
}
Expand Down Expand Up @@ -147,7 +149,9 @@ public function test_get_usage_report_with_prior_data() { // phpcs:ignore Squiz.
$expected_report->unsubscribes = 1;
$expected_report->total_contacts = 2;

$actual_report = ( new Newspack_Newsletters_Active_Campaign_Usage_Reports( new Newspack_Newsletters_Active_Campaign_Test_Wrapper() ) )->get_usage_report();
$usage_report_object = new Newspack_Newsletters_Active_Campaign_Usage_Reports( new Newspack_Newsletters_Active_Campaign_Test_Wrapper() );
$usage_report_object->campaign_fetch_batch_size = 1;
$actual_report = $usage_report_object->get_usage_report();

$this->assertEquals( $expected_report->to_array(), $actual_report->to_array() );
}
Expand Down

0 comments on commit a4a9dfc

Please sign in to comment.