diff --git a/lib/API/Endpoints/Newsletters.php b/lib/API/Endpoints/Newsletters.php index 033f53ca90..fae5c931ba 100644 --- a/lib/API/Endpoints/Newsletters.php +++ b/lib/API/Endpoints/Newsletters.php @@ -70,21 +70,22 @@ class Newsletters extends APIEndpoint { } if(!empty($options)) { - NewsletterOption::where('newsletter_id', $newsletter->id) - ->deleteMany(); - $option_fields = NewsletterOptionField::where( 'newsletter_type', - $data['type'] - )->findArray(); + $newsletter->type + )->findMany(); + + if (!count($option_fields)) return; foreach($option_fields as $option_field) { - if(isset($options[$option_field['name']])) { - $relation = NewsletterOption::create(); - $relation->newsletter_id = $newsletter->id; - $relation->option_field_id = $option_field['id']; - $relation->value = $options[$option_field['name']]; - $relation->save(); + if(isset($options[$option_field->name])) { + $newsletter_option = NewsletterOption::createOrUpdate( + array( + 'newsletter_id' => $newsletter->id, + 'option_field_id' => $option_field->id, + 'value' => $options[$option_field->name] + ) + ); } } } diff --git a/lib/Models/NewsletterOption.php b/lib/Models/NewsletterOption.php index 6d21aa2630..d355c1ead2 100644 --- a/lib/Models/NewsletterOption.php +++ b/lib/Models/NewsletterOption.php @@ -5,4 +5,20 @@ if(!defined('ABSPATH')) exit; class NewsletterOption extends Model { public static $_table = MP_NEWSLETTER_OPTION_TABLE; + + static function createOrUpdate($data = array()) { + if(!is_array($data) && empty($data)) return; + + $newsletter_option = self::where('option_field_id', $data['option_field_id']) + ->where('newsletter_id', $data['newsletter_id']) + ->findOne(); + + if(empty($newsletter_option)) $newsletter_option = self::create(); + + $newsletter_option->newsletter_id = $data['newsletter_id']; + $newsletter_option->option_field_id = $data['option_field_id']; + $newsletter_option->value = $data['value']; + $newsletter_option->save(); + return $newsletter_option; + } } diff --git a/tests/unit/Models/NewsletterOptionTest.php b/tests/unit/Models/NewsletterOptionTest.php new file mode 100644 index 0000000000..199f76cdb6 --- /dev/null +++ b/tests/unit/Models/NewsletterOptionTest.php @@ -0,0 +1,40 @@ +data = array( + 'newsletter_id' => 1, + 'option_field_id' => 2, + 'value' => 'test' + ); + } + + function testItCanCreateOrUpdateNewsletterOptionFieldRelation() { + // it can create + $data = $this->data; + NewsletterOption::createOrUpdate($data); + $newsletter_option = NewsletterOption::where('newsletter_id', $data['newsletter_id']) + ->where('option_field_id', $data['option_field_id']) + ->findOne(); + expect($newsletter_option->value)->equals($data['value']); + + // it can update + $data['value'] = 'updated test'; + NewsletterOption::createOrUpdate($data); + $newsletter_option = NewsletterOption::where('newsletter_id', $data['newsletter_id']) + ->where('option_field_id', $data['option_field_id']) + ->findOne(); + expect($newsletter_option->value)->equals($data['value']); + } + + + function _after() { + ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); + } +}