diff --git a/.gitignore b/.gitignore index 9641a20e..cd396b39 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ storage/* *.log routes.txt /storage/logs/ +/ss.sql diff --git a/app/Events/SummitVenueRoomDeleted.php b/app/Events/SummitVenueRoomDeleted.php new file mode 100644 index 00000000..250557e5 --- /dev/null +++ b/app/Events/SummitVenueRoomDeleted.php @@ -0,0 +1,22 @@ +getCurrentUserExternalId(); if(is_null($owner_id)) $owner_id = 0; - $request = new AdminSummitLocationActionSyncWorkRequest(); - $location = $location_repository->getById($event->getLocationId()); + $request = new AdminSummitLocationActionSyncWorkRequest; - $request->setLocation($location); + $request->setLocationId($event->getLocationId()); $request->setType($type); diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index 0a12c725..1bf233ce 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -1367,4 +1367,29 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController return $this->error500($ex); } } + + public function deleteVenueRoom($summit_id, $venue_id, $room_id){ + try { + + $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $this->location_service->deleteVenueRoom($summit, $venue_id, $room_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); + } + } } \ No newline at end of file diff --git a/app/Http/routes.php b/app/Http/routes.php index 1fc785d6..319c875d 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -296,6 +296,7 @@ Route::group([ Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@addVenueRoom']); Route::group(['prefix' => '{room_id}'], function () { Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@updateVenueRoom']); + Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@deleteVenueRoom']); }); }); diff --git a/app/Models/Foundation/Main/SummitMemberFavorite.php b/app/Models/Foundation/Main/SummitMemberFavorite.php index 30d8e7c5..cb17d70d 100644 --- a/app/Models/Foundation/Main/SummitMemberFavorite.php +++ b/app/Models/Foundation/Main/SummitMemberFavorite.php @@ -11,12 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - use App\Models\Utils\BaseEntity; use Doctrine\ORM\Mapping AS ORM; use models\summit\SummitEvent; - - /** * @ORM\Entity * @ORM\Table(name="Member_FavoriteSummitEvents") @@ -66,14 +63,14 @@ final class SummitMemberFavorite extends BaseEntity /** * @ORM\ManyToOne(targetEntity="Member", inversedBy="favorites") - * @ORM\JoinColumn(name="MemberID", referencedColumnName="ID") + * @ORM\JoinColumn(name="MemberID", referencedColumnName="ID", onDelete="CASCADE") * @var Member */ private $member; /** * @ORM\ManyToOne(targetEntity="models\summit\SummitEvent") - * @ORM\JoinColumn(name="SummitEventID", referencedColumnName="ID") + * @ORM\JoinColumn(name="SummitEventID", referencedColumnName="ID", onDelete="CASCADE") * @var SummitEvent */ private $event; diff --git a/app/Models/Foundation/Main/SummitMemberSchedule.php b/app/Models/Foundation/Main/SummitMemberSchedule.php index 67542ab4..71f199b6 100644 --- a/app/Models/Foundation/Main/SummitMemberSchedule.php +++ b/app/Models/Foundation/Main/SummitMemberSchedule.php @@ -26,14 +26,14 @@ final class SummitMemberSchedule extends BaseEntity /** * @ORM\ManyToOne(targetEntity="Member", inversedBy="schedule") - * @ORM\JoinColumn(name="MemberID", referencedColumnName="ID") + * @ORM\JoinColumn(name="MemberID", referencedColumnName="ID", onDelete="CASCADE") * @var Member */ private $member; /** * @ORM\ManyToOne(targetEntity="models\summit\SummitEvent") - * @ORM\JoinColumn(name="SummitEventID", referencedColumnName="ID") + * @ORM\JoinColumn(name="SummitEventID", referencedColumnName="ID", onDelete="CASCADE") * @var SummitEvent */ private $event; diff --git a/app/Models/Foundation/Summit/CalendarSync/CalendarSyncInfo.php b/app/Models/Foundation/Summit/CalendarSync/CalendarSyncInfo.php index ae726ebd..d2f4f3d2 100644 --- a/app/Models/Foundation/Summit/CalendarSync/CalendarSyncInfo.php +++ b/app/Models/Foundation/Summit/CalendarSync/CalendarSyncInfo.php @@ -80,7 +80,7 @@ class CalendarSyncInfo extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="models\main\Member", inversedBy="calendars_sync") - * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID") + * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID", onDelete="CASCADE") * @var Member */ protected $owner; diff --git a/app/Models/Foundation/Summit/CalendarSync/ScheduleCalendarSyncInfo.php b/app/Models/Foundation/Summit/CalendarSync/ScheduleCalendarSyncInfo.php index 610b3986..24f168d1 100644 --- a/app/Models/Foundation/Summit/CalendarSync/ScheduleCalendarSyncInfo.php +++ b/app/Models/Foundation/Summit/CalendarSync/ScheduleCalendarSyncInfo.php @@ -11,13 +11,12 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - use Doctrine\ORM\Mapping AS ORM; use models\main\Member; use models\summit\SummitAbstractLocation; use models\summit\SummitEvent; +use models\summit\SummitVenueRoom; use models\utils\SilverstripeBaseModel; - /** * @ORM\Entity(repositoryClass="App\Repositories\Summit\DoctrineScheduleCalendarSyncInfoRepository") * @ORM\Table(name="ScheduleCalendarSyncInfo") @@ -28,7 +27,7 @@ class ScheduleCalendarSyncInfo extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="models\main\Member", inversedBy="schedule_sync_info") - * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID", nullable=true ) + * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID", nullable=true, onDelete="CASCADE") * @var Member */ private $member; @@ -79,11 +78,10 @@ class ScheduleCalendarSyncInfo extends SilverstripeBaseModel } /** - * @ORM\ManyToOne(targetEntity="models\summit\SummitAbstractLocation") - * @ORM\JoinColumn(name="LocationID", referencedColumnName="ID") - * @var SummitAbstractLocation + * @ORM\Column(name="LocationID", type="integer") + * @var int */ - private $location; + private $location_id; /** * @ORM\Column(name="ExternalId", type="string") @@ -243,19 +241,26 @@ class ScheduleCalendarSyncInfo extends SilverstripeBaseModel } /** - * @return mixed + * @return SummitAbstractLocation */ public function getLocation() { - return $this->location; + $id = $this->location_id; + try { + $location = $this->getEM()->find(SummitAbstractLocation::class, $id); + } + catch(\Exception $ex){ + return null; + } + return $location; } /** - * @param mixed $location + * @param int location_id */ - public function setLocation($location) + public function setLocationId($location_id) { - $this->location = $location; + $this->location_id = $location_id; } /** diff --git a/app/Models/Foundation/Summit/CalendarSync/WorkQueue/AdminSummitLocationActionSyncWorkRequest.php b/app/Models/Foundation/Summit/CalendarSync/WorkQueue/AdminSummitLocationActionSyncWorkRequest.php index 289b78ff..d841ff0f 100644 --- a/app/Models/Foundation/Summit/CalendarSync/WorkQueue/AdminSummitLocationActionSyncWorkRequest.php +++ b/app/Models/Foundation/Summit/CalendarSync/WorkQueue/AdminSummitLocationActionSyncWorkRequest.php @@ -23,19 +23,26 @@ final class AdminSummitLocationActionSyncWorkRequest extends AdminScheduleSummitActionSyncWorkRequest { const SubType = 'ADMIN_LOCATION'; + /** - * @ORM\ManyToOne(targetEntity="models\summit\SummitAbstractLocation", cascade={"persist"}) - * @ORM\JoinColumn(name="LocationID", referencedColumnName="ID") - * @var SummitAbstractLocation + * @ORM\Column(name="LocationID", type="integer") + * @var int */ - private $location; + private $location_id; /** * @return SummitAbstractLocation */ public function getLocation() { - return $this->location; + $id = $this->location_id; + try { + $location = $this->getEM()->find(SummitAbstractLocation::class, $id); + } + catch(\Exception $ex){ + return null; + } + return $location; } /** @@ -43,19 +50,14 @@ extends AdminScheduleSummitActionSyncWorkRequest */ public function getLocationId() { - try{ - return is_null($this->location) ? 0 : $this->location->getId(); - } - catch (\Exception $ex){ - return 0; - } + return $this->location_id; } /** - * @param SummitAbstractLocation $location + * @param int $location_id */ - public function setLocation($location) + public function setLocationId($location_id) { - $this->location = $location; + $this->location_id = $location_id; } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php b/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php index cf04bd01..b9809e28 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php +++ b/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php @@ -39,7 +39,7 @@ abstract class PresentationMaterial extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="models\summit\Presentation", inversedBy="materials") - * @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID") + * @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID", onDelete="CASCADE") * @var Presentation */ protected $presentation; diff --git a/app/Models/Foundation/Summit/Events/Presentations/Presentation.php b/app/Models/Foundation/Summit/Events/Presentations/Presentation.php index 1e12ef77..54376a60 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/Presentation.php +++ b/app/Models/Foundation/Summit/Events/Presentations/Presentation.php @@ -111,7 +111,7 @@ class Presentation extends SummitEvent /** * @ORM\ManyToOne(targetEntity="PresentationSpeaker", inversedBy="moderated_presentations") - * @ORM\JoinColumn(name="ModeratorID", referencedColumnName="ID") + * @ORM\JoinColumn(name="ModeratorID", referencedColumnName="ID", onDelete="SET NULL") * @var PresentationSpeaker */ private $moderator; @@ -126,10 +126,10 @@ class Presentation extends SummitEvent * @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", inversedBy="presentations") * @ORM\JoinTable(name="Presentation_Speakers", * joinColumns={ - * @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID") + * @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID", onDelete="CASCADE") * }, * inverseJoinColumns={ - * @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID") + * @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID", onDelete="CASCADE") * * } * ) diff --git a/app/Models/Foundation/Summit/Events/RSVP/RSVP.php b/app/Models/Foundation/Summit/Events/RSVP/RSVP.php index 909a0e24..1651b8d8 100644 --- a/app/Models/Foundation/Summit/Events/RSVP/RSVP.php +++ b/app/Models/Foundation/Summit/Events/RSVP/RSVP.php @@ -32,14 +32,14 @@ class RSVP extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="models\main\Member", inversedBy="rsvp", fetch="LAZY") - * @ORM\JoinColumn(name="SubmittedByID", referencedColumnName="ID") + * @ORM\JoinColumn(name="SubmittedByID", referencedColumnName="ID", onDelete="CASCADE") * @var Member */ private $owner; /** * @ORM\ManyToOne(targetEntity="models\summit\SummitEvent", inversedBy="rsvp", fetch="LAZY") - * @ORM\JoinColumn(name="EventID", referencedColumnName="ID") + * @ORM\JoinColumn(name="EventID", referencedColumnName="ID", onDelete="CASCADE") * @var SummitEvent */ private $event; diff --git a/app/Models/Foundation/Summit/Events/RSVP/RSVPAnswer.php b/app/Models/Foundation/Summit/Events/RSVP/RSVPAnswer.php index da40a334..cef24ff7 100644 --- a/app/Models/Foundation/Summit/Events/RSVP/RSVPAnswer.php +++ b/app/Models/Foundation/Summit/Events/RSVP/RSVPAnswer.php @@ -26,7 +26,7 @@ class RSVPAnswer extends SilverstripeBaseModel { /** * @ORM\ManyToOne(targetEntity="models\summit\RSVP", inversedBy="answers", fetch="LAZY") - * @ORM\JoinColumn(name="RSVPID", referencedColumnName="ID") + * @ORM\JoinColumn(name="RSVPID", referencedColumnName="ID", onDelete="CASCADE") * @var SummitAttendee */ private $rsvp; diff --git a/app/Models/Foundation/Summit/Events/SummitEvent.php b/app/Models/Foundation/Summit/Events/SummitEvent.php index 3530d918..4cbb9b2d 100644 --- a/app/Models/Foundation/Summit/Events/SummitEvent.php +++ b/app/Models/Foundation/Summit/Events/SummitEvent.php @@ -108,7 +108,7 @@ class SummitEvent extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate", fetch="EXTRA_LAZY") - * @ORM\JoinColumn(name="RSVPTemplateID", referencedColumnName="ID") + * @ORM\JoinColumn(name="RSVPTemplateID", referencedColumnName="ID", onDelete="SET NULL") * @var RSVPTemplate */ protected $rsvp_template; @@ -121,21 +121,21 @@ class SummitEvent extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="PresentationCategory", fetch="EXTRA_LAZY") - * @ORM\JoinColumn(name="CategoryID", referencedColumnName="ID") + * @ORM\JoinColumn(name="CategoryID", referencedColumnName="ID", onDelete="SET NULL") * @var PresentationCategory */ protected $category = null; /** * @ORM\ManyToOne(targetEntity="SummitEventType", fetch="EXTRA_LAZY") - * @ORM\JoinColumn(name="TypeID", referencedColumnName="ID") + * @ORM\JoinColumn(name="TypeID", referencedColumnName="ID", onDelete="SET NULL") * @var SummitEventType */ protected $type; /** * @ORM\ManyToOne(targetEntity="SummitAbstractLocation", fetch="EXTRA_LAZY") - * @ORM\JoinColumn(name="LocationID", referencedColumnName="ID") + * @ORM\JoinColumn(name="LocationID", referencedColumnName="ID", onDelete="SET NULL") * @var SummitAbstractLocation */ protected $location = null; @@ -143,8 +143,8 @@ class SummitEvent extends SilverstripeBaseModel /** * @ORM\ManyToMany(targetEntity="models\main\Company", inversedBy="sponsorships", fetch="EXTRA_LAZY") * @ORM\JoinTable(name="SummitEvent_Sponsors", - * joinColumns={@ORM\JoinColumn(name="SummitEventID", referencedColumnName="ID")}, - * inverseJoinColumns={@ORM\JoinColumn(name="CompanyID", referencedColumnName="ID")} + * joinColumns={@ORM\JoinColumn(name="SummitEventID", referencedColumnName="ID", onDelete="CASCADE")}, + * inverseJoinColumns={@ORM\JoinColumn(name="CompanyID", referencedColumnName="ID", onDelete="CASCADE")} * ) */ protected $sponsors; diff --git a/app/Models/Foundation/Summit/Events/SummitEventFeedback.php b/app/Models/Foundation/Summit/Events/SummitEventFeedback.php index e3c828c5..52ba2c05 100644 --- a/app/Models/Foundation/Summit/Events/SummitEventFeedback.php +++ b/app/Models/Foundation/Summit/Events/SummitEventFeedback.php @@ -73,7 +73,7 @@ class SummitEventFeedback extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="models\main\Member", inversedBy="feedback") - * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID") + * @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID", onDelete="CASCADE") * @var Member */ private $owner; @@ -95,7 +95,7 @@ class SummitEventFeedback extends SilverstripeBaseModel /** * @ORM\ManyToOne(targetEntity="models\summit\SummitEvent", inversedBy="feedback", fetch="LAZY") - * @ORM\JoinColumn(name="EventID", referencedColumnName="ID") + * @ORM\JoinColumn(name="EventID", referencedColumnName="ID", onDelete="CASCADE") * @var SummitEvent */ private $event; diff --git a/app/Models/Foundation/Summit/Locations/SummitVenue.php b/app/Models/Foundation/Summit/Locations/SummitVenue.php index 7c2771f7..4d2dbfdf 100644 --- a/app/Models/Foundation/Summit/Locations/SummitVenue.php +++ b/app/Models/Foundation/Summit/Locations/SummitVenue.php @@ -183,7 +183,7 @@ class SummitVenue extends SummitGeoLocatedLocation $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('name', trim($floor_name))); $floor = $this->floors->matching($criteria)->first(); - return $floor === false ? null:$floor; + return $floor === false ? null : $floor; } /** @@ -203,8 +203,17 @@ class SummitVenue extends SummitGeoLocatedLocation */ public function removeFloor(SummitVenueFloor $floor){ $this->floors->removeElement($floor); - $floor->setVenue(null); + $floor->clearVenue(); return $this; } + /** + * @param SummitVenueRoom $room + * @return $this + */ + public function removeRoom(SummitVenueRoom $room){ + $this->rooms->removeElement($room); + $room->clearVenue(); + return $this; + } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Locations/SummitVenueFloor.php b/app/Models/Foundation/Summit/Locations/SummitVenueFloor.php index e2a441d7..786e519f 100644 --- a/app/Models/Foundation/Summit/Locations/SummitVenueFloor.php +++ b/app/Models/Foundation/Summit/Locations/SummitVenueFloor.php @@ -159,13 +159,17 @@ class SummitVenueFloor extends SilverstripeBaseModel } /** - * @param SummitVenue $venue + * @param SummitVenue|null $venue */ public function setVenue($venue) { $this->venue = $venue; } + public function clearVenue(){ + $this->venue = null; + } + /** * @param File $image */ @@ -182,6 +186,14 @@ class SummitVenueFloor extends SilverstripeBaseModel $room->setFloor($this); } + /** + * @param SummitVenueRoom $room + */ + public function removeRoom(SummitVenueRoom $room){ + $this->rooms->removeElement($room); + $room->clearFloor(); + } + /** * @param SummitVenueRoom $room * @param int $new_order diff --git a/app/Models/Foundation/Summit/Locations/SummitVenueRoom.php b/app/Models/Foundation/Summit/Locations/SummitVenueRoom.php index ddf197ab..bff5fc6c 100644 --- a/app/Models/Foundation/Summit/Locations/SummitVenueRoom.php +++ b/app/Models/Foundation/Summit/Locations/SummitVenueRoom.php @@ -191,13 +191,21 @@ class SummitVenueRoom extends SummitAbstractLocation } /** - * @param SummitVenue $venue + * @param SummitVenue|null $venue */ public function setVenue(SummitVenue $venue) { $this->venue = $venue; } + public function clearVenue(){ + $this->venue = null; + } + + public function clearFloor(){ + $this->floor = null; + } + /** * @param SummitVenueFloor $floor */ diff --git a/app/Models/Foundation/Summit/Repositories/IScheduleCalendarSyncInfoRepository.php b/app/Models/Foundation/Summit/Repositories/IScheduleCalendarSyncInfoRepository.php index 67550e78..42a26d2c 100644 --- a/app/Models/Foundation/Summit/Repositories/IScheduleCalendarSyncInfoRepository.php +++ b/app/Models/Foundation/Summit/Repositories/IScheduleCalendarSyncInfoRepository.php @@ -11,11 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - use models\utils\IBaseRepository; use utils\PagingInfo; use utils\PagingResponse; - /** * Interface IScheduleCalendarSyncInfoRepository * @package models\summit @@ -30,10 +28,10 @@ interface IScheduleCalendarSyncInfoRepository extends IBaseRepository public function getAllBySummitEvent($summit_event_id, PagingInfo $paging_info); /** - * @param SummitAbstractLocation $location + * @param int $location_id * @param PagingInfo $paging_info * @return PagingResponse */ - public function getAllBySummitLocation(SummitAbstractLocation $location, PagingInfo $paging_info); + public function getAllBySummitLocation($location_id, PagingInfo $paging_info); } \ No newline at end of file diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 26b0235a..c8aff1ad 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -194,6 +194,18 @@ final class EventServiceProvider extends ServiceProvider } }); + Event::listen(\App\Events\SummitVenueRoomDeleted::class, function($event) + { + EntityEventPersister::persist(LocationActionEntityEventFactory::build($event, 'DELETE')); + $published_events = $event->getRelatedEventIds(); + if(count($published_events) > 0){ + AdminSummitLocationActionSyncWorkRequestPersister::persist + ( + AdminSummitLocationActionSyncWorkRequestFactory::build($event, 'REMOVE') + ); + } + }); + Event::listen(\App\Events\LocationInserted::class, function($event) { EntityEventPersister::persist(LocationActionEntityEventFactory::build($event, 'INSERT')); diff --git a/app/Repositories/Summit/DoctrineScheduleCalendarSyncInfoRepository.php b/app/Repositories/Summit/DoctrineScheduleCalendarSyncInfoRepository.php index 291492ba..3a3b8d81 100644 --- a/app/Repositories/Summit/DoctrineScheduleCalendarSyncInfoRepository.php +++ b/app/Repositories/Summit/DoctrineScheduleCalendarSyncInfoRepository.php @@ -12,18 +12,14 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Tools\Pagination\Paginator; use models\summit\IScheduleCalendarSyncInfoRepository; -use models\summit\SummitAbstractLocation; -use models\summit\SummitEvent; use models\summit\CalendarSync\ScheduleCalendarSyncInfo; use models\summit\SummitEventFeedback; use App\Repositories\SilverStripeDoctrineRepository; use utils\PagingInfo; use utils\PagingResponse; - /** * Class DoctrineScheduleCalendarSyncInfoRepository * @package App\Repositories\Summit @@ -72,21 +68,21 @@ final class DoctrineScheduleCalendarSyncInfoRepository } /** - * @param SummitAbstractLocation $location + * @param int $location_id * @param PagingInfo $paging_info * @return PagingResponse */ - public function getAllBySummitLocation(SummitAbstractLocation $location, PagingInfo $paging_info) + public function getAllBySummitLocation($location_id, PagingInfo $paging_info) { $query = $this->getEntityManager() ->createQueryBuilder() ->select("si") ->from(ScheduleCalendarSyncInfo::class, "si") - ->join('si.location', 'l', Join::WITH, " l.id = :location_id") - ->join('si.calendar_sync_info', 'ci', Join::WITH, " ci.revoked = :crendential_status") + ->join('si.calendar_sync_info', 'ci', Join::WITH, " ci.revoked = :credential_status") + ->where("si.location_id = :location_id") ->orderBy('si.id', 'ASC') - ->setParameter('location_id', $location->getId()) - ->setParameter('crendential_status',false); + ->setParameter('location_id', $location_id) + ->setParameter('credential_status',false); $query= $query ->setFirstResult($paging_info->getOffset()) @@ -114,6 +110,6 @@ final class DoctrineScheduleCalendarSyncInfoRepository */ protected function getBaseEntity() { - return SummitEventFeedback::class; + return ScheduleCalendarSyncInfo::class; } } \ No newline at end of file diff --git a/app/Services/Apis/CalendarSync/GoogleCalendarSyncRemoteFacade.php b/app/Services/Apis/CalendarSync/GoogleCalendarSyncRemoteFacade.php index b7b58157..c85ed8cd 100644 --- a/app/Services/Apis/CalendarSync/GoogleCalendarSyncRemoteFacade.php +++ b/app/Services/Apis/CalendarSync/GoogleCalendarSyncRemoteFacade.php @@ -107,7 +107,7 @@ final class GoogleCalendarSyncRemoteFacade // relationships $sync_info->setSummitEventId($summit_event->getId()); $sync_info->setCalendarSyncInfo($this->sync_calendar_info); - $sync_info->setLocation($summit_event->getLocation()); + $sync_info->setLocationId($summit_event->getLocationId()); return $sync_info; } catch(Google_Service_Exception $ex1){ @@ -236,7 +236,7 @@ final class GoogleCalendarSyncRemoteFacade // primitives $schedule_sync_info->setEtag($updated_event->getEtag()); // relationships - $schedule_sync_info->setLocation($summit_event->getLocation()); + $schedule_sync_info->setLocationId($summit_event->getLocationId()); return true; } diff --git a/app/Services/Apis/CalendarSync/ICloudCalendarSyncRemoteFacade.php b/app/Services/Apis/CalendarSync/ICloudCalendarSyncRemoteFacade.php index 516e9605..14c8a6a9 100644 --- a/app/Services/Apis/CalendarSync/ICloudCalendarSyncRemoteFacade.php +++ b/app/Services/Apis/CalendarSync/ICloudCalendarSyncRemoteFacade.php @@ -165,7 +165,7 @@ final class ICloudCalendarSyncRemoteFacade // relationships $sync_info->setSummitEventId($summit_event->getId()); $sync_info->setCalendarSyncInfo($this->sync_calendar_info); - $sync_info->setLocation($summit_event->getLocation()); + $sync_info->setLocationId($summit_event->getLocationId()); return $sync_info; } @@ -207,7 +207,7 @@ final class ICloudCalendarSyncRemoteFacade $schedule_sync_info->setEtag($etag); $schedule_sync_info->setVCard($vcard); // relationships - $schedule_sync_info->setLocation($summit_event->getLocation()); + $schedule_sync_info->setLocationId($summit_event->getLocationId()); return true; } catch (Exception $ex){ diff --git a/app/Services/Apis/CalendarSync/OutlookCalendarSyncRemoteFacade.php b/app/Services/Apis/CalendarSync/OutlookCalendarSyncRemoteFacade.php index 35780f3d..f8912a55 100644 --- a/app/Services/Apis/CalendarSync/OutlookCalendarSyncRemoteFacade.php +++ b/app/Services/Apis/CalendarSync/OutlookCalendarSyncRemoteFacade.php @@ -11,7 +11,6 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - use models\summit\CalendarSync\CalendarSyncInfo; use models\summit\CalendarSync\CalendarSyncInfoOAuth2; use models\summit\CalendarSync\ScheduleCalendarSyncInfo; @@ -164,7 +163,7 @@ final class OutlookCalendarSyncRemoteFacade // relationships $sync_info->setSummitEventId($summit_event->getId()); $sync_info->setCalendarSyncInfo($this->sync_calendar_info); - $sync_info->setLocation($summit_event->getLocation()); + $sync_info->setLocationId($summit_event->getLocationId()); return $sync_info; } catch (Exception $ex){ @@ -214,7 +213,7 @@ final class OutlookCalendarSyncRemoteFacade // primitives $schedule_sync_info->setEtag($updated_event->getEtag()); // relationships - $schedule_sync_info->setLocation($summit_event->getLocation()); + $schedule_sync_info->setLocationId($summit_event->getLocationId()); return true; } catch (Exception $ex){ diff --git a/app/Services/Model/AdminActionsCalendarSyncProcessingService.php b/app/Services/Model/AdminActionsCalendarSyncProcessingService.php index 336c554c..429a3645 100644 --- a/app/Services/Model/AdminActionsCalendarSyncProcessingService.php +++ b/app/Services/Model/AdminActionsCalendarSyncProcessingService.php @@ -126,18 +126,17 @@ final class AdminActionsCalendarSyncProcessingService } if($request instanceof AdminSummitLocationActionSyncWorkRequest){ - $location = $request->getLocation(); - $page = 1; + $location_id = $request->getLocationId(); + $page = 1; do{ - $page_response = $this->schedule_sync_repository->getAllBySummitLocation($location, new PagingInfo($page, 1000)); + $page_response = $this->schedule_sync_repository->getAllBySummitLocation($location_id, new PagingInfo($page, 1000)); $has_more = count($page_response->getItems()) > 0; if(!$has_more) continue; foreach ($page_response->getItems() as $schedule_event){ if(!$schedule_event instanceof ScheduleCalendarSyncInfo) continue; $work_request = new MemberEventScheduleSummitActionSyncWorkRequest(); - // always is update no matter what - $work_request->setType(AbstractCalendarSyncWorkRequest::TypeUpdate); + $work_request->setType($request->getType()); $work_request->setCalendarSyncInfo($schedule_event->getCalendarSyncInfo()); $work_request->setOwner($schedule_event->getMember()); $work_request->setSummitEventId($schedule_event->getSummitEvent()->getId()); diff --git a/app/Services/Model/AdminScheduleWorkQueueManager.php b/app/Services/Model/AdminScheduleWorkQueueManager.php index a3976486..b99c6415 100644 --- a/app/Services/Model/AdminScheduleWorkQueueManager.php +++ b/app/Services/Model/AdminScheduleWorkQueueManager.php @@ -39,7 +39,7 @@ implements ICalendarSyncWorkRequestQueueManager $event_id = $request->getSummitEventId(); } if($request instanceof AdminSummitLocationActionSyncWorkRequest){ - $location_id = $request->getLocation()->getId(); + $location_id = $request->getLocationId(); } return $this->generateKey($request->getType(), $event_id, $location_id); } diff --git a/app/Services/Model/ILocationService.php b/app/Services/Model/ILocationService.php index 8b0764c9..7638f5cc 100644 --- a/app/Services/Model/ILocationService.php +++ b/app/Services/Model/ILocationService.php @@ -82,6 +82,16 @@ interface ILocationService */ public function deleteVenueFloor(Summit $summit, $venue_id, $floor_id); + /** + * @param Summit $summit + * @param int $venue_id + * @param int $room_id + * @return void + * @throws EntityNotFoundException + * @throws ValidationException + */ + public function deleteVenueRoom(Summit $summit, $venue_id, $room_id); + /** * @param Summit $summit * @param $venue_id @@ -103,13 +113,4 @@ interface ILocationService */ public function updateVenueRoom(Summit $summit, $venue_id, $room_id, array $payload); - /** - * @param Summit $summit - * @param int $venue_id - * @param int $room_id - * @return void - * @throws EntityNotFoundException - * @throws ValidationException - */ - public function deleteVenueRoom(Summit $summit, $venue_id, $room_id); } \ No newline at end of file diff --git a/app/Services/Model/LocationService.php b/app/Services/Model/LocationService.php index df9aad8f..36bb7400 100644 --- a/app/Services/Model/LocationService.php +++ b/app/Services/Model/LocationService.php @@ -18,6 +18,7 @@ use App\Events\FloorUpdated; use App\Events\LocationDeleted; use App\Events\LocationInserted; use App\Events\LocationUpdated; +use App\Events\SummitVenueRoomDeleted; use App\Events\SummitVenueRoomInserted; use App\Events\SummitVenueRoomUpdated; use App\Models\Foundation\Summit\Factories\SummitLocationFactory; @@ -33,7 +34,10 @@ use models\exceptions\EntityNotFoundException; use models\exceptions\ValidationException; use models\summit\Summit; use models\summit\SummitAbstractLocation; +use models\summit\SummitAirport; +use models\summit\SummitExternalLocation; use models\summit\SummitGeoLocatedLocation; +use models\summit\SummitHotel; use models\summit\SummitVenue; use models\summit\SummitVenueFloor; use models\summit\SummitVenueRoom; @@ -294,6 +298,22 @@ final class LocationService implements ILocationService ); } + if (!($location instanceof SummitVenue + || $location instanceof SummitHotel + || $location instanceof SummitAirport + || $location instanceof SummitExternalLocation)) { + throw new EntityNotFoundException( + trans + ( + 'validation_errors.LocationService.deleteLocation.LocationNotFoundOnSummit', + [ + 'summit_id' => $summit->getId(), + 'location_id' => $location_id, + ] + ) + ); + } + Event::fire(new LocationDeleted ( $location->getSummitId(), @@ -848,6 +868,72 @@ final class LocationService implements ILocationService */ public function deleteVenueRoom(Summit $summit, $venue_id, $room_id) { - // TODO: Implement deleteVenueRoom() method. + return $this->tx_service->transaction(function () use ($summit, $venue_id, $room_id) { + + $venue = $summit->getLocation($venue_id); + + if(is_null($venue)){ + throw new EntityNotFoundException + ( + trans + ( + 'not_found_errors.LocationService.deleteVenueRoom.VenueNotFound', + [ + 'summit_id' => $summit->getId(), + 'venue_id' => $venue_id, + ] + ) + ); + } + + if(!$venue instanceof SummitVenue){ + throw new EntityNotFoundException + ( + trans + ( + 'not_found_errors.LocationService.deleteVenueRoom.VenueNotFound', + [ + 'summit_id' => $summit->getId(), + 'venue_id' => $venue_id, + ] + ) + ); + } + + $room = $venue->getRoom($room_id); + + if(is_null($room)){ + throw new EntityNotFoundException + ( + trans + ( + 'not_found_errors.LocationService.deleteVenueRoom.RoomNotFound', + [ + 'room_id' => $room_id, + 'venue_id' => $venue_id + ] + ) + ); + } + + $venue->removeRoom($room); + + if($room->hasFloor()) + { + $floor = $room->getFloor(); + $floor->removeRoom($room); + } + + Event::fire + ( + new SummitVenueRoomDeleted + ( + $room->getSummitId(), + $room->getId(), + 'SummitVenueRoom', + $summit->getScheduleEventsIdsPerLocation($room) + ) + ); + }); } } \ No newline at end of file diff --git a/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestDeleteStrategy.php b/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestDeleteStrategy.php index 0d2b56c3..377bb4cd 100644 --- a/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestDeleteStrategy.php +++ b/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestDeleteStrategy.php @@ -57,8 +57,7 @@ final class AdminSummitLocationActionSyncWorkRequestDeleteStrategy public function process(AbstractCalendarSyncWorkRequest $request) { if(!$request instanceof AdminSummitLocationActionSyncWorkRequest) return null; - $location = $request->getLocation(); - $pending_requests = $this->queue_manager->getSummitLocationRequestFor($location->getId()); + $pending_requests = $this->queue_manager->getSummitLocationRequestFor($request->getLocationId()); if(count($pending_requests) > 0 ){ // delete all former and pending ... foreach ($pending_requests as $pending_request) { diff --git a/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestUpdateStrategy.php b/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestUpdateStrategy.php index 4eb3c1c2..96f00bbf 100644 --- a/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestUpdateStrategy.php +++ b/app/Services/Model/Strategies/AdminActions/AdminSummitLocationActionSyncWorkRequestUpdateStrategy.php @@ -58,8 +58,7 @@ final class AdminSummitLocationActionSyncWorkRequestUpdateStrategy public function process(AbstractCalendarSyncWorkRequest $request) { if(!$request instanceof AdminSummitLocationActionSyncWorkRequest) return null; - $location = $request->getLocation(); - $pending_requests = $this->queue_manager->getSummitLocationRequestFor($location->getId()); + $pending_requests = $this->queue_manager->getSummitLocationRequestFor($request->getLocationId()); if(count($pending_requests) > 0 ){ // delete all former and pending ... foreach ($pending_requests as $pending_request) { diff --git a/app/Services/Model/SummitService.php b/app/Services/Model/SummitService.php index e3cf0f10..68206bd7 100644 --- a/app/Services/Model/SummitService.php +++ b/app/Services/Model/SummitService.php @@ -961,7 +961,6 @@ final class SummitService implements ISummitService */ public function unPublishEvent(Summit $summit, $event_id) { - return $this->tx_service->transaction(function () use ($summit, $event_id) { $event = $this->event_repository->getById($event_id); @@ -973,8 +972,7 @@ final class SummitService implements ISummitService throw new ValidationException(sprintf("event %s does not belongs to summit id %s", $event_id, $summit->getIdentifier())); $event->unPublish(); - $this->event_repository->add($event); - $this->event_repository->cleanupScheduleAndFavoritesForEvent($event_id); + return $event; }); } @@ -998,8 +996,6 @@ final class SummitService implements ISummitService throw new ValidationException(sprintf("event %s does not belongs to summit id %s", $event_id, $summit->getIdentifier())); $this->event_repository->delete($event); - // clean up summit attendees schedule - $this->event_repository->cleanupScheduleAndFavoritesForEvent($event_id); return true; }); diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 6fc86602..b5251bd8 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -563,6 +563,15 @@ class ApiEndpointsSeeder extends Seeder sprintf(SummitScopes::WriteLocationsData, $current_realm) ], ], + [ + 'name' => 'delete-venue-room', + 'route' => '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + 'http_method' => 'DELETE', + 'scopes' => [ + sprintf(SummitScopes::WriteSummitData, $current_realm), + sprintf(SummitScopes::WriteLocationsData, $current_realm) + ], + ], [ 'name' => 'add-venue-floor-room', 'route' => '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms', diff --git a/tests/OAuth2SummitLocationsApiTest.php b/tests/OAuth2SummitLocationsApiTest.php index 28ea1964..61804bfa 100644 --- a/tests/OAuth2SummitLocationsApiTest.php +++ b/tests/OAuth2SummitLocationsApiTest.php @@ -944,4 +944,36 @@ final class OAuth2SummitLocationsApiTest extends ProtectedApiTest $this->assertTrue(!is_null($room)); return $room; } + + /** + * @param int $summit_id + * @param int $venue_id + * @return mixed + */ + public function testDeleteExistentRoom($summit_id = 23, $venue_id = 292, $room_id = 307){ + + $params = [ + 'id' => $summit_id, + 'venue_id' => $venue_id, + 'room_id' => 333 + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "DELETE", + "OAuth2SummitLocationsApiController@deleteVenueRoom", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(204); + } } \ No newline at end of file