From 3a09bb577e0a6f610c7f96e6501e7b350a3ed713 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 11 Jul 2016 15:08:53 -0700 Subject: [PATCH] Create separate "Accept" and "Decline" transactions for Calendar Summary: Ref T9275. Currently, there's a single "invite" transaction type for managing Calendar invites, and it takes a map of invitees to status. This isn't great for EditEngine or API access, since it lets you set anyone else to any status and we can't reuse as much code as we can with a simpler API. Make "Accept" and "Decline" separate actions which affect the actor's invite, so "invite" can be a simpler transaction which just invites or uninvites people. Test Plan: - Joined/accepted/declined an event invitation. - Edited event invitees. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9275 Differential Revision: https://secure.phabricator.com/D16272 --- ...PhabricatorCalendarEventJoinController.php | 57 +++++++------------ .../editor/PhabricatorCalendarEventEditor.php | 40 +++++++++++++ .../PhabricatorCalendarEventTransaction.php | 21 +++++++ 3 files changed, 83 insertions(+), 35 deletions(-) diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php b/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php index d69a065f9b..b69dbe1bfd 100644 --- a/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php +++ b/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php @@ -3,18 +3,9 @@ final class PhabricatorCalendarEventJoinController extends PhabricatorCalendarController { - const ACTION_ACCEPT = 'accept'; - const ACTION_DECLINE = 'decline'; - const ACTION_JOIN = 'join'; - public function handleRequest(AphrontRequest $request) { + $viewer = $this->getViewer(); $id = $request->getURIData('id'); - $action = $request->getURIData('action'); - - $request = $this->getRequest(); - $viewer = $request->getViewer(); - $declined_status = PhabricatorCalendarEventInvitee::STATUS_DECLINED; - $attending_status = PhabricatorCalendarEventInvitee::STATUS_ATTENDING; $event = id(new PhabricatorCalendarEventQuery()) ->setViewer($viewer) @@ -25,34 +16,31 @@ final class PhabricatorCalendarEventJoinController } $cancel_uri = $event->getURI(); + + $action = $request->getURIData('action'); + switch ($action) { + case 'accept': + $is_join = true; + break; + case 'decline': + $is_join = false; + break; + default: + $is_join = !$event->getIsUserAttending($viewer->getPHID()); + break; + } + $validation_exception = null; - - $is_attending = $event->getIsUserAttending($viewer->getPHID()); - if ($request->isFormPost()) { - $new_status = null; - - switch ($action) { - case self::ACTION_ACCEPT: - $new_status = $attending_status; - break; - case self::ACTION_JOIN: - if ($is_attending) { - $new_status = $declined_status; - } else { - $new_status = $attending_status; - } - break; - case self::ACTION_DECLINE: - $new_status = $declined_status; - break; + if ($is_join) { + $xaction_type = PhabricatorCalendarEventTransaction::TYPE_ACCEPT; + } else { + $xaction_type = PhabricatorCalendarEventTransaction::TYPE_DECLINE; } - $new_status = array($viewer->getPHID() => $new_status); - $xaction = id(new PhabricatorCalendarEventTransaction()) - ->setTransactionType(PhabricatorCalendarEventTransaction::TYPE_INVITE) - ->setNewValue($new_status); + ->setTransactionType($xaction_type) + ->setNewValue(true); $editor = id(new PhabricatorCalendarEventEditor()) ->setActor($viewer) @@ -68,8 +56,7 @@ final class PhabricatorCalendarEventJoinController } } - if (($action == self::ACTION_JOIN && !$is_attending) - || $action == self::ACTION_ACCEPT) { + if ($is_join) { $title = pht('Join Event'); $paragraph = pht('Would you like to join this event?'); $submit = pht('Join'); diff --git a/src/applications/calendar/editor/PhabricatorCalendarEventEditor.php b/src/applications/calendar/editor/PhabricatorCalendarEventEditor.php index 5b46a42e7c..f632abca02 100644 --- a/src/applications/calendar/editor/PhabricatorCalendarEventEditor.php +++ b/src/applications/calendar/editor/PhabricatorCalendarEventEditor.php @@ -68,6 +68,8 @@ final class PhabricatorCalendarEventEditor $types[] = PhabricatorCalendarEventTransaction::TYPE_INVITE; $types[] = PhabricatorCalendarEventTransaction::TYPE_ALL_DAY; $types[] = PhabricatorCalendarEventTransaction::TYPE_ICON; + $types[] = PhabricatorCalendarEventTransaction::TYPE_ACCEPT; + $types[] = PhabricatorCalendarEventTransaction::TYPE_DECLINE; $types[] = PhabricatorCalendarEventTransaction::TYPE_RECURRING; $types[] = PhabricatorCalendarEventTransaction::TYPE_FREQUENCY; @@ -104,6 +106,10 @@ final class PhabricatorCalendarEventEditor return (int)$object->getIsAllDay(); case PhabricatorCalendarEventTransaction::TYPE_ICON: return $object->getIcon(); + case PhabricatorCalendarEventTransaction::TYPE_ACCEPT: + case PhabricatorCalendarEventTransaction::TYPE_DECLINE: + $actor_phid = $this->getActingAsPHID(); + return $object->getUserInviteStatus($actor_phid); case PhabricatorCalendarEventTransaction::TYPE_INVITE: $map = $xaction->getNewValue(); $phids = array_keys($map); @@ -136,6 +142,10 @@ final class PhabricatorCalendarEventEditor case PhabricatorCalendarEventTransaction::TYPE_INVITE: case PhabricatorCalendarEventTransaction::TYPE_ICON: return $xaction->getNewValue(); + case PhabricatorCalendarEventTransaction::TYPE_ACCEPT: + return PhabricatorCalendarEventInvitee::STATUS_ATTENDING; + case PhabricatorCalendarEventTransaction::TYPE_DECLINE: + return PhabricatorCalendarEventInvitee::STATUS_DECLINED; case PhabricatorCalendarEventTransaction::TYPE_ALL_DAY: return (int)$xaction->getNewValue(); case PhabricatorCalendarEventTransaction::TYPE_RECURRENCE_END_DATE: @@ -181,6 +191,8 @@ final class PhabricatorCalendarEventEditor $object->setIcon($xaction->getNewValue()); return; case PhabricatorCalendarEventTransaction::TYPE_INVITE: + case PhabricatorCalendarEventTransaction::TYPE_ACCEPT: + case PhabricatorCalendarEventTransaction::TYPE_DECLINE: return; } @@ -223,6 +235,28 @@ final class PhabricatorCalendarEventEditor } $object->attachInvitees($invitees); return; + case PhabricatorCalendarEventTransaction::TYPE_ACCEPT: + case PhabricatorCalendarEventTransaction::TYPE_DECLINE: + $acting_phid = $this->getActingAsPHID(); + + $invitees = $object->getInvitees(); + $invitees = mpull($invitees, null, 'getInviteePHID'); + + $invitee = idx($invitees, $acting_phid); + if (!$invitee) { + $invitee = id(new PhabricatorCalendarEventInvitee()) + ->setEventPHID($object->getPHID()) + ->setInviteePHID($acting_phid) + ->setInviterPHID($acting_phid); + $invitees[$acting_phid] = $invitee; + } + + $invitee + ->setStatus($xaction->getNewValue()) + ->save(); + + $object->attachInvitees($invitees); + return; } return parent::applyCustomExternalTransaction($object, $xaction); @@ -252,6 +286,12 @@ final class PhabricatorCalendarEventEditor // caches for all attendees. $invalidate_all = true; break; + + case PhabricatorCalendarEventTransaction::TYPE_ACCEPT: + case PhabricatorCalendarEventTransaction::TYPE_DECLINE: + $acting_phid = $this->getActingAsPHID(); + $invalidate_phids[$acting_phid] = $acting_phid; + break; case PhabricatorCalendarEventTransaction::TYPE_INVITE: foreach ($xaction->getNewValue() as $phid => $ignored) { $invalidate_phids[$phid] = $phid; diff --git a/src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php b/src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php index 573428d8bc..584c41e569 100644 --- a/src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php +++ b/src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php @@ -11,11 +11,14 @@ final class PhabricatorCalendarEventTransaction const TYPE_ALL_DAY = 'calendar.allday'; const TYPE_ICON = 'calendar.icon'; const TYPE_INVITE = 'calendar.invite'; + const TYPE_ACCEPT = 'calendar.accept'; + const TYPE_DECLINE = 'calendar.decline'; const TYPE_RECURRING = 'calendar.recurring'; const TYPE_FREQUENCY = 'calendar.frequency'; const TYPE_RECURRENCE_END_DATE = 'calendar.recurrenceenddate'; + const MAILTAG_RESCHEDULE = 'calendar-reschedule'; const MAILTAG_CONTENT = 'calendar-content'; const MAILTAG_OTHER = 'calendar-other'; @@ -163,6 +166,14 @@ final class PhabricatorCalendarEventTransaction '%s reinstated this event.', $this->renderHandleLink($author_phid)); } + case self::TYPE_ACCEPT: + return pht( + '%s is attending this event.', + $this->renderHandleLink($author_phid)); + case self::TYPE_DECLINE: + return pht( + '%s declined this event.', + $this->renderHandleLink($author_phid)); case self::TYPE_INVITE: $text = null; @@ -363,6 +374,16 @@ final class PhabricatorCalendarEventTransaction $this->renderHandleLink($author_phid), $this->renderHandleLink($object_phid)); } + case self::TYPE_ACCEPT: + return pht( + '%s is attending %s.', + $this->renderHandleLink($author_phid), + $this->renderHandleLink($object_phid)); + case self::TYPE_DECLINE: + return pht( + '%s declined %s.', + $this->renderHandleLink($author_phid), + $this->renderHandleLink($object_phid)); case self::TYPE_INVITE: $text = null;