From 168b4500021a50547f2a01f112112a37c43baa50 Mon Sep 17 00:00:00 2001 From: Sebastian Marcet Date: Thu, 5 Apr 2018 19:26:06 -0300 Subject: [PATCH] added endpoint to copy tracks from summit to another POST /api/v1/summits/{id}/tracks/copy/{to_summit_id} Change-Id: Icbfe4c5826cd939181674e4efd00236aafccf4b1 --- .../OAuth2SummitTracksApiController.php | 44 ++++++++++++++ app/Http/routes.php | 1 + app/Models/Foundation/Summit/Summit.php | 2 +- app/Services/Model/ISummitTrackService.php | 9 +++ app/Services/Model/SummitTrackService.php | 58 ++++++++++++++++++- database/seeds/ApiEndpointsSeeder.php | 9 +++ resources/lang/en/validation_errors.php | 3 +- tests/OAuth2TracksApiTest.php | 29 ++++++++++ 8 files changed, 152 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index 5c489819..69ff76c6 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -29,6 +29,8 @@ use utils\FilterParser; use utils\OrderParser; use utils\PagingInfo; use Exception; +use utils\PagingResponse; + /** * Class OAuth2SummitTracksApiController * @package App\Http\Controllers @@ -338,6 +340,48 @@ final class OAuth2SummitTracksApiController extends OAuth2ProtectedController } } + /** + * @param $summit_id + * @param $to_summit_id + * @return mixed + */ + public function copyTracksToSummit($summit_id, $to_summit_id){ + try { + + $from_summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($from_summit)) return $this->error404(); + + $to_summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($to_summit_id); + if (is_null($to_summit)) return $this->error404(); + + $tracks = $this->track_service->copyTracks($from_summit, $to_summit); + + $response = new PagingResponse + ( + count($tracks), + count($tracks), + 1, + 1, + $tracks + ); + + return $this->created($response->toArray()); + } + 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); + } + } + /** * @param $summit_id * @param $track_id diff --git a/app/Http/routes.php b/app/Http/routes.php index 08f43a4a..e71ceadb 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -487,6 +487,7 @@ Route::group([ Route::get('', 'OAuth2SummitTracksApiController@getAllBySummit'); Route::get('csv', 'OAuth2SummitTracksApiController@getAllBySummitCSV'); Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitTracksApiController@addTrackBySummit']); + Route::post('copy/{to_summit_id}', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitTracksApiController@copyTracksToSummit']); Route::group(['prefix' => '{track_id}'], function () { Route::get('', 'OAuth2SummitTracksApiController@getTrackBySummit'); Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitTracksApiController@updateTrackBySummit']); diff --git a/app/Models/Foundation/Summit/Summit.php b/app/Models/Foundation/Summit/Summit.php index 8dabca1d..f8405caa 100644 --- a/app/Models/Foundation/Summit/Summit.php +++ b/app/Models/Foundation/Summit/Summit.php @@ -954,7 +954,7 @@ class Summit extends SilverstripeBaseModel public function getPresentationCategoryByTitle($category_title) { $criteria = Criteria::create(); - $criteria->where(Criteria::expr()->eq('title', intval($category_title))); + $criteria->where(Criteria::expr()->eq('title', trim($category_title))); $category = $this->presentation_categories->matching($criteria)->first(); return $category === false ? null : $category; } diff --git a/app/Services/Model/ISummitTrackService.php b/app/Services/Model/ISummitTrackService.php index 7e130262..b54c4b3c 100644 --- a/app/Services/Model/ISummitTrackService.php +++ b/app/Services/Model/ISummitTrackService.php @@ -49,4 +49,13 @@ interface ISummitTrackService */ public function deleteTrack(Summit $summit, $track_id); + /** + * @param Summit $from_summit + * @param Summit $to_summit + * @return PresentationCategory[] + * @throws EntityNotFoundException + * @throws ValidationException + */ + public function copyTracks(Summit $from_summit, Summit $to_summit); + } \ No newline at end of file diff --git a/app/Services/Model/SummitTrackService.php b/app/Services/Model/SummitTrackService.php index ab9d37d2..34743173 100644 --- a/app/Services/Model/SummitTrackService.php +++ b/app/Services/Model/SummitTrackService.php @@ -111,7 +111,6 @@ final class SummitTrackService throw new ValidationException(sprintf("track id %s already has title %s assigned on summit id %s", $former_track->getId(), $data['title'], $summit->getId())); } - $track = PresentationCategoryFactory::populate($track, $data); Event::fire(new TrackUpdated($track->getSummitId(), $track->getId())); @@ -154,4 +153,61 @@ final class SummitTrackService $this->repository->delete($track); }); } + + /** + * @param Summit $from_summit + * @param Summit $to_summit + * @return PresentationCategory[] + * @throws EntityNotFoundException + * @throws ValidationException + */ + public function copyTracks(Summit $from_summit, Summit $to_summit) + { + $added_tracks = $this->tx_service->transaction(function () use ($from_summit, $to_summit) { + + if($from_summit->getId() == $to_summit->getId()){ + throw new ValidationException + ( + trans + ( + 'validation_errors.SummitTrackService.copyTracks.SameSummit' + ) + ); + } + + $added_tracks = []; + foreach($from_summit->getPresentationCategories() as $track_2_copy){ + $former_track = $to_summit->getPresentationCategoryByTitle($track_2_copy->getTitle()); + if(!is_null($former_track)) continue; + + $former_track = $to_summit->getPresentationCategoryByCode($track_2_copy->getCode()); + if(!is_null($former_track)) continue; + + $data = [ + 'title' => $track_2_copy->getTitle(), + 'code' => $track_2_copy->getCode(), + 'description' => $track_2_copy->getDescription(), + 'session_count' => $track_2_copy->getSessionCount(), + 'alternate_count' => $track_2_copy->getAlternateCount(), + 'lightning_count' => $track_2_copy->getLightningCount(), + 'lightning_alternate_count' => $track_2_copy->getLightningAlternateCount(), + 'voting_visible' => $track_2_copy->isVotingVisible(), + 'chair_visible' => $track_2_copy->isChairVisible(), + ]; + + $new_track = PresentationCategoryFactory::build($to_summit, $data); + + $to_summit->addPresentationCategory($new_track); + $added_tracks[] = $new_track; + } + + return $added_tracks; + }); + + foreach ($added_tracks as $track){ + Event::fire(new TrackInserted($track->getSummitId(), $track->getId())); + } + + return $added_tracks; + } } \ No newline at end of file diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 0aa14176..c6b6970b 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -1110,6 +1110,15 @@ class ApiEndpointsSeeder extends Seeder sprintf(SummitScopes::ReadAllSummitData, $current_realm) ], ], + [ + 'name' => 'copy-tracks-to-summit', + 'route' => '/api/v1/summits/{id}/tracks/copy/{to_summit_id}', + 'http_method' => 'POST', + 'scopes' => [ + sprintf(SummitScopes::WriteTracksData, $current_realm), + sprintf(SummitScopes::WriteSummitData, $current_realm) + ], + ], [ 'name' => 'add-track', 'route' => '/api/v1/summits/{id}/tracks', diff --git a/resources/lang/en/validation_errors.php b/resources/lang/en/validation_errors.php index 534a6c84..5305646e 100644 --- a/resources/lang/en/validation_errors.php +++ b/resources/lang/en/validation_errors.php @@ -68,5 +68,6 @@ return [ // SummitService 'SummitService.AddSummit.NameAlreadyExists' => 'name :name its already being assigned to another summit', 'SummitService.updateSummit.NameAlreadyExists'=> 'name :name its already being assigned to another summit', - 'SummitService.updateSummit.SummitAlreadyActive' => 'summit :active_summit_id is already activated please deactivate it to set current summit as active' + 'SummitService.updateSummit.SummitAlreadyActive' => 'summit :active_summit_id is already activated please deactivate it to set current summit as active', + 'SummitTrackService.copyTracks.SameSummit' => 'from summit is equal a to summit.', ]; \ No newline at end of file diff --git a/tests/OAuth2TracksApiTest.php b/tests/OAuth2TracksApiTest.php index 28bc4a60..2d53ab68 100644 --- a/tests/OAuth2TracksApiTest.php +++ b/tests/OAuth2TracksApiTest.php @@ -22,6 +22,7 @@ final class OAuth2TracksApiTest extends ProtectedApiTest * @return mixed */ public function testGetTracksByTitle($summit_id = 23){ + $params = [ 'id' => $summit_id, @@ -261,4 +262,32 @@ final class OAuth2TracksApiTest extends ProtectedApiTest $content = $response->getContent(); $this->assertResponseStatus(412); } + + public function testCopyTracks($from_summit_id = 24, $to_summit_id = 25){ + + $params = [ + 'id' => $from_summit_id, + 'to_summit_id' => $to_summit_id + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2SummitTracksApiController@copyTracksToSummit", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $added_tracks = json_decode($content); + $this->assertTrue(!is_null($added_tracks)); + } } \ No newline at end of file