added endpoint to copy tracks from summit to another

POST /api/v1/summits/{id}/tracks/copy/{to_summit_id}

Change-Id: Icbfe4c5826cd939181674e4efd00236aafccf4b1
This commit is contained in:
Sebastian Marcet 2018-04-05 19:26:06 -03:00
parent 7c502e93ef
commit 168b450002
8 changed files with 152 additions and 3 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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.',
];

View File

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