Page MenuHomePhabricator

D18011.id.diff
No OneTemporary

D18011.id.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1601,6 +1601,7 @@
'MultimeterLabel' => 'applications/multimeter/storage/MultimeterLabel.php',
'MultimeterSampleController' => 'applications/multimeter/controller/MultimeterSampleController.php',
'MultimeterViewer' => 'applications/multimeter/storage/MultimeterViewer.php',
+ 'NuanceCommandImplementation' => 'applications/nuance/command/NuanceCommandImplementation.php',
'NuanceConduitAPIMethod' => 'applications/nuance/conduit/NuanceConduitAPIMethod.php',
'NuanceConsoleController' => 'applications/nuance/controller/NuanceConsoleController.php',
'NuanceContentSource' => 'applications/nuance/contentsource/NuanceContentSource.php',
@@ -1636,6 +1637,7 @@
'NuanceItemRequestorTransaction' => 'applications/nuance/xaction/NuanceItemRequestorTransaction.php',
'NuanceItemSearchEngine' => 'applications/nuance/query/NuanceItemSearchEngine.php',
'NuanceItemSourceTransaction' => 'applications/nuance/xaction/NuanceItemSourceTransaction.php',
+ 'NuanceItemStatusTransaction' => 'applications/nuance/xaction/NuanceItemStatusTransaction.php',
'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php',
'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php',
'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php',
@@ -1690,6 +1692,7 @@
'NuanceSourceTransactionType' => 'applications/nuance/xaction/NuanceSourceTransactionType.php',
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
+ 'NuanceTrashCommand' => 'applications/nuance/command/NuanceTrashCommand.php',
'NuanceWorker' => 'applications/nuance/worker/NuanceWorker.php',
'OwnersConduitAPIMethod' => 'applications/owners/conduit/OwnersConduitAPIMethod.php',
'OwnersEditConduitAPIMethod' => 'applications/owners/conduit/OwnersEditConduitAPIMethod.php',
@@ -6714,6 +6717,7 @@
'MultimeterLabel' => 'MultimeterDimension',
'MultimeterSampleController' => 'MultimeterController',
'MultimeterViewer' => 'MultimeterDimension',
+ 'NuanceCommandImplementation' => 'Phobject',
'NuanceConduitAPIMethod' => 'ConduitAPIMethod',
'NuanceConsoleController' => 'NuanceController',
'NuanceContentSource' => 'PhabricatorContentSource',
@@ -6759,6 +6763,7 @@
'NuanceItemRequestorTransaction' => 'NuanceItemTransactionType',
'NuanceItemSearchEngine' => 'PhabricatorApplicationSearchEngine',
'NuanceItemSourceTransaction' => 'NuanceItemTransactionType',
+ 'NuanceItemStatusTransaction' => 'NuanceItemTransactionType',
'NuanceItemTransaction' => 'NuanceTransaction',
'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment',
'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
@@ -6822,6 +6827,7 @@
'NuanceSourceTransactionType' => 'PhabricatorModularTransactionType',
'NuanceSourceViewController' => 'NuanceSourceController',
'NuanceTransaction' => 'PhabricatorModularTransaction',
+ 'NuanceTrashCommand' => 'NuanceCommandImplementation',
'NuanceWorker' => 'PhabricatorWorker',
'OwnersConduitAPIMethod' => 'ConduitAPIMethod',
'OwnersEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
diff --git a/src/applications/nuance/command/NuanceCommandImplementation.php b/src/applications/nuance/command/NuanceCommandImplementation.php
new file mode 100644
--- /dev/null
+++ b/src/applications/nuance/command/NuanceCommandImplementation.php
@@ -0,0 +1,107 @@
+<?php
+
+abstract class NuanceCommandImplementation
+ extends Phobject {
+
+ private $actor;
+
+ private $transactionQueue = array();
+
+ final public function setActor(PhabricatorUser $actor) {
+ $this->actor = $actor;
+ return $this;
+ }
+
+ final public function getActor() {
+ return $this->actor;
+ }
+
+ abstract public function getCommandName();
+ abstract public function canApplyToItem(NuanceItem $item);
+
+ abstract protected function executeCommand(
+ NuanceItem $item,
+ NuanceItemCommand $command);
+
+ final public function applyCommand(
+ NuanceItem $item,
+ NuanceItemCommand $command) {
+
+ $command_key = $command->getCommand();
+ $implementation_key = $this->getCommandKey();
+ if ($command_key !== $implementation_key) {
+ throw new Exception(
+ pht(
+ 'This command implementation("%s") can not apply a command of a '.
+ 'different type ("%s").',
+ $implementation_key,
+ $command_key));
+ }
+
+ if (!$this->canApplyToItem($item)) {
+ throw new Exception(
+ pht(
+ 'This command implementation ("%s") can not be applied to an '.
+ 'item of type "%s".',
+ $implementation_key,
+ $item->getItemType()));
+ }
+
+ $this->transactionQueue = array();
+
+ $command_type = NuanceItemCommandTransaction::TRANSACTIONTYPE;
+ $command_xaction = $this->newTransaction($command_type);
+
+ $result = $this->executeCommand($item, $command);
+
+ $xactions = $this->transactionQueue;
+ $this->transactionQueue = array();
+
+ $command_xaction->setNewValue(
+ array(
+ 'command' => $command->getCommand(),
+ 'parameters' => $command->getParameters(),
+ 'result' => $result,
+ ));
+
+ // TODO: Maybe preserve the actor's original content source?
+ $source = PhabricatorContentSource::newForSource(
+ PhabricatorDaemonContentSource::SOURCECONST);
+
+ $actor = $this->getActor();
+
+ id(new NuanceItemEditor())
+ ->setActor($actor)
+ ->setActingAsPHID($command->getAuthorPHID())
+ ->setContentSource($source)
+ ->setContinueOnMissingFields(true)
+ ->setContinueOnNoEffect(true)
+ ->applyTransactions($item, $xactions);
+ }
+
+ final public function getCommandKey() {
+ return $this->getPhobjectClassConstant('COMMANDKEY');
+ }
+
+ final public static function getAllCommands() {
+ return id(new PhutilClassMapQuery())
+ ->setAncestorClass(__CLASS__)
+ ->setUniqueMethod('getCommandKey')
+ ->execute();
+ }
+
+ protected function newTransaction($type) {
+ $xaction = id(new NuanceItemTransaction())
+ ->setTransactionType($type);
+
+ $this->transactionQueue[] = $xaction;
+
+ return $xaction;
+ }
+
+ protected function newStatusTransaction($status) {
+ return $this->newTransaction(NuanceItemStatusTransaction::TRANSACTIONTYPE)
+ ->setNewValue($status);
+ }
+
+}
diff --git a/src/applications/nuance/command/NuanceTrashCommand.php b/src/applications/nuance/command/NuanceTrashCommand.php
new file mode 100644
--- /dev/null
+++ b/src/applications/nuance/command/NuanceTrashCommand.php
@@ -0,0 +1,23 @@
+<?php
+
+final class NuanceTrashCommand
+ extends NuanceCommandImplementation {
+
+ const COMMANDKEY = 'trash';
+
+ public function getCommandName() {
+ return pht('Throw in Trash');
+ }
+
+ public function canApplyToItem(NuanceItem $item) {
+ $type = $item->getImplementation();
+ return ($type instanceof NuanceFormItemType);
+ }
+
+ protected function executeCommand(
+ NuanceItem $item,
+ NuanceItemCommand $command) {
+ $this->newStatusTransaction(NuanceItem::STATUS_CLOSED);
+ }
+
+}
diff --git a/src/applications/nuance/item/NuanceGitHubEventItemType.php b/src/applications/nuance/item/NuanceGitHubEventItemType.php
--- a/src/applications/nuance/item/NuanceGitHubEventItemType.php
+++ b/src/applications/nuance/item/NuanceGitHubEventItemType.php
@@ -329,6 +329,9 @@
NuanceItem $item,
NuanceItemCommand $command) {
+ // TODO: This code is no longer reachable, and has moved to
+ // CommandImplementation subclasses.
+
$action = $command->getCommand();
switch ($action) {
case 'sync':
diff --git a/src/applications/nuance/item/NuanceItemType.php b/src/applications/nuance/item/NuanceItemType.php
--- a/src/applications/nuance/item/NuanceItemType.php
+++ b/src/applications/nuance/item/NuanceItemType.php
@@ -106,46 +106,6 @@
return $this->newWorkCommands($item);
}
- final public function applyCommand(
- NuanceItem $item,
- NuanceItemCommand $command) {
-
- $result = $this->handleCommand($item, $command);
-
- if ($result === null) {
- return;
- }
-
- $xaction = id(new NuanceItemTransaction())
- ->setTransactionType(NuanceItemCommandTransaction::TRANSACTIONTYPE)
- ->setNewValue(
- array(
- 'command' => $command->getCommand(),
- 'parameters' => $command->getParameters(),
- 'result' => $result,
- ));
-
- $viewer = $this->getViewer();
-
- // TODO: Maybe preserve the actor's original content source?
- $source = PhabricatorContentSource::newForSource(
- PhabricatorDaemonContentSource::SOURCECONST);
-
- $editor = id(new NuanceItemEditor())
- ->setActor($viewer)
- ->setActingAsPHID($command->getAuthorPHID())
- ->setContentSource($source)
- ->setContinueOnMissingFields(true)
- ->setContinueOnNoEffect(true)
- ->applyTransactions($item, array($xaction));
- }
-
- protected function handleCommand(
- NuanceItem $item,
- NuanceItemCommand $command) {
- return null;
- }
-
final protected function newContentSource(
NuanceItem $item,
$agent_phid) {
diff --git a/src/applications/nuance/storage/NuanceItem.php b/src/applications/nuance/storage/NuanceItem.php
--- a/src/applications/nuance/storage/NuanceItem.php
+++ b/src/applications/nuance/storage/NuanceItem.php
@@ -9,7 +9,6 @@
const STATUS_IMPORTING = 'importing';
const STATUS_ROUTING = 'routing';
const STATUS_OPEN = 'open';
- const STATUS_ASSIGNED = 'assigned';
const STATUS_CLOSED = 'closed';
protected $status;
diff --git a/src/applications/nuance/worker/NuanceItemUpdateWorker.php b/src/applications/nuance/worker/NuanceItemUpdateWorker.php
--- a/src/applications/nuance/worker/NuanceItemUpdateWorker.php
+++ b/src/applications/nuance/worker/NuanceItemUpdateWorker.php
@@ -68,13 +68,29 @@
->execute();
$commands = msort($commands, 'getID');
+ $executors = NuanceCommandImplementation::getAllCommands();
foreach ($commands as $command) {
$command
->setStatus(NuanceItemCommand::STATUS_EXECUTING)
->save();
try {
- $impl->applyCommand($item, $command);
+ $command_key = $command->getCommand();
+
+ $executor = idx($executors, $command_key);
+ if (!$executor) {
+ throw new Exception(
+ pht(
+ 'Unable to execute command "%s": this command does not have '.
+ 'a recognized command implementation.',
+ $command_key));
+ }
+
+ $executor = clone $executor;
+
+ $executor
+ ->setActor($viewer)
+ ->applyCommand($item, $command);
$command
->setStatus(NuanceItemCommand::STATUS_DONE)
diff --git a/src/applications/nuance/xaction/NuanceItemCommandTransaction.php b/src/applications/nuance/xaction/NuanceItemCommandTransaction.php
--- a/src/applications/nuance/xaction/NuanceItemCommandTransaction.php
+++ b/src/applications/nuance/xaction/NuanceItemCommandTransaction.php
@@ -9,14 +9,14 @@
return null;
}
- public function applyInternalEffects($object, $value) {
- // TODO: Probably implement this.
- }
-
public function getTitle() {
+ $spec = $this->getNewValue();
+ $command_key = idx($spec, 'command', '???');
+
return pht(
- '%s applied a command to this item.',
- $this->renderAuthor());
+ '%s applied a "%s" command to this item.',
+ $this->renderAuthor(),
+ $command_key);
}
}
diff --git a/src/applications/nuance/xaction/NuanceItemStatusTransaction.php b/src/applications/nuance/xaction/NuanceItemStatusTransaction.php
new file mode 100644
--- /dev/null
+++ b/src/applications/nuance/xaction/NuanceItemStatusTransaction.php
@@ -0,0 +1,25 @@
+<?php
+
+final class NuanceItemStatusTransaction
+ extends NuanceItemTransactionType {
+
+ const TRANSACTIONTYPE = 'nuance.item.status';
+
+ public function generateOldValue($object) {
+ return $object->getStatus();
+ }
+
+ public function applyInternalEffects($object, $value) {
+ $object->setStatus($value);
+ }
+
+ public function getTitle() {
+ return pht(
+ '%s changed the status of this item from %s to %s.',
+ $this->renderAuthor(),
+ $this->renderOldValue(),
+ $this->renderNewValue());
+ }
+
+
+}

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 10, 9:01 PM (3 d, 13 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7472328
Default Alt Text
D18011.id.diff (12 KB)

Event Timeline