Added delete RSVP endpoint

DELETE /api/v1/members/{member_id}/rsvp/{rsvp_id}

Change-Id: I535dcde913d2d589927444d3795955372ecd1ab2
This commit is contained in:
Sebastian Marcet 2018-01-19 16:18:01 -03:00
parent 885b9bca22
commit 70ec096148
13 changed files with 200 additions and 16 deletions

View File

@ -254,5 +254,34 @@ final class OAuth2MembersApiController extends OAuth2ProtectedController
}
}
/**
* @param $member_id
* @param $rsvp_id
* @return mixed
*/
public function deleteRSVP($member_id, $rsvp_id){
try{
$member = $this->repository->getById($member_id);
if(is_null($member)) return $this->error404();
$this->member_service->deleteRSVP($member, $rsvp_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

@ -153,7 +153,13 @@ final class OAuth2SummitAttendeesApiController extends OAuth2ProtectedController
(
$attendee,
SerializerRegistry::SerializerType_Private
)->serialize($expand));
)->serialize
(
$expand,
[],
[],
[ 'serializer_type' => SerializerRegistry::SerializerType_Private ]
));
}
catch (\HTTP401UnauthorizedException $ex1) {
Log::warning($ex1);

View File

@ -108,6 +108,12 @@ Route::group([
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2MembersApiController@deleteAffiliation']);
});
});
Route::group(array('prefix' => 'rsvp'), function () {
Route::group(['prefix' => '{rsvp_id}'], function () {
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2MembersApiController@deleteRSVP']);
});
});
});
});

View File

@ -43,6 +43,7 @@ final class OwnMemberSerializer extends AbstractMemberSerializer
'favorite_summit_events',
'feedback',
'schedule_summit_events',
'rsvp',
];
private static $expand_group_events = [
@ -172,6 +173,18 @@ final class OwnMemberSerializer extends AbstractMemberSerializer
$values['schedule_summit_events'] = $schedule;
}
break;
case 'rsvp':{
if(!in_array('rsvp', $relations)) break;
if(is_null($summit)) break;
$rsvps = [];
foreach ($member->getRsvpBySummit($summit) as $rsvp){
$rsvps[] = SerializerRegistry::getInstance()
->getSerializer($rsvp)
->serialize($expand);
}
$values['rsvp'] = $rsvps;
}
break;
}
}
}

View File

@ -106,6 +106,7 @@ final class SerializerRegistry
self::SerializerType_Private => AdminPresentationSpeakerSerializer::class
];
$this->registry['RSVP'] = RSVPSerializer::class;
$this->registry['SpeakerExpertise'] = SpeakerExpertiseSerializer::class;
$this->registry['SpeakerLanguage'] = SpeakerLanguageSerializer::class;
$this->registry['SpeakerTravelPreference'] = SpeakerTravelPreferenceSerializer::class;

View File

@ -0,0 +1,27 @@
<?php namespace ModelSerializers;
/**
* 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.
**/
/**
* Class RSVPSerializer
* @package ModelSerializers
*/
final class RSVPSerializer extends SilverStripeSerializer
{
protected static $array_mappings = array
(
'OwnerId' => 'owner_id:json_int',
'EventId' => 'event_id:json_int',
'SeatType' => 'seat_type:json_string',
'Created' => 'created:datetime_epoch',
);
}

View File

@ -112,7 +112,13 @@ final class SummitAttendeeSerializer extends SilverStripeSerializer
if($attendee->hasMember())
{
unset($values['member_id']);
$values['member'] = SerializerRegistry::getInstance()->getSerializer($attendee->getMember(), $serializer_type)->serialize($expand);
$values['member'] = SerializerRegistry::getInstance()
->getSerializer($attendee->getMember(), $serializer_type)
->serialize(
$expand,
[],
[],
['summit' => $attendee->getSummit()]);
}
}
break;

View File

@ -924,6 +924,26 @@ SQL;
return count($rsvp) > 0 ? $rsvp[0] : null;
}
/**
* @param Summit $summit
* @return null|RSVP[]
*/
public function getRsvpBySummit(Summit $summit){
$builder = $this->createQueryBuilder();
$res = $builder
->select('r')
->from('models\summit\RSVP','r')
->join('r.owner','o')
->join('r.event','e')
->join('e.summit','s')
->where('o.id = :owner_id and s.id = :summit_id')
->setParameter('owner_id', $this->getId())
->setParameter('summit_id', $summit->getId())
->getQuery()->getResult();
return $res;
}
/**
* @param Summit $summit
* @return SummitMemberSchedule[]
@ -1016,4 +1036,26 @@ SQL;
$this->affiliations->removeElement($affiliation);
return $this;
}
/**
* @param int $rsvp_id
* @return RSVP|null
*/
public function getRsvpById($rsvp_id){
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('id', $rsvp_id));
$rsvp = $this->rsvp->matching($criteria)->first();
return $rsvp ? $rsvp : null;
}
/**
* @param RSVP $rsvp
* @return $this
*/
public function removeRsvp(RSVP $rsvp){
$this->rsvp->removeElement($rsvp);
return $this;
}
}

View File

@ -40,6 +40,25 @@ class RSVP extends SilverstripeBaseModel
*/
private $owner;
/**
* @ORM\ManyToOne(targetEntity="models\summit\SummitEvent", inversedBy="rsvp", fetch="LAZY")
* @ORM\JoinColumn(name="EventID", referencedColumnName="ID")
* @var SummitEvent
*/
private $event;
/**
* @ORM\Column(name="SeatType", type="string")
*/
protected $seat_type;
/**
* @ORM\OneToMany(targetEntity="models\summit\RSVPAnswer", mappedBy="rsvp", cascade={"persist", "remove"})
* @var RSVPAnswer[]
*/
protected $answers;
/**
* @return ArrayCollection
*/
@ -71,12 +90,6 @@ class RSVP extends SilverstripeBaseModel
$this->owner = $owner;
}
/**
* @ORM\ManyToOne(targetEntity="models\summit\SummitEvent", inversedBy="rsvp", fetch="LAZY")
* @ORM\JoinColumn(name="EventID", referencedColumnName="ID")
* @var SummitEvent
*/
private $event;
/**
* @return SummitEvent
@ -125,9 +138,19 @@ class RSVP extends SilverstripeBaseModel
}
/**
* @ORM\OneToMany(targetEntity="models\summit\RSVPAnswer", mappedBy="rsvp", cascade={"persist", "remove"})
* @var RSVPAnswer[]
* @return mixed
*/
protected $answers;
public function getSeatType()
{
return $this->seat_type;
}
/**
* @param mixed $seat_type
*/
public function setSeatType($seat_type)
{
$this->seat_type = $seat_type;
}
}

View File

@ -29,8 +29,15 @@ interface IMemberService
/**
* @param Member $member
* @param $affiliation_id
* @param int $affiliation_id
* @return void
*/
public function deleteAffiliation(Member $member, $affiliation_id);
/**
* @param Member $member
* @param int $rsvp_id
* @return void
*/
public function deleteRSVP(Member $member, $rsvp_id);
}

View File

@ -111,4 +111,20 @@ final class MemberService implements IMemberService
$member->removeAffiliation($affiliation);
});
}
/**
* @param Member $member
* @param int $rsvp_id
* @return void
*/
public function deleteRSVP(Member $member, $rsvp_id)
{
return $this->tx_service->transaction(function() use($member, $rsvp_id){
$affiliation = $member->getRsvpById($rsvp_id);
if(is_null($affiliation))
throw new EntityNotFoundException(sprintf("rsvp id %s does not belongs to member id %s", $rsvp_id, $member->getId()));
$member->removeAffiliation($affiliation);
});
}
}

View File

@ -693,7 +693,15 @@ class ApiEndpointsSeeder extends Seeder
'scopes' => [
sprintf(SummitScopes::WriteMemberData, $current_realm)
],
]
],
[
'name' => 'delete-member-rsvp',
'route' => '/api/v1/members/{member_id}/rsvp/{rsvp_id}',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteMemberData, $current_realm)
],
]
]
);
}

View File

@ -23,7 +23,7 @@ class OAuth2AttendeesApiTest extends ProtectedApiTest
'per_page' => 10,
'order' => '+id',
'filter' => 'email=@jimmy',
'expand' => 'member,schedule'
'expand' => 'member,schedule,rsvp'
];
$headers = [
@ -74,12 +74,12 @@ class OAuth2AttendeesApiTest extends ProtectedApiTest
$this->assertTrue(!is_null($attendee));
}
public function testGetAttendeeByID($attendee_id = 12642){
public function testGetAttendeeByID($attendee_id = 12923){
$params = [
'id' => 23,
'attendee_id' => $attendee_id,
'expand' => 'member,schedule,tickets,affiliations,groups'
'expand' => 'member,schedule,tickets,affiliations,groups,rsvp'
];
$headers = [