diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php index 59d612cd..e8014a85 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php @@ -26,6 +26,7 @@ use models\summit\IEventFeedbackRepository; use models\summit\ISpeakerRepository; use models\summit\ISummitEventRepository; use models\summit\ISummitRepository; +use ModelSerializers\ISerializerTypeSelector; use ModelSerializers\SerializerRegistry; use services\model\ISpeakerService; use services\model\ISummitService; @@ -65,6 +66,10 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController */ private $member_repository; + /** + * @var ISerializerTypeSelector + */ + private $serializer_type_selector; /** * OAuth2SummitSpeakersApiController constructor. @@ -74,6 +79,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param IEventFeedbackRepository $event_feedback_repository * @param IMemberRepository $member_repository * @param ISpeakerService $service + * @param ISerializerTypeSelector $serializer_type_selector * @param IResourceServerContext $resource_server_context */ public function __construct @@ -84,6 +90,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController IEventFeedbackRepository $event_feedback_repository, IMemberRepository $member_repository, ISpeakerService $service, + ISerializerTypeSelector $serializer_type_selector, IResourceServerContext $resource_server_context ) { parent::__construct($resource_server_context); @@ -93,6 +100,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $this->member_repository = $member_repository; $this->event_feedback_repository = $event_feedback_repository; $this->service = $service; + $this->serializer_type_selector = $serializer_type_selector; } /** @@ -106,7 +114,6 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController public function getSpeakers($summit_id) { try { - $serializer_type = SerializerRegistry::SerializerType_Public; $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -161,13 +168,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController ]); } - $current_member_id = $this->resource_server_context->getCurrentUserExternalId(); - if(!is_null($current_member_id) && $member = $this->member_repository->getById($current_member_id)){ - if($member->isOnGroup(Group::SummitAdministrators)){ - $serializer_type = SerializerRegistry::SerializerType_Private; - } - } - $result = $this->speaker_repository->getSpeakersBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); + $serializer_type = $this->serializer_type_selector->getSerializerType(); + $result = $this->speaker_repository->getSpeakersBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); return $this->ok ( @@ -190,13 +192,16 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController } } - + /** + * get all speakers without summit + * @return mixed + */ public function getAll(){ try { - $values = Input::all(); - $serializer_type = SerializerRegistry::SerializerType_Public; - $rules = [ + $values = Input::all(); + $serializer_type = $this->serializer_type_selector->getSerializerType(); + $rules = [ 'page' => 'integer|min:1', 'per_page' => 'required_with:page|integer|min:10|max:100', ]; @@ -246,13 +251,6 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $result = $this->speaker_repository->getAllByPage(new PagingInfo($page, $per_page), $filter, $order); - $current_member_id = $this->resource_server_context->getCurrentUserExternalId(); - if(!is_null($current_member_id) && $member = $this->member_repository->getById($current_member_id)){ - if($member->isOnGroup(Group::SummitAdministrators)){ - $serializer_type = SerializerRegistry::SerializerType_Private; - } - } - return $this->ok ( $result->toArray(Request::input('expand', ''),[] ,[], [], $serializer_type) @@ -279,23 +277,17 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return mixed */ - public function getSpeaker($summit_id, $speaker_id) + public function getSummitSpeaker($summit_id, $speaker_id) { try { - $serializer_type = SerializerRegistry::SerializerType_Public; - $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); + $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); $speaker = CheckSpeakerStrategyFactory::build(CheckSpeakerStrategyFactory::Me, $this->resource_server_context)->check($speaker_id, $summit); if (is_null($speaker)) return $this->error404(); - $current_member_id = $this->resource_server_context->getCurrentUserExternalId(); - if(!is_null($current_member_id) && $member = $this->member_repository->getById($current_member_id)){ - if($member->isOnGroup(Group::SummitAdministrators)){ - $serializer_type = SerializerRegistry::SerializerType_Private; - } - } + $serializer_type = $this->serializer_type_selector->getSerializerType(); return $this->ok ( @@ -324,6 +316,47 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController } } + /** + * @param $speaker_id + * @return mixed + */ + public function getSpeaker($speaker_id) + { + try + { + + $speaker = $this->speaker_repository->getById($speaker_id); + if (is_null($speaker)) return $this->error404(); + + $serializer_type = $this->serializer_type_selector->getSerializerType(); + + return $this->ok + ( + SerializerRegistry::getInstance()->getSerializer($speaker, $serializer_type)->serialize + ( + Request::input('expand', ''), + [], + [], + [] + ) + ); + + } + catch(ValidationException $ex1){ + Log::warning($ex1); + return $this->error412($ex1->getMessages()); + } + 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 addSpeaker($summit_id){ try { if(!Request::isJson()) return $this->error403(); diff --git a/app/Http/routes.php b/app/Http/routes.php index 56322a8d..7205d1b0 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -185,7 +185,7 @@ Route::group([ Route::get('', 'OAuth2SummitSpeakersApiController@getSpeakers'); Route::group(['prefix' => '{speaker_id}'], function () { - Route::get('', 'OAuth2SummitSpeakersApiController@getSpeaker')->where('speaker_id', 'me|[0-9]+'); + Route::get('', 'OAuth2SummitSpeakersApiController@getSummitSpeaker')->where('speaker_id', 'me|[0-9]+'); Route::put('',[ 'middleware' => 'auth.user:administrators', 'uses' => 'OAuth2SummitSpeakersApiController@updateSpeaker'])->where('speaker_id', 'me|[0-9]+'); }); }); @@ -314,6 +314,7 @@ Route::group([ Route::get('', 'OAuth2SummitSpeakersApiController@getAll'); Route::group(['prefix' => '{speaker_id}'], function () { + Route::get('', 'OAuth2SummitSpeakersApiController@getSpeaker'); Route::post('/photo', [ 'middleware' => 'auth.user:administrators', 'uses' => 'OAuth2SummitSpeakersApiController@addSpeakerPhoto']); }); }); diff --git a/app/ModelSerializers/AdminPresentationSpeakerSerializer.php b/app/ModelSerializers/AdminPresentationSpeakerSerializer.php deleted file mode 100644 index 23f99f0a..00000000 --- a/app/ModelSerializers/AdminPresentationSpeakerSerializer.php +++ /dev/null @@ -1,78 +0,0 @@ -getAllowedRelations(); - - $speaker = $this->object; - if(!$speaker instanceof PresentationSpeaker) return []; - - $values = parent::serialize($expand, $fields, $relations, $params); - $values['email'] = $speaker->getEmail(); - $summit = isset($params['summit'])? $params['summit']:null; - - if(!is_null($summit)){ - $summit_assistance = $speaker->getAssistanceFor($summit); - if($summit_assistance){ - $values['summit_assistance'] = SerializerRegistry::getInstance()->getSerializer($summit_assistance)->serialize(); - } - $registration_code = $speaker->getPromoCodeFor($summit); - if($registration_code){ - $values['registration_code'] = SerializerRegistry::getInstance()->getSerializer($registration_code)->serialize(); - } - - $values['all_presentations'] = $speaker->getPresentationIds($summit->getId() ,false); - $values['all_moderated_presentations'] = $speaker->getModeratedPresentationIds($summit->getId(), false); - } - - if (!empty($expand)) { - foreach (explode(',', $expand) as $relation) { - switch (trim($relation)) { - case 'presentations': { - if(is_null($summit)) continue; - $presentations = []; - foreach ($speaker->getPresentations($summit->getId(), false) as $p) { - $presentations[] = SerializerRegistry::getInstance()->getSerializer($p)->serialize(); - } - $values['all_presentations'] = $presentations; - - $moderated_presentations = []; - foreach ($speaker->getModeratedPresentations($summit->getId(), false) as $p) { - $moderated_presentations[] = SerializerRegistry::getInstance()->getSerializer($p)->serialize(); - } - $values['all_moderated_presentations'] = $presentations; - } - break; - } - } - } - return $values; - } -} \ No newline at end of file diff --git a/app/ModelSerializers/BaseSerializerTypeSelector.php b/app/ModelSerializers/BaseSerializerTypeSelector.php new file mode 100644 index 00000000..63c9eff0 --- /dev/null +++ b/app/ModelSerializers/BaseSerializerTypeSelector.php @@ -0,0 +1,63 @@ +resource_server_context = $resource_server_context; + $this->member_repository = $member_repository; + } + + /** + * @return string + */ + public function getSerializerType() + { + $serializer_type = SerializerRegistry::SerializerType_Public; + $current_member_id = $this->resource_server_context->getCurrentUserExternalId(); + if(!is_null($current_member_id) && $member = $this->member_repository->getById($current_member_id)){ + if($member->isOnGroup(Group::SummitAdministrators)){ + $serializer_type = SerializerRegistry::SerializerType_Private; + } + } + return $serializer_type; + } +} \ No newline at end of file diff --git a/app/ModelSerializers/ISerializerTypeSelector.php b/app/ModelSerializers/ISerializerTypeSelector.php new file mode 100644 index 00000000..10f32dc8 --- /dev/null +++ b/app/ModelSerializers/ISerializerTypeSelector.php @@ -0,0 +1,21 @@ + AdminPresentationSpeakerSerializer::class ]; + $this->registry['SpeakerExpertise'] = SpeakerExpertiseSerializer::class; + $this->registry['SpeakerLanguage'] = SpeakerLanguageSerializer::class; + $this->registry['SpeakerTravelPreference'] = SpeakerTravelPreferenceSerializer::class; + $this->registry['SpeakerPresentationLink'] = SpeakerPresentationLinkSerializer::class; + $this->registry['SpeakerActiveInvolvement'] = SpeakerActiveInvolvementSerializer::class; + $this->registry['SpeakerOrganizationalRole'] = SpeakerOrganizationalRoleSerializer::class; + $this->registry['SummitEventFeedback'] = SummitEventFeedbackSerializer::class; $this->registry['SummitAttendee'] = SummitAttendeeSerializer::class; $this->registry['SummitMemberSchedule'] = SummitMemberScheduleSerializer::class; @@ -171,12 +178,12 @@ final class SerializerRegistry $this->registry['CloudServiceOffered'] = CloudServiceOfferedSerializer::class; // software - $this->registry['OpenStackComponent'] = OpenStackComponentSerializer::class; - $this->registry['OpenStackRelease'] = OpenStackReleaseSerializer::class; + $this->registry['OpenStackComponent'] = OpenStackComponentSerializer::class; + $this->registry['OpenStackRelease'] = OpenStackReleaseSerializer::class; // ccla - $this->registry['Team'] = TeamSerializer::class; + $this->registry['Team'] = TeamSerializer::class; } /** diff --git a/app/ModelSerializers/PresentationCategoryGroupSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationCategoryGroupSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationCategoryGroupSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationCategoryGroupSerializer.php diff --git a/app/ModelSerializers/PresentationCategorySerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationCategorySerializer.php similarity index 100% rename from app/ModelSerializers/PresentationCategorySerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationCategorySerializer.php diff --git a/app/ModelSerializers/PresentationLinkSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationLinkSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationLinkSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationLinkSerializer.php diff --git a/app/ModelSerializers/PresentationMaterialSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationMaterialSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationMaterialSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationMaterialSerializer.php diff --git a/app/ModelSerializers/PresentationSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationSerializer.php diff --git a/app/ModelSerializers/PresentationSlideSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationSlideSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationSlideSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationSlideSerializer.php diff --git a/app/ModelSerializers/PresentationSpeakerSummitAssistanceConfirmationRequestSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationSpeakerSummitAssistanceConfirmationRequestSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationSpeakerSummitAssistanceConfirmationRequestSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationSpeakerSummitAssistanceConfirmationRequestSerializer.php diff --git a/app/ModelSerializers/PresentationTypeSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationTypeSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationTypeSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationTypeSerializer.php diff --git a/app/ModelSerializers/PresentationVideoSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationVideoSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationVideoSerializer.php rename to app/ModelSerializers/Summit/Presentation/PresentationVideoSerializer.php diff --git a/app/ModelSerializers/Summit/Speakers/AdminPresentationSpeakerSerializer.php b/app/ModelSerializers/Summit/Speakers/AdminPresentationSpeakerSerializer.php new file mode 100644 index 00000000..e4d6d25e --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/AdminPresentationSpeakerSerializer.php @@ -0,0 +1,144 @@ +getAllowedRelations(); + + $speaker = $this->object; + if(!$speaker instanceof PresentationSpeaker) return []; + + $values = parent::serialize($expand, $fields, $relations, $params); + $values['email'] = $speaker->getEmail(); + $summit = isset($params['summit'])? $params['summit']:null; + + if(!is_null($summit)){ + $summit_assistance = $speaker->getAssistanceFor($summit); + if($summit_assistance){ + $values['summit_assistance'] = SerializerRegistry::getInstance()->getSerializer($summit_assistance)->serialize(); + } + $registration_code = $speaker->getPromoCodeFor($summit); + if($registration_code){ + $values['registration_code'] = SerializerRegistry::getInstance()->getSerializer($registration_code)->serialize(); + } + + $values['all_presentations'] = $speaker->getPresentationIds($summit->getId() ,false); + $values['all_moderated_presentations'] = $speaker->getModeratedPresentationIds($summit->getId(), false); + } + else{ + // get all summits info + $summit_assistances = []; + foreach ($speaker->getSummitAssistances() as $assistance){ + $summit_assistances[] = SerializerRegistry::getInstance()->getSerializer($assistance)->serialize(); + } + $values['summit_assistances'] = $summit_assistances; + + $registration_codes = []; + foreach ($speaker->getPromoCodes() as $promo_code){ + $registration_codes[] = SerializerRegistry::getInstance()->getSerializer($promo_code)->serialize(); + } + $values['registration_codes'] = $registration_codes; + + $values['all_presentations'] = $speaker->getAllPresentationIds(false); + $values['all_moderated_presentations'] = $speaker->getAllModeratedPresentationIds( false); + + } + + $languages = []; + foreach ($speaker->getLanguages() as $language){ + $languages[] = SerializerRegistry::getInstance()->getSerializer($language)->serialize(); + } + $values['languages'] = $languages; + + $other_presentation_links = []; + foreach ($speaker->getOtherPresentationLinks() as $link){ + $other_presentation_links[] = SerializerRegistry::getInstance()->getSerializer($link)->serialize(); + } + $values['other_presentation_links'] = $other_presentation_links; + + $areas_of_expertise = []; + foreach ($speaker->getAreasOfExpertise() as $exp){ + $areas_of_expertise[] = SerializerRegistry::getInstance()->getSerializer($exp)->serialize(); + } + $values['areas_of_expertise'] = $areas_of_expertise; + + $travel_preferences = []; + foreach ($speaker->getTravelPreferences() as $tp){ + $travel_preferences[] = SerializerRegistry::getInstance()->getSerializer($tp)->serialize(); + } + $values['travel_preferences'] = $travel_preferences; + + $active_involvements = []; + foreach ($speaker->getActiveInvolvements() as $ai){ + $active_involvements[] = SerializerRegistry::getInstance()->getSerializer($ai)->serialize(); + } + $values['active_involvements'] = $active_involvements; + + $organizational_roles = []; + foreach ($speaker->getOrganizationalRoles() as $or){ + $organizational_roles[] = SerializerRegistry::getInstance()->getSerializer($or)->serialize(); + } + $values['organizational_roles'] = $organizational_roles; + + if (!empty($expand)) { + foreach (explode(',', $expand) as $relation) { + switch (trim($relation)) { + case 'presentations': { + $presentations = []; + $moderated_presentations = []; + if(is_null($summit)){ + + foreach ($speaker->getAllPresentations( false) as $p) { + $presentations[] = SerializerRegistry::getInstance()->getSerializer($p)->serialize(); + } + + foreach ($speaker->getAllModeratedPresentations(false) as $p) { + $moderated_presentations[] = SerializerRegistry::getInstance()->getSerializer($p)->serialize(); + } + } + else{ + foreach ($speaker->getPresentations($summit->getId(), false) as $p) { + $presentations[] = SerializerRegistry::getInstance()->getSerializer($p)->serialize(); + } + + foreach ($speaker->getModeratedPresentations($summit->getId(), false) as $p) { + $moderated_presentations[] = SerializerRegistry::getInstance()->getSerializer($p)->serialize(); + } + } + + $values['all_presentations'] = $presentations; + $values['all_moderated_presentations'] = $moderated_presentations; + } + break; + } + } + } + return $values; + } +} \ No newline at end of file diff --git a/app/ModelSerializers/PresentationSpeakerSerializer.php b/app/ModelSerializers/Summit/Speakers/PresentationSpeakerSerializer.php similarity index 100% rename from app/ModelSerializers/PresentationSpeakerSerializer.php rename to app/ModelSerializers/Summit/Speakers/PresentationSpeakerSerializer.php diff --git a/app/ModelSerializers/Summit/Speakers/SpeakerActiveInvolvementSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerActiveInvolvementSerializer.php new file mode 100644 index 00000000..9768c8f2 --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/SpeakerActiveInvolvementSerializer.php @@ -0,0 +1,21 @@ + 'involvement:json_string', + 'IsDefault' => 'is_default:json_boolean', + ]; +} \ No newline at end of file diff --git a/app/ModelSerializers/Summit/Speakers/SpeakerExpertiseSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerExpertiseSerializer.php new file mode 100644 index 00000000..48f41317 --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/SpeakerExpertiseSerializer.php @@ -0,0 +1,21 @@ + 'expertise:json_string', + 'SpeakerId' => 'speaker_id:json_int', + ]; +} \ No newline at end of file diff --git a/app/ModelSerializers/Summit/Speakers/SpeakerLanguageSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerLanguageSerializer.php new file mode 100644 index 00000000..5363ec02 --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/SpeakerLanguageSerializer.php @@ -0,0 +1,21 @@ + 'language:json_string', + 'SpeakerId' => 'speaker_id:json_int', + ]; +} \ No newline at end of file diff --git a/app/ModelSerializers/Summit/Speakers/SpeakerOrganizationalRoleSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerOrganizationalRoleSerializer.php new file mode 100644 index 00000000..ed61b138 --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/SpeakerOrganizationalRoleSerializer.php @@ -0,0 +1,21 @@ + 'role:json_string', + 'IsDefault' => 'is_default:json_boolean', + ]; +} \ No newline at end of file diff --git a/app/ModelSerializers/Summit/Speakers/SpeakerPresentationLinkSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerPresentationLinkSerializer.php new file mode 100644 index 00000000..88a5ed5d --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/SpeakerPresentationLinkSerializer.php @@ -0,0 +1,22 @@ + 'link:json_string', + 'Title' => 'title:json_string', + 'SpeakerId' => 'speaker_id:json_int', + ]; +} \ No newline at end of file diff --git a/app/ModelSerializers/SpeakerSummitRegistrationPromoCodeSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerSummitRegistrationPromoCodeSerializer.php similarity index 100% rename from app/ModelSerializers/SpeakerSummitRegistrationPromoCodeSerializer.php rename to app/ModelSerializers/Summit/Speakers/SpeakerSummitRegistrationPromoCodeSerializer.php diff --git a/app/ModelSerializers/Summit/Speakers/SpeakerTravelPreferenceSerializer.php b/app/ModelSerializers/Summit/Speakers/SpeakerTravelPreferenceSerializer.php new file mode 100644 index 00000000..12de41bc --- /dev/null +++ b/app/ModelSerializers/Summit/Speakers/SpeakerTravelPreferenceSerializer.php @@ -0,0 +1,21 @@ + 'country:json_string', + 'SpeakerId' => 'speaker_id:json_int', + ]; +} \ No newline at end of file diff --git a/app/ModelSerializers/SummitAttendeeSerializer.php b/app/ModelSerializers/Summit/SummitAttendeeSerializer.php similarity index 100% rename from app/ModelSerializers/SummitAttendeeSerializer.php rename to app/ModelSerializers/Summit/SummitAttendeeSerializer.php diff --git a/app/ModelSerializers/SummitEntityEventSerializer.php b/app/ModelSerializers/Summit/SummitEntityEventSerializer.php similarity index 100% rename from app/ModelSerializers/SummitEntityEventSerializer.php rename to app/ModelSerializers/Summit/SummitEntityEventSerializer.php diff --git a/app/ModelSerializers/SummitEventFeedbackSerializer.php b/app/ModelSerializers/Summit/SummitEventFeedbackSerializer.php similarity index 100% rename from app/ModelSerializers/SummitEventFeedbackSerializer.php rename to app/ModelSerializers/Summit/SummitEventFeedbackSerializer.php diff --git a/app/ModelSerializers/SummitEventMetricsSnapshotSerializer.php b/app/ModelSerializers/Summit/SummitEventMetricsSnapshotSerializer.php similarity index 100% rename from app/ModelSerializers/SummitEventMetricsSnapshotSerializer.php rename to app/ModelSerializers/Summit/SummitEventMetricsSnapshotSerializer.php diff --git a/app/ModelSerializers/SummitEventSerializer.php b/app/ModelSerializers/Summit/SummitEventSerializer.php similarity index 100% rename from app/ModelSerializers/SummitEventSerializer.php rename to app/ModelSerializers/Summit/SummitEventSerializer.php diff --git a/app/ModelSerializers/SummitEventTypeSerializer.php b/app/ModelSerializers/Summit/SummitEventTypeSerializer.php similarity index 100% rename from app/ModelSerializers/SummitEventTypeSerializer.php rename to app/ModelSerializers/Summit/SummitEventTypeSerializer.php diff --git a/app/ModelSerializers/SummitEventWithFileSerializer.php b/app/ModelSerializers/Summit/SummitEventWithFileSerializer.php similarity index 100% rename from app/ModelSerializers/SummitEventWithFileSerializer.php rename to app/ModelSerializers/Summit/SummitEventWithFileSerializer.php diff --git a/app/ModelSerializers/SummitGroupEventSerializer.php b/app/ModelSerializers/Summit/SummitGroupEventSerializer.php similarity index 100% rename from app/ModelSerializers/SummitGroupEventSerializer.php rename to app/ModelSerializers/Summit/SummitGroupEventSerializer.php diff --git a/app/ModelSerializers/SummitMemberFavoriteSerializer.php b/app/ModelSerializers/Summit/SummitMemberFavoriteSerializer.php similarity index 100% rename from app/ModelSerializers/SummitMemberFavoriteSerializer.php rename to app/ModelSerializers/Summit/SummitMemberFavoriteSerializer.php diff --git a/app/ModelSerializers/SummitMemberScheduleSerializer.php b/app/ModelSerializers/Summit/SummitMemberScheduleSerializer.php similarity index 100% rename from app/ModelSerializers/SummitMemberScheduleSerializer.php rename to app/ModelSerializers/Summit/SummitMemberScheduleSerializer.php diff --git a/app/ModelSerializers/SummitPushNotificationSerializer.php b/app/ModelSerializers/Summit/SummitPushNotificationSerializer.php similarity index 100% rename from app/ModelSerializers/SummitPushNotificationSerializer.php rename to app/ModelSerializers/Summit/SummitPushNotificationSerializer.php diff --git a/app/ModelSerializers/SummitRegistrationPromoCodeSerializer.php b/app/ModelSerializers/Summit/SummitRegistrationPromoCodeSerializer.php similarity index 100% rename from app/ModelSerializers/SummitRegistrationPromoCodeSerializer.php rename to app/ModelSerializers/Summit/SummitRegistrationPromoCodeSerializer.php diff --git a/app/ModelSerializers/SummitScheduleEmptySpotSerializer.php b/app/ModelSerializers/Summit/SummitScheduleEmptySpotSerializer.php similarity index 100% rename from app/ModelSerializers/SummitScheduleEmptySpotSerializer.php rename to app/ModelSerializers/Summit/SummitScheduleEmptySpotSerializer.php diff --git a/app/ModelSerializers/SummitSerializer.php b/app/ModelSerializers/Summit/SummitSerializer.php similarity index 100% rename from app/ModelSerializers/SummitSerializer.php rename to app/ModelSerializers/Summit/SummitSerializer.php diff --git a/app/ModelSerializers/SummitTicketTypeSerializer.php b/app/ModelSerializers/Summit/SummitTicketTypeSerializer.php similarity index 100% rename from app/ModelSerializers/SummitTicketTypeSerializer.php rename to app/ModelSerializers/Summit/SummitTicketTypeSerializer.php diff --git a/app/ModelSerializers/SummitTypeSerializer.php b/app/ModelSerializers/Summit/SummitTypeSerializer.php similarity index 100% rename from app/ModelSerializers/SummitTypeSerializer.php rename to app/ModelSerializers/Summit/SummitTypeSerializer.php diff --git a/app/ModelSerializers/SummitWIFIConnectionSerializer.php b/app/ModelSerializers/Summit/SummitWIFIConnectionSerializer.php similarity index 100% rename from app/ModelSerializers/SummitWIFIConnectionSerializer.php rename to app/ModelSerializers/Summit/SummitWIFIConnectionSerializer.php diff --git a/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php b/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php index e351d23c..c512ff9e 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php +++ b/app/Models/Foundation/Summit/Events/Presentations/PresentationSpeaker.php @@ -70,6 +70,42 @@ class PresentationSpeaker extends SilverstripeBaseModel */ private $created_from_api; + /** + * @ORM\Column(name="AvailableForBureau", type="boolean") + */ + private $available_for_bureau; + + /** + * @ORM\Column(name="FundedTravel", type="boolean") + */ + private $funded_travel; + + /** + * @ORM\Column(name="WillingToTravel", type="boolean") + */ + private $willing_to_travel; + + /** + * @ORM\Column(name="Country", type="string") + */ + private $country; + + /** + * @ORM\Column(name="WillingToPresentVideo", type="boolean") + */ + private $willing_to_presentVideo; + + /** + * @ORM\Column(name="Notes", type="string") + */ + private $notes; + + + /** + * @ORM\Column(name="OrgHasCloud", type="boolean") + */ + private $org_has_cloud; + /** * @ORM\ManyToOne(targetEntity="SpeakerRegistrationRequest", cascade={"persist"}) * @ORM\JoinColumn(name="RegistrationRequestID", referencedColumnName="ID") @@ -116,7 +152,51 @@ class PresentationSpeaker extends SilverstripeBaseModel private $member; /** - * @return mixed + * @ORM\OneToMany(targetEntity="SpeakerExpertise", mappedBy="speaker", cascade={"persist"}) + * @var SpeakerExpertise[] + */ + private $areas_of_expertise; + + /** + * @ORM\OneToMany(targetEntity="SpeakerPresentationLink", mappedBy="speaker", cascade={"persist"}) + * @var SpeakerPresentationLink[] + */ + private $other_presentation_links; + + /** + * @ORM\OneToMany(targetEntity="SpeakerTravelPreference", mappedBy="speaker", cascade={"persist"}) + * @var SpeakerTravelPreference[] + */ + private $travel_preferences; + + /** + * @ORM\OneToMany(targetEntity="SpeakerLanguage", mappedBy="speaker", cascade={"persist"}) + * @var SpeakerLanguage[] + */ + private $languages; + + /** + * @ORM\ManyToMany(targetEntity="SpeakerOrganizationalRole", cascade={"persist"}) + * @ORM\JoinTable(name="PresentationSpeaker_OrganizationalRoles", + * joinColumns={@ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID")}, + * inverseJoinColumns={@ORM\JoinColumn(name="SpeakerOrganizationalRoleID", referencedColumnName="ID")} + * ) + * @var SpeakerOrganizationalRole[] + */ + protected $organizational_roles; + + /** + * @ORM\ManyToMany(targetEntity="SpeakerOrganizationalRole", cascade={"persist"}) + * @ORM\JoinTable(name="PresentationSpeaker_ActiveInvolvements", + * joinColumns={@ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID")}, + * inverseJoinColumns={@ORM\JoinColumn(name="SpeakerActiveInvolvementID", referencedColumnName="ID")} + * ) + * @var SpeakerActiveInvolvement[] + */ + protected $active_involvements; + + /** + * @return string */ public function getFirstName() { @@ -215,10 +295,16 @@ class PresentationSpeaker extends SilverstripeBaseModel { parent::__construct(); - $this->presentations = new ArrayCollection; - $this->moderated_presentations = new ArrayCollection; - $this->summit_assistances = new ArrayCollection; - $this->promo_codes = new ArrayCollection; + $this->presentations = new ArrayCollection; + $this->moderated_presentations = new ArrayCollection; + $this->summit_assistances = new ArrayCollection; + $this->promo_codes = new ArrayCollection; + $this->areas_of_expertise = new ArrayCollection; + $this->other_presentation_links = new ArrayCollection; + $this->travel_preferences = new ArrayCollection; + $this->languages = new ArrayCollection; + $this->organizational_roles = new ArrayCollection; + $this->active_involvements = new ArrayCollection; } /** @@ -228,7 +314,6 @@ class PresentationSpeaker extends SilverstripeBaseModel $this->presentations->add($presentation); } - public function clearPresentations(){ foreach($this->presentations as $presentation){ $presentation->removeSpeaker($this); @@ -255,6 +340,13 @@ class PresentationSpeaker extends SilverstripeBaseModel return $this; } + /** + * @return ArrayCollection|SpeakerSummitRegistrationPromoCode[] + */ + public function getPromoCodes(){ + return $this->promo_codes; + } + /** * @param Summit $summit * @return SpeakerSummitRegistrationPromoCode @@ -319,6 +411,17 @@ class PresentationSpeaker extends SilverstripeBaseModel })->toArray(); } + /** + * @param bool|true $published_ones + * @return array + */ + public function getAllPresentationIds($published_ones = true) + { + return $this->presentations(null, $published_ones)->map(function($entity) { + return $entity->getId(); + })->toArray(); + } + /** * @param null $summit_id * @param bool|true $published_ones @@ -331,6 +434,17 @@ class PresentationSpeaker extends SilverstripeBaseModel })->toArray(); } + /** + * @param bool|true $published_ones + * @return array + */ + public function getAllPresentations($published_ones = true) + { + return $this->presentations(null, $published_ones)->map(function($entity) { + return $entity; + })->toArray(); + } + /** * @param null $summit_id @@ -344,6 +458,17 @@ class PresentationSpeaker extends SilverstripeBaseModel })->toArray(); } + /** + * @param bool|true $published_ones + * @return array + */ + public function getAllModeratedPresentationIds($published_ones = true) + { + return $this->moderated_presentations(null, $published_ones)->map(function($entity) { + return $entity->getId(); + })->toArray(); + } + /** * @param null $summit_id * @param bool|true $published_ones @@ -356,6 +481,17 @@ class PresentationSpeaker extends SilverstripeBaseModel })->toArray(); } + /** + * @param bool|true $published_ones + * @return array + */ + public function getAllModeratedPresentations($published_ones = true) + { + return $this->moderated_presentations(null, $published_ones)->map(function($entity) { + return $entity; + })->toArray(); + } + /** * @return File */ @@ -624,4 +760,165 @@ SQL; public function inserted($args){ Event::fire(new PresentationSpeakerCreated($this, $args)); } + + /** + * @return bool + */ + public function isAvailableForBureau() + { + return $this->available_for_bureau; + } + + /** + * @param bool $available_for_bureau + */ + public function setAvailableForBureau($available_for_bureau) + { + $this->available_for_bureau = $available_for_bureau; + } + + /** + * @return bool + */ + public function isFundedTravel() + { + return $this->funded_travel; + } + + /** + * @param bool $funded_travel + */ + public function setFundedTravel($funded_travel) + { + $this->funded_travel = $funded_travel; + } + + /** + * @return bool + */ + public function isWillingToTravel() + { + return $this->willing_to_travel; + } + + /** + * @param bool $willing_to_travel + */ + public function setWillingToTravel($willing_to_travel) + { + $this->willing_to_travel = $willing_to_travel; + } + + /** + * @return string + */ + public function getCountry() + { + return $this->country; + } + + /** + * @param string $country + */ + public function setCountry($country) + { + $this->country = $country; + } + + /** + * @return bool + */ + public function isWillingToPresentVideo() + { + return $this->willing_to_presentVideo; + } + + /** + * @param bool $willing_to_presentVideo + */ + public function setWillingToPresentVideo($willing_to_presentVideo) + { + $this->willing_to_presentVideo = $willing_to_presentVideo; + } + + /** + * @return string + */ + public function getNotes() + { + return $this->notes; + } + + /** + * @param string $notes + */ + public function setNotes($notes) + { + $this->notes = $notes; + } + + /** + * @return bool + */ + public function isOrgHasCloud() + { + return $this->org_has_cloud; + } + + /** + * @param bool $org_has_cloud + */ + public function setOrgHasCloud($org_has_cloud) + { + $this->org_has_cloud = $org_has_cloud; + } + + /** + * @return SpeakerExpertise[] + */ + public function getAreasOfExpertise() + { + return $this->areas_of_expertise; + } + + /** + * @return SpeakerPresentationLink[] + */ + public function getOtherPresentationLinks() + { + return $this->other_presentation_links; + } + + /** + * @return SpeakerTravelPreference[] + */ + public function getTravelPreferences() + { + return $this->travel_preferences; + } + + /** + * @return SpeakerLanguage[] + */ + public function getLanguages() + { + return $this->languages; + } + + /** + * @return SpeakerOrganizationalRole[] + */ + public function getOrganizationalRoles() + { + return $this->organizational_roles; + } + + /** + * @return SpeakerActiveInvolvement[] + */ + public function getActiveInvolvements() + { + return $this->active_involvements; + } + } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/SpeakerActiveInvolvement.php b/app/Models/Foundation/Summit/Events/Presentations/SpeakerActiveInvolvement.php new file mode 100644 index 00000000..a8208897 --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/SpeakerActiveInvolvement.php @@ -0,0 +1,65 @@ +involvement; + } + + /** + * @param mixed $involvement + */ + public function setInvolvement($involvement) + { + $this->involvement = $involvement; + } + + /** + * @return bool + */ + public function isDefault() + { + return $this->is_default; + } + + /** + * @param bool $is_default + */ + public function setIsDefault($is_default) + { + $this->is_default = $is_default; + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/SpeakerExpertise.php b/app/Models/Foundation/Summit/Events/Presentations/SpeakerExpertise.php new file mode 100644 index 00000000..ceceac99 --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/SpeakerExpertise.php @@ -0,0 +1,79 @@ +expertise; + } + + /** + * @param string $expertise + */ + public function setExpertise($expertise) + { + $this->expertise = $expertise; + } + + /** + * @return PresentationSpeaker + */ + public function getSpeaker() + { + return $this->speaker; + } + + /** + * @param PresentationSpeaker $speaker + */ + public function setSpeaker($speaker) + { + $this->speaker = $speaker; + } + + /** + * @return int + */ + public function getSpeakerId(){ + try { + return !is_null($this->speaker) ? $this->speaker->getId() : 0; + } + catch(\Exception $ex){ + return 0; + } + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/SpeakerLanguage.php b/app/Models/Foundation/Summit/Events/Presentations/SpeakerLanguage.php new file mode 100644 index 00000000..d7741549 --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/SpeakerLanguage.php @@ -0,0 +1,79 @@ +language; + } + + /** + * @param string $language + */ + public function setLanguage($language) + { + $this->language = $language; + } + + /** + * @return PresentationSpeaker + */ + public function getSpeaker() + { + return $this->speaker; + } + + /** + * @param PresentationSpeaker $speaker + */ + public function setSpeaker($speaker) + { + $this->speaker = $speaker; + } + + /** + * @return int + */ + public function getSpeakerId(){ + try { + return !is_null($this->speaker) ? $this->speaker->getId() : 0; + } + catch(\Exception $ex){ + return 0; + } + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/SpeakerOrganizationalRole.php b/app/Models/Foundation/Summit/Events/Presentations/SpeakerOrganizationalRole.php new file mode 100644 index 00000000..74a66628 --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/SpeakerOrganizationalRole.php @@ -0,0 +1,66 @@ +role; + } + + /** + * @param mixed $role + */ + public function setRole($role) + { + $this->role = $role; + } + + /** + * @return bool + */ + public function isDefault() + { + return $this->is_default; + } + + /** + * @param bool $is_default + */ + public function setIsDefault($is_default) + { + $this->is_default = $is_default; + } + +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/SpeakerPresentationLink.php b/app/Models/Foundation/Summit/Events/Presentations/SpeakerPresentationLink.php new file mode 100644 index 00000000..f202826b --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/SpeakerPresentationLink.php @@ -0,0 +1,100 @@ +link; + } + + /** + * @param string $link + */ + public function setLink($link) + { + $this->link = $link; + } + + /** + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * @return PresentationSpeaker + */ + public function getSpeaker() + { + return $this->speaker; + } + + /** + * @param PresentationSpeaker $speaker + */ + public function setSpeaker($speaker) + { + $this->speaker = $speaker; + } + + /** + * @return int + */ + public function getSpeakerId(){ + try { + return !is_null($this->speaker) ? $this->speaker->getId() : 0; + } + catch(\Exception $ex){ + return 0; + } + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/SpeakerTravelPreference.php b/app/Models/Foundation/Summit/Events/Presentations/SpeakerTravelPreference.php new file mode 100644 index 00000000..7e49c1fe --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/SpeakerTravelPreference.php @@ -0,0 +1,79 @@ +speaker) ? $this->speaker->getId() : 0; + } + catch(\Exception $ex){ + return 0; + } + } + + /** + * @return string + */ + public function getCountry() + { + return $this->country; + } + + /** + * @param string $country + */ + public function setCountry($country) + { + $this->country = $country; + } + + /** + * @return PresentationSpeaker + */ + public function getSpeaker() + { + return $this->speaker; + } + + /** + * @param PresentationSpeaker $speaker + */ + public function setSpeaker($speaker) + { + $this->speaker = $speaker; + } +} \ No newline at end of file diff --git a/app/Services/ServicesProvider.php b/app/Services/ServicesProvider.php index 912ef0b8..60d8dedf 100644 --- a/app/Services/ServicesProvider.php +++ b/app/Services/ServicesProvider.php @@ -14,6 +14,8 @@ use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; use Illuminate\Support\ServiceProvider; +use ModelSerializers\BaseSerializerTypeSelector; +use ModelSerializers\ISerializerTypeSelector; use services\apis\EventbriteAPI; use services\apis\FireBaseGCMApi; /*** @@ -51,6 +53,8 @@ class ServicesProvider extends ServiceProvider ); }); + App::singleton(ISerializerTypeSelector::class, BaseSerializerTypeSelector::class); + App::singleton('services\model\ISummitService', 'services\model\SummitService'); App::singleton('services\model\ISpeakerService', 'services\model\SpeakerService'); diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 26ccdbd3..d5c4b2de 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -192,6 +192,15 @@ class ApiEndpointsSeeder extends Seeder ), array( 'name' => 'get-speaker', + 'route' => '/api/v1/speakers/{speaker_id}', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadSummitData, $current_realm), + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ), + array( + 'name' => 'get-speaker-by-summit', 'route' => '/api/v1/summits/{id}/speakers/{speaker_id}', 'http_method' => 'GET', 'scopes' => [ diff --git a/tests/OAuth2SpeakersApiTest.php b/tests/OAuth2SpeakersApiTest.php index 641afebd..72e253a3 100644 --- a/tests/OAuth2SpeakersApiTest.php +++ b/tests/OAuth2SpeakersApiTest.php @@ -167,7 +167,6 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest return $speaker; } - public function testGetCurrentSummitSpeakersOrderByID() { $params = [ @@ -265,7 +264,34 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest { $params = [ 'id' => 23, - 'speaker_id' => 13869 + 'speaker_id' => 13869 + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "GET", + "OAuth2SummitSpeakersApiController@getSummitSpeaker", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + $speaker = json_decode($content); + $this->assertTrue(!is_null($speaker)); + } + + public function testGetSpeaker(){ + + $params = [ + 'speaker_id' => 1 ]; $headers = [