diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index fb6607b4..4edc9adb 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -1748,7 +1748,66 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController } } - public function updateLocationBanner($summit, $location_id, $banner_id){ + /** + * @param $summit_id + * @param $location_id + * @param $banner_id + * @return mixed + */ + public function updateLocationBanner($summit_id, $location_id, $banner_id){ + try { + if(!Request::isJson()) return $this->error403(); + $payload = Input::json()->all(); + + $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $rules = SummitLocationBannerValidationRulesFactory::build($payload, true); + // Creates a Validator instance and validates the data. + $messages = [ + 'class_name.in' => sprintf + ( + ":attribute has an invalid value ( valid values are %s )", + implode(", ", SummitLocationBannerConstants::$valid_class_names) + ) + ]; + $validation = Validator::make($payload, $rules, $messages); + + if ($validation->fails()) { + $messages = $validation->messages()->toArray(); + + return $this->error412 + ( + $messages + ); + } + + $banner = $this->location_service->updateLocationBanner + ( + $summit, + $location_id, + $banner_id, + HTMLCleaner::cleanData + ( + $payload, ['title', 'content'] + ) + ); + + return $this->updated(SerializerRegistry::getInstance()->getSerializer($banner)->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); + } } } \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Summit/SummitLocationBannerValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/SummitLocationBannerValidationRulesFactory.php index c1bbfb1b..4dc9dc64 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/SummitLocationBannerValidationRulesFactory.php +++ b/app/Http/Controllers/Apis/Protected/Summit/SummitLocationBannerValidationRulesFactory.php @@ -33,7 +33,7 @@ final class SummitLocationBannerValidationRulesFactory throw new ValidationException('class_name is not set'); $base_rules = [ - 'class_name' => sprintf('required|in%s', implode(", ", SummitLocationBannerConstants::$valid_class_names)), + 'class_name' => sprintf('required|in:%s', implode(",", SummitLocationBannerConstants::$valid_class_names)), 'title' => 'required|string', 'content' => 'required|string', 'type' => sprintf('required|in:%s', implode(",", SummitLocationBannerConstants::$valid_types)), @@ -42,7 +42,7 @@ final class SummitLocationBannerValidationRulesFactory if($update){ $base_rules = [ - 'class_name' => sprintf('required|in%s', implode(", ", SummitLocationBannerConstants::$valid_class_names)), + 'class_name' => sprintf('required|in:%s', implode(",", SummitLocationBannerConstants::$valid_class_names)), 'title' => 'sometimes|string', 'content' => 'sometimes|string', 'type' => sprintf('sometimes|in:%s', implode(",", SummitLocationBannerConstants::$valid_types)), diff --git a/app/Http/Controllers/Apis/Protected/Summit/SummitLocationValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/SummitLocationValidationRulesFactory.php index 2e6491a0..4993b973 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/SummitLocationValidationRulesFactory.php +++ b/app/Http/Controllers/Apis/Protected/Summit/SummitLocationValidationRulesFactory.php @@ -36,7 +36,7 @@ final class SummitLocationValidationRulesFactory throw new ValidationException('class_name is required'); $base_rules = [ - 'class_name' => sprintf('required|in:%s', implode(", ", SummitLocationConstants::$valid_class_names)) + 'class_name' => sprintf('required|in:%s', implode(",", SummitLocationConstants::$valid_class_names)) ]; switch($data['class_name']){ @@ -64,6 +64,7 @@ final class SummitLocationValidationRulesFactory } break; } + return []; } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php b/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php index c8f3de92..46ba2460 100644 --- a/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php +++ b/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php @@ -178,15 +178,14 @@ class SummitAbstractLocation extends SilverstripeBaseModel /** * @param SummitLocationBanner $banner - * @return $this * @throws ValidationException */ - public function addBanner(SummitLocationBanner $banner){ + public function validateBanner(SummitLocationBanner $banner){ if($banner->getClassName() == SummitLocationBanner::ClassName){ // only one static banner could exist at the same time foreach ($this->banners as $old_banner){ - if($old_banner->getClassName() == SummitLocationBanner::ClassName && $old_banner->isEnabled()){ + if($old_banner->getClassName() == SummitLocationBanner::ClassName && $old_banner->isEnabled() && $old_banner->getId() != $banner->getId()){ throw new ValidationException ( sprintf @@ -197,12 +196,12 @@ class SummitAbstractLocation extends SilverstripeBaseModel } if($banner instanceof ScheduledSummitLocationBanner){ - // dont overlap enabled ones + // do not overlap enabled ones $new_start = $banner->getLocalStartDate(); $new_end = $banner->getLocalEndDate(); foreach ($this->banners as $old_banner){ - if($old_banner instanceof ScheduledSummitLocationBanner && $old_banner->isEnabled()){ + if($old_banner instanceof ScheduledSummitLocationBanner && $old_banner->isEnabled() && $old_banner->getId() != $banner->getId()){ $old_start = $old_banner->getLocalStartDate(); $old_end = $old_banner->getLocalEndDate(); // (StartA <= EndB) and (EndA >= StartB) @@ -225,6 +224,15 @@ class SummitAbstractLocation extends SilverstripeBaseModel } } + } + /** + * @param SummitLocationBanner $banner + * @return $this + * @throws ValidationException + */ + public function addBanner(SummitLocationBanner $banner){ + + $this->validateBanner($banner); $this->banners->add($banner); $banner->setLocation($this); return $this; diff --git a/app/Services/Model/LocationService.php b/app/Services/Model/LocationService.php index a952c79c..086c62ba 100644 --- a/app/Services/Model/LocationService.php +++ b/app/Services/Model/LocationService.php @@ -1008,6 +1008,41 @@ final class LocationService implements ILocationService { return $this->tx_service->transaction(function () use ($summit, $location_id, $banner_id, $data) { + $location = $summit->getLocation($location_id); + + if(is_null($location)){ + throw new EntityNotFoundException + ( + trans + ( + 'not_found_errors.LocationService.updateLocationBanner.LocationNotFound', + [ + 'summit_id' => $summit->getId(), + 'location_id' => $location_id, + ] + ) + ); + } + + $banner = $location->getBannerById($banner_id); + + if(is_null($banner)){ + throw new EntityNotFoundException + ( + trans + ( + 'not_found_errors.LocationService.updateLocationBanner.BannerNotFound', + [ + 'location_id' => $location_id, + 'banner_id' => $banner_id, + ] + ) + ); + } + + $banner = SummitLocationBannerFactory::populate($summit, $location, $data, $banner); + $location->validateBanner($banner); + return $banner; }); } diff --git a/resources/lang/en/not_found_errors.php b/resources/lang/en/not_found_errors.php index 744b24b8..c56727ce 100644 --- a/resources/lang/en/not_found_errors.php +++ b/resources/lang/en/not_found_errors.php @@ -29,4 +29,6 @@ return [ 'LocationService.addLocationBanner.LocationNotFound' => 'location :location_id not found on summit :summit_id', 'LocationService.deleteLocationBanner.LocationNotFound' => 'location :location_id not found on summit :summit_id', 'LocationService.deleteLocationBanner.BannerNotFound'=> 'banner :banner_id not found on location :location_id', + 'LocationService.updateLocationBanner.LocationNotFound' => 'location :location_id not found on summit :summit_id', + 'LocationService.updateLocationBanner.BannerNotFound'=> 'banner :banner_id not found on location :location_id', ]; \ No newline at end of file