From 42f51934e01971eb81461e0fede4f0c5d939f34d Mon Sep 17 00:00:00 2001 From: Sebastian Marcet Date: Wed, 13 Dec 2017 12:07:48 -0300 Subject: [PATCH] Fix on Presentation update process there was an issue on presentation update and doctrine entity lifecycles Change-Id: If65a29f8a92b5581d4326a08bce66964b9239204 --- .../OAuth2SummitSpeakersApiController.php | 2 +- .../Events/Presentations/Presentation.php | 19 ++- .../Presentations/PresentationSpeaker.php | 18 +-- .../Summit/Events/SummitEntityEvent.php | 7 + app/Providers/EventServiceProvider.php | 147 ++++++++++++------ app/Services/Model/SpeakerService.php | 2 +- tests/OAuth2SpeakersApiTest.php | 4 +- tests/OAuth2SummitApiTest.php | 5 +- 8 files changed, 141 insertions(+), 63 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php index 824c6d84..37fc8c1c 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php @@ -379,7 +379,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); - $speaker = CheckSpeakerStrategyFactory::build(CheckSpeakerStrategyFactory::Me, $this->resource_server_context)->check($speaker_id, $summit); + $speaker = $this->speaker_repository->getById($speaker_id); if (is_null($speaker)) return $this->error404(); $rules = array diff --git a/app/Models/Foundation/Summit/Events/Presentations/Presentation.php b/app/Models/Foundation/Summit/Events/Presentations/Presentation.php index a8553871..a03074e4 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/Presentation.php +++ b/app/Models/Foundation/Summit/Events/Presentations/Presentation.php @@ -116,8 +116,16 @@ class Presentation extends SummitEvent private $materials; /** - * @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", mappedBy="presentations") - * @var PresentationSpeaker[] + * @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", inversedBy="presentations") + * @ORM\JoinTable(name="Presentation_Speakers", + * joinColumns={ + * @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID") + * }, + * inverseJoinColumns={ + * @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID") + * + * } + * ) */ private $speakers; @@ -298,6 +306,13 @@ class Presentation extends SummitEvent $video->unsetPresentation(); } + /** + * @param PresentationSpeaker $speaker + */ + public function removeSpeaker(PresentationSpeaker $speaker){ + $this->speakers->removeElement($speaker); + } + /** * @return PresentationSlide[] */ diff --git a/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php b/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php index 3c274e03..3cf9960f 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php +++ b/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php @@ -90,15 +90,8 @@ class PresentationSpeaker extends SilverstripeBaseModel private $promo_codes; /** - * @ORM\ManyToMany(targetEntity="models\summit\Presentation", inversedBy="speakers") - * @ORM\JoinTable(name="Presentation_Speakers", - * joinColumns={ - * @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID") - * }, - * inverseJoinColumns={ - * @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID") - * } - * ) + * @ORM\ManyToMany(targetEntity="models\summit\Presentation", mappedBy="speakers") + * @var Presentation[] */ private $presentations; @@ -235,6 +228,13 @@ class PresentationSpeaker extends SilverstripeBaseModel $this->presentations->add($presentation); } + + public function clearPresentations(){ + foreach($this->presentations as $presentation){ + $presentation->removeSpeaker($this); + } + $this->presentations->clear(); + } /** * @param SpeakerSummitRegistrationPromoCode $code * @return $this diff --git a/app/Models/Foundation/Summit/Events/SummitEntityEvent.php b/app/Models/Foundation/Summit/Events/SummitEntityEvent.php index 238b20d2..fb025da1 100644 --- a/app/Models/Foundation/Summit/Events/SummitEntityEvent.php +++ b/app/Models/Foundation/Summit/Events/SummitEntityEvent.php @@ -94,6 +94,13 @@ class SummitEntityEvent extends SilverstripeBaseModel return !empty($this->metadata) ? json_decode($this->metadata, true) : array(); } + /** + * @return string + */ + public function getRawMetadata(){ + return $this->metadata; + } + /** * @ORM\ManyToOne(targetEntity="models\main\Member", cascade={"persist"}) * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID") diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 0a28f734..60355e79 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -52,6 +52,85 @@ class EventServiceProvider extends ServiceProvider ], ]; + private static function persistsEntityEvent(SummitEntityEvent $entity_event){ + $sql = << $entity_event->getEntityId(), + 'EntityClassName' => $entity_event->getEntityClassName(), + 'Type' => $entity_event->getType(), + 'Metadata' => $entity_event->getRawMetadata(), + 'Created' => $entity_event->getCreated(), + 'LastEdited' => $entity_event->getLastEdited(), + 'OwnerID' => $entity_event->getOwnerId(), + 'SummitID' => $entity_event->getSummitId() + ]; + + $types = [ + 'EntityID' => 'integer', + 'EntityClassName' => 'string', + 'Type' => 'string', + 'Metadata' => 'string', + 'Created' => 'datetime', + 'LastEdited' => 'datetime', + 'OwnerID' => 'integer', + 'SummitID' => 'integer', + ]; + + self::insert($sql, $bindings, $types); + } + + private static function persistAdminSyncRequest(AdminSummitEventActionSyncWorkRequest $request){ + $em = Registry::getManager('ss'); + $em->persist($request); + $em->flush(); + } + + private static function persistsAssetSyncRequest(AssetsSyncRequest $assets_sync_request){ + + $sql = << $assets_sync_request->getFrom(), + 'ToFile' => $assets_sync_request->getTo(), + ]; + + $types = [ + 'FromFile' => 'string', + 'ToFile' => 'string', + + ]; + + self::insert($sql, $bindings, $types); + + } + + /** + * @param string $sql + * @param array $bindings + */ + private static function insert($sql, array $bindings, array $types){ + $em = Registry::getManager('ss'); + $em->getConnection()->executeUpdate($sql, $bindings, $types); + } /** * Register any other events for your application. * @return void @@ -70,9 +149,8 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getSummit()); $entity_event->setMetadata(''); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); + }); Event::listen(\App\Events\MyFavoritesAdd::class, function($event) @@ -85,9 +163,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getSummit()); $entity_event->setMetadata(''); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); Event::listen(\App\Events\MyScheduleRemove::class, function($event) @@ -100,9 +176,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getSummit()); $entity_event->setMetadata(''); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); @@ -117,9 +191,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getSummit()); $entity_event->setMetadata(''); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); @@ -143,9 +215,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getSummitEvent()->getSummit()); $entity_event->setMetadata( json_encode([ 'pub_new' => intval($event->getSummitEvent()->isPublished())])); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); @@ -193,10 +263,9 @@ class EventServiceProvider extends ServiceProvider else $entity_event->setMetadata(json_encode([ 'pub_new' => intval($event->getSummitEvent()->getPublished())])); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->persist($request); - $em->flush(); + self::persistsEntityEvent($entity_event); + self::persistAdminSyncRequest($request); + }); Event::listen(\App\Events\SummitEventDeleted::class, function($event) @@ -210,7 +279,6 @@ class EventServiceProvider extends ServiceProvider $owner_id = $resource_server_context->getCurrentUserExternalId(); if(is_null($owner_id)) $owner_id = 0; $params = $args->getParams(); - $em = Registry::getManager('ss'); $entity_event = new SummitEntityEvent; $entity_event->setEntityClassName($params['class_name']); @@ -225,6 +293,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($params['summit']); $entity_event->setMetadata(''); + $request = null; if(isset($params['published']) && $params['published']){ // just record the published state at the moment of the update @@ -240,11 +309,13 @@ class EventServiceProvider extends ServiceProvider $member = $member_repository->getById($owner_id); $request->setCreatedBy($member); } - $em->persist($request); + } - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); + + if(!is_null($request)) + self::persistAdminSyncRequest($request); }); Event::listen(\App\Events\PresentationMaterialCreated::class, function($event) @@ -268,9 +339,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit()); $entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())])); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); @@ -295,9 +364,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit()); $entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())])); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); @@ -321,9 +388,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($event->getPresentation()->getSummit()); - $em = Registry::getManager('ss'); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); }); @@ -355,9 +420,7 @@ class EventServiceProvider extends ServiceProvider $asset_sync_request->setFrom($remote_destination); $asset_sync_request->setTo(sprintf("%s/%s", $folder_name, $file_name)); $asset_sync_request->setProcessed(false); - $em = Registry::getManager('ss'); - $em->persist($asset_sync_request); - $em->flush(); + self::persistsAssetSyncRequest($asset_sync_request); }); @@ -370,8 +433,6 @@ class EventServiceProvider extends ServiceProvider $owner_id = $resource_server_context->getCurrentUserExternalId(); if(is_null($owner_id)) $owner_id = 0; - $em = Registry::getManager('ss'); - foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) { $entity_event = new SummitEntityEvent; @@ -387,8 +448,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($summit); $entity_event->setMetadata(''); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); } }); @@ -402,8 +462,6 @@ class EventServiceProvider extends ServiceProvider $owner_id = $resource_server_context->getCurrentUserExternalId(); if(is_null($owner_id)) $owner_id = 0; - $em = Registry::getManager('ss'); - foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) { $entity_event = new SummitEntityEvent; @@ -419,8 +477,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($summit); $entity_event->setMetadata(''); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); } }); @@ -436,7 +493,6 @@ class EventServiceProvider extends ServiceProvider $owner_id = $resource_server_context->getCurrentUserExternalId(); if(is_null($owner_id)) $owner_id = 0; $params = $args->getParams(); - $em = Registry::getManager('ss'); foreach($params['summits'] as $summit) { @@ -453,8 +509,7 @@ class EventServiceProvider extends ServiceProvider $entity_event->setSummit($summit); $entity_event->setMetadata(''); - $em->persist($entity_event); - $em->flush(); + self::persistsEntityEvent($entity_event); } }); diff --git a/app/Services/Model/SpeakerService.php b/app/Services/Model/SpeakerService.php index 79ad8193..f4bede49 100644 --- a/app/Services/Model/SpeakerService.php +++ b/app/Services/Model/SpeakerService.php @@ -333,7 +333,7 @@ final class SpeakerService implements ISpeakerService if(!empty($reg_code)){ $this->registerSummitPromoCodeByValue($speaker, $summit, $reg_code); } - + $speaker->clearPresentations(); return $speaker; }); } diff --git a/tests/OAuth2SpeakersApiTest.php b/tests/OAuth2SpeakersApiTest.php index 06489853..35088e43 100644 --- a/tests/OAuth2SpeakersApiTest.php +++ b/tests/OAuth2SpeakersApiTest.php @@ -136,7 +136,7 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest $params = [ 'id' => $summit_id, - 'speaker_id' => 1 + 'speaker_id' => 9161 ]; $headers = [ @@ -145,7 +145,7 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest ]; $data = [ - 'title' => 'Legend!', + 'title' => 'Legend!!!', ]; $response = $this->action diff --git a/tests/OAuth2SummitApiTest.php b/tests/OAuth2SummitApiTest.php index 70a1c8ff..866c6ccc 100644 --- a/tests/OAuth2SummitApiTest.php +++ b/tests/OAuth2SummitApiTest.php @@ -1085,12 +1085,13 @@ final class OAuth2SummitApiTest extends ProtectedApiTest $params = array ( 'id' => 23, - 'event_id' => 20619, + 'event_id' => 19255, ); $data = array ( - 'title' => 'OpenStack Public Cloud Update TEST!', + 'title' => 'Using HTTPS to Secure OpenStack Services Update', + 'speakers' => [210, 9161, 202] );