Fix on Presentation update process

there was an issue on presentation update
and doctrine entity lifecycles

Change-Id: If65a29f8a92b5581d4326a08bce66964b9239204
This commit is contained in:
Sebastian Marcet 2017-12-13 12:07:48 -03:00
parent b2faf65f5a
commit 42f51934e0
8 changed files with 141 additions and 63 deletions

View File

@ -379,7 +379,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404(); 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(); if (is_null($speaker)) return $this->error404();
$rules = array $rules = array

View File

@ -116,8 +116,16 @@ class Presentation extends SummitEvent
private $materials; private $materials;
/** /**
* @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", mappedBy="presentations") * @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", inversedBy="presentations")
* @var PresentationSpeaker[] * @ORM\JoinTable(name="Presentation_Speakers",
* joinColumns={
* @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID")
*
* }
* )
*/ */
private $speakers; private $speakers;
@ -298,6 +306,13 @@ class Presentation extends SummitEvent
$video->unsetPresentation(); $video->unsetPresentation();
} }
/**
* @param PresentationSpeaker $speaker
*/
public function removeSpeaker(PresentationSpeaker $speaker){
$this->speakers->removeElement($speaker);
}
/** /**
* @return PresentationSlide[] * @return PresentationSlide[]
*/ */

View File

@ -90,15 +90,8 @@ class PresentationSpeaker extends SilverstripeBaseModel
private $promo_codes; private $promo_codes;
/** /**
* @ORM\ManyToMany(targetEntity="models\summit\Presentation", inversedBy="speakers") * @ORM\ManyToMany(targetEntity="models\summit\Presentation", mappedBy="speakers")
* @ORM\JoinTable(name="Presentation_Speakers", * @var Presentation[]
* joinColumns={
* @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID")
* }
* )
*/ */
private $presentations; private $presentations;
@ -235,6 +228,13 @@ class PresentationSpeaker extends SilverstripeBaseModel
$this->presentations->add($presentation); $this->presentations->add($presentation);
} }
public function clearPresentations(){
foreach($this->presentations as $presentation){
$presentation->removeSpeaker($this);
}
$this->presentations->clear();
}
/** /**
* @param SpeakerSummitRegistrationPromoCode $code * @param SpeakerSummitRegistrationPromoCode $code
* @return $this * @return $this

View File

@ -94,6 +94,13 @@ class SummitEntityEvent extends SilverstripeBaseModel
return !empty($this->metadata) ? json_decode($this->metadata, true) : array(); 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\ManyToOne(targetEntity="models\main\Member", cascade={"persist"})
* @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID") * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID")

View File

@ -52,6 +52,85 @@ class EventServiceProvider extends ServiceProvider
], ],
]; ];
private static function persistsEntityEvent(SummitEntityEvent $entity_event){
$sql = <<<SQL
INSERT INTO SummitEntityEvent
(EntityID, EntityClassName, Type, Metadata, Created, LastEdited, OwnerID, SummitID)
VALUES (:EntityID, :EntityClassName, :Type, :Metadata, :Created, :LastEdited, :OwnerID, :SummitID)
SQL;
$bindings = [
'EntityID' => $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 = <<<SQL
INSERT INTO AssetsSyncRequest
(
ClassName,
Created,
LastEdited,
`From`,
`To`,
Processed,
ProcessedDate
)
VALUES
('AssetsSyncRequest', NOW(), NOW(), :FromFile, :ToFile, 0, NULL );
SQL;
$bindings = [
'FromFile' => $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. * Register any other events for your application.
* @return void * @return void
@ -70,9 +149,8 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getSummit()); $entity_event->setSummit($event->getSummit());
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
Event::listen(\App\Events\MyFavoritesAdd::class, function($event) Event::listen(\App\Events\MyFavoritesAdd::class, function($event)
@ -85,9 +163,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getSummit()); $entity_event->setSummit($event->getSummit());
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
Event::listen(\App\Events\MyScheduleRemove::class, function($event) Event::listen(\App\Events\MyScheduleRemove::class, function($event)
@ -100,9 +176,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getSummit()); $entity_event->setSummit($event->getSummit());
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
@ -117,9 +191,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getSummit()); $entity_event->setSummit($event->getSummit());
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
@ -143,9 +215,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getSummitEvent()->getSummit()); $entity_event->setSummit($event->getSummitEvent()->getSummit());
$entity_event->setMetadata( json_encode([ 'pub_new' => intval($event->getSummitEvent()->isPublished())])); $entity_event->setMetadata( json_encode([ 'pub_new' => intval($event->getSummitEvent()->isPublished())]));
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
@ -193,10 +263,9 @@ class EventServiceProvider extends ServiceProvider
else else
$entity_event->setMetadata(json_encode([ 'pub_new' => intval($event->getSummitEvent()->getPublished())])); $entity_event->setMetadata(json_encode([ 'pub_new' => intval($event->getSummitEvent()->getPublished())]));
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event); self::persistAdminSyncRequest($request);
$em->persist($request);
$em->flush();
}); });
Event::listen(\App\Events\SummitEventDeleted::class, function($event) Event::listen(\App\Events\SummitEventDeleted::class, function($event)
@ -210,7 +279,6 @@ class EventServiceProvider extends ServiceProvider
$owner_id = $resource_server_context->getCurrentUserExternalId(); $owner_id = $resource_server_context->getCurrentUserExternalId();
if(is_null($owner_id)) $owner_id = 0; if(is_null($owner_id)) $owner_id = 0;
$params = $args->getParams(); $params = $args->getParams();
$em = Registry::getManager('ss');
$entity_event = new SummitEntityEvent; $entity_event = new SummitEntityEvent;
$entity_event->setEntityClassName($params['class_name']); $entity_event->setEntityClassName($params['class_name']);
@ -225,6 +293,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($params['summit']); $entity_event->setSummit($params['summit']);
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$request = null;
if(isset($params['published']) && $params['published']){ if(isset($params['published']) && $params['published']){
// just record the published state at the moment of the update // 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); $member = $member_repository->getById($owner_id);
$request->setCreatedBy($member); $request->setCreatedBy($member);
} }
$em->persist($request);
} }
$em->persist($entity_event); self::persistsEntityEvent($entity_event);
$em->flush();
if(!is_null($request))
self::persistAdminSyncRequest($request);
}); });
Event::listen(\App\Events\PresentationMaterialCreated::class, function($event) 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->setSummit($event->getMaterial()->getPresentation()->getSummit());
$entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())])); $entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())]));
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
@ -295,9 +364,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit()); $entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit());
$entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())])); $entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())]));
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
@ -321,9 +388,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($event->getPresentation()->getSummit()); $entity_event->setSummit($event->getPresentation()->getSummit());
$em = Registry::getManager('ss'); self::persistsEntityEvent($entity_event);
$em->persist($entity_event);
$em->flush();
}); });
@ -355,9 +420,7 @@ class EventServiceProvider extends ServiceProvider
$asset_sync_request->setFrom($remote_destination); $asset_sync_request->setFrom($remote_destination);
$asset_sync_request->setTo(sprintf("%s/%s", $folder_name, $file_name)); $asset_sync_request->setTo(sprintf("%s/%s", $folder_name, $file_name));
$asset_sync_request->setProcessed(false); $asset_sync_request->setProcessed(false);
$em = Registry::getManager('ss'); self::persistsAssetSyncRequest($asset_sync_request);
$em->persist($asset_sync_request);
$em->flush();
}); });
@ -370,8 +433,6 @@ class EventServiceProvider extends ServiceProvider
$owner_id = $resource_server_context->getCurrentUserExternalId(); $owner_id = $resource_server_context->getCurrentUserExternalId();
if(is_null($owner_id)) $owner_id = 0; if(is_null($owner_id)) $owner_id = 0;
$em = Registry::getManager('ss');
foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) { foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) {
$entity_event = new SummitEntityEvent; $entity_event = new SummitEntityEvent;
@ -387,8 +448,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($summit); $entity_event->setSummit($summit);
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em->persist($entity_event); self::persistsEntityEvent($entity_event);
$em->flush();
} }
}); });
@ -402,8 +462,6 @@ class EventServiceProvider extends ServiceProvider
$owner_id = $resource_server_context->getCurrentUserExternalId(); $owner_id = $resource_server_context->getCurrentUserExternalId();
if(is_null($owner_id)) $owner_id = 0; if(is_null($owner_id)) $owner_id = 0;
$em = Registry::getManager('ss');
foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) { foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) {
$entity_event = new SummitEntityEvent; $entity_event = new SummitEntityEvent;
@ -419,8 +477,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($summit); $entity_event->setSummit($summit);
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em->persist($entity_event); self::persistsEntityEvent($entity_event);
$em->flush();
} }
}); });
@ -436,7 +493,6 @@ class EventServiceProvider extends ServiceProvider
$owner_id = $resource_server_context->getCurrentUserExternalId(); $owner_id = $resource_server_context->getCurrentUserExternalId();
if(is_null($owner_id)) $owner_id = 0; if(is_null($owner_id)) $owner_id = 0;
$params = $args->getParams(); $params = $args->getParams();
$em = Registry::getManager('ss');
foreach($params['summits'] as $summit) { foreach($params['summits'] as $summit) {
@ -453,8 +509,7 @@ class EventServiceProvider extends ServiceProvider
$entity_event->setSummit($summit); $entity_event->setSummit($summit);
$entity_event->setMetadata(''); $entity_event->setMetadata('');
$em->persist($entity_event); self::persistsEntityEvent($entity_event);
$em->flush();
} }
}); });

View File

@ -333,7 +333,7 @@ final class SpeakerService implements ISpeakerService
if(!empty($reg_code)){ if(!empty($reg_code)){
$this->registerSummitPromoCodeByValue($speaker, $summit, $reg_code); $this->registerSummitPromoCodeByValue($speaker, $summit, $reg_code);
} }
$speaker->clearPresentations();
return $speaker; return $speaker;
}); });
} }

View File

@ -136,7 +136,7 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest
$params = [ $params = [
'id' => $summit_id, 'id' => $summit_id,
'speaker_id' => 1 'speaker_id' => 9161
]; ];
$headers = [ $headers = [
@ -145,7 +145,7 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest
]; ];
$data = [ $data = [
'title' => 'Legend!', 'title' => 'Legend!!!',
]; ];
$response = $this->action $response = $this->action

View File

@ -1085,12 +1085,13 @@ final class OAuth2SummitApiTest extends ProtectedApiTest
$params = array $params = array
( (
'id' => 23, 'id' => 23,
'event_id' => 20619, 'event_id' => 19255,
); );
$data = array $data = array
( (
'title' => 'OpenStack Public Cloud Update TEST!', 'title' => 'Using HTTPS to Secure OpenStack Services Update',
'speakers' => [210, 9161, 202]
); );