diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index 4aa37ec37e..dc00c90ffc 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -644,7 +644,8 @@ class Newsletter extends Model { // filter by type $type = isset($data['params']['type']) ? $data['params']['type'] : null; if($type !== null) { - $orm->filter('filterType', $type); + $group = (isset($data['params']['group'])) ? $data['params']['group'] : null; + $orm->filter('filterType', $type, $group); } // filter by parent id @@ -818,7 +819,7 @@ class Newsletter extends Model { return $orm; } - static function filterType($orm, $type = false) { + static function filterType($orm, $type = false, $group = false) { if(in_array($type, array( self::TYPE_STANDARD, self::TYPE_WELCOME, @@ -826,7 +827,26 @@ class Newsletter extends Model { self::TYPE_NOTIFICATION, self::TYPE_NOTIFICATION_HISTORY ))) { - $orm->where('type', $type); + if($type === self::TYPE_AUTOMATIC && $group) { + $orm = $orm->join( + NewsletterOptionField::$_table, + array( + 'option_fields.newsletter_type', '=', self::$_table . '.type', + 'option_fields.name', '=', 'group' + ), + 'option_fields' + ) + ->join( + NewsletterOption::$_table, + array( + 'options.newsletter_id', '=', self::$_table . '.id' + ), + 'options' + ) + ->whereRaw('`options`.`option_field_id` = `option_fields`.`id`') + ->where('options.value', $group); + } + $orm = $orm->where(self::$_table . '.type', $type); } return $orm; } @@ -834,14 +854,14 @@ class Newsletter extends Model { static function listingQuery($data = array()) { $query = self::select( array( - 'id', - 'subject', - 'hash', - 'type', - 'status', - 'sent_at', - 'updated_at', - 'deleted_at' + self::$_table . '.id', + self::$_table . '.subject', + self::$_table . '.hash', + self::$_table . '.type', + self::$_table . '.status', + self::$_table . '.sent_at', + self::$_table . '.updated_at', + self::$_table . '.deleted_at' ) ); if($data['sort_by'] === 'sent_at') { diff --git a/tests/unit/Models/NewsletterTest.php b/tests/unit/Models/NewsletterTest.php index 9a3a337cc5..ff2f11c3aa 100644 --- a/tests/unit/Models/NewsletterTest.php +++ b/tests/unit/Models/NewsletterTest.php @@ -742,7 +742,7 @@ class NewsletterTest extends \MailPoetTest { expect(NewsletterSegment::findArray())->count(0); } - function testDuplicatesNewsletter() { + function testItDuplicatesNewsletter() { $original_newsletter = $this->newsletter; $original_newsletter->status = Newsletter::STATUS_SENT; $original_newsletter->sent_at = $original_newsletter->deleted_at = $original_newsletter->created_at = $original_newsletter->updated_at = date( '2000-m-d H:i:s'); @@ -766,6 +766,79 @@ class NewsletterTest extends \MailPoetTest { expect($duplicate_newsletter->subject)->equals($data['subject']); } + function testItCanQueryAutomaticEmailsByGroup() { + $newsletter_1 = Newsletter::createOrUpdate( + array( + 'subject' => 'WooCommerce', + 'preheader' => 'Pre Header', + 'type' => Newsletter::TYPE_AUTOMATIC + ) + ); + $newsletter_2 = Newsletter::createOrUpdate( + array( + 'subject' => 'Unicrons', + 'preheader' => 'Pre Header', + 'type' => Newsletter::TYPE_AUTOMATIC + ) + ); + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->hydrate( + array( + 'newsletter_type' => Newsletter::TYPE_AUTOMATIC, + 'name' => 'group' + ) + ); + $newsletter_option_field->save(); + $newsletter_option_1 = NewsletterOption::create(); + $newsletter_option_1->hydrate( + array( + 'newsletter_id' => $newsletter_1->id, + 'option_field_id' => $newsletter_option_field->id, + 'value' => 'woocommerce' + ) + ); + $newsletter_option_1->save(); + $newsletter_option_2 = NewsletterOption::create(); + $newsletter_option_2->hydrate( + array( + 'newsletter_id' => $newsletter_2->id, + 'option_field_id' => $newsletter_option_field->id, + 'value' => 'unicorns' + ) + ); + $newsletter_option_2->save(); + $listings_data = array( + 'params' => array( + 'type' => Newsletter::TYPE_AUTOMATIC + ), + 'sort_by' => 'updated_at', + 'sort_order' => 'desc', + 'offset' => 0, + 'limit' => 20, + 'group' => 'all', + 'search' => '' + ); + + // get "woocommerce" emails + $listings_data['params']['group'] = 'woocommerce'; + $result = Newsletter::listingQuery($listings_data)->findMany(); + expect($result)->count(1); + expect($result[0]->id)->equals($newsletter_1->id); + + // get "unicorn" emails + $listings_data['params']['group'] = 'unicorns'; + $result = Newsletter::listingQuery($listings_data)->findMany(); + expect($result)->count(1); + expect($result[0]->id)->equals($newsletter_2->id); + + // get all automatic emails + unset($listings_data['params']['group']); + $result = Newsletter::listingQuery($listings_data)->findMany(); + expect($result)->count(2); + expect($result[0]->id)->equals($newsletter_1->id); + expect($result[1]->id)->equals($newsletter_2->id); + } + function _after() { \ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); \ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);