Added missing endpoint /api/v1/summits/{id}/featured-speakers
Change-Id: I7e0e47532af354bb14c6a790eab68d5dcc58b712 Signed-off-by: smarcet <smarcet@gmail.com>
This commit is contained in:
parent
f59e5ba5dd
commit
d45ed38e35
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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']);
|
||||
|
@ -41,6 +41,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
|
||||
|
@ -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 = <<<SQL
|
||||
SELECT COUNT(DISTINCT(ID)) AS QTY
|
||||
FROM (
|
||||
SELECT S.ID,
|
||||
IFNULL(S.FirstName, M.FirstName) AS FirstName,
|
||||
IFNULL(S.LastName, M.Surname) AS LastName,
|
||||
CONCAT(IFNULL(S.FirstName, M.FirstName), ' ', IFNULL(S.LastName, M.Surname)) AS FullName,
|
||||
IFNULL(M.Email, R.Email) AS Email
|
||||
FROM PresentationSpeaker S
|
||||
LEFT JOIN Member M ON M.ID = S.MemberID
|
||||
LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID
|
||||
WHERE
|
||||
EXISTS
|
||||
(
|
||||
SELECT FS.ID FROM Summit_FeaturedSpeakers FS
|
||||
WHERE FS.SummitID = {$summit->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 = <<<SQL
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT
|
||||
S.ID,
|
||||
S.ClassName,
|
||||
S.Created,
|
||||
S.LastEdited,
|
||||
S.Title AS SpeakerTitle,
|
||||
S.Bio,
|
||||
S.IRCHandle,
|
||||
S.AvailableForBureau,
|
||||
S.FundedTravel,
|
||||
S.Country,
|
||||
S.MemberID,
|
||||
S.WillingToTravel,
|
||||
S.WillingToPresentVideo,
|
||||
S.Notes,
|
||||
S.TwitterName,
|
||||
IFNULL(S.FirstName, M.FirstName) AS FirstName,
|
||||
IFNULL(S.LastName, M.Surname) AS LastName,
|
||||
CONCAT(IFNULL(S.FirstName, M.FirstName), ' ', IFNULL(S.LastName, M.Surname)) AS FullName,
|
||||
IFNULL(M.Email,R.Email) AS Email,
|
||||
S.PhotoID,
|
||||
S.BigPhotoID,
|
||||
R.ID AS RegistrationRequestID
|
||||
FROM PresentationSpeaker S
|
||||
LEFT JOIN Member M ON M.ID = S.MemberID
|
||||
LEFT JOIN File F ON F.ID = S.PhotoID
|
||||
LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID
|
||||
WHERE
|
||||
EXISTS
|
||||
(
|
||||
SELECT FS.ID FROM Summit_FeaturedSpeakers FS
|
||||
WHERE FS.SummitID = {$summit->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);
|
||||
}
|
||||
}
|
@ -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}',
|
||||
|
Loading…
x
Reference in New Issue
Block a user