Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15341963
D18011.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Referenced Files
None
Subscribers
None
D18011.id.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D18011: Make throwing things into the trash actually work in Nuance
Attached
Detach File
Event Timeline
Log In to Comment