Added endpoints to remove/add extra questions from tracks

PUT /api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}

DELETE /api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}

scopes

%s/tracks/write
%s/summits/write

Change-Id: I5d3455dad8058a93f357b40adc7efdf5995b01c7
This commit is contained in:
Sebastian Marcet 2018-09-14 19:17:49 -03:00
parent 17276e7286
commit 62188c7815
7 changed files with 248 additions and 6 deletions

View File

@ -294,6 +294,11 @@ final class OAuth2SummitTracksApiController extends OAuth2ProtectedController
}
}
/**
* @param $summit_id
* @param $track_id
* @return mixed
*/
public function getTrackExtraQuestionsBySummit($summit_id, $track_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
@ -324,6 +329,62 @@ final class OAuth2SummitTracksApiController extends OAuth2ProtectedController
}
}
/**
* @param $summit_id
* @param $track_id
* @param $question_id
* @return mixed
*/
public function addTrackExtraQuestion($summit_id, $track_id, $question_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$this->track_service->addTrackExtraQuestion($track_id, $question_id);
return $this->updated();
} 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
* @param $question_id
* @return mixed
*/
public function removeTrackExtraQuestion($summit_id, $track_id, $question_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$this->track_service->removeTrackExtraQuestion($track_id, $question_id);
return $this->deleted();
} 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);
}
}
public function getTrackAllowedTagsBySummit($summit_id, $track_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);

View File

@ -484,6 +484,18 @@ Route::group([
Route::group(['prefix' => 'extra-questions'], function () {
Route::get('', 'OAuth2SummitTracksApiController@getTrackExtraQuestionsBySummit');
Route::group(['prefix' => '{question_id}'], function () {
Route::put('', [
'middleware' => 'auth.user:administrators|summit-front-end-administrators',
'uses' => 'OAuth2SummitTracksApiController@addTrackExtraQuestion']
);
Route::delete('', [
'middleware' => 'auth.user:administrators|summit-front-end-administrators',
'uses' => 'OAuth2SummitTracksApiController@removeTrackExtraQuestion'
]);
});
});
});
});

View File

