From d5a5a651fd919b14ed2a5f8b516e183111ad20c5 Mon Sep 17 00:00:00 2001 From: Sebastian Marcet Date: Tue, 20 Feb 2018 14:13:43 -0300 Subject: [PATCH] added export event types csv GET /api/v1/summits/{id}/event-types/csv Change-Id: I0f62c4d18d19c7a6777183f925f380e04558747a --- .../EventTypeValidationRulesFactory.php | 19 +-- .../OAuth2SummitPromoCodesApiController.php | 2 +- .../OAuth2SummitsEventTypesApiController.php | 122 ++++++++++++++++++ app/Http/routes.php | 1 + .../PresentationTypeSerializer.php | 21 +-- .../Events/Presentations/PresentationType.php | 9 +- .../Factories/SummitEventTypeFactory.php | 4 + database/seeds/ApiEndpointsSeeder.php | 9 ++ tests/OAuth2EventTypesApiTest.php | 30 +++++ 9 files changed, 193 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/EventTypeValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/EventTypeValidationRulesFactory.php index cde9489e..1920969b 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/EventTypeValidationRulesFactory.php +++ b/app/Http/Controllers/Apis/Protected/Summit/EventTypeValidationRulesFactory.php @@ -63,15 +63,16 @@ final class EventTypeValidationRulesFactory case PresentationType::ClassName: { $specific_rules = [ - 'use_speakers' => 'sometimes|boolean', - 'are_speakers_mandatory' => 'sometimes|boolean|required_with:use_speakers', - 'min_speakers' => 'sometimes|integer|required_with:use_speakers', - 'max_speakers' => 'sometimes|integer|required_with:use_speakers|greater_than_field:max_speakers', - 'use_moderator' => 'sometimes|boolean', - 'is_moderator_mandatory' => 'sometimes|boolean|required_with:use_moderator', - 'min_moderators' => 'sometimes|integer|required_with:use_moderator', - 'max_moderators' => 'sometimes|integer|required_with:use_moderator|greater_than_field:min_moderators', - 'moderator_label' => 'sometimes|string' + 'use_speakers' => 'sometimes|boolean', + 'are_speakers_mandatory' => 'sometimes|boolean|required_with:use_speakers', + 'min_speakers' => 'sometimes|integer|required_with:use_speakers', + 'max_speakers' => 'sometimes|integer|required_with:use_speakers|greater_than_field:max_speakers', + 'use_moderator' => 'sometimes|boolean', + 'is_moderator_mandatory' => 'sometimes|boolean|required_with:use_moderator', + 'min_moderators' => 'sometimes|integer|required_with:use_moderator', + 'max_moderators' => 'sometimes|integer|required_with:use_moderator|greater_than_field:min_moderators', + 'should_be_available_on_cfp' => 'sometimes|boolean', + 'moderator_label' => 'sometimes|string' ]; } break; diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPromoCodesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPromoCodesApiController.php index 65a91215..0f23faaa 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPromoCodesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPromoCodesApiController.php @@ -236,7 +236,7 @@ final class OAuth2SummitPromoCodesApiController extends OAuth2ProtectedControlle public function getAllBySummitCSV($summit_id){ $values = Input::all(); $rules = [ - ]; + ]; try { diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php index 9d28fdf3..3151a106 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php @@ -11,6 +11,8 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Http\Utils\BooleanCellFormatter; +use App\Http\Utils\EpochCellFormatter; use App\Services\Model\ISummitEventTypeService; use Illuminate\Support\Facades\Request; use App\Models\Foundation\Summit\Events\SummitEventTypeConstants; @@ -73,6 +75,7 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll } return $valid; } + /** * @param $summit_id * @return mixed @@ -182,6 +185,125 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll } } + + /** + * @param $summit_id + * @return mixed + */ + public function getAllBySummitCSV($summit_id){ + $values = Input::all(); + $rules = [ + ]; + + try { + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $validation = Validator::make($values, $rules); + + if ($validation->fails()) { + $ex = new ValidationException(); + throw $ex->setMessages($validation->messages()->toArray()); + } + + // default values + $page = 1; + $per_page = PHP_INT_MAX; + + if (Input::has('page')) { + $page = intval(Input::get('page')); + $per_page = intval(Input::get('per_page')); + } + + $filter = null; + + if (Input::has('filter')) { + $filter = FilterParser::parse(Input::get('filter'), [ + 'name' => ['=@', '=='], + 'class_name' => ['=='], + 'is_default' => ['=='], + 'black_out_times' => ['=='], + 'use_sponsors' => ['=='], + 'are_sponsors_mandatory' => ['=='], + 'allows_attachment' => ['=='], + 'use_speakers' => ['=='], + 'are_speakers_mandatory' => ['=='], + 'use_moderator' => ['=='], + 'is_moderator_mandatory' => ['=='], + 'should_be_available_on_cfp' => ['=='], + ]); + } + + $order = null; + + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), [ + + 'id', + 'name', + ]); + } + + if(is_null($filter)) $filter = new Filter(); + + if($filter->hasFilter("class_name") && !$this->validateClassName($filter->getFilter("class_name"))){ + throw new ValidationException( + sprintf + ( + "class_name filter has an invalid value ( valid values are %s", + implode(", ", SummitEventTypeConstants::$valid_class_names) + ) + ); + } + + $data = $this->repository->getBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); + + $filename = "event-types-" . date('Ymd'); + $list = $data->toArray(); + return $this->export + ( + 'csv', + $filename, + $list['data'], + [ + 'created' => new EpochCellFormatter, + 'last_edited' => new EpochCellFormatter, + 'is_default' => new BooleanCellFormatter, + 'black_out_times' => new BooleanCellFormatter, + 'use_sponsors' => new BooleanCellFormatter, + 'are_sponsors_mandatory' => new BooleanCellFormatter, + 'allows_attachment' => new BooleanCellFormatter, + 'use_speakers' => new BooleanCellFormatter, + 'are_speakers_mandatory' => new BooleanCellFormatter, + 'use_moderator' => new BooleanCellFormatter, + 'is_moderator_mandatory' => new BooleanCellFormatter, + 'should_be_available_on_cfp' => new BooleanCellFormatter, + ] + ); + } + 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(\HTTP401UnauthorizedException $ex3) + { + Log::warning($ex3); + return $this->error401(); + } + catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + /** * @param $summit_id * @return mixed diff --git a/app/Http/routes.php b/app/Http/routes.php index 6873967a..c9d1c35d 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -295,6 +295,7 @@ Route::group([ // event types Route::group(['prefix' => 'event-types'], function () { Route::get('', 'OAuth2SummitsEventTypesApiController@getAllBySummit'); + Route::get('csv', 'OAuth2SummitsEventTypesApiController@getAllBySummitCSV'); Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitsEventTypesApiController@addEventTypeBySummit']); Route::group(['prefix' => '{event_type_id}'], function () { Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitsEventTypesApiController@updateEventTypeBySummit']); diff --git a/app/ModelSerializers/Summit/Presentation/PresentationTypeSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationTypeSerializer.php index eeeef724..b96de2b5 100644 --- a/app/ModelSerializers/Summit/Presentation/PresentationTypeSerializer.php +++ b/app/ModelSerializers/Summit/Presentation/PresentationTypeSerializer.php @@ -16,19 +16,20 @@ * Class PresentationEventTypeSerializer * @package ModelSerializers */ -class PresentationTypeSerializer extends SummitEventTypeSerializer +final class PresentationTypeSerializer extends SummitEventTypeSerializer { protected static $array_mappings = [ - 'MaxSpeakers' => 'max_speakers:json_int', - 'MinSpeakers' => 'min_speakers:json_int', - 'MaxModerators' => 'max_moderators:json_int', - 'MinModerators' => 'min_moderators:json_int', - 'UseSpeakers' => 'use_speakers:json_boolean', - 'AreSpeakersMandatory' => 'are_speakers_mandatory:json_boolean', - 'UseModerator' => 'use_moderator:json_boolean', - 'ModeratorMandatory' => 'is_moderator_mandatory:json_boolean', - 'ModeratorLabel' => 'moderator_label:json_string', + 'MaxSpeakers' => 'max_speakers:json_int', + 'MinSpeakers' => 'min_speakers:json_int', + 'MaxModerators' => 'max_moderators:json_int', + 'MinModerators' => 'min_moderators:json_int', + 'UseSpeakers' => 'use_speakers:json_boolean', + 'AreSpeakersMandatory' => 'are_speakers_mandatory:json_boolean', + 'UseModerator' => 'use_moderator:json_boolean', + 'ModeratorMandatory' => 'is_moderator_mandatory:json_boolean', + 'ModeratorLabel' => 'moderator_label:json_string', + 'isShouldBeAvailableOnCfp' => 'should_be_available_on_cfp:json_boolean', ]; /** diff --git a/app/Models/Foundation/Summit/Events/Presentations/PresentationType.php b/app/Models/Foundation/Summit/Events/Presentations/PresentationType.php index 9bd470b6..b2e97f35 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/PresentationType.php +++ b/app/Models/Foundation/Summit/Events/Presentations/PresentationType.php @@ -285,9 +285,10 @@ SQL; public function __construct() { parent::__construct(); - $this->are_speakers_mandatory = false; - $this->use_speakers = false; - $this->use_moderator = false; - $this->is_moderator_mandatory = false; + $this->are_speakers_mandatory = false; + $this->use_speakers = false; + $this->use_moderator = false; + $this->is_moderator_mandatory = false; + $this->should_be_available_on_cfp = false; } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Factories/SummitEventTypeFactory.php b/app/Models/Foundation/Summit/Factories/SummitEventTypeFactory.php index 1482da8d..bf9945e8 100644 --- a/app/Models/Foundation/Summit/Factories/SummitEventTypeFactory.php +++ b/app/Models/Foundation/Summit/Factories/SummitEventTypeFactory.php @@ -90,6 +90,10 @@ final class SummitEventTypeFactory if(isset($data['moderator_label'])) { $event_type->setModeratorLabel(trim($data['moderator_label'])); } + + if(isset($data['should_be_available_on_cfp'])) { + $event_type->setShouldBeAvailableOnCfp(boolval($data['should_be_available_on_cfp'])); + } } } break; diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 9efc1c07..61cedfbd 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -546,6 +546,15 @@ class ApiEndpointsSeeder extends Seeder sprintf(SummitScopes::ReadAllSummitData, $current_realm) ], ], + [ + 'name' => 'get-event-types-csv', + 'route' => '/api/v1/summits/{id}/event-types/csv', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadSummitData, $current_realm), + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ], [ 'name' => 'add-event-type', 'route' => '/api/v1/summits/{id}/event-types', diff --git a/tests/OAuth2EventTypesApiTest.php b/tests/OAuth2EventTypesApiTest.php index 0b0f29ef..180f30f8 100644 --- a/tests/OAuth2EventTypesApiTest.php +++ b/tests/OAuth2EventTypesApiTest.php @@ -49,6 +49,36 @@ final class OAuth2EventTypesApiTest extends ProtectedApiTest return $event_types; } + public function testGetEventTypesByClassNameCSV(){ + $params = [ + + 'id' => 23, + 'page' => 1, + 'per_page' => 10, + 'filter' => 'class_name==EVENT_TYPE', + 'order' => '+name' + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "GET", + "OAuth2SummitsEventTypesApiController@getAllBySummitCSV", + $params, + [], + [], + [], + $headers + ); + + $csv = $response->getContent(); + $this->assertResponseStatus(200); + $this->assertTrue(!empty($csv)); + } + public function testGetEventTypesDefaultOnes(){ $params = [