Endpoint delete atendee ticket

DELETE /api/v1/summits/{id}/attendees/{attendee_id}/tickets/{ticket_id}

Change-Id: I0e14cdc66a9c1031b5549b0ac450a8f2e87cf316
This commit is contained in:
Sebastian Marcet 2018-01-18 23:37:34 -03:00
parent d292a9478d
commit a763661ad0
7 changed files with 115 additions and 1 deletions

View File

@ -615,4 +615,37 @@ final class OAuth2SummitAttendeesApiController extends OAuth2ProtectedController
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $attendee_id
* @param $ticket_id
* @return mixed
*/
public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id){
try {
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$attendee = $this->attendee_repository->getById($attendee_id);
if(is_null($attendee)) return $this->error404();
$ticket = $this->attendee_service->deleteAttendeeTicket($attendee, $ticket_id);
return $this->deleted();
}
catch (ValidationException $ex1) {
Log::warning($ex1);
return $this->error412(array($ex1->getMessage()));
}
catch(EntityNotFoundException $ex2)
{
Log::warning($ex2);
return $this->error404(array('message'=> $ex2->getMessage()));
}
catch (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
}

View File

@ -175,6 +175,7 @@ Route::group([
Route::group(array('prefix' => 'tickets'), function ()
{
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitAttendeesApiController@addAttendeeTicket']);
Route::delete('{ticket_id}', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitAttendeesApiController@deleteAttendeeTicket']);
});
});
});

View File

@ -237,5 +237,25 @@ class SummitAttendee extends SilverstripeBaseModel
return $this->member->getRsvpByEvent($event_id);
}
/**
* @param int $ticket_id
* @return SummitAttendeeTicket
*/
public function getTicketById($ticket_id){
$ticket = $this->tickets->matching(
$criteria = Criteria::create()
->where(Criteria::expr()->eq("id", $ticket_id))
)->first();
return $ticket ? $ticket : null;
}
/**
* @param SummitAttendeeTicket $ticket
* @return $this
*/
public function removeTicket(SummitAttendeeTicket $ticket){
$this->tickets->removeElement($ticket);
return $this;
}
}

View File

@ -242,4 +242,22 @@ final class AttendeeService implements IAttendeeService
return SummitAttendeeTicketFactory::build($attendee, $type, $data);
});
}
/**
* @param SummitAttendee $attendee
* @param int $ticket_id
* @throws ValidationException
* @throws EntityNotFoundException
* @return SummitAttendeeTicket
*/
public function deleteAttendeeTicket(SummitAttendee $attendee, $ticket_id)
{
return $this->tx_service->transaction(function() use($attendee, $ticket_id){
$ticket = $attendee->getTicketById($ticket_id);
if(is_null($ticket)){
throw new EntityNotFoundException(sprintf("ticket id %s does not belongs to attendee id %s", $ticket_id, $attendee->getId()));
}
$attendee->removeTicket($ticket);
});
}
}

View File

@ -58,4 +58,13 @@ interface IAttendeeService
* @return SummitAttendeeTicket
*/
public function addAttendeeTicket(SummitAttendee $attendee, array $data);
/**
* @param SummitAttendee $attendee
* @param int $ticket_id
* @throws ValidationException
* @throws EntityNotFoundException
* @return SummitAttendeeTicket
*/
public function deleteAttendeeTicket(SummitAttendee $attendee, $ticket_id);
}

View File

@ -188,6 +188,14 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::WriteAttendeesData, $current_realm),
],
),
array(
'name' => 'delete-attendee-ticket',
'route' => '/api/v1/summits/{id}/attendees/{attendee_id}/tickets/{ticket_id}',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteAttendeesData, $current_realm),
],
),
// speakers
array(
'name' => 'get-speakers',

View File

@ -74,7 +74,7 @@ class OAuth2AttendeesApiTest extends ProtectedApiTest
$this->assertTrue(!is_null($attendee));
}
public function testGetAttendeeByID($attendee_id = 12641){
public function testGetAttendeeByID($attendee_id = 12642){
$params = [
'id' => 23,
@ -267,4 +267,29 @@ class OAuth2AttendeesApiTest extends ProtectedApiTest
$this->assertTrue(!is_null($ticket));
return $ticket;
}
public function testDeleteAttendeeTicket(){
$params = [
'id' => 23,
'attendee_id' => 12642,
'ticket_id' => 14161
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"DELETE",
"OAuth2SummitAttendeesApiController@deleteAttendeeTicket",
$params,
[],
[],
[],
$headers
);
$this->assertResponseStatus(204);
}
}