@ -58,4 +58,23 @@ interface ISummitTrackService
*/
public function copyTracks(Summit $from_summit, Summit $to_summit);
/**
* @param int $track_id
* @param int $question_id
* @return void
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function addTrackExtraQuestion($track_id, $question_id);
/**
* @param int $track_id
* @param int $question_id
* @return void
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function removeTrackExtraQuestion($track_id, $question_id);
}

View File

@ -17,6 +17,7 @@ use App\Events\TrackInserted;
use App\Events\TrackUpdated;
use App\Models\Foundation\Summit\Factories\PresentationCategoryFactory;
use App\Models\Foundation\Summit\Repositories\ISummitTrackRepository;
use App\Models\Foundation\Summit\Repositories\ITrackQuestionTemplateRepository;
use Illuminate\Support\Facades\Event;
use libs\utils\ITransactionService;
use models\exceptions\EntityNotFoundException;
@ -35,29 +36,37 @@ final class SummitTrackService
/**
* @var ISummitTrackRepository
*/
private $repository;
private $track_repository;
/**
* @var ITagRepository
*/
private $tag_repository;
/**
* @var ITrackQuestionTemplateRepository
*/
private $track_question_template_repository;
/**
* SummitTrackService constructor.
* @param ISummitTrackRepository $repository
* @param ISummitTrackRepository $track_repository
* @param ITagRepository $tag_repository
* @param ITrackQuestionTemplateRepository $track_question_template_repository
* @param ITransactionService $tx_service
*/
public function __construct
(
ISummitTrackRepository $repository,
ISummitTrackRepository $track_repository,
ITagRepository $tag_repository,
ITrackQuestionTemplateRepository $track_question_template_repository,
ITransactionService $tx_service
)
{
parent::__construct($tx_service);
$this->tag_repository = $tag_repository;
$this->repository = $repository;
$this->track_repository = $track_repository;
$this->track_question_template_repository = $track_question_template_repository;
}
/**
@ -189,7 +198,7 @@ final class SummitTrackService
Event::fire(new TrackDeleted($track->getSummitId(), $track->getId()));
$this->repository->delete($track);
$this->track_repository->delete($track);
});
}
@ -249,4 +258,74 @@ final class SummitTrackService
return $added_tracks;
}
/**
* @param int $track_id
* @param int $question_id
* @return void
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function addTrackExtraQuestion($track_id, $question_id)
{
return $this->tx_service->transaction(function() use($track_id, $question_id){
$track = $this->track_repository->getById($track_id);
if(is_null($track))
throw new EntityNotFoundException(
trans
(
'not_found_errors.SummitTrackService.addTrackExtraQuestion.TrackNotFound',
['track_id' => $track_id ]
)
);
$track_question_template = $this->track_question_template_repository->getById($question_id);
if(is_null($track_question_template))
throw new EntityNotFoundException(
trans
(
'not_found_errors.SummitTrackService.addTrackExtraQuestion.QuestionNotFound',
['question_id' => $question_id ]
)
);
$track->addExtraQuestion($track_question_template);
});
}
/**
* @param int $track_id
* @param int $question_id
* @return void
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function removeTrackExtraQuestion($track_id, $question_id)
{
return $this->tx_service->transaction(function() use($track_id, $question_id){
$track = $this->track_repository->getById($track_id);
if(is_null($track))
throw new EntityNotFoundException(
trans
(
'not_found_errors.SummitTrackService.removeTrackExtraQuestion.TrackNotFound',
['track_id' => $track_id ]
)
);
$track_question_template = $this->track_question_template_repository->getById($question_id);
if(is_null($track_question_template))
throw new EntityNotFoundException(
trans
(
'not_found_errors.SummitTrackService.removeTrackExtraQuestion.QuestionNotFound',
['question_id' => $question_id ]
)
);
$track->removeExtraQuestion($track_question_template);
});
}
}

View File

@ -1190,6 +1190,24 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'add-track-extra-questions',
'route' => '/api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}',
'http_method' => 'PUT',
'scopes' => [
sprintf(SummitScopes::WriteTracksData, $current_realm),
sprintf(SummitScopes::WriteSummitData, $current_realm)
],
],
[
'name' => 'remove-track-extra-questions',
'route' => '/api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteTracksData, $current_realm),
sprintf(SummitScopes::WriteSummitData, $current_realm)
],
],
[
'name' => 'get-track-allowed-tags',
'route' => '/api/v1/summits/{id}/tracks/{track_id}/allowed-tags',

View File

@ -100,5 +100,10 @@ return [
'TrackQuestionTemplateService.deleteTrackQuestionValueTemplate.TrackQuestionTemplateValueNotFound' => 'track question template value :track_question_value_template_id not found',
'TrackQuestionTemplateService.addTrackQuestionTemplate.TrackNotFound' => 'track :track_id not found',
'TrackQuestionTemplateService.updateTrackQuestionTemplate.TrackNotFound' => 'track :track_id not found',
'TrackQuestionTemplateService.updateTrackQuestionTemplate.DefaultValueNotFound' => 'default value :default_value not found'
'TrackQuestionTemplateService.updateTrackQuestionTemplate.DefaultValueNotFound' => 'default value :default_value not found',
// tracks
'SummitTrackService.addTrackExtraQuestion.TrackNotFound' => 'track :track_id not found',
'SummitTrackService.addTrackExtraQuestion.QuestionNotFound' => 'question :question_id not found',
'SummitTrackService.removeTrackExtraQuestion.TrackNotFound' => 'track :track_id not found',
'SummitTrackService.removeTrackExtraQuestion.QuestionNotFound' => 'question :question_id not found',
];

View File

@ -158,6 +158,54 @@ final class OAuth2TrackQuestionsTemplateTest
return $track_question_template;
}
public function testAddTrackExtraQuestion(){
$new_track_extra_question = $this->testAddTrackQuestionTemplate();
$params = [
'summit_id' => 25,
'track_id' => 246,
'question_id' => $new_track_extra_question->id,
];
$headers = ["HTTP_Authorization" => " Bearer " . $this->access_token];
$response = $this->action(
"PUT",
"OAuth2SummitTracksApiController@addTrackExtraQuestion",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(201);
return $new_track_extra_question;
}
public function testRemoveTrackExtraQuestion(){
$new_track_extra_question = $this->testAddTrackExtraQuestion();
$params = [
'summit_id' => 25,
'track_id' => 246,
'question_id' => $new_track_extra_question->id,
];
$headers = ["HTTP_Authorization" => " Bearer " . $this->access_token];
$response = $this->action(
"DELETE",
"OAuth2SummitTracksApiController@removeTrackExtraQuestion",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(204);
}
public function testDeleteTrackQuestionTemplate(){
$new_track_question_template = $this->testAddTrackQuestionTemplate();