mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-30 01:10:58 +01:00
Lift common code for transaction-based reply handlers into parent class
Summary: Ref T7199. Essentially all of the reply handlers now apply transactions to something which implements PhabricatorApplicationTransactionInterface. We can share code between them by lifting this stuff into a superclass. First, convert paste. Also rename `PasteMockMailReceiver` to `PasteMailReceiver` (this got mis-copied from Pholio at some point, I think). Test Plan: Used `bin/mail receive-test` to send comments + `!unsubscribe` to pastes. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7199 Differential Revision: https://secure.phabricator.com/D12236
This commit is contained in:
parent
afd86a0420
commit
161f936871
4 changed files with 105 additions and 43 deletions
|
@ -1248,7 +1248,7 @@ phutil_register_library_map(array(
|
||||||
'PasteDefaultViewCapability' => 'applications/paste/capability/PasteDefaultViewCapability.php',
|
'PasteDefaultViewCapability' => 'applications/paste/capability/PasteDefaultViewCapability.php',
|
||||||
'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php',
|
'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php',
|
||||||
'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php',
|
'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php',
|
||||||
'PasteMockMailReceiver' => 'applications/paste/mail/PasteMockMailReceiver.php',
|
'PasteMailReceiver' => 'applications/paste/mail/PasteMailReceiver.php',
|
||||||
'PasteQueryConduitAPIMethod' => 'applications/paste/conduit/PasteQueryConduitAPIMethod.php',
|
'PasteQueryConduitAPIMethod' => 'applications/paste/conduit/PasteQueryConduitAPIMethod.php',
|
||||||
'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.php',
|
'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.php',
|
||||||
'PeopleBrowseUserDirectoryCapability' => 'applications/people/capability/PeopleBrowseUserDirectoryCapability.php',
|
'PeopleBrowseUserDirectoryCapability' => 'applications/people/capability/PeopleBrowseUserDirectoryCapability.php',
|
||||||
|
@ -1310,6 +1310,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorApplicationTransactionNoEffectException' => 'applications/transactions/exception/PhabricatorApplicationTransactionNoEffectException.php',
|
'PhabricatorApplicationTransactionNoEffectException' => 'applications/transactions/exception/PhabricatorApplicationTransactionNoEffectException.php',
|
||||||
'PhabricatorApplicationTransactionNoEffectResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionNoEffectResponse.php',
|
'PhabricatorApplicationTransactionNoEffectResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionNoEffectResponse.php',
|
||||||
'PhabricatorApplicationTransactionQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionQuery.php',
|
'PhabricatorApplicationTransactionQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionQuery.php',
|
||||||
|
'PhabricatorApplicationTransactionReplyHandler' => 'applications/transactions/replyhandler/PhabricatorApplicationTransactionReplyHandler.php',
|
||||||
'PhabricatorApplicationTransactionResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionResponse.php',
|
'PhabricatorApplicationTransactionResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionResponse.php',
|
||||||
'PhabricatorApplicationTransactionShowOlderController' => 'applications/transactions/controller/PhabricatorApplicationTransactionShowOlderController.php',
|
'PhabricatorApplicationTransactionShowOlderController' => 'applications/transactions/controller/PhabricatorApplicationTransactionShowOlderController.php',
|
||||||
'PhabricatorApplicationTransactionStructureException' => 'applications/transactions/exception/PhabricatorApplicationTransactionStructureException.php',
|
'PhabricatorApplicationTransactionStructureException' => 'applications/transactions/exception/PhabricatorApplicationTransactionStructureException.php',
|
||||||
|
@ -4512,9 +4513,9 @@ phutil_register_library_map(array(
|
||||||
'PasteDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
'PasteDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
||||||
'PasteEmbedView' => 'AphrontView',
|
'PasteEmbedView' => 'AphrontView',
|
||||||
'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod',
|
'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod',
|
||||||
'PasteMockMailReceiver' => 'PhabricatorObjectMailReceiver',
|
'PasteMailReceiver' => 'PhabricatorObjectMailReceiver',
|
||||||
'PasteQueryConduitAPIMethod' => 'PasteConduitAPIMethod',
|
'PasteQueryConduitAPIMethod' => 'PasteConduitAPIMethod',
|
||||||
'PasteReplyHandler' => 'PhabricatorMailReplyHandler',
|
'PasteReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
||||||
'PeopleBrowseUserDirectoryCapability' => 'PhabricatorPolicyCapability',
|
'PeopleBrowseUserDirectoryCapability' => 'PhabricatorPolicyCapability',
|
||||||
'PeopleCreateUsersCapability' => 'PhabricatorPolicyCapability',
|
'PeopleCreateUsersCapability' => 'PhabricatorPolicyCapability',
|
||||||
'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
||||||
|
@ -4579,6 +4580,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorApplicationTransactionNoEffectException' => 'Exception',
|
'PhabricatorApplicationTransactionNoEffectException' => 'Exception',
|
||||||
'PhabricatorApplicationTransactionNoEffectResponse' => 'AphrontProxyResponse',
|
'PhabricatorApplicationTransactionNoEffectResponse' => 'AphrontProxyResponse',
|
||||||
'PhabricatorApplicationTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhabricatorApplicationTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
|
'PhabricatorApplicationTransactionReplyHandler' => 'PhabricatorMailReplyHandler',
|
||||||
'PhabricatorApplicationTransactionResponse' => 'AphrontProxyResponse',
|
'PhabricatorApplicationTransactionResponse' => 'AphrontProxyResponse',
|
||||||
'PhabricatorApplicationTransactionShowOlderController' => 'PhabricatorApplicationTransactionController',
|
'PhabricatorApplicationTransactionShowOlderController' => 'PhabricatorApplicationTransactionController',
|
||||||
'PhabricatorApplicationTransactionStructureException' => 'Exception',
|
'PhabricatorApplicationTransactionStructureException' => 'Exception',
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
final class PasteMockMailReceiver extends PhabricatorObjectMailReceiver {
|
final class PasteMailReceiver extends PhabricatorObjectMailReceiver {
|
||||||
|
|
||||||
public function isEnabled() {
|
public function isEnabled() {
|
||||||
$app_class = 'PhabricatorPasteApplication';
|
$app_class = 'PhabricatorPasteApplication';
|
|
@ -1,6 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
final class PasteReplyHandler extends PhabricatorMailReplyHandler {
|
final class PasteReplyHandler
|
||||||
|
extends PhabricatorApplicationTransactionReplyHandler {
|
||||||
|
|
||||||
public function validateMailReceiver($mail_receiver) {
|
public function validateMailReceiver($mail_receiver) {
|
||||||
if (!($mail_receiver instanceof PhabricatorPaste)) {
|
if (!($mail_receiver instanceof PhabricatorPaste)) {
|
||||||
|
@ -8,35 +9,14 @@ final class PasteReplyHandler extends PhabricatorMailReplyHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPrivateReplyHandlerEmailAddress(
|
public function getObjectPrefix() {
|
||||||
PhabricatorObjectHandle $handle) {
|
return 'P';
|
||||||
return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'P');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPublicReplyHandlerEmailAddress() {
|
protected function processMailCommands(array $commands) {
|
||||||
return $this->getDefaultPublicReplyHandlerEmailAddress('P');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) {
|
|
||||||
$actor = $this->getActor();
|
$actor = $this->getActor();
|
||||||
$paste = $this->getMailReceiver();
|
|
||||||
|
|
||||||
$body_data = $mail->parseBody();
|
|
||||||
$body = $body_data['body'];
|
|
||||||
$body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments());
|
|
||||||
|
|
||||||
$content_source = PhabricatorContentSource::newForSource(
|
|
||||||
PhabricatorContentSource::SOURCE_EMAIL,
|
|
||||||
array(
|
|
||||||
'id' => $mail->getID(),
|
|
||||||
));
|
|
||||||
|
|
||||||
$lines = explode("\n", trim($body));
|
|
||||||
$first_line = head($lines);
|
|
||||||
|
|
||||||
$xactions = array();
|
$xactions = array();
|
||||||
|
|
||||||
$commands = $body_data['commands'];
|
|
||||||
foreach ($commands as $command) {
|
foreach ($commands as $command) {
|
||||||
switch (head($command)) {
|
switch (head($command)) {
|
||||||
case 'unsubscribe':
|
case 'unsubscribe':
|
||||||
|
@ -48,19 +28,7 @@ final class PasteReplyHandler extends PhabricatorMailReplyHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$xactions[] = id(new PhabricatorPasteTransaction())
|
return $xactions;
|
||||||
->setTransactionType(PhabricatorTransactions::TYPE_COMMENT)
|
|
||||||
->attachComment(
|
|
||||||
id(new PhabricatorPasteTransactionComment())
|
|
||||||
->setContent($body));
|
|
||||||
|
|
||||||
$editor = id(new PhabricatorPasteEditor())
|
|
||||||
->setActor($actor)
|
|
||||||
->setContentSource($content_source)
|
|
||||||
->setContinueOnNoEffect(true)
|
|
||||||
->setIsPreview(false);
|
|
||||||
|
|
||||||
$editor->applyTransactions($paste, $xactions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
abstract class PhabricatorApplicationTransactionReplyHandler
|
||||||
|
extends PhabricatorMailReplyHandler {
|
||||||
|
|
||||||
|
abstract public function getObjectPrefix();
|
||||||
|
|
||||||
|
public function getPrivateReplyHandlerEmailAddress(
|
||||||
|
PhabricatorObjectHandle $handle) {
|
||||||
|
return $this->getDefaultPrivateReplyHandlerEmailAddress(
|
||||||
|
$handle,
|
||||||
|
$this->getObjectPrefix());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicReplyHandlerEmailAddress() {
|
||||||
|
return $this->getDefaultPublicReplyHandlerEmailAddress(
|
||||||
|
$this->getObjectPrefix());
|
||||||
|
}
|
||||||
|
|
||||||
|
private function newEditor(PhabricatorMetaMTAReceivedMail $mail) {
|
||||||
|
$content_source = PhabricatorContentSource::newForSource(
|
||||||
|
PhabricatorContentSource::SOURCE_EMAIL,
|
||||||
|
array(
|
||||||
|
'id' => $mail->getID(),
|
||||||
|
));
|
||||||
|
|
||||||
|
$editor = $this->getMailReceiver()
|
||||||
|
->getApplicationTransactionEditor()
|
||||||
|
->setActor($this->getActor())
|
||||||
|
->setContentSource($content_source)
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
|
->setParentMessageID($mail->getMessageID())
|
||||||
|
->setExcludeMailRecipientPHIDs($this->getExcludeMailRecipientPHIDs());
|
||||||
|
|
||||||
|
if ($this->getApplicationEmail()) {
|
||||||
|
$editor->setApplicationEmail($this->getApplicationEmail());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function newTransaction() {
|
||||||
|
return $this->getMailReceiver()->getApplicationTransactionTemplate();
|
||||||
|
}
|
||||||
|
|
||||||
|
final protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) {
|
||||||
|
$viewer = $this->getActor();
|
||||||
|
$object = $this->getMailReceiver();
|
||||||
|
|
||||||
|
$body_data = $mail->parseBody();
|
||||||
|
|
||||||
|
$xactions = $this->processMailCommands($body_data['commands']);
|
||||||
|
|
||||||
|
// If this object is subscribable, subscribe all the users who were
|
||||||
|
// CC'd on the message.
|
||||||
|
if ($object instanceof PhabricatorSubscribableInterface) {
|
||||||
|
$subscriber_phids = $mail->loadCCPHIDs();
|
||||||
|
if ($subscriber_phids) {
|
||||||
|
$xactions[] = $this->newTransaction()
|
||||||
|
->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS)
|
||||||
|
->setNewValue(
|
||||||
|
array(
|
||||||
|
'+' => array($viewer->getPHID()),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$body = $body_data['body'];
|
||||||
|
$body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments());
|
||||||
|
|
||||||
|
$comment = $this
|
||||||
|
->newTransaction()
|
||||||
|
->getApplicationTransactionCommentObject()
|
||||||
|
->setContent($body);
|
||||||
|
|
||||||
|
$xactions[] = $this->newTransaction()
|
||||||
|
->setTransactionType(PhabricatorTransactions::TYPE_COMMENT)
|
||||||
|
->attachComment($comment);
|
||||||
|
|
||||||
|
$target = $object->getApplicationTransactionObject();
|
||||||
|
|
||||||
|
$this->newEditor($mail)
|
||||||
|
->setContinueOnNoEffect(true)
|
||||||
|
->applyTransactions($target, $xactions);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function processMailCommands(array $commands) {
|
||||||
|
// TODO: Modularize this.
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue