Major refactoring of listing/router/model relation

- updated Subscribers listing
- udpated Segments listing
- added Forms router
This commit is contained in:
Jonathan Labreuille
2015-10-29 15:30:24 +01:00
parent 103da61d45
commit a4cf2f9c76
20 changed files with 662 additions and 643 deletions

View File

@ -9,6 +9,10 @@ class Model extends \Sudzy\ValidModel {
parent::__construct($customValidators->init());
}
static function create() {
return parent::create();
}
function save() {
$this->setTimestamp();
try {
@ -21,29 +25,54 @@ class Model extends \Sudzy\ValidModel {
}
}
static function restore($orm) {
$models = $orm->findResultSet();
if(empty($models)) return false;
function trash() {
return $this->set_expr('deleted_at', 'NOW()')->save();
}
$models->setExpr('deleted_at', 'NULL')->save();
static function bulkTrash($orm) {
$models = $orm->findResultSet();
$models->set_expr('deleted_at', 'NOW()')->save();
return $models->count();
}
static function trash($orm, $confirm = false) {
$models = $orm->findResultSet();
if(empty($models)) return false;
if($confirm === true) {
foreach($models as $model) {
$model->delete();
}
} else {
$models = $orm->findResultSet();
$models->setExpr('deleted_at', 'NOW()')->save();
static function bulkDelete($orm) {
$models = $orm->findMany();
$count = 0;
foreach($models as $model) {
$model->delete();
$count++;
}
return $count;
}
function restore() {
return $this->set_expr('deleted_at', 'NULl')->save();
}
static function bulkRestore($orm) {
$models = $orm->findResultSet();
$models->set_expr('deleted_at', 'NULL')->save();
return $models->count();
}
function duplicate($data = array()) {
$model = get_called_class();
$model_data = array_merge($this->asArray(), $data);
unset($model_data['id']);
$duplicate = $model::create();
$duplicate->hydrate($model_data);
$duplicate->set_expr('created_at', 'NOW()');
$duplicate->set_expr('updated_at', 'NOW()');
$duplicate->set_expr('deleted_at', 'NULL');
if($duplicate->save()) {
return $duplicate;
} else {
return false;
}
}
private function setTimestamp() {
if($this->created_at === null) {
$this->set_expr('created_at', 'NOW()');

View File

@ -143,46 +143,4 @@ class Newsletter extends Model {
}
return false;
}
static function trash($listing, $data = array()) {
$confirm_delete = filter_var($data['confirm'], FILTER_VALIDATE_BOOLEAN);
if($confirm_delete) {
// delete relations with all segments
$newsletters = $listing->getSelection()->findResultSet();
if(!empty($newsletters)) {
$newsletters_count = 0;
foreach($newsletters as $newsletter) {
if($newsletter->delete()) {
$newsletters_count++;
}
}
return array(
'newsletters' => $newsletters_count
);
}
return false;
} else {
// soft delete
$newsletters = $listing->getSelection()
->findResultSet()
->set_expr('deleted_at', 'NOW()')
->save();
return array(
'newsletters' => $newsletters->count()
);
}
}
static function restore($listing, $data = array()) {
$newsletters = $listing->getSelection()
->findResultSet()
->set_expr('deleted_at', 'NULL')
->save();
return array(
'newsletters' => $newsletters->count()
);
}
}

View File

@ -17,48 +17,7 @@ class Segment extends Model {
function delete() {
// delete all relations to subscribers
SubscriberSegment::where('segment_id', $this->id)->deleteMany();
return parent::delete();
}
static function duplicate($id) {
$segment = self::findOne($id)->asArray();
if($segment !== false) {
unset($segment['id']);
$new_segment = self::create();
$new_segment->hydrate($segment);
$new_segment->set(
'name',
sprintf(__('Copy of %s'), $new_segment->name)
);
$new_segment->set_expr('created_at', 'NOW()');
$new_segment->set_expr('updated_at', 'NOW()');
$new_segment->save();
$relations = SubscriberSegment::select('subscriber_id')
->where('segment_id', $id)
->findResultSet();
foreach($relations as $relation) {
$new_relation = SubscriberSegment::create();
$new_relation->set('subscriber_id', $relation->subscriber_id);
$new_relation->set('segment_id', $new_segment->id());
$new_relation->save();
}
return true;
}
return false;
}
function subscribers() {
return $this->has_many_through(
__NAMESPACE__.'\Subscriber',
__NAMESPACE__.'\SubscriberSegment',
'segment_id',
'subscriber_id'
);
parent::delete();
}
function newsletters() {
@ -125,45 +84,28 @@ class Segment extends Model {
return false;
}
static function trash($listing, $data = array()) {
$confirm_delete = filter_var($data['confirm'], FILTER_VALIDATE_BOOLEAN);
if($confirm_delete) {
// delete relations with all segments
$segments = $listing->getSelection()->findResultSet();
function duplicate($data = array()) {
$duplicate = parent::duplicate($data);
if(!empty($segments)) {
$segments_count = 0;
foreach($segments as $segment) {
if($segment->delete()) {
$segments_count++;
}
}
return array(
'segments' => $segments_count
);
if($duplicate !== false) {
foreach($this->subscribers()->findResultSet() as $relation) {
$new_relation = SubscriberSegment::create();
$new_relation->set('subscriber_id', $relation->id);
$new_relation->set('segment_id', $duplicate->id);
$new_relation->save();
}
return false;
} else {
// soft delete
$segments = $listing->getSelection()
->findResultSet()
->set_expr('deleted_at', 'NOW()')
->save();
return array(
'segments' => $segments->count()
);
return $duplicate;
}
return false;
}
static function restore($listing, $data = array()) {
$segments = $listing->getSelection()
->findResultSet()
->set_expr('deleted_at', 'NULL')
->save();
return array(
'segments' => $segments->count()
function subscribers() {
return $this->has_many_through(
__NAMESPACE__.'\Subscriber',
__NAMESPACE__.'\SubscriberSegment',
'segment_id',
'subscriber_id'
);
}
}

View File

@ -66,7 +66,7 @@ class Subscriber extends Model {
if($key === 'segment') {
$segment = Segment::findOne($value);
if($segment !== false) {
$orm = $segment->subscribers();
return $segment->subscribers();
}
}
}
@ -189,12 +189,11 @@ class Subscriber extends Model {
return false;
}
static function moveToList($listing, $data = array()) {
static function bulkMoveToList($orm, $data = array()) {
$segment_id = (isset($data['segment_id']) ? (int)$data['segment_id'] : 0);
$segment = Segment::findOne($segment_id);
if($segment !== false) {
$subscribers_count = 0;
$subscribers = $listing->getSelection()->findResultSet();
$subscribers = $orm->findResultSet();
foreach($subscribers as $subscriber) {
// remove subscriber from all segments
SubscriberSegment::where('subscriber_id', $subscriber->id)->deleteMany();
@ -204,37 +203,37 @@ class Subscriber extends Model {
$association->subscriber_id = $subscriber->id;
$association->segment_id = $segment->id;
$association->save();
$subscribers_count++;
}
return array(
'subscribers' => $subscribers_count,
'subscribers' => $subscribers->count(),
'segment' => $segment->name
);
}
return false;
}
static function removeFromList($listing, $data = array()) {
static function bulkRemoveFromList($orm, $data = array()) {
$segment_id = (isset($data['segment_id']) ? (int)$data['segment_id'] : 0);
$segment = Segment::findOne($segment_id);
if($segment !== false) {
// delete relations with segment
$subscriber_ids = $listing->getSelectionIds();
SubscriberSegment::whereIn('subscriber_id', $subscriber_ids)
->where('segment_id', $segment->id)
->deleteMany();
$subscribers = $orm->findResultSet();
foreach($subscribers as $subscriber) {
SubscriberSegment::where('subscriber_id', $subscriber->id)
->where('segment_id', $segment->id)
->deleteMany();
}
return array(
'subscribers' => count($subscriber_ids),
'subscribers' => $subscribers->count(),
'segment' => $segment->name
);
}
return false;
}
static function removeFromAllLists($listing) {
static function bulkRemoveFromAllLists($orm) {
$segments = Segment::findMany();
$segment_ids = array_map(function($segment) {
return $segment->id();
@ -242,62 +241,48 @@ class Subscriber extends Model {
if(!empty($segment_ids)) {
// delete relations with segment
$subscriber_ids = $listing->getSelectionIds();
SubscriberSegment::whereIn('subscriber_id', $subscriber_ids)
->whereIn('segment_id', $segment_ids)
->deleteMany();
return array(
'subscribers' => count($subscriber_ids)
);
}
return false;
}
static function confirmUnconfirmed($listing) {
$subscriber_ids = $listing->getSelectionIds();
$subscribers = Subscriber::whereIn('id', $subscriber_ids)
->where('status', 'unconfirmed')
->findMany();
if(!empty($subscribers)) {
$subscribers_count = 0;
$subscribers = $orm->findResultSet();
foreach($subscribers as $subscriber) {
$subscriber->set('status', 'subscribed');
if($subscriber->save() === true) {
$subscribers_count++;
}
SubscriberSegment::where('subscriber_id', $subscriber->id)
->whereIn('segment_id', $segment_ids)
->deleteMany();
}
return array(
'subscribers' => $subscribers_count
);
return $subscribers->count();
}
return false;
}
static function resendConfirmationEmail($listing) {
$subscriber_ids = $listing->getSelectionIds();
$subscribers = Subscriber::whereIn('id', $subscriber_ids)
static function bulkConfirmUnconfirmed($orm) {
$subscribers = $orm->findResultSet();
$subscribers->set('status', 'subscribed')->save();
return $subscribers->count();
}
static function bulkResendConfirmationEmail($orm) {
$subscribers = $orm
->where('status', 'unconfirmed')
->findMany();
->findResultSet();
if(!empty($subscribers)) {
foreach($subscribers as $subscriber) {
// TODO: resend confirmation email
// TODO: send confirmation email
// $subscriber->sendConfirmationEmail()
}
return true;
return $subscribers->count();
}
return false;
}
static function addToList($listing, $data = array()) {
static function bulkAddToList($orm, $data = array()) {
$segment_id = (isset($data['segment_id']) ? (int)$data['segment_id'] : 0);
$segment = Segment::findOne($segment_id);
if($segment !== false) {
$subscribers_count = 0;
$subscribers = $listing->getSelection()->findMany();
$subscribers = $orm->findMany();
foreach($subscribers as $subscriber) {
// create relation with segment
$association = \MailPoet\Models\SubscriberSegment::create();
@ -314,46 +299,4 @@ class Subscriber extends Model {
}
return false;
}
static function trash($listing, $data = array()) {
$confirm_delete = filter_var($data['confirm'], FILTER_VALIDATE_BOOLEAN);
if($confirm_delete) {
// delete relations with all segments
$subscribers = $listing->getSelection()->findResultSet();
if(!empty($subscribers)) {
$subscribers_count = 0;
foreach($subscribers as $subscriber) {
if($subscriber->delete()) {
$subscribers_count++;
}
}
return array(
'subscribers' => $subscribers_count
);
}
return false;
} else {
// soft delete
$subscribers = $listing->getSelection()
->findResultSet()
->set_expr('deleted_at', 'NOW()')
->save();
return array(
'subscribers' => $subscribers->count()
);
}
}
static function restore($listing, $data = array()) {
$subscribers = $listing->getSelection()
->findResultSet()
->set_expr('deleted_at', 'NULL')
->save();
return array(
'subscribers' => $subscribers->count()
);
}
}