diff --git a/src/applications/differential/controller/subscribe/DifferentialSubscribeController.php b/src/applications/differential/controller/subscribe/DifferentialSubscribeController.php index 9c5f06f97d..cd39209b78 100644 --- a/src/applications/differential/controller/subscribe/DifferentialSubscribeController.php +++ b/src/applications/differential/controller/subscribe/DifferentialSubscribeController.php @@ -37,8 +37,6 @@ class DifferentialSubscribeController extends DifferentialController { } if (!$request->isFormPost()) { - // TODO: This dialog is silly but we're CSRF-able otherwise. - $dialog = new AphrontDialogView(); switch ($this->action) { @@ -74,28 +72,16 @@ class DifferentialSubscribeController extends DifferentialController { switch ($this->action) { case 'add': - DifferentialRevisionEditor::addCC( + DifferentialRevisionEditor::addCCAndUpdateRevision( $revision, $phid, $phid); - $unsubscribed = $revision->getUnsubscribed(); - if (isset($unsubscribed[$phid])) { - unset($unsubscribed[$phid]); - $revision->setUnsubscribed($unsubscribed); - $revision->save(); - } break; case 'rem': - DifferentialRevisionEditor::removeCC( + DifferentialRevisionEditor::removeCCAndUpdateRevision( $revision, - $user->getPHID(), - $user->getPHID()); - $unsubscribed = $revision->getUnsubscribed(); - if (empty($unsubscribed[$phid])) { - $unsubscribed[$phid] = true; - $revision->setUnsubscribed($unsubscribed); - $revision->save(); - } + $phid, + $phid); break; default: return new Aphront400Response(); diff --git a/src/applications/differential/editor/revision/DifferentialRevisionEditor.php b/src/applications/differential/editor/revision/DifferentialRevisionEditor.php index 3e19e25d44..c97bed4404 100644 --- a/src/applications/differential/editor/revision/DifferentialRevisionEditor.php +++ b/src/applications/differential/editor/revision/DifferentialRevisionEditor.php @@ -416,6 +416,36 @@ class DifferentialRevisionEditor { } } + public static function addCCAndUpdateRevision( + $revision, + $phid, + $reason) { + + self::addCC($revision, $phid, $reason); + + $unsubscribed = $revision->getUnsubscribed(); + if (isset($unsubscribed[$phid])) { + unset($unsubscribed[$phid]); + $revision->setUnsubscribed($unsubscribed); + $revision->save(); + } + } + + public static function removeCCAndUpdateRevision( + $revision, + $phid, + $reason) { + + self::removeCC($revision, $phid, $reason); + + $unsubscribed = $revision->getUnsubscribed(); + if (empty($unsubscribed[$phid])) { + $unsubscribed[$phid] = true; + $revision->setUnsubscribed($unsubscribed); + $revision->save(); + } + } + public static function addCC( DifferentialRevision $revision, $phid, diff --git a/src/applications/differential/replyhandler/DifferentialReplyHandler.php b/src/applications/differential/replyhandler/DifferentialReplyHandler.php index 37e1bc60d6..df0e11077a 100644 --- a/src/applications/differential/replyhandler/DifferentialReplyHandler.php +++ b/src/applications/differential/replyhandler/DifferentialReplyHandler.php @@ -89,6 +89,7 @@ class DifferentialReplyHandler extends PhabricatorMailReplyHandler { DifferentialAction::ACTION_RECLAIM, DifferentialAction::ACTION_RESIGN, DifferentialAction::ACTION_RETHINK, + 'unsubscribe', ); } @@ -114,6 +115,13 @@ class DifferentialReplyHandler extends PhabricatorMailReplyHandler { throw new Exception('No actor is set for the reply action.'); } + switch ($command) { + case 'unsubscribe': + $this->unsubscribeUser($this->getMailReceiver(), $actor); + // TODO: Send the user a confirmation email? + return null; + } + try { $editor = new DifferentialCommentEditor( $this->getMailReceiver(), @@ -139,4 +147,16 @@ class DifferentialReplyHandler extends PhabricatorMailReplyHandler { } } + private function unsubscribeUser( + DifferentialRevision $revision, + PhabricatorUser $user) { + + $revision->loadRelationships(); + DifferentialRevisionEditor::removeCCAndUpdateRevision( + $revision, + $user->getPHID(), + $user->getPHID()); + } + + } diff --git a/src/applications/differential/replyhandler/__init__.php b/src/applications/differential/replyhandler/__init__.php index ada5f63ba5..c857d47389 100644 --- a/src/applications/differential/replyhandler/__init__.php +++ b/src/applications/differential/replyhandler/__init__.php @@ -8,6 +8,7 @@ phutil_require_module('phabricator', 'applications/differential/constants/action'); phutil_require_module('phabricator', 'applications/differential/editor/comment'); +phutil_require_module('phabricator', 'applications/differential/editor/revision'); phutil_require_module('phabricator', 'applications/differential/mail/exception'); phutil_require_module('phabricator', 'applications/metamta/replyhandler/base'); phutil_require_module('phabricator', 'infrastructure/env');