diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php b/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php --- 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 @@ } $cancel_uri = $event->getURI(); - $validation_exception = null; - $is_attending = $event->getIsUserAttending($viewer->getPHID()); + $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; 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 @@ } } - 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 --- a/src/applications/calendar/editor/PhabricatorCalendarEventEditor.php +++ b/src/applications/calendar/editor/PhabricatorCalendarEventEditor.php @@ -68,6 +68,8 @@ $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 @@ 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 @@ 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 @@ $object->setIcon($xaction->getNewValue()); return; case PhabricatorCalendarEventTransaction::TYPE_INVITE: + case PhabricatorCalendarEventTransaction::TYPE_ACCEPT: + case PhabricatorCalendarEventTransaction::TYPE_DECLINE: return; } @@ -223,6 +235,28 @@ } $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 @@ // 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 --- a/src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php +++ b/src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php @@ -11,11 +11,14 @@ 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 @@ '%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 @@ $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;