Fixed my speaker profile

added endpoint to update my speaker profile

PUT /api/v1/speakers/me

payload

'title' => 'sometimes|string|max:100',
'first_name' => 'sometimes|string|max:100',
'last_name' => 'sometimes|string|max:100',
'bio' => 'sometimes|string',
'notes' => 'sometimes|string',
'irc' => 'sometimes|string|max:50',
'twitter' => 'sometimes|string|max:50',
'member_id' => 'sometimes|integer',
'email' => 'sometimes|string|max:50',
'available_for_bureau' => 'sometimes|boolean',
'funded_travel' => 'sometimes|boolean',
'willing_to_travel' => 'sometimes|boolean',
'willing_to_present_video' => 'sometimes|boolean',
'org_has_cloud' => 'sometimes|boolean',
'country' => 'sometimes|country_iso_alpha2_code',

scopes

%s/speakers/write/me

Change-Id: I7efcfcb65d5347bc24ab82e6d41b7c345a1d1cdd
This commit is contained in:
Sebastian Marcet 2018-10-16 13:06:50 -03:00
parent 2dcb7c559e
commit 210c46e3ee
6 changed files with 107 additions and 44 deletions

View File

@ -405,6 +405,37 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
}
}
/**
* @return mixed
*/
public function updateMySpeaker()
{
try {
$current_member_id = $this->resource_server_context->getCurrentUserExternalId();
if (is_null($current_member_id))
return $this->error403();
$member = $this->member_repository->getById($current_member_id);
if (is_null($member))
return $this->error403();
$speaker = $this->speaker_repository->getByMember($member);
if (is_null($speaker)) return $this->error404();
return $this->updateSpeaker($speaker->getId());
} catch (ValidationException $ex1) {
Log::warning($ex1);
return $this->error412($ex1->getMessages());
} catch (EntityNotFoundException $ex2) {
Log::warning($ex2);
return $this->error404(array('message' => $ex2->getMessage()));
} catch (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $speaker_id
* @return mixed
@ -454,8 +485,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$rules = array
(
$rules = [
'title' => 'required|string|max:100',
'first_name' => 'required|string|max:100',
'last_name' => 'required|string|max:100',
@ -469,7 +499,13 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
'is_confirmed' => 'sometimes|boolean',
'checked_in' => 'sometimes|boolean',
'registration_code' => 'sometimes|string',
);
'available_for_bureau' => 'sometimes|boolean',
'funded_travel' => 'sometimes|boolean',
'willing_to_travel' => 'sometimes|boolean',
'willing_to_present_video' => 'sometimes|boolean',
'org_has_cloud' => 'sometimes|boolean',
'country' => 'sometimes|country_iso_alpha2_code',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($data->all(), $rules);
@ -520,8 +556,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
$speaker = $this->speaker_repository->getById($speaker_id);
if (is_null($speaker)) return $this->error404();
$rules = array
(
$rules = [
'title' => 'sometimes|string|max:100',
'first_name' => 'sometimes|string|max:100',
'last_name' => 'sometimes|string|max:100',
@ -535,7 +570,13 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
'is_confirmed' => 'sometimes|boolean',
'checked_in' => 'sometimes|boolean',
'registration_code' => 'sometimes|string',
);
'available_for_bureau' => 'sometimes|boolean',
'funded_travel' => 'sometimes|boolean',
'willing_to_travel' => 'sometimes|boolean',
'willing_to_present_video' => 'sometimes|boolean',
'org_has_cloud' => 'sometimes|boolean',
'country' => 'sometimes|country_iso_alpha2_code',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($data->all(), $rules);
@ -657,6 +698,8 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
'funded_travel' => 'sometimes|boolean',
'willing_to_travel' => 'sometimes|boolean',
'willing_to_present_video' => 'sometimes|boolean',
'org_has_cloud' => 'sometimes|boolean',
'country' => 'sometimes|country_iso_alpha2_code',
];
// Creates a Validator instance and validates the data.
@ -706,8 +749,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
$speaker = $this->speaker_repository->getById($speaker_id);
if (is_null($speaker)) return $this->error404();
$rules = array
(
$rules = [
'title' => 'sometimes|string|max:100',
'first_name' => 'sometimes|string|max:100',
'last_name' => 'sometimes|string|max:100',
@ -721,7 +763,9 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
'funded_travel' => 'sometimes|boolean',
'willing_to_travel' => 'sometimes|boolean',
'willing_to_present_video' => 'sometimes|boolean',
);
'org_has_cloud' => 'sometimes|boolean',
'country' => 'sometimes|country_iso_alpha2_code',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($data->all(), $rules);
@ -746,10 +790,10 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
return $this->updated(SerializerRegistry::getInstance()->getSerializer($speaker, SerializerRegistry::SerializerType_Private)->serialize());
} catch (ValidationException $ex1) {
Log::warning($ex1);
return $this->error412(array($ex1->getMessage()));
return $this->error412([$ex1->getMessage()]);
} catch (EntityNotFoundException $ex2) {
Log::warning($ex2);
return $this->error404(array('message' => $ex2->getMessage()));
return $this->error404(['message' => $ex2->getMessage()]);
} catch (Exception $ex) {
Log::error($ex);
return $this->error500($ex);

View File

@ -597,6 +597,7 @@ Route::group([
// speakers
Route::group(['prefix' => 'speakers'], function () {
Route::get('', 'OAuth2SummitSpeakersApiController@getAll');
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitSpeakersApiController@addSpeaker']);
Route::put('merge/{speaker_from_id}/{speaker_to_id}', 'OAuth2SummitSpeakersApiController@merge');
@ -604,6 +605,7 @@ Route::group([
Route::group(['prefix' => 'me'], function(){
Route::get('', 'OAuth2SummitSpeakersApiController@getMySpeaker');
Route::post('', 'OAuth2SummitSpeakersApiController@createMySpeaker');
Route::put('', 'OAuth2SummitSpeakersApiController@updateMySpeaker');
Route::group(['prefix' => 'presentations'], function(){
Route::group(['prefix' => '{presentation_id}'], function(){

View File

@ -19,11 +19,7 @@ use models\summit\PresentationSpeaker;
final class AdminPresentationSpeakerSerializer extends PresentationSpeakerSerializer
{
protected static $array_mappings = [
'AvailableForBureau' => 'available_for_bureau:json_boolean',
'FundedTravel' => 'funded_travel:json_boolean',
'WillingToTravel' => 'willing_to_travel:json_boolean',
'WillingToPresentVideo' => 'willing_to_present_video:json_boolean',
'Notes' => 'notes:json_string'
'Notes'=> 'notes:json_string'
];
/**

View File

@ -27,6 +27,13 @@ class PresentationSpeakerSerializer extends SilverStripeSerializer
'Bio' => 'bio:json_string',
'IRCHandle' => 'irc:json_string',
'TwitterName' => 'twitter:json_string',
'OrgHasCloud' => 'org_has_cloud:json_boolean',
'Country' => 'country:json_string',
'AvailableForBureau' => 'available_for_bureau:json_boolean',
'FundedTravel' => 'funded_travel:json_boolean',
'WillingToTravel' => 'willing_to_travel:json_boolean',
'WillingToPresentVideo' => 'willing_to_present_video:json_boolean',
];
protected static $allowed_relations = [

View File

@ -309,6 +309,12 @@ final class SpeakerService
if(isset($data['willing_to_present_video']))
$speaker->setWillingToPresentVideo(boolval($data['willing_to_present_video']));
if(isset($data['org_has_cloud']))
$speaker->setOrgHasCloud(boolval($data['org_has_cloud']));
if(isset($data['country']))
$speaker->setCountry(trim($data['country']));
}
/**

View File

@ -386,22 +386,30 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::WriteMySpeakersData, $current_realm)
],
],
array(
[
'name' => 'create-my-speaker',
'route' => '/api/v1/speakers/me',
'http_method' => 'POST',
'scopes' => [
sprintf(SummitScopes::WriteMySpeakersData, $current_realm),
],
),
array(
],
[
'name' => 'update-my-speaker',
'route' => '/api/v1/speakers/me',
'http_method' => 'PUT',
'scopes' => [
sprintf(SummitScopes::WriteMySpeakersData, $current_realm),
],
],
[
'name' => 'merge-speakers',
'route' => '/api/v1/speakers/merge/{speaker_from_id}/{speaker_to_id}',
'http_method' => 'PUT',
'scopes' => [
sprintf(SummitScopes::WriteSpeakersData, $current_realm),
],
),
],
array(
'name' => 'get-speaker-by-summit',
'route' => '/api/v1/summits/{id}/speakers/{speaker_id}',
@ -481,7 +489,7 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
),
array(
[
'name' => 'get-event',
'route' => '/api/v1/summits/{id}/events/{event_id}',
'http_method' => 'GET',
@ -489,8 +497,8 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
),
array(
],
[
'name' => 'get-published-event',
'route' => '/api/v1/summits/{id}/events/{event_id}/published',
'http_method' => 'GET',
@ -498,67 +506,67 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
),
array(
],
[
'name' => 'add-event',
'route' => '/api/v1/summits/{id}/events',
'http_method' => 'POST',
'scopes' => [sprintf(SummitScopes::WriteEventData, $current_realm)],
),
array(
],
[
'name' => 'update-event',
'route' => '/api/v1/summits/{id}/events/{event_id}',
'http_method' => 'PUT',
'scopes' => [sprintf(SummitScopes::WriteEventData, $current_realm)],
),
array(
],
[
'name' => 'update-events',
'route' => '/api/v1/summits/{id}/events',
'http_method' => 'PUT',
'scopes' => [sprintf(SummitScopes::WriteEventData, $current_realm)],
),
array(
],
[
'name' => 'publish-event',
'route' => '/api/v1/summits/{id}/events/{event_id}/publish',
'http_method' => 'PUT',
'scopes' => [sprintf(SummitScopes::PublishEventData, $current_realm)],
),
array(
],
[
'name' => 'publish-events',
'route' => '/api/v1/summits/{id}/events/publish',
'http_method' => 'PUT',
'scopes' => [sprintf(SummitScopes::PublishEventData, $current_realm)],
),
array(
],
[
'name' => 'unpublish-event',
'route' => '/api/v1/summits/{id}/events/{event_id}/publish',
'http_method' => 'DELETE',
'scopes' => [sprintf(SummitScopes::PublishEventData, $current_realm)],
),
array(
],
[
'name' => 'unpublish-events',
'route' => '/api/v1/summits/{id}/events/publish',
'http_method' => 'DELETE',
'scopes' => [sprintf(SummitScopes::PublishEventData, $current_realm)],
),
array(
],
[
'name' => 'delete-event',
'route' => '/api/v1/summits/{id}/events/{event_id}',
'http_method' => 'DELETE',
'scopes' => [sprintf('%s/summits/delete-event', $current_realm)],
),
array(
],
[
'name' => 'add-event-feedback',
'route' => '/api/v1/summits/{id}/events/{event_id}/feedback',
'http_method' => 'POST',
'scopes' => [sprintf(SummitScopes::WriteSummitData, $current_realm)],
),
array(
],
[
'name' => 'add-event-attachment',
'route' => '/api/v1/summits/{id}/events/{event_id}/attachment',
'http_method' => 'POST',
'scopes' => [sprintf(SummitScopes::WriteSummitData, $current_realm)],
),
],
[
'name' => 'add-event-feedback-v2',
'route' => '/api/v2/summits/{id}/events/{event_id}/feedback',