From 87e99197ed9075718de2974e2bf33d294a6f95a6 Mon Sep 17 00:00:00 2001 From: smarcet Date: Tue, 14 May 2019 13:14:59 -0300 Subject: [PATCH] Added Clone event endpoint POST /api/v1/summits/{id}/events/{event_id}/clone scopes %s/summits/write-event Change-Id: Ifda70bae5f211a91daae047a71e922210710f6af --- .../OAuth2SummitEventsApiController.php | 33 +++++++++++ app/Http/routes.php | 1 + .../Summit/Factories/SummitEventFactory.php | 1 + app/Services/Model/ISummitService.php | 10 ++++ app/Services/Model/SummitService.php | 59 +++++++++++++++++++ database/seeds/ApiEndpointsSeeder.php | 6 ++ tests/OAuth2SummitEventsApiTest.php | 31 ++++++++++ 7 files changed, 141 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitEventsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitEventsApiController.php index b02df8b5..b674eee8 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitEventsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitEventsApiController.php @@ -1163,4 +1163,37 @@ final class OAuth2SummitEventsApiController extends OAuth2ProtectedController } } + /** + * @param $summit_id + * @param $event_id + * @return mixed + */ + public function cloneEvent($summit_id, $event_id) + { + try { + $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $event = $this->service->cloneEvent($summit, $event_id); + + return $this->created(SerializerRegistry::getInstance()->getSerializer($event)->serialize()); + + } + catch (ValidationException $ex1) + { + Log::warning($ex1); + return $this->error412(array($ex1->getMessage())); + } + catch(EntityNotFoundException $ex2) + { + Log::warning($ex2); + return $this->error404(array('message'=> $ex2->getMessage())); + } + catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + } \ No newline at end of file diff --git a/app/Http/routes.php b/app/Http/routes.php index 92c82401..bd964795 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -243,6 +243,7 @@ Route::group([ Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitEventsApiController@addEvent']); Route::group(array('prefix' => '{event_id}'), function () { + Route::post('/clone', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitEventsApiController@cloneEvent']); Route::get('', 'OAuth2SummitEventsApiController@getEvent'); Route::get('/published', [ 'middleware' => 'cache:'.Config::get('cache_api_response.get_published_event_response_lifetime', 300), 'uses' => 'OAuth2SummitEventsApiController@getScheduledEvent']); Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators|summit-room-administrators', 'uses' => 'OAuth2SummitEventsApiController@updateEvent' ]); diff --git a/app/Models/Foundation/Summit/Factories/SummitEventFactory.php b/app/Models/Foundation/Summit/Factories/SummitEventFactory.php index 51d140e0..b3994e4a 100644 --- a/app/Models/Foundation/Summit/Factories/SummitEventFactory.php +++ b/app/Models/Foundation/Summit/Factories/SummitEventFactory.php @@ -37,6 +37,7 @@ final class SummitEventFactory $event = new SummitEventWithFile(); $event->setSummit($summit); + $event->setType($type); return $event; } diff --git a/app/Services/Model/ISummitService.php b/app/Services/Model/ISummitService.php index 7398e9ea..87c7df96 100644 --- a/app/Services/Model/ISummitService.php +++ b/app/Services/Model/ISummitService.php @@ -263,4 +263,14 @@ interface ISummitService */ public function removeModeratorFromPresentation($current_member_id, $speaker_id, $presentation_id); + + /** + * @param Summit $summit + * @param int $event_id + * @return SummitEvent + * @throws ValidationException + * @throws EntityNotFoundException + */ + public function cloneEvent(Summit $summit, int $event_id):SummitEvent; + } \ No newline at end of file diff --git a/app/Services/Model/SummitService.php b/app/Services/Model/SummitService.php index 9b26747f..435a1b49 100644 --- a/app/Services/Model/SummitService.php +++ b/app/Services/Model/SummitService.php @@ -1836,4 +1836,63 @@ final class SummitService extends AbstractService implements ISummitService }); } + /** + * @param Summit $summit + * @param int $event_id + * @return SummitEvent + * @throws ValidationException + * @throws EntityNotFoundException + */ + public function cloneEvent(Summit $summit, int $event_id): SummitEvent + { + return $this->tx_service->transaction(function () use ($summit, $event_id) { + + $event = $this->event_repository->getById($event_id); + if(is_null($event)) + throw new EntityNotFoundException(sprintf("event %s not found!", $event_id)); + + if($event instanceof Presentation) + throw new ValidationException(sprintf("event %s is not allowed to be cloned!", $event_id)); + + $eventClone = SummitEventFactory::build($event->getType(), $summit); + + $eventClone->setTitle($event->getTitle()); + $eventClone->setAbstract($event->getAbstract()); + $eventClone->setLocation($event->getLocation()); + $eventClone->setAllowFeedBack($event->getAllowFeedback()); + $eventClone->setSocialSummary($event->getSocialSummary()); + $eventClone->setStartDate($event->getLocalStartDate()); + $eventClone->setEndDate($event->getLocalEndDate()); + $eventClone->setCategory($event->getCategory()); + + if($event->hasRSVPTemplate()) + { + $eventClone->setRSVPTemplate($event->getRSVPTemplate()); + } + + if($event->isExternalRSVP()) + { + $eventClone->setRSVPLink($event->getRSVPLink()); + } + + foreach($event->getSponsors() as $sponsor){ + $eventClone->addSponsor($sponsor); + } + + foreach($event->getTags() as $tag){ + $eventClone->addTag($tag); + } + + // check if SummitEventWithFile + + if($event instanceof SummitEventWithFile && $event->hasAttachment()){ + $eventClone->setAttachment($event->getAttachment()); + } + + $this->event_repository->add($eventClone); + + return $eventClone; + + }); + } } \ No newline at end of file diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index b1b16a8f..aaab2c00 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -583,6 +583,12 @@ class ApiEndpointsSeeder extends Seeder 'http_method' => 'PUT', 'scopes' => [sprintf(SummitScopes::WriteEventData, $current_realm)], ], + [ + 'name' => 'clone-event', + 'route' => '/api/v1/summits/{id}/events/{event_id}/clone', + 'http_method' => 'POST', + 'scopes' => [sprintf(SummitScopes::WriteEventData, $current_realm)], + ], [ 'name' => 'update-events', 'route' => '/api/v1/summits/{id}/events', diff --git a/tests/OAuth2SummitEventsApiTest.php b/tests/OAuth2SummitEventsApiTest.php index 21c040ba..2fdf1a52 100644 --- a/tests/OAuth2SummitEventsApiTest.php +++ b/tests/OAuth2SummitEventsApiTest.php @@ -1335,4 +1335,35 @@ final class OAuth2SummitEventsApiTest extends ProtectedApiTest } + public function testCloneEvent($summit_id = 25, $event_id= 22943) + { + $params = [ + + 'id' => $summit_id, + 'event_id' => $event_id, + ]; + + $headers = [ + + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action + ( + "POST", + "OAuth2SummitEventsApiController@cloneEvent", + $params, + [], [], [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $event = json_decode($content); + $this->assertTrue($event->id > 0); + return $event; + } + + } \ No newline at end of file