commit d45ed38e3513f48b30b5b1fe009e31b7b1946b47 Author: smarcet Date: Fri Oct 2 12:28:19 2020 -0300 Added missing endpoint /api/v1/summits/{id}/featured-speakers Change-Id: I7e0e47532af354bb14c6a790eab68d5dcc58b712 Signed-off-by: smarcet diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php index a9a55be..2772670 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php @@ -36,6 +36,8 @@ use utils\FilterElement; use utils\Order; use utils\OrderElement; use Illuminate\Http\Request as LaravelRequest; +use utils\PagingInfo; + /** * Class OAuth2SummitApiController * @package App\Http\Controllers @@ -766,4 +768,79 @@ final class OAuth2SummitApiController extends OAuth2ProtectedController } } + /** + * @param $summit_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function getAllFeatureSpeaker($summit_id){ + try { + $summit = SummitFinderStrategyFactory::build($this->getRepository(), $this->getResourceServerContext())->find($summit_id); + if (is_null($summit)) return $this->error404(); + + return $this->_getAll( + function(){ + return [ + 'first_name' => ['=@', '=='], + 'last_name' => ['=@', '=='], + 'email' => ['=@', '=='], + 'id' => ['=='], + 'full_name' => ['=@', '=='], + ]; + }, + function(){ + return [ + 'first_name' => 'sometimes|string', + 'last_name' => 'sometimes|string', + 'email' => 'sometimes|string', + 'id' => 'sometimes|integer', + 'full_name' => 'sometimes|string', + ]; + }, + function() + { + return [ + 'first_name', + 'last_name', + 'id', + 'email', + ]; + }, + function($filter) use($summit){ + return $filter; + }, + function(){ + return $this->serializer_type_selector->getSerializerType(); + }, + null, + null, + function ($page, $per_page, $filter, $order, $applyExtraFilters) use($summit) { + return $this->speaker_repository->getFeaturedSpeakers + ( + $summit, + new PagingInfo($page, $per_page), + call_user_func($applyExtraFilters, $filter), + $order + ); + }, + [ + 'summit_id' => $summit_id, + 'published' => true, + 'summit' => $summit + ] + ); + } catch (EntityNotFoundException $ex1) { + Log::warning($ex1); + return $this->error404(); + } catch (ValidationException $ex2) { + Log::warning($ex2); + return $this->error412(array($ex2->getMessage())); + } catch (\HTTP401UnauthorizedException $ex3) { + Log::warning($ex3); + return $this->error401(); + } catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + } \ No newline at end of file diff --git a/app/Http/routes.php b/app/Http/routes.php index 0474105..29208c0 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -1141,6 +1141,7 @@ Route::group([ // featured speakers Route::group(['prefix' => 'featured-speakers'], function(){ + Route::get('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitApiController@getAllFeatureSpeaker']); Route::group(['prefix' => '{speaker_id}'], function() { Route::put('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitApiController@addFeatureSpeaker']); Route::delete('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitApiController@removeFeatureSpeaker']); diff --git a/app/Models/Foundation/Summit/Repositories/ISpeakerRepository.php b/app/Models/Foundation/Summit/Repositories/ISpeakerRepository.php index cf62815..fab2fca 100644 --- a/app/Models/Foundation/Summit/Repositories/ISpeakerRepository.php +++ b/app/Models/Foundation/Summit/Repositories/ISpeakerRepository.php @@ -42,6 +42,15 @@ interface ISpeakerRepository extends IBaseRepository public function getSpeakersBySummitAndOnSchedule(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null); /** + * @param Summit $summit + * @param PagingInfo $paging_info + * @param Filter|null $filter + * @param Order|null $order + * @return mixed + */ + public function getFeaturedSpeakers(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null); + + /** * @param Member $member * @return PresentationSpeaker */ diff --git a/app/Repositories/Summit/DoctrineSpeakerRepository.php b/app/Repositories/Summit/DoctrineSpeakerRepository.php index edee14d..e40a338 100644 --- a/app/Repositories/Summit/DoctrineSpeakerRepository.php +++ b/app/Repositories/Summit/DoctrineSpeakerRepository.php @@ -849,4 +849,146 @@ SQL; return false; } + + /** + * @inheritDoc + */ + public function getFeaturedSpeakers(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null) + { + $extra_filters = ''; + $extra_orders = ''; + $bindings = []; + + if(!is_null($filter)) + { + $where_conditions = $filter->toRawSQL([ + 'full_name' => 'FullName', + 'first_name' => 'FirstName', + 'last_name' => 'LastName', + 'email' => 'Email', + 'id' => 'ID' + ]); + if(!empty($where_conditions)) { + $extra_filters = " WHERE {$where_conditions}"; + $bindings = array_merge($bindings, $filter->getSQLBindings()); + } + } + + if(!is_null($order)) + { + $extra_orders = $order->toRawSQL(array + ( + 'id' => 'ID', + 'email' => 'Email', + 'first_name' => 'FirstName', + 'last_name' => 'LastName', + 'full_name' => 'FullName', + )); + } + + $query_count = <<getId()} AND FS.PresentationSpeakerID = S.ID + ) +) +SUMMIT_SPEAKERS +{$extra_filters} +SQL; + + + $stm = $this->getEntityManager()->getConnection()->executeQuery($query_count, $bindings); + + $total = intval($stm->fetchColumn(0)); + + $bindings = array_merge( $bindings, array + ( + 'per_page' => $paging_info->getPerPage(), + 'offset' => $paging_info->getOffset(), + )); + + $query = <<getId()} AND FS.PresentationSpeakerID = S.ID + ) +) +SUMMIT_SPEAKERS +{$extra_filters} {$extra_orders} limit :per_page offset :offset; +SQL; + + /*$rsm = new ResultSetMapping(); + $rsm->addEntityResult(\models\summit\PresentationSpeaker::class, 's'); + $rsm->addJoinedEntityResult(\models\main\File::class,'p', 's', 'photo'); + $rsm->addJoinedEntityResult(\models\main\Member::class,'m', 's', 'member'); + + $rsm->addFieldResult('s', 'ID', 'id'); + $rsm->addFieldResult('s', 'FirstName', 'first_name'); + $rsm->addFieldResult('s', 'LastName', 'last_name'); + $rsm->addFieldResult('s', 'Bio', 'last_name'); + $rsm->addFieldResult('s', 'SpeakerTitle', 'title' ); + $rsm->addFieldResult('p', 'PhotoID', 'id'); + $rsm->addFieldResult('p', 'PhotoTitle', 'title'); + $rsm->addFieldResult('p', 'PhotoFileName', 'filename'); + $rsm->addFieldResult('p', 'PhotoName', 'name'); + $rsm->addFieldResult('m', 'MemberID', 'id');*/ + + $rsm = new ResultSetMappingBuilder($this->getEntityManager()); + $rsm->addRootEntityFromClassMetadata(\models\summit\PresentationSpeaker::class, 's', ['Title' => 'SpeakerTitle']); + + // build rsm here + $native_query = $this->getEntityManager()->createNativeQuery($query, $rsm); + + foreach($bindings as $k => $v) + $native_query->setParameter($k, $v); + + $speakers = $native_query->getResult(); + + $last_page = (int) ceil($total / $paging_info->getPerPage()); + + return new PagingResponse($total, $paging_info->getPerPage(), $paging_info->getCurrentPage(), $last_page, $speakers); + } } \ No newline at end of file diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 12dccc1..8349324 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -5828,6 +5828,21 @@ class ApiEndpointsSeeder extends Seeder ], ], // featured speakers + + [ + 'name' => 'get-featured-speakers', + 'route' => '/api/v1/summits/{id}/featured-speakers', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadAllSummitData, $current_realm), + sprintf(SummitScopes::ReadSummitData, $current_realm), + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], [ 'name' => 'add-featured-speaker', 'route' => '/api/v1/summits/{id}/featured-speakers/{speaker_id}',