From bb9fce7f82b8180df3d4b797bf9713bc32d70b07 Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 18 Mar 2016 09:58:40 -0400 Subject: [PATCH] - Implements post notification scheduling --- .../js/src/newsletters/types/notification.jsx | 26 +++++----- composer.lock | 6 +-- lib/Config/Populator.php | 12 +++++ lib/Models/Subscriber.php | 2 +- lib/Newsletter/Scheduler/Scheduler.php | 52 +++++++++++++++++-- lib/Router/Newsletters.php | 7 +++ lib/Segments/WP.php | 2 +- 7 files changed, 84 insertions(+), 23 deletions(-) diff --git a/assets/js/src/newsletters/types/notification.jsx b/assets/js/src/newsletters/types/notification.jsx index 92f1606cd1..9952590994 100644 --- a/assets/js/src/newsletters/types/notification.jsx +++ b/assets/js/src/newsletters/types/notification.jsx @@ -53,13 +53,13 @@ define( var weekDayField = { name: 'weekDay', values: { - 0: 'Monday', - 1: 'Tuesday', - 2: 'Wednesday', - 3: 'Thursday', - 4: 'Friday', - 5: 'Saturday', - 6: 'Sunday', + 0: 'Sunday', + 1: 'Monday', + 2: 'Tuesday', + 3: 'Wednesday', + 4: 'Thursday', + 5: 'Friday', + 6: 'Saturday' }, }; @@ -84,10 +84,10 @@ define( var nthWeekDayField = { name: 'nthWeekDay', values: { - '0': '1st', - '1': '2nd', - '2': '3rd', - '3': 'last', + '1': '1st', + '2': '2nd', + '3': '3rd', + 'L': 'last', }, }; @@ -99,9 +99,9 @@ define( return { intervalType: 'immediate', // 'immediate'|'daily'|'weekly'|'monthly' timeOfDay: 0, - weekDay: 0, + weekDay: 1, monthDay: 0, - nthWeekDay: 0, + nthWeekDay: 1, }; }, handleIntervalChange: function(event) { diff --git a/composer.lock b/composer.lock index da2bdd5d99..84c3cf549c 100644 --- a/composer.lock +++ b/composer.lock @@ -2294,7 +2294,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/41ee6c70758f40fa1dbf90d019ae0a66c4a09e74", + "url": "https://api.github.com/repos/symfony/config/zipball/ee4cdda66aff834c8125e8f2c15932461667c521", "reference": "41ee6c70758f40fa1dbf90d019ae0a66c4a09e74", "shasum": "" }, @@ -2671,7 +2671,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/7fd5e4034cb8e215887136f5e176430bbf5ef085", + "url": "https://api.github.com/repos/symfony/form/zipball/b629051c77a4f37c625651d03002760385df4575", "reference": "7fd5e4034cb8e215887136f5e176430bbf5ef085", "shasum": "" }, @@ -2929,7 +2929,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6f1979c3b0f4c22c77a8a8971afaa7dd07f082ac", + "url": "https://api.github.com/repos/symfony/process/zipball/d9d21cfcc3e202ee34777d6da38897695d4d208d", "reference": "6f1979c3b0f4c22c77a8a8971afaa7dd07f082ac", "shasum": "" }, diff --git a/lib/Config/Populator.php b/lib/Config/Populator.php index d1518e7287..b24f763aa1 100644 --- a/lib/Config/Populator.php +++ b/lib/Config/Populator.php @@ -175,6 +175,18 @@ class Populator { 'name' => 'nthWeekDay', 'newsletter_type' => 'notification', ), + array( + 'name' => 'schedule', + 'newsletter_type' => 'notification', + ), + array( + 'name' => 'lastRunTime', + 'newsletter_type' => 'notification', + ), + array( + 'name' => 'lastRunResults', + 'newsletter_type' => 'notification', + ), ); } diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index b1244d6ac8..52f263c16b 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -209,7 +209,7 @@ class Subscriber extends Model { if($subscriber->save()) { $subscriber->addToSegments($segment_ids); - Scheduler::newSegmentSubscriptionNewsletter($subscriber, $segment_ids); + Scheduler::welcomeForSegmentSubscription($subscriber, $segment_ids); } } diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index d8b67021c1..ac9655ac28 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -3,29 +3,71 @@ namespace MailPoet\Newsletter\Scheduler; use Carbon\Carbon; use MailPoet\Models\Newsletter; +use MailPoet\Models\NewsletterOption; +use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\SendingQueue; class Scheduler { - static function newSegmentSubscriptionNewsletter(array $subscriber, array $segments) { + static function postNotification($newsletter_id) { + $newsletter = Newsletter::filter('filterWithOptions') + ->findOne($newsletter_id); + $interval_type = $newsletter->intervalType; + $hour = (int) $newsletter->timeOfDay / 3600; + $week_day = $newsletter->weekDay; + $month_day = $newsletter->monthDay; + $nth_week_day = ($newsletter->nthWeekDay === 'L') ? + $newsletter->nthWeekDay : + '#' . $newsletter->nthWeekDay; + switch($interval_type) { + case 'immediately': + $cron = '* * * * *'; + break; + case 'immediate': //daily + $cron = sprintf('0 %s * * *', $hour); + break; + case 'weekly': + $cron = sprintf('0 %s * * %s', $hour, $week_day); + break; + case 'monthly': + $cron = sprintf('0 %s %s * *', $hour, $month_day); + break; + case 'nthWeekDay': + $cron = sprintf('0 %s ? * %s%s', $hour, $week_day, $nth_week_day); + break; + } + $option_field = NewsletterOptionField::where('name', 'schedule') + ->findOne(); + $relation = NewsletterOption::create(); + $relation->newsletter_id = $newsletter->id; + $relation->option_field_id = $option_field->id; + $relation->value = $cron; + $relation->save(); + } + + static function welcomeForSegmentSubscription( + array $subscriber, array $segments + ) { $newsletters = self::getWelcomeNewsletters(); if(!count($newsletters)) return; foreach($newsletters as $newsletter) { if($newsletter['event'] === 'segment' && in_array($newsletter['segment'], $segments) ) { - self::scheduleWelcomeNewsletter($newsletter, $subscriber); + self::createSendingQueueEntry($newsletter, $subscriber); } } } - static function newUserRegistrationNewsletter(array $subscriber, array $wp_user) { + static function welcomeForNewWordpressUserRegistration( + array $subscriber, array $wp_user + ) { $newsletters = self::getWelcomeNewsletters(); if(!count($newsletters)) return; foreach($newsletters as $newsletter) { if($newsletter['event'] === 'user' && in_array($newsletter['role'], $wp_user['roles']) ) { - self::scheduleWelcomeNewsletter($newsletter, $subscriber); + self::createSendingQueueEntry($newsletter, $subscriber); } } } @@ -36,7 +78,7 @@ class Scheduler { ->findArray(); } - private static function scheduleWelcomeNewsletter($newsletter, $subscriber) { + private static function createSendingQueueEntry($newsletter, $subscriber) { $queue = SendingQueue::create(); $queue->newsletter_id = $newsletter['id']; $queue->subscribers = serialize( diff --git a/lib/Router/Newsletters.php b/lib/Router/Newsletters.php index 2f40669a52..ce8e1cfebd 100644 --- a/lib/Router/Newsletters.php +++ b/lib/Router/Newsletters.php @@ -14,6 +14,7 @@ use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOption; use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Models\SendingQueue; +use MailPoet\Newsletter\Scheduler\Scheduler; if(!defined('ABSPATH')) exit; @@ -265,6 +266,12 @@ class Newsletters { } } } + if(!isset($data['id']) && + isset($data['type']) && + $data['type'] === 'notification' + ) { + Scheduler::postNotification($newsletter->id); + } return array( 'result' => true, 'newsletter' => $newsletter->asArray() diff --git a/lib/Segments/WP.php b/lib/Segments/WP.php index 35cd8c1532..d482958239 100644 --- a/lib/Segments/WP.php +++ b/lib/Segments/WP.php @@ -48,7 +48,7 @@ class WP { $segment->addSubscriber($subscriber->id); } if(isset($new_user) && $new_user === true) { - Scheduler::newUserRegistrationNewsletter( + Scheduler::welcomeForNewWordpressUserRegistration( $subscriber->asArray(), (array) $wp_user );