added new endpoint update promo code
PUT /api/v1/summits/{id}/promo-codes/{promo_code_id} payload member promo code { code: "1234" class_name: "MEMBER_PROMO_CODE", first_name: "test", last_name: "test", email: "test@test.com", owner_id: 1123 type: "ATC" } speaker promo code { code: "1234" class_name: "SPEAKER_PROMO_CODE", speaker_id: 1123, type: 'ACCEPTED' } sponsor promo code { code: "1234" class_name: "SPONSOR_PROMO_CODE", sponsor_id: 1123 } Change-Id: I3961012d43706c46261f65d27817b1b01d577e20
This commit is contained in:
parent
da4ff5a429
commit
86c15507f3
@ -249,7 +249,7 @@ final class OAuth2SummitPromoCodesApiController extends OAuth2ProtectedControlle
|
||||
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
|
||||
if (is_null($summit)) return $this->error404();
|
||||
|
||||
$rules = PromoCodesValidationRulesFactory::buildAddRules($data->all());
|
||||
$rules = PromoCodesValidationRulesFactory::build($data->all());
|
||||
// Creates a Validator instance and validates the data.
|
||||
$validation = Validator::make($data->all(), $rules);
|
||||
|
||||
@ -285,4 +285,46 @@ final class OAuth2SummitPromoCodesApiController extends OAuth2ProtectedControlle
|
||||
return $this->error500($ex);
|
||||
}
|
||||
}
|
||||
|
||||
public function updatePromoCodeBySummit($summit_id, $promo_code_id)
|
||||
{
|
||||
try {
|
||||
if (!Request::isJson()) return $this->error403();
|
||||
$data = Input::json();
|
||||
|
||||
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
|
||||
if (is_null($summit)) return $this->error404();
|
||||
|
||||
$rules = PromoCodesValidationRulesFactory::build($data->all());
|
||||
// Creates a Validator instance and validates the data.
|
||||
$validation = Validator::make($data->all(), $rules);
|
||||
|
||||
if ($validation->fails()) {
|
||||
$messages = $validation->messages()->toArray();
|
||||
|
||||
return $this->error412
|
||||
(
|
||||
$messages
|
||||
);
|
||||
}
|
||||
|
||||
$current_member = null;
|
||||
if (!is_null($this->resource_server_context->getCurrentUserExternalId())) {
|
||||
$current_member = $this->member_repository->getById($this->resource_server_context->getCurrentUserExternalId());
|
||||
}
|
||||
|
||||
$promo_code = $this->promo_code_service->updatePromoCode($summit, $promo_code_id, $data->all(), $current_member);
|
||||
|
||||
return $this->updated(SerializerRegistry::getInstance()->getSerializer($promo_code)->serialize());
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -27,7 +27,7 @@ final class PromoCodesValidationRulesFactory
|
||||
* @return array
|
||||
* @throws ValidationException
|
||||
*/
|
||||
public static function buildAddRules(array $data){
|
||||
public static function build(array $data){
|
||||
if(!isset($data['class_name']))
|
||||
throw new ValidationException("class_name parameter is mandatory");
|
||||
|
||||
|
@ -335,6 +335,9 @@ Route::group([
|
||||
Route::get('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitPromoCodesApiController@getAllBySummit']);
|
||||
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitPromoCodesApiController@addPromoCodeBySummit']);
|
||||
Route::get('metadata', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitPromoCodesApiController@getMetadata']);
|
||||
Route::group(['prefix' => '{promo_code_id}'], function () {
|
||||
Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitPromoCodesApiController@updatePromoCodeBySummit']);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -15,17 +15,50 @@ use models\summit\MemberSummitRegistrationPromoCode;
|
||||
use models\summit\SpeakerSummitRegistrationPromoCode;
|
||||
use models\summit\SponsorSummitRegistrationPromoCode;
|
||||
use models\summit\Summit;
|
||||
use models\summit\SummitRegistrationPromoCode;
|
||||
/**
|
||||
* Class SummitPromoCodeFactory
|
||||
* @package App\Models\Foundation\Summit\Factories
|
||||
*/
|
||||
final class SummitPromoCodeFactory
|
||||
{
|
||||
/**
|
||||
* @param Summit $summit
|
||||
* @param array $data
|
||||
* @param array $params
|
||||
* @return SummitRegistrationPromoCode|null
|
||||
*/
|
||||
public static function build(Summit $summit, array $data, array $params = []){
|
||||
$promo_code = null;
|
||||
switch ($data['class_name']){
|
||||
case MemberSummitRegistrationPromoCode::ClassName:{
|
||||
$promo_code = new MemberSummitRegistrationPromoCode();
|
||||
}
|
||||
break;
|
||||
case SpeakerSummitRegistrationPromoCode::ClassName:{
|
||||
$promo_code = new SpeakerSummitRegistrationPromoCode();
|
||||
}
|
||||
break;
|
||||
case SponsorSummitRegistrationPromoCode::ClassName:{
|
||||
$promo_code = new SponsorSummitRegistrationPromoCode();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(is_null($promo_code)) return null;
|
||||
return self::populate($promo_code, $summit, $data, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param SummitRegistrationPromoCode $promo_code
|
||||
* @param Summit $summit
|
||||
* @param array $data
|
||||
* @param array $params
|
||||
* @return SummitRegistrationPromoCode
|
||||
*/
|
||||
public static function populate(SummitRegistrationPromoCode $promo_code, Summit $summit, array $data, array $params = []){
|
||||
switch ($data['class_name']){
|
||||
case MemberSummitRegistrationPromoCode::ClassName:{
|
||||
if(isset($params['owner']))
|
||||
$promo_code->setOwner($params['owner']);
|
||||
if(isset($data['type']))
|
||||
@ -37,23 +70,19 @@ final class SummitPromoCodeFactory
|
||||
if(isset($data['email']))
|
||||
$promo_code->setEmail(trim($data['email']));
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SpeakerSummitRegistrationPromoCode::ClassName:{
|
||||
$promo_code = new SpeakerSummitRegistrationPromoCode();
|
||||
if(isset($data['type']))
|
||||
$promo_code->setType($data['type']);
|
||||
$promo_code->setSpeaker($params['speaker']);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SponsorSummitRegistrationPromoCode::ClassName:{
|
||||
$promo_code = new SponsorSummitRegistrationPromoCode();
|
||||
$promo_code->setSponsor($params['sponsor']);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(is_null($promo_code)) return null;
|
||||
|
||||
$promo_code->setCode(trim($data['code']));
|
||||
$summit->addPromoCode($promo_code);
|
||||
return $promo_code;
|
||||
|
@ -1362,4 +1362,15 @@ SQL;
|
||||
$promo_code = $this->promo_codes->matching($criteria)->first();
|
||||
return $promo_code === false ? null : $promo_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $promo_code_id
|
||||
* @return SummitRegistrationPromoCode|null
|
||||
*/
|
||||
public function getPromoCodeById($promo_code_id){
|
||||
$criteria = Criteria::create();
|
||||
$criteria->where(Criteria::expr()->eq('id', $promo_code_id));
|
||||
$promo_code = $this->promo_codes->matching($criteria)->first();
|
||||
return $promo_code === false ? null : $promo_code;
|
||||
}
|
||||
}
|
@ -32,4 +32,14 @@ interface ISummitPromoCodeService
|
||||
*/
|
||||
public function addPromoCode(Summit $summit, array $data, Member $current_user = null);
|
||||
|
||||
/**
|
||||
* @param Summit $summit
|
||||
* @param int $promo_code_id
|
||||
* @param array $data
|
||||
* @param Member $current_user
|
||||
* @return SummitRegistrationPromoCode
|
||||
* @throws EntityNotFoundException
|
||||
* @throws ValidationException
|
||||
*/
|
||||
public function updatePromoCode(Summit $summit, $promo_code_id, array $data, Member $current_user = null);
|
||||
}
|
@ -78,6 +78,38 @@ final class SummitPromoCodeService implements ISummitPromoCodeService
|
||||
$this->tx_service = $tx_service;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @return array
|
||||
* @throws EntityNotFoundException
|
||||
*/
|
||||
private function getPromoCodeParams(array $data){
|
||||
$params = [];
|
||||
|
||||
if(isset($data['owner_id'])){
|
||||
$owner = $this->member_repository->getById(intval($data['owner_id']));
|
||||
if(is_null($owner))
|
||||
throw new EntityNotFoundException(sprintf("owner_id %s not found", $data['owner_id']));
|
||||
$params['owner'] = $owner;
|
||||
}
|
||||
|
||||
if(isset($data['speaker_id'])){
|
||||
$speaker = $this->speaker_repository->getById(intval($data['speaker_id']));
|
||||
if(is_null($speaker))
|
||||
throw new EntityNotFoundException(sprintf("speaker_id %s not found", $data['speaker_id']));
|
||||
$params['speaker'] = $speaker;
|
||||
}
|
||||
|
||||
|
||||
if(isset($data['sponsor_id'])){
|
||||
$sponsor = $this->company_repository->getById(intval($data['sponsor_id']));
|
||||
if(is_null($sponsor))
|
||||
throw new EntityNotFoundException(sprintf("sponsor_id %s not found", $data['sponsor_id']));
|
||||
$params['sponsor'] = $sponsor;
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
/**
|
||||
* @param Summit $summit
|
||||
* @param array $data
|
||||
@ -94,33 +126,44 @@ final class SummitPromoCodeService implements ISummitPromoCodeService
|
||||
|
||||
if(!is_null($old_promo_code))
|
||||
throw new ValidationException(sprintf("promo code %s already exits on summit id %s", trim($data['code']), $summit->getId()));
|
||||
$params = [];
|
||||
|
||||
if(isset($data['owner_id'])){
|
||||
$owner = $this->member_repository->getById(intval($data['owner_id']));
|
||||
if(is_null($owner))
|
||||
throw new EntityNotFoundException(sprintf("owner_id %s not found", $data['owner_id']));
|
||||
$params['owner'] = $owner;
|
||||
}
|
||||
|
||||
if(isset($data['speaker_id'])){
|
||||
$speaker = $this->speaker_repository->getById(intval($data['speaker_id']));
|
||||
if(is_null($speaker))
|
||||
throw new EntityNotFoundException(sprintf("speaker_id %s not found", $data['speaker_id']));
|
||||
$params['speaker'] = $speaker;
|
||||
}
|
||||
|
||||
|
||||
if(isset($data['sponsor_id'])){
|
||||
$sponsor = $this->company_repository->getById(intval($data['sponsor_id']));
|
||||
if(is_null($sponsor))
|
||||
throw new EntityNotFoundException(sprintf("sponsor_id %s not found", $data['sponsor_id']));
|
||||
$params['sponsor'] = $sponsor;
|
||||
}
|
||||
|
||||
$promo_code = SummitPromoCodeFactory::build($summit, $data, $params);
|
||||
$promo_code = SummitPromoCodeFactory::build($summit, $data, $this->getPromoCodeParams($data));
|
||||
if(is_null($promo_code))
|
||||
throw new ValidationException("class_name %s is invalid", $data['class_name']);
|
||||
throw new ValidationException(sprintf("class_name %s is invalid", $data['class_name']));
|
||||
|
||||
if(!is_null($current_user))
|
||||
$promo_code->setCreator($current_user);
|
||||
|
||||
$promo_code->setSourceAdmin();
|
||||
|
||||
return $promo_code;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Summit $summit
|
||||
* @param int $promo_code_id
|
||||
* @param array $data
|
||||
* @param Member $current_user
|
||||
* @return SummitRegistrationPromoCode
|
||||
* @throws EntityNotFoundException
|
||||
* @throws ValidationException
|
||||
*/
|
||||
public function updatePromoCode(Summit $summit, $promo_code_id, array $data, Member $current_user = null)
|
||||
{
|
||||
return $this->tx_service->transaction(function() use($promo_code_id, $summit, $data, $current_user){
|
||||
|
||||
$old_promo_code = $summit->getPromoCodeByCode(trim($data['code']));
|
||||
|
||||
if(!is_null($old_promo_code) && $old_promo_code->getId() != $promo_code_id)
|
||||
throw new ValidationException(sprintf("promo code %s already exits on summit id %s for promo code id %s", trim($data['code']), $summit->getId(), $old_promo_code->getId()));
|
||||
|
||||
$promo_code = $summit->getPromoCodeById($promo_code_id);
|
||||
if(is_null($promo_code))
|
||||
throw new EntityNotFoundException(sprintf("promo code id %s does not belongs to summit id %s", $promo_code_id, $summit->getId()));
|
||||
|
||||
$promo_code = SummitPromoCodeFactory::populate($promo_code, $summit, $data, $this->getPromoCodeParams($data));
|
||||
|
||||
if(!is_null($current_user))
|
||||
$promo_code->setCreator($current_user);
|
||||
|
||||
|
@ -676,6 +676,15 @@ class ApiEndpointsSeeder extends Seeder
|
||||
sprintf(SummitScopes::WriteSummitData, $current_realm)
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'update-promo-code',
|
||||
'route' => '/api/v1/summits/{id}/promo-codes/{promo_code_id}',
|
||||
'http_method' => 'PUT',
|
||||
'scopes' => [
|
||||
sprintf(SummitScopes::WritePromoCodeData, $current_realm),
|
||||
sprintf(SummitScopes::WriteSummitData, $current_realm)
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'get-promo-codes-metadata',
|
||||
'route' => '/api/v1/summits/{id}/promo-codes/metadata',
|
||||
|
@ -201,9 +201,9 @@ final class OAuth2PromoCodesApiTest extends ProtectedApiTest
|
||||
$this->assertTrue(!is_null($metadata));
|
||||
}
|
||||
|
||||
public function testAddPromoCode($code = "12344KG_SPEAKER"){
|
||||
public function testAddPromoCode($summit_id = 23, $code = "12344KG_SPEAKER"){
|
||||
$params = [
|
||||
'id' => 23,
|
||||
'id' => $summit_id,
|
||||
];
|
||||
|
||||
$data = [
|
||||
@ -237,4 +237,45 @@ final class OAuth2PromoCodesApiTest extends ProtectedApiTest
|
||||
$this->assertTrue(!is_null($promo_code));
|
||||
return $promo_code;
|
||||
}
|
||||
|
||||
public function testUpdatePromoCode($summit_id = 23){
|
||||
|
||||
$code = str_random(16).'_PROMOCODE_TEST';
|
||||
$promo_code = $this->testAddPromoCode($summit_id, $code);
|
||||
$params = [
|
||||
'id' => $summit_id,
|
||||
'promo_code_id' => $promo_code->id
|
||||
];
|
||||
|
||||
$data = [
|
||||
'code' => $code.'_UPDATE',
|
||||
'class_name' => \models\summit\MemberSummitRegistrationPromoCode::ClassName,
|
||||
'first_name' => 'Sebastian update',
|
||||
'last_name' => 'Marcet update',
|
||||
'email' => 'test@test.com',
|
||||
'type' => \models\summit\MemberSummitRegistrationPromoCode::$valid_type_values[2]
|
||||
];
|
||||
|
||||
$headers = [
|
||||
"HTTP_Authorization" => " Bearer " . $this->access_token,
|
||||
"CONTENT_TYPE" => "application/json"
|
||||
];
|
||||
|
||||
$response = $this->action(
|
||||
"PUT",
|
||||
"OAuth2SummitPromoCodesApiController@updatePromoCodeBySummit",
|
||||
$params,
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
$headers,
|
||||
json_encode($data)
|
||||
);
|
||||
|
||||
$content = $response->getContent();
|
||||
$this->assertResponseStatus(201);
|
||||
$promo_code = json_decode($content);
|
||||
$this->assertTrue(!is_null($promo_code));
|
||||
return $promo_code;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user