mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-01 19:22:42 +01:00
Make throwing things into the trash actually work in Nuance
Summary: Ref T12738. Implements some modular behavior for Nuance commands. Test Plan: {F4975322} Reviewers: chad Reviewed By: chad Maniphest Tasks: T12738 Differential Revision: https://secure.phabricator.com/D18011
This commit is contained in:
parent
7e91f42b02
commit
8374ec46fd
9 changed files with 187 additions and 48 deletions
|
@ -1601,6 +1601,7 @@ phutil_register_library_map(array(
|
||||||
'MultimeterLabel' => 'applications/multimeter/storage/MultimeterLabel.php',
|
'MultimeterLabel' => 'applications/multimeter/storage/MultimeterLabel.php',
|
||||||
'MultimeterSampleController' => 'applications/multimeter/controller/MultimeterSampleController.php',
|
'MultimeterSampleController' => 'applications/multimeter/controller/MultimeterSampleController.php',
|
||||||
'MultimeterViewer' => 'applications/multimeter/storage/MultimeterViewer.php',
|
'MultimeterViewer' => 'applications/multimeter/storage/MultimeterViewer.php',
|
||||||
|
'NuanceCommandImplementation' => 'applications/nuance/command/NuanceCommandImplementation.php',
|
||||||
'NuanceConduitAPIMethod' => 'applications/nuance/conduit/NuanceConduitAPIMethod.php',
|
'NuanceConduitAPIMethod' => 'applications/nuance/conduit/NuanceConduitAPIMethod.php',
|
||||||
'NuanceConsoleController' => 'applications/nuance/controller/NuanceConsoleController.php',
|
'NuanceConsoleController' => 'applications/nuance/controller/NuanceConsoleController.php',
|
||||||
'NuanceContentSource' => 'applications/nuance/contentsource/NuanceContentSource.php',
|
'NuanceContentSource' => 'applications/nuance/contentsource/NuanceContentSource.php',
|
||||||
|
@ -1636,6 +1637,7 @@ phutil_register_library_map(array(
|
||||||
'NuanceItemRequestorTransaction' => 'applications/nuance/xaction/NuanceItemRequestorTransaction.php',
|
'NuanceItemRequestorTransaction' => 'applications/nuance/xaction/NuanceItemRequestorTransaction.php',
|
||||||
'NuanceItemSearchEngine' => 'applications/nuance/query/NuanceItemSearchEngine.php',
|
'NuanceItemSearchEngine' => 'applications/nuance/query/NuanceItemSearchEngine.php',
|
||||||
'NuanceItemSourceTransaction' => 'applications/nuance/xaction/NuanceItemSourceTransaction.php',
|
'NuanceItemSourceTransaction' => 'applications/nuance/xaction/NuanceItemSourceTransaction.php',
|
||||||
|
'NuanceItemStatusTransaction' => 'applications/nuance/xaction/NuanceItemStatusTransaction.php',
|
||||||
'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php',
|
'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php',
|
||||||
'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php',
|
'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php',
|
||||||
'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php',
|
'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php',
|
||||||
|
@ -1690,6 +1692,7 @@ phutil_register_library_map(array(
|
||||||
'NuanceSourceTransactionType' => 'applications/nuance/xaction/NuanceSourceTransactionType.php',
|
'NuanceSourceTransactionType' => 'applications/nuance/xaction/NuanceSourceTransactionType.php',
|
||||||
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
|
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
|
||||||
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
|
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
|
||||||
|
'NuanceTrashCommand' => 'applications/nuance/command/NuanceTrashCommand.php',
|
||||||
'NuanceWorker' => 'applications/nuance/worker/NuanceWorker.php',
|
'NuanceWorker' => 'applications/nuance/worker/NuanceWorker.php',
|
||||||
'OwnersConduitAPIMethod' => 'applications/owners/conduit/OwnersConduitAPIMethod.php',
|
'OwnersConduitAPIMethod' => 'applications/owners/conduit/OwnersConduitAPIMethod.php',
|
||||||
'OwnersEditConduitAPIMethod' => 'applications/owners/conduit/OwnersEditConduitAPIMethod.php',
|
'OwnersEditConduitAPIMethod' => 'applications/owners/conduit/OwnersEditConduitAPIMethod.php',
|
||||||
|
@ -6714,6 +6717,7 @@ phutil_register_library_map(array(
|
||||||
'MultimeterLabel' => 'MultimeterDimension',
|
'MultimeterLabel' => 'MultimeterDimension',
|
||||||
'MultimeterSampleController' => 'MultimeterController',
|
'MultimeterSampleController' => 'MultimeterController',
|
||||||
'MultimeterViewer' => 'MultimeterDimension',
|
'MultimeterViewer' => 'MultimeterDimension',
|
||||||
|
'NuanceCommandImplementation' => 'Phobject',
|
||||||
'NuanceConduitAPIMethod' => 'ConduitAPIMethod',
|
'NuanceConduitAPIMethod' => 'ConduitAPIMethod',
|
||||||
'NuanceConsoleController' => 'NuanceController',
|
'NuanceConsoleController' => 'NuanceController',
|
||||||
'NuanceContentSource' => 'PhabricatorContentSource',
|
'NuanceContentSource' => 'PhabricatorContentSource',
|
||||||
|
@ -6759,6 +6763,7 @@ phutil_register_library_map(array(
|
||||||
'NuanceItemRequestorTransaction' => 'NuanceItemTransactionType',
|
'NuanceItemRequestorTransaction' => 'NuanceItemTransactionType',
|
||||||
'NuanceItemSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
'NuanceItemSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||||
'NuanceItemSourceTransaction' => 'NuanceItemTransactionType',
|
'NuanceItemSourceTransaction' => 'NuanceItemTransactionType',
|
||||||
|
'NuanceItemStatusTransaction' => 'NuanceItemTransactionType',
|
||||||
'NuanceItemTransaction' => 'NuanceTransaction',
|
'NuanceItemTransaction' => 'NuanceTransaction',
|
||||||
'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
||||||
'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||||
|
@ -6822,6 +6827,7 @@ phutil_register_library_map(array(
|
||||||
'NuanceSourceTransactionType' => 'PhabricatorModularTransactionType',
|
'NuanceSourceTransactionType' => 'PhabricatorModularTransactionType',
|
||||||
'NuanceSourceViewController' => 'NuanceSourceController',
|
'NuanceSourceViewController' => 'NuanceSourceController',
|
||||||
'NuanceTransaction' => 'PhabricatorModularTransaction',
|
'NuanceTransaction' => 'PhabricatorModularTransaction',
|
||||||
|
'NuanceTrashCommand' => 'NuanceCommandImplementation',
|
||||||
'NuanceWorker' => 'PhabricatorWorker',
|
'NuanceWorker' => 'PhabricatorWorker',
|
||||||
'OwnersConduitAPIMethod' => 'ConduitAPIMethod',
|
'OwnersConduitAPIMethod' => 'ConduitAPIMethod',
|
||||||
'OwnersEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
'OwnersEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
||||||
|
|
107
src/applications/nuance/command/NuanceCommandImplementation.php
Normal file
107
src/applications/nuance/command/NuanceCommandImplementation.php
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
23
src/applications/nuance/command/NuanceTrashCommand.php
Normal file
23
src/applications/nuance/command/NuanceTrashCommand.php
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -329,6 +329,9 @@ final class NuanceGitHubEventItemType
|
||||||
NuanceItem $item,
|
NuanceItem $item,
|
||||||
NuanceItemCommand $command) {
|
NuanceItemCommand $command) {
|
||||||
|
|
||||||
|
// TODO: This code is no longer reachable, and has moved to
|
||||||
|
// CommandImplementation subclasses.
|
||||||
|
|
||||||
$action = $command->getCommand();
|
$action = $command->getCommand();
|
||||||
switch ($action) {
|
switch ($action) {
|
||||||
case 'sync':
|
case 'sync':
|
||||||
|
|
|
@ -106,46 +106,6 @@ abstract class NuanceItemType
|
||||||
return $this->newWorkCommands($item);
|
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(
|
final protected function newContentSource(
|
||||||
NuanceItem $item,
|
NuanceItem $item,
|
||||||
$agent_phid) {
|
$agent_phid) {
|
||||||
|
|
|
@ -9,7 +9,6 @@ final class NuanceItem
|
||||||
const STATUS_IMPORTING = 'importing';
|
const STATUS_IMPORTING = 'importing';
|
||||||
const STATUS_ROUTING = 'routing';
|
const STATUS_ROUTING = 'routing';
|
||||||
const STATUS_OPEN = 'open';
|
const STATUS_OPEN = 'open';
|
||||||
const STATUS_ASSIGNED = 'assigned';
|
|
||||||
const STATUS_CLOSED = 'closed';
|
const STATUS_CLOSED = 'closed';
|
||||||
|
|
||||||
protected $status;
|
protected $status;
|
||||||
|
|
|
@ -68,13 +68,29 @@ final class NuanceItemUpdateWorker
|
||||||
->execute();
|
->execute();
|
||||||
$commands = msort($commands, 'getID');
|
$commands = msort($commands, 'getID');
|
||||||
|
|
||||||
|
$executors = NuanceCommandImplementation::getAllCommands();
|
||||||
foreach ($commands as $command) {
|
foreach ($commands as $command) {
|
||||||
$command
|
$command
|
||||||
->setStatus(NuanceItemCommand::STATUS_EXECUTING)
|
->setStatus(NuanceItemCommand::STATUS_EXECUTING)
|
||||||
->save();
|
->save();
|
||||||
|
|
||||||
try {
|
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
|
$command
|
||||||
->setStatus(NuanceItemCommand::STATUS_DONE)
|
->setStatus(NuanceItemCommand::STATUS_DONE)
|
||||||
|
|
|
@ -9,14 +9,14 @@ final class NuanceItemCommandTransaction
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function applyInternalEffects($object, $value) {
|
|
||||||
// TODO: Probably implement this.
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle() {
|
public function getTitle() {
|
||||||
|
$spec = $this->getNewValue();
|
||||||
|
$command_key = idx($spec, 'command', '???');
|
||||||
|
|
||||||
return pht(
|
return pht(
|
||||||
'%s applied a command to this item.',
|
'%s applied a "%s" command to this item.',
|
||||||
$this->renderAuthor());
|
$this->renderAuthor(),
|
||||||
|
$command_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue