diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index 6de34e47..04a2148a 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -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); diff --git a/app/Http/routes.php b/app/Http/routes.php index 620bf13e..498f99bf 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -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' + ]); + }); }); }); }); diff --git a/app/Services/Model/ISummitTrackService.php b/app/Services/Model/ISummitTrackService.php index b54c4b3c..5a6b6d9a 100644 --- a/app/Services/Model/ISummitTrackService.php +++ b/app/Services/Model/ISummitTrackService.php @@ -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); + } \ No newline at end of file diff --git a/app/Services/Model/SummitTrackService.php b/app/Services/Model/SummitTrackService.php index 7f4d99d1..5f958eda 100644 --- a/app/Services/Model/SummitTrackService.php +++ b/app/Services/Model/SummitTrackService.php @@ -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); + }); + } } \ No newline at end of file diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 7f1929eb..451b5d6f 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -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', diff --git a/resources/lang/en/not_found_errors.php b/resources/lang/en/not_found_errors.php index 0c131373..19a63720 100644 --- a/resources/lang/en/not_found_errors.php +++ b/resources/lang/en/not_found_errors.php @@ -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', ]; \ No newline at end of file diff --git a/tests/OAuth2TrackQuestionsTemplateTest.php b/tests/OAuth2TrackQuestionsTemplateTest.php index 97b38363..04ff6222 100644 --- a/tests/OAuth2TrackQuestionsTemplateTest.php +++ b/tests/OAuth2TrackQuestionsTemplateTest.php @@ -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();