From 655256f9cdbad96e7fb9263c9b8eb326b67e98c3 Mon Sep 17 00:00:00 2001 From: smarcet Date: Fri, 30 Oct 2020 12:58:47 -0300 Subject: [PATCH] Added featured speakers filter Change-Id: Ib2beba7846da780529ac13f13da851e254582f58 Signed-off-by: smarcet --- .../OAuth2SummitSpeakersApiController.php | 154 ++++++++++-------- .../Summit/DoctrineSpeakerRepository.php | 32 +++- tests/BrowserKitTestCase.php | 4 +- tests/InsertMemberTestData.php | 14 +- tests/OAuth2SpeakersApiTest.php | 4 +- 5 files changed, 119 insertions(+), 89 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php index a016892a..ef2baaef 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSpeakersApiController.php @@ -11,6 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + use App\Models\Foundation\Summit\Repositories\ISelectionPlanRepository; use Exception; use Illuminate\Support\Facades\Input; @@ -34,6 +35,7 @@ use services\model\ISummitService; use utils\PagingInfo; use Illuminate\Http\Request as LaravelRequest; use utils\PagingResponse; + /** * Class OAuth2SummitSpeakersApiController * @package App\Http\Controllers @@ -135,26 +137,25 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController if (is_null($summit)) return $this->error404(); return $this->_getAll( - function(){ + function () { return [ 'first_name' => ['=@', '=='], - 'last_name' => ['=@', '=='], - 'email' => ['=@', '=='], - 'id' => ['=='], - 'full_name' => ['=@', '=='], + 'last_name' => ['=@', '=='], + 'email' => ['=@', '=='], + 'id' => ['=='], + 'full_name' => ['=@', '=='], ]; }, - function(){ + function () { return [ 'first_name' => 'sometimes|string', - 'last_name' => 'sometimes|string', - 'email' => 'sometimes|string', - 'id' => 'sometimes|integer', - 'full_name' => 'sometimes|string', + 'last_name' => 'sometimes|string', + 'email' => 'sometimes|string', + 'id' => 'sometimes|integer', + 'full_name' => 'sometimes|string', ]; }, - function() - { + function () { return [ 'first_name', 'last_name', @@ -162,15 +163,15 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController 'email', ]; }, - function($filter) use($summit){ + function ($filter) use ($summit) { return $filter; }, - function(){ + function () { return $this->serializer_type_selector->getSerializerType(); }, null, null, - function ($page, $per_page, $filter, $order, $applyExtraFilters) use($summit) { + function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { return $this->speaker_repository->getSpeakersBySummit ( $summit, @@ -197,30 +198,31 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController if (is_null($summit)) return $this->error404(); return $this->_getAll( - function(){ + function () { return [ 'first_name' => ['=@', '=='], - 'last_name' => ['=@', '=='], - 'email' => ['=@', '=='], - 'id' => ['=='], - 'full_name' => ['=@', '=='], + 'last_name' => ['=@', '=='], + 'email' => ['=@', '=='], + 'id' => ['=='], + 'full_name' => ['=@', '=='], 'event_start_date' => ['>', '<', '<=', '>=', '=='], - 'event_end_date' => ['>', '<', '<=', '>=', '=='], + 'event_end_date' => ['>', '<', '<=', '>=', '=='], + 'featured' => ['=='], ]; }, - function(){ + function () { return [ 'first_name' => 'sometimes|string', - 'last_name' => 'sometimes|string', - 'email' => 'sometimes|string', - 'id' => 'sometimes|integer', - 'full_name' => 'sometimes|string', + 'last_name' => 'sometimes|string', + 'email' => 'sometimes|string', + 'id' => 'sometimes|integer', + 'full_name' => 'sometimes|string', 'event_start_date' => 'sometimes|date_format:U', 'event_end_date' => 'sometimes|date_format:U', + 'featured' => 'sometimes|required|string|in:true,false', ]; }, - function() - { + function () { return [ 'first_name', 'last_name', @@ -228,15 +230,15 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController 'email', ]; }, - function($filter) use($summit){ + function ($filter) use ($summit) { return $filter; }, - function(){ + function () { return $this->serializer_type_selector->getSerializerType(); }, null, null, - function ($page, $per_page, $filter, $order, $applyExtraFilters) use($summit) { + function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { return $this->speaker_repository->getSpeakersBySummitAndOnSchedule ( $summit, @@ -260,26 +262,25 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController public function getAll() { return $this->_getAll( - function(){ + function () { return [ 'first_name' => ['=@', '=='], - 'last_name' => ['=@', '=='], - 'email' => ['=@', '=='], - 'id' => ['=='], - 'full_name' => ['=@', '=='], + 'last_name' => ['=@', '=='], + 'email' => ['=@', '=='], + 'id' => ['=='], + 'full_name' => ['=@', '=='], ]; }, - function(){ + function () { return [ 'first_name' => 'sometimes|string', - 'last_name' => 'sometimes|string', - 'email' => 'sometimes|string', - 'id' => 'sometimes|integer', - 'full_name' => 'sometimes|string', + 'last_name' => 'sometimes|string', + 'email' => 'sometimes|string', + 'id' => 'sometimes|integer', + 'full_name' => 'sometimes|string', ]; }, - function() - { + function () { return [ 'first_name', 'last_name', @@ -287,15 +288,15 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController 'email', ]; }, - function($filter){ + function ($filter) { return $filter; }, - function(){ + function () { return $this->serializer_type_selector->getSerializerType(); }, null, null, - function ($page, $per_page, $filter, $order, $applyExtraFilters) { + function ($page, $per_page, $filter, $order, $applyExtraFilters) { return $this->speaker_repository->getAllByPage ( new PagingInfo($page, $per_page), @@ -323,8 +324,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); $serializer_type = SerializerRegistry::SerializerType_Public; // if speaker profile belongs to current member - if (!is_null($current_member)){ - if($speaker->getMemberId() == $current_member->getId()) + if (!is_null($current_member)) { + if ($speaker->getMemberId() == $current_member->getId()) $serializer_type = SerializerRegistry::SerializerType_Private; } @@ -355,7 +356,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $summit_id * @return mixed */ - public function getMySummitSpeaker($summit_id){ + public function getMySummitSpeaker($summit_id) + { try { $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -375,7 +377,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController [ 'summit_id' => $summit_id, 'published' => Request::input('published', false), - 'summit' => $summit + 'summit' => $summit ] ) ); @@ -513,8 +515,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); $serializer_type = SerializerRegistry::SerializerType_Public; // if speaker profile belongs to current member - if (!is_null($current_member)){ - if($speaker->getMemberId() == $current_member->getId() || $speaker->canBeEditedBy($current_member)) + if (!is_null($current_member)) { + if ($speaker->getMemberId() == $current_member->getId() || $speaker->canBeEditedBy($current_member)) $serializer_type = SerializerRegistry::SerializerType_Private; } @@ -695,7 +697,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController } } - public function addMySpeakerPhoto(LaravelRequest $request){ + public function addMySpeakerPhoto(LaravelRequest $request) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -703,7 +706,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $speaker = $this->speaker_repository->getByMember($current_member); if (is_null($speaker)) return $this->error404(); - return $this->addSpeakerPhoto($request, $speaker->getId()); + return $this->addSpeakerPhoto($request, $speaker->getId()); } catch (ValidationException $ex1) { Log::warning($ex1); @@ -838,7 +841,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $speaker = $this->speaker_repository->getById($speaker_id); if (is_null($speaker)) return $this->error404(); - if(!$speaker->canBeEditedBy($current_member)){ + if (!$speaker->canBeEditedBy($current_member)) { return $this->error403(); } @@ -1040,7 +1043,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return mixed */ - public function addSpeakerToMyPresentation($presentation_id, $speaker_id){ + public function addSpeakerToMyPresentation($presentation_id, $speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -1066,7 +1070,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return mixed */ - public function addModeratorToMyPresentation($presentation_id, $speaker_id){ + public function addModeratorToMyPresentation($presentation_id, $speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -1092,7 +1097,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return mixed */ - public function removeSpeakerFromMyPresentation($presentation_id, $speaker_id){ + public function removeSpeakerFromMyPresentation($presentation_id, $speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -1118,7 +1124,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return mixed */ - public function removeModeratorFromMyPresentation($presentation_id, $speaker_id){ + public function removeModeratorFromMyPresentation($presentation_id, $speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -1143,7 +1150,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function requestSpeakerEditPermission($speaker_id){ + public function requestSpeakerEditPermission($speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -1170,7 +1178,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $speaker_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getSpeakerEditPermission($speaker_id){ + public function getSpeakerEditPermission($speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -1198,7 +1207,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $hash * @return \Illuminate\Http\JsonResponse|mixed */ - public function approveSpeakerEditPermission($speaker_id, $hash){ + public function approveSpeakerEditPermission($speaker_id, $hash) + { try { $request = $this->service->approveSpeakerEditPermission($hash, $speaker_id); return response()->view('speakers.edit_permissions.approved', [], 200); @@ -1219,7 +1229,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController * @param $hash * @return \Illuminate\Http\JsonResponse|mixed */ - public function declineSpeakerEditPermission($speaker_id, $hash){ + public function declineSpeakerEditPermission($speaker_id, $hash) + { try { $request = $this->service->rejectSpeakerEditPermission($hash, $speaker_id); @@ -1251,7 +1262,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $speaker = $this->speaker_repository->getById($speaker_id); if (is_null($speaker)) return $this->error404(); - if(!$speaker->canBeEditedBy($current_member)){ + if (!$speaker->canBeEditedBy($current_member)) { return $this->error403(); } @@ -1279,7 +1290,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController } } - public function deleteSpeakerPhoto($speaker_id){ + public function deleteSpeakerPhoto($speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); @@ -1288,7 +1300,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $speaker = $this->speaker_repository->getById($speaker_id); if (is_null($speaker)) return $this->error404(); - if(!$speaker->canBeEditedBy($current_member)){ + if (!$speaker->canBeEditedBy($current_member)) { return $this->error403(); } @@ -1311,7 +1323,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController } } - public function addSpeakerBigPhoto(LaravelRequest $request, $speaker_id){ + public function addSpeakerBigPhoto(LaravelRequest $request, $speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); @@ -1320,7 +1333,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $speaker = $this->speaker_repository->getById($speaker_id); if (is_null($speaker)) return $this->error404(); - if(!$speaker->canBeEditedBy($current_member)){ + if (!$speaker->canBeEditedBy($current_member)) { return $this->error403(); } @@ -1348,7 +1361,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController } } - public function deleteSpeakerBigPhoto($speaker_id){ + public function deleteSpeakerBigPhoto($speaker_id) + { try { $current_member = $this->resource_server_context->getCurrentUser(); @@ -1357,7 +1371,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController $speaker = $this->speaker_repository->getById($speaker_id); if (is_null($speaker)) return $this->error404(); - if(!$speaker->canBeEditedBy($current_member)){ + if (!$speaker->canBeEditedBy($current_member)) { return $this->error403(); } diff --git a/app/Repositories/Summit/DoctrineSpeakerRepository.php b/app/Repositories/Summit/DoctrineSpeakerRepository.php index e40a3387..fe14f592 100644 --- a/app/Repositories/Summit/DoctrineSpeakerRepository.php +++ b/app/Repositories/Summit/DoctrineSpeakerRepository.php @@ -357,6 +357,7 @@ SQL; 'last_name' => 'LastName', 'email' => 'Email', 'id' => 'ID', + 'featured' => 'Featured' ]); if(!empty($where_conditions)) { @@ -375,6 +376,13 @@ SQL; } } + foreach ($bindings as $key => $value){ + if($value == 'true') + $bindings[$key] = 1; + if($value == 'false') + $bindings[$key] = 0; + } + if(!is_null($order)) { $extra_orders = $order->toRawSQL(array @@ -394,7 +402,8 @@ FROM ( 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 + IFNULL(M.Email, R.Email) AS Email, + EXISTS(SELECT 1 FROM Summit_FeaturedSpeakers WHERE Summit_FeaturedSpeakers.PresentationSpeakerID = S.ID AND Summit_FeaturedSpeakers.SummitID = {$summit->getId()}) AS Featured FROM PresentationSpeaker S LEFT JOIN Member M ON M.ID = S.MemberID LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID @@ -411,7 +420,8 @@ FROM ( 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 + IFNULL(M.Email, R.Email) AS Email, + EXISTS(SELECT 1 FROM Summit_FeaturedSpeakers WHERE Summit_FeaturedSpeakers.PresentationSpeakerID = S.ID AND Summit_FeaturedSpeakers.SummitID = {$summit->getId()}) AS Featured FROM PresentationSpeaker S LEFT JOIN Member M ON M.ID = S.MemberID LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID @@ -428,7 +438,8 @@ FROM ( 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 + IFNULL(M.Email, R.Email) AS Email, + EXISTS(SELECT 1 FROM Summit_FeaturedSpeakers WHERE Summit_FeaturedSpeakers.PresentationSpeakerID = S.ID AND Summit_FeaturedSpeakers.SummitID = {$summit->getId()}) AS Featured FROM PresentationSpeaker S LEFT JOIN Member M ON M.ID = S.MemberID LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID @@ -446,9 +457,11 @@ SUMMIT_SPEAKERS SQL; - $stm = $this->getEntityManager()->getConnection()->executeQuery($query_count, $bindings); + $stm = $this->getEntityManager()->getConnection()->prepare($query_count); + $stm->execute($bindings); + $res = $stm->fetchAll(\PDO::FETCH_COLUMN); - $total = intval($stm->fetchColumn(0)); + $total = count($res) > 0 ? $res[0] : 0; $bindings = array_merge( $bindings, array ( @@ -481,7 +494,8 @@ FROM ( IFNULL(M.Email,R.Email) AS Email, S.PhotoID, S.BigPhotoID, - R.ID AS RegistrationRequestID + R.ID AS RegistrationRequestID, + EXISTS(SELECT 1 FROM Summit_FeaturedSpeakers WHERE Summit_FeaturedSpeakers.PresentationSpeakerID = S.ID AND Summit_FeaturedSpeakers.SummitID = {$summit->getId()}) AS Featured FROM PresentationSpeaker S LEFT JOIN Member M ON M.ID = S.MemberID LEFT JOIN File F ON F.ID = S.PhotoID @@ -517,7 +531,8 @@ FROM ( IFNULL(M.Email,R.Email) AS Email, S.PhotoID, S.BigPhotoID, - R.ID AS RegistrationRequestID + R.ID AS RegistrationRequestID, + EXISTS(SELECT 1 FROM Summit_FeaturedSpeakers WHERE Summit_FeaturedSpeakers.PresentationSpeakerID = S.ID AND Summit_FeaturedSpeakers.SummitID = {$summit->getId()}) AS Featured FROM PresentationSpeaker S LEFT JOIN Member M ON M.ID = S.MemberID LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID @@ -552,7 +567,8 @@ FROM ( IFNULL(M.Email,R.Email) AS Email, S.PhotoID, S.BigPhotoID, - R.ID AS RegistrationRequestID + R.ID AS RegistrationRequestID, + EXISTS(SELECT 1 FROM Summit_FeaturedSpeakers WHERE Summit_FeaturedSpeakers.PresentationSpeakerID = S.ID AND Summit_FeaturedSpeakers.SummitID = {$summit->getId()}) AS Featured FROM PresentationSpeaker S LEFT JOIN Member M ON M.ID = S.MemberID LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID diff --git a/tests/BrowserKitTestCase.php b/tests/BrowserKitTestCase.php index 9240b3e1..dd168b84 100644 --- a/tests/BrowserKitTestCase.php +++ b/tests/BrowserKitTestCase.php @@ -46,8 +46,8 @@ abstract class BrowserKitTestCase extends BaseTestCase */ protected function prepareForTests() { - Artisan::call('doctrine:migrations:migrate', ["--connection" => 'config']); - Artisan::call('doctrine:migrations:migrate', ["--connection" => 'model']); + // Artisan::call('doctrine:migrations:migrate', ["--connection" => 'config']); + // Artisan::call('doctrine:migrations:migrate', ["--connection" => 'model']); //Mail::pretend(true); $this->seed('TestSeeder'); } diff --git a/tests/InsertMemberTestData.php b/tests/InsertMemberTestData.php index 59b864a9..0c700533 100644 --- a/tests/InsertMemberTestData.php +++ b/tests/InsertMemberTestData.php @@ -91,11 +91,11 @@ trait InsertMemberTestData */ protected static function insertMemberTestData(string $current_group_slug){ - DB::setDefaultConnection("model"); - DB::table("Group_Members")->delete(); - DB::table("Group")->delete(); - DB::table("Member")->delete(); - DB::table("PresentationSpeaker")->delete(); + // DB::setDefaultConnection("model"); + //DB::table("Group_Members")->delete(); + //DB::table("Group")->delete(); + //DB::table("Member")->delete(); + //DB::table("PresentationSpeaker")->delete(); self::$em = Registry::getManager(SilverstripeBaseModel::EntityManager); if (!self::$em ->isOpen()) { @@ -122,7 +122,7 @@ trait InsertMemberTestData self::$member->setFirstName("Sebastian"); self::$member->setLastName("Marcet"); self::$member->setEmailVerified(true); - self::$member->setUserExternalId("1"); + self::$member->setUserExternalId(mt_rand()); self::$member->add2Group(self::$group); self::$member2 = new Member(); @@ -131,7 +131,7 @@ trait InsertMemberTestData self::$member2->setFirstName("Sebastian"); self::$member2->setLastName("Marcet Summit Admin"); self::$member2->setEmailVerified(true); - self::$member2->setUserExternalId("2"); + self::$member2->setUserExternalId(mt_rand()); self::$member2->add2Group(self::$group2); diff --git a/tests/OAuth2SpeakersApiTest.php b/tests/OAuth2SpeakersApiTest.php index 27eed4b7..e7d63e68 100644 --- a/tests/OAuth2SpeakersApiTest.php +++ b/tests/OAuth2SpeakersApiTest.php @@ -496,14 +496,14 @@ final class OAuth2SpeakersApiTest extends ProtectedApiTest $this->assertTrue(!is_null($speakers)); } - public function testGetSpeakersOnSchedule($summit_id = 23) + public function testGetSpeakersOnSchedule($summit_id = 31) { $params = [ 'id' => $summit_id, 'page' => 1, 'per_page' => 10, - 'filter' => ['start_date>=1509753600','end_date<=1509839999'] + 'filter' => ['featured==true'] ]; $headers = [