diff --git a/app/Http/Utils/Filters/DoctrineFilterMapping.php b/app/Http/Utils/Filters/DoctrineFilterMapping.php index f0e3bb7f..226b2969 100644 --- a/app/Http/Utils/Filters/DoctrineFilterMapping.php +++ b/app/Http/Utils/Filters/DoctrineFilterMapping.php @@ -45,9 +45,10 @@ class DoctrineFilterMapping extends FilterMapping * @return QueryBuilder */ public function apply(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":value", $filter->getValue(), $this->where); + $param_count = $query->getParameters()->count() + 1; + $where = str_replace(":value", ":value_".$param_count, $this->where); $where = str_replace(":operator", $filter->getOperator(), $where); - return $query->andWhere($where); + return $query->andWhere($where)->setParameter(":value_".$param_count, $filter->getValue()); } /** @@ -56,8 +57,10 @@ class DoctrineFilterMapping extends FilterMapping * @return string */ public function applyOr(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":value", $filter->getValue(), $this->where); + $param_count = $query->getParameters()->count() + 1; + $where = str_replace(":value", ":value_".$param_count, $this->where); $where = str_replace(":operator", $filter->getOperator(), $where); + $query->setParameter(":value_".$param_count, $filter->getValue()); return $where; } } \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php b/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php index 6ee504bb..d200d341 100644 --- a/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php +++ b/app/Http/Utils/Filters/DoctrineJoinFilterMapping.php @@ -51,11 +51,12 @@ class DoctrineJoinFilterMapping extends FilterMapping * @return QueryBuilder */ public function apply(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":value", $filter->getValue(), $this->where); + $param_count = $query->getParameters()->count() + 1; + $where = str_replace(":value", ":value_".$param_count, $this->where); $where = str_replace(":operator", $filter->getOperator(), $where); if(!in_array($this->alias, $query->getAllAliases())) $query->innerJoin($this->table, $this->alias, Join::WITH); - return $query->andWhere($where); + return $query->andWhere($where)->setParameter(":value_".$param_count, $filter->getValue()); } /** @@ -64,10 +65,12 @@ class DoctrineJoinFilterMapping extends FilterMapping * @return string */ public function applyOr(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":value", $filter->getValue(), $this->where); + $param_count = $query->getParameters()->count() + 1; + $where = str_replace(":value", ":value_".$param_count, $this->where); $where = str_replace(":operator", $filter->getOperator(), $where); if(!in_array($this->alias, $query->getAllAliases())) $query->innerJoin($this->table, $this->alias, Join::WITH); + $query->setParameter(":value_".$param_count, $filter->getValue()); return $where; } } \ No newline at end of file diff --git a/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php b/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php index b8ac82f2..2e24e702 100644 --- a/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php +++ b/app/Http/Utils/Filters/DoctrineLeftJoinFilterMapping.php @@ -25,11 +25,13 @@ class DoctrineLeftJoinFilterMapping extends DoctrineJoinFilterMapping * @return QueryBuilder */ public function apply(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":value", $filter->getValue(), $this->where); + $param_count = $query->getParameters()->count() + 1; + $where = str_replace(":value", ":value_".$param_count, $this->where); $where = str_replace(":operator", $filter->getOperator(), $where); if(!in_array($this->alias, $query->getAllAliases())) $query->leftJoin($this->table, $this->alias, Join::WITH); - return $query->andWhere($where); + + return $query->andWhere($where)->setParameter(":value_".$param_count, $filter->getValue()); } /** @@ -38,10 +40,12 @@ class DoctrineLeftJoinFilterMapping extends DoctrineJoinFilterMapping * @return string */ public function applyOr(QueryBuilder $query, FilterElement $filter){ - $where = str_replace(":value", $filter->getValue(), $this->where); + $param_count = $query->getParameters()->count() + 1; + $where = str_replace(":value", ":value_".$param_count, $this->where); $where = str_replace(":operator", $filter->getOperator(), $where); if(!in_array($this->alias, $query->getAllAliases())) $query->leftJoin($this->table, $this->alias, Join::WITH); + $query->setParameter(":value_".$param_count, $filter->getValue()); return $where; } } \ No newline at end of file diff --git a/app/Repositories/Marketplace/DoctrineCompanyServiceRepository.php b/app/Repositories/Marketplace/DoctrineCompanyServiceRepository.php index 3f95b7cf..669c26ab 100644 --- a/app/Repositories/Marketplace/DoctrineCompanyServiceRepository.php +++ b/app/Repositories/Marketplace/DoctrineCompanyServiceRepository.php @@ -41,7 +41,7 @@ abstract class DoctrineCompanyServiceRepository extends SilverStripeDoctrineRepo ( 'e.company', 'c', - "c.name :operator ':value'" + "c.name :operator :value" ), ]; } diff --git a/app/Repositories/Summit/DoctrineMemberRepository.php b/app/Repositories/Summit/DoctrineMemberRepository.php index 6a547fa1..0cb5ab10 100644 --- a/app/Repositories/Summit/DoctrineMemberRepository.php +++ b/app/Repositories/Summit/DoctrineMemberRepository.php @@ -15,6 +15,7 @@ use Doctrine\ORM\Tools\Pagination\Paginator; use models\main\IMemberRepository; use models\main\Member; use App\Repositories\SilverStripeDoctrineRepository; +use utils\DoctrineFilterMapping; use utils\DoctrineJoinFilterMapping; use utils\Filter; use utils\Order; @@ -71,13 +72,13 @@ final class DoctrineMemberRepository 'first_name' => 'm.first_name:json_string', 'last_name' => 'm.last_name:json_string', 'github_user' => 'm.github_user:json_string', - 'full_name' => "concat(m.first_name, ' ', m.last_name) :operator ':value'", + 'full_name' => new DoctrineFilterMapping("concat(m.first_name, ' ', m.last_name) :operator :value"), 'email' => ['m.email:json_string', 'm.second_email:json_string', 'm.third_email:json_string'], 'group_slug' => new DoctrineJoinFilterMapping ( 'm.groups', 'g', - "g.code :operator ':value'" + "g.code :operator :value" ), 'group_id' => new DoctrineJoinFilterMapping ( diff --git a/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php b/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php index f266eda7..ba139e2f 100644 --- a/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php +++ b/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php @@ -58,19 +58,19 @@ final class DoctrinePresentationCategoryGroupRepository ), 'track_title' => new DoctrineFilterMapping ( - "(cat.title :operator ':value')" + "(cat.title :operator :value)" ), 'track_code' => new DoctrineFilterMapping ( - "(cat.code :operator ':value')" + "(cat.code :operator :value)" ), 'group_title' => new DoctrineFilterMapping ( - "(grp.title :operator ':value')" + "(grp.title :operator :value)" ), 'group_code' => new DoctrineFilterMapping ( - "(grp.code :operator ':value')" + "(grp.code :operator :value)" ), ]; } diff --git a/app/Repositories/Summit/DoctrinePresentationSpeakerSummitAssistanceConfirmationRequestRepository.php b/app/Repositories/Summit/DoctrinePresentationSpeakerSummitAssistanceConfirmationRequestRepository.php index 468e5993..a0e8d15c 100644 --- a/app/Repositories/Summit/DoctrinePresentationSpeakerSummitAssistanceConfirmationRequestRepository.php +++ b/app/Repositories/Summit/DoctrinePresentationSpeakerSummitAssistanceConfirmationRequestRepository.php @@ -49,16 +49,16 @@ final class DoctrinePresentationSpeakerSummitAssistanceConfirmationRequestReposi 'confirmation_date' => 'r.confirmation_date:datetime_epoch', 'speaker' => new DoctrineFilterMapping ( - "( concat(spkr.first_name, ' ', spkr.last_name) :operator ':value' ". - "OR concat(spmm.first_name, ' ', spmm.last_name) :operator ':value' ". - "OR spkr.first_name :operator ':value' ". - "OR spkr.last_name :operator ':value' ". - "OR spmm.first_name :operator ':value' ". - "OR spmm.last_name :operator ':value' )" + "( concat(spkr.first_name, ' ', spkr.last_name) :operator :value ". + "OR concat(spmm.first_name, ' ', spmm.last_name) :operator :value ". + "OR spkr.first_name :operator :value ". + "OR spkr.last_name :operator :value ". + "OR spmm.first_name :operator :value ". + "OR spmm.last_name :operator :value )" ), 'speaker_email' => new DoctrineFilterMapping ( - "(sprr.email :operator ':value' OR spmm.email :operator ':value')" + "(sprr.email :operator :value OR spmm.email :operator :value)" ), ]; } diff --git a/app/Repositories/Summit/DoctrineSummitAttendeeRepository.php b/app/Repositories/Summit/DoctrineSummitAttendeeRepository.php index fb28195e..579afbab 100644 --- a/app/Repositories/Summit/DoctrineSummitAttendeeRepository.php +++ b/app/Repositories/Summit/DoctrineSummitAttendeeRepository.php @@ -67,31 +67,31 @@ final class DoctrineSummitAttendeeRepository ( 'a.member', 'm', - "m.first_name :operator ':value'" + "m.first_name :operator :value" ), 'last_name' => new DoctrineLeftJoinFilterMapping ( 'a.member', 'm', - "m.last_name :operator ':value'" + "m.last_name :operator :value" ), 'email' => new DoctrineLeftJoinFilterMapping ( 'a.member', 'm', - "m.email :operator ':value'" + "m.email :operator :value" ), 'external_order_id' => new DoctrineLeftJoinFilterMapping ( 'a.tickets', 't', - "t.external_order_id :operator ':value'" + "t.external_order_id :operator :value" ), 'external_attendee_id' => new DoctrineLeftJoinFilterMapping ( 'a.tickets', 't', - "t.external_attendee_id :operator ':value'" + "t.external_attendee_id :operator :value" ), ]); } diff --git a/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeTypeRepository.php b/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeTypeRepository.php index 93559163..c5c29c64 100644 --- a/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeTypeRepository.php +++ b/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeTypeRepository.php @@ -36,7 +36,7 @@ final class DoctrineSummitBookableVenueRoomAttributeTypeRepository ( 'e.summit', 's', - "s.id :operator ':value'" + "s.id :operator :value" ), ]; } diff --git a/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeValueRepository.php b/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeValueRepository.php index 0c1229c9..167039e4 100644 --- a/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeValueRepository.php +++ b/app/Repositories/Summit/DoctrineSummitBookableVenueRoomAttributeValueRepository.php @@ -35,13 +35,13 @@ final class DoctrineSummitBookableVenueRoomAttributeValueRepository ( 'e.summit', 's', - "s.id :operator ':value'" + "s.id :operator :value" ), 'type_id' => new DoctrineJoinFilterMapping ( 'e.type', 't', - "t.id :operator ':value'" + "t.id :operator :value" ), ]; } diff --git a/app/Repositories/Summit/DoctrineSummitEventRepository.php b/app/Repositories/Summit/DoctrineSummitEventRepository.php index 99adfc44..e2497150 100644 --- a/app/Repositories/Summit/DoctrineSummitEventRepository.php +++ b/app/Repositories/Summit/DoctrineSummitEventRepository.php @@ -92,7 +92,7 @@ final class DoctrineSummitEventRepository ( 'e.tags', 't', - "t.tag :operator ':value'" + "t.tag :operator :value" ), 'summit_id'=> new DoctrineJoinFilterMapping ( @@ -120,19 +120,19 @@ final class DoctrineSummitEventRepository ), 'speaker' => new DoctrineFilterMapping ( - "( concat(sp.first_name, ' ', sp.last_name) :operator ':value' ". - "OR concat(spm.first_name, ' ', spm.last_name) :operator ':value' ". - "OR concat(spmm.first_name, ' ', spmm.last_name) :operator ':value' ". - "OR sp.first_name :operator ':value' ". - "OR sp.last_name :operator ':value' ". - "OR spm.first_name :operator ':value' ". - "OR spm.last_name :operator ':value' ". - "OR spmm.first_name :operator ':value' ". - "OR spmm.last_name :operator ':value' )" + "( concat(sp.first_name, ' ', sp.last_name) :operator :value ". + "OR concat(spm.first_name, ' ', spm.last_name) :operator :value ". + "OR concat(spmm.first_name, ' ', spmm.last_name) :operator :value ". + "OR sp.first_name :operator :value ". + "OR sp.last_name :operator :value ". + "OR spm.first_name :operator :value ". + "OR spm.last_name :operator :value ". + "OR spmm.first_name :operator :value ". + "OR spmm.last_name :operator :value) " ), 'speaker_email' => new DoctrineFilterMapping ( - "(sprr.email :operator ':value' OR spmm.email :operator ':value')" + "(sprr.email :operator :value OR spmm.email :operator :value)" ), 'speaker_id' => new DoctrineFilterMapping ( diff --git a/app/Repositories/Summit/DoctrineSummitLocationRepository.php b/app/Repositories/Summit/DoctrineSummitLocationRepository.php index 8abcef9a..4fce1b17 100644 --- a/app/Repositories/Summit/DoctrineSummitLocationRepository.php +++ b/app/Repositories/Summit/DoctrineSummitLocationRepository.php @@ -69,7 +69,7 @@ final class DoctrineSummitLocationRepository 'capacity' => 'r.capacity', 'attribute' => new DoctrineFilterMapping ( - "(bra.value :operator ':value' or bra.id = ':value')" + "(bra.value :operator :value or bra.id = :value)" ), 'class_name' => new DoctrineInstanceOfFilterMapping( "al", diff --git a/app/Repositories/Summit/DoctrineSummitRegistrationPromoCodeRepository.php b/app/Repositories/Summit/DoctrineSummitRegistrationPromoCodeRepository.php index c6114cea..213ff576 100644 --- a/app/Repositories/Summit/DoctrineSummitRegistrationPromoCodeRepository.php +++ b/app/Repositories/Summit/DoctrineSummitRegistrationPromoCodeRepository.php @@ -70,44 +70,44 @@ class DoctrineSummitRegistrationPromoCodeRepository 'sponsor' => new DoctrineFilterMapping ( - "(spnr.name :operator ':value')" + "(spnr.name :operator :value)" ), 'creator' => new DoctrineFilterMapping ( - "( concat(ct.first_name, ' ', ct.last_name) :operator ':value' ". - "OR ct.first_name :operator ':value' ". - "OR ct.last_name :operator ':value' )" + "( concat(ct.first_name, ' ', ct.last_name) :operator :value ". + "OR ct.first_name :operator :value ". + "OR ct.last_name :operator :value )" ), 'creator_email' => new DoctrineFilterMapping ( - "(ct.email :operator ':value')" + "(ct.email :operator :value)" ), 'owner' => new DoctrineFilterMapping ( - "( concat(owr.first_name, ' ', owr.last_name) :operator ':value' ". - "OR owr.first_name :operator ':value' ". - "OR owr.last_name :operator ':value' )" + "( concat(owr.first_name, ' ', owr.last_name) :operator :value ". + "OR owr.first_name :operator :value ". + "OR owr.last_name :operator :value )" ), 'owner_email' => new DoctrineFilterMapping ( - "(owr.email :operator ':value')" + "(owr.email :operator :value)" ), 'speaker' => new DoctrineFilterMapping ( - "( concat(spkr.first_name, ' ', spkr.last_name) :operator ':value' ". - "OR concat(spmm.first_name, ' ', spmm.last_name) :operator ':value' ". - "OR spkr.first_name :operator ':value' ". - "OR spkr.last_name :operator ':value' ". - "OR spmm.first_name :operator ':value' ". - "OR spmm.last_name :operator ':value' )" + "( concat(spkr.first_name, ' ', spkr.last_name) :operator :value ". + "OR concat(spmm.first_name, ' ', spmm.last_name) :operator :value ". + "OR spkr.first_name :operator :value ". + "OR spkr.last_name :operator :value ". + "OR spmm.first_name :operator :value ". + "OR spmm.last_name :operator :value )" ), 'speaker_email' => new DoctrineFilterMapping ( - "(sprr.email :operator ':value' OR spmm.email :operator ':value')" + "(sprr.email :operator :value OR spmm.email :operator :value)" ), 'type' => new DoctrineFilterMapping ( - "(mpc.type :operator ':value' OR spkpc.type :operator ':value')" + "(mpc.type :operator :value OR spkpc.type :operator :value)" ), 'class_name' => new DoctrineInstanceOfFilterMapping( "pc", diff --git a/app/Repositories/Summit/DoctrineSummitRoomReservationRepository.php b/app/Repositories/Summit/DoctrineSummitRoomReservationRepository.php index 62b0dae7..a8b6827f 100644 --- a/app/Repositories/Summit/DoctrineSummitRoomReservationRepository.php +++ b/app/Repositories/Summit/DoctrineSummitRoomReservationRepository.php @@ -60,7 +60,7 @@ final class DoctrineSummitRoomReservationRepository ( 'e.room', 'r', - "r.name :operator ':value'" + "r.name :operator :value" ), 'venue_id' => new DoctrineJoinFilterMapping ( @@ -78,13 +78,13 @@ final class DoctrineSummitRoomReservationRepository ( 'e.owner', 'o', - "LOWER(CONCAT(o.first_name, ' ', o.last_name)) :operator ':value'" + "LOWER(CONCAT(o.first_name, ' ', o.last_name)) :operator :value" ), 'owner_email' => new DoctrineJoinFilterMapping ( 'e.owner', 'o', - "o.email :operator ':value'" + "o.email :operator :value" ), ]; } diff --git a/app/Repositories/Summit/DoctrineSummitTrackRepository.php b/app/Repositories/Summit/DoctrineSummitTrackRepository.php index 6773209d..00631b3c 100644 --- a/app/Repositories/Summit/DoctrineSummitTrackRepository.php +++ b/app/Repositories/Summit/DoctrineSummitTrackRepository.php @@ -46,7 +46,7 @@ final class DoctrineSummitTrackRepository 'code' => 't.code:json_string', 'group_name' => new DoctrineFilterMapping ( - "(g.name :operator ':value')" + "(g.name :operator :value)" ), ]; } diff --git a/app/Repositories/Summit/DoctrineTrackTagGroupAllowedTagsRepository.php b/app/Repositories/Summit/DoctrineTrackTagGroupAllowedTagsRepository.php index 2c03fa0d..e0f7cd3d 100644 --- a/app/Repositories/Summit/DoctrineTrackTagGroupAllowedTagsRepository.php +++ b/app/Repositories/Summit/DoctrineTrackTagGroupAllowedTagsRepository.php @@ -34,7 +34,7 @@ final class DoctrineTrackTagGroupAllowedTagsRepository return [ 'tag' => new DoctrineFilterMapping ( - "(tg.tag :operator ':value')" + "(tg.tag :operator :value)" ), ]; } diff --git a/tests/OAuth2MembersApiTest.php b/tests/OAuth2MembersApiTest.php index c79a8561..c2704692 100644 --- a/tests/OAuth2MembersApiTest.php +++ b/tests/OAuth2MembersApiTest.php @@ -41,6 +41,32 @@ final class OAuth2MembersApiTest extends ProtectedApiTest $this->assertResponseStatus(200); } + public function testGetMemberByFullName() + { + + $params = [ + //AND FILTER + 'filter' => ['full_name=@Seba'], + 'order' => '+first_name,-last_name' + ]; + + $headers = array("HTTP_Authorization" => " Bearer " . $this->access_token); + $response = $this->action( + "GET", + "OAuth2MembersApiController@getAll", + $params, + array(), + array(), + array(), + $headers + ); + + $content = $response->getContent(); + $members = json_decode($content); + $this->assertTrue(!is_null($members)); + $this->assertResponseStatus(200); + } + public function testGetMembersEmpty() {