Fixed summit attendee serializer

Added ticket serializer
and filter by eventbrite order id and
external attendee id

Change-Id: I86c26e272354ad79fc999134b346fc61cff0926b
This commit is contained in:
Sebastian Marcet 2018-01-12 01:39:25 -03:00
parent 2306382478
commit 68ec7ff062
6 changed files with 122 additions and 17 deletions

View File

@ -308,6 +308,10 @@ final class OAuth2SummitAttendeesApiController extends OAuth2ProtectedController
}
}
/**
* @param $summit_id
* @return mixed
*/
public function getAttendeesBySummit($summit_id){
$values = Input::all();
@ -341,24 +345,27 @@ final class OAuth2SummitAttendeesApiController extends OAuth2ProtectedController
$filter = null;
if (Input::has('filter')) {
$filter = FilterParser::parse(Input::get('filter'), array
(
'first_name' => ['=@', '=='],
'last_name' => ['=@', '=='],
'email' => ['=@', '=='],
));
$filter = FilterParser::parse(Input::get('filter'), [
'first_name' => ['=@', '=='],
'last_name' => ['=@', '=='],
'email' => ['=@', '=='],
'external_order_id' => ['=@', '=='],
'external_attendee_id' => ['=@', '=='],
]);
}
$order = null;
if (Input::has('order'))
{
$order = OrderParser::parse(Input::get('order'), array
(
$order = OrderParser::parse(Input::get('order'), [
'first_name',
'last_name',
'id',
));
'external_order_id',
]);
}
if(is_null($filter)) $filter = new Filter();

View File

@ -115,6 +115,7 @@ final class SerializerRegistry
$this->registry['SummitEventFeedback'] = SummitEventFeedbackSerializer::class;
$this->registry['SummitAttendee'] = SummitAttendeeSerializer::class;
$this->registry['SummitAttendeeTicket'] = SummitAttendeeTicketSerializer::class;
$this->registry['SummitMemberSchedule'] = SummitMemberScheduleSerializer::class;
$this->registry['SummitMemberFavorite'] = SummitMemberFavoriteSerializer::class;
$this->registry['SummitEntityEvent'] = SummitEntityEventSerializer::class;

View File

@ -22,14 +22,12 @@ use models\summit\SummitAttendee;
*/
final class SummitAttendeeSerializer extends SilverStripeSerializer
{
protected static $array_mappings = array
(
protected static $array_mappings = [
'SummitHallCheckedIn' => 'summit_hall_checked_in:json_boolean',
'SummitHallCheckedInDate' => 'summit_hall_checked_in_date:datetime_epoch',
'SharedContactInfo' => 'shared_contact_info:json_boolean',
'MemberId' => 'member_id:json_int',
);
];
/**
* @param null $expand
@ -93,7 +91,7 @@ final class SummitAttendeeSerializer extends SilverStripeSerializer
$tickets = array();
foreach($attendee->getTickets() as $t)
{
array_push($tickets, SerializerRegistry::getInstance()->getSerializer($t->getTicketType())->serialize());
array_push($tickets, SerializerRegistry::getInstance()->getSerializer($t)->serialize($expand));
}
$values['tickets'] = $tickets;
}

View File

@ -0,0 +1,52 @@
<?php namespace ModelSerializers;
use models\summit\SummitAttendeeTicket;
/**
* Copyright 2018 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
final class SummitAttendeeTicketSerializer extends SilverStripeSerializer
{
protected static $array_mappings = [
'ExternalOrderId' => 'external_order_id:json_string',
'ExternalAttendeeId' => 'external_attendee_id:json_string',
'BoughtDate' => 'bought_date:datetime_epoch',
'TicketTypeId' => 'ticket_type_id:json_int',
];
/**
* @param null $expand
* @param array $fields
* @param array $relations
* @param array $params
* @return array
*/
public function serialize($expand = null, array $fields = array(), array $relations = array(), array $params = array())
{
$ticket = $this->object;
if (!$ticket instanceof SummitAttendeeTicket) return [];
$values = parent::serialize($expand, $fields, $relations, $params);
if (!empty($expand)) {
$exp_expand = explode(',', $expand);
foreach ($exp_expand as $relation) {
switch (trim($relation)) {
case 'ticket_type': {
unset($values['ticket_type_id']);
$values['ticket_type'] = SerializerRegistry::getInstance()->getSerializer($ticket->getTicketType())->serialize();
}
break;
}
}
}
return $values;
}
}

View File

@ -55,6 +55,7 @@ final class DoctrineSummitAttendeeRepository
->from(SummitAttendee::class, "a")
->leftJoin('a.summit', 's')
->leftJoin('a.member', 'm')
->leftJoin('a.tickets', 't')
->where("s.id = :summit_id");
$query->setParameter("summit_id", $summit->getId());
@ -80,15 +81,28 @@ final class DoctrineSummitAttendeeRepository
'm',
"m.email :operator ':value'"
),
'external_order_id' => new DoctrineLeftJoinFilterMapping
(
'a.tickets',
't',
"t.external_order_id :operator ':value'"
),
'external_attendee_id' => new DoctrineLeftJoinFilterMapping
(
'a.tickets',
't',
"t.external_attendee_id :operator ':value'"
),
]);
}
if (!is_null($order)) {
$order->apply2Query($query, [
'id' => 'a.id',
'first_name' => 'm.first_name',
'last_name' => 'm.last_name',
'id' => 'a.id',
'first_name' => 'm.first_name',
'last_name' => 'm.last_name',
'external_order_id' => 't.external_order_id',
]);
} else {
//default order

View File

@ -102,4 +102,37 @@ class OAuth2AttendeesApiTest extends ProtectedApiTest
$attendee = json_decode($content);
$this->assertTrue(!is_null($attendee));
}
public function testGetAttendeeByOrderID(){
$params = [
'id' => 23,
'page' => 1,
'per_page' => 10,
'order' => '+external_order_id',
'filter' => 'external_order_id==615528547',
'expand' => 'member,schedule,tickets,ticket_type'
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"GET",
"OAuth2SummitAttendeesApiController@getAttendeesBySummit",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(200);
$attendees = json_decode($content);
$this->assertTrue(!is_null($attendees));
}
}