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);
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

View File

@ -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[]
*/

View File

@ -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

View File

@ -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")

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.
* @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);
}
});

View File

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

View File

@ -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

View File

@ -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]
);