mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-02 03:32:42 +01:00
Allow "almanac.service.edit" to create services
Summary: Depends on D19317. Ref T13120. Ref T12414. See PHI145. See PHI473. This adds a Conduit-only "type" transaction for Almanac services. This is very similar to the approach in D18849 for Drydock blueprints. Test Plan: - Tried to create an empty service via "almanac.service.edit", was told to pick a type. - Tried to pick a bad type, was told to pick a good type. - Created a new Almanac service via "almanac.service.edit". - Tried to edit the service to change the type, wasn't allowed to. - Created and edited via the web UI, nothing changed from before. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13120, T12414 Differential Revision: https://secure.phabricator.com/D19318
This commit is contained in:
parent
c428f60a97
commit
6983479e4f
4 changed files with 100 additions and 2 deletions
|
@ -126,6 +126,7 @@ phutil_register_library_map(array(
|
||||||
'AlmanacServiceType' => 'applications/almanac/servicetype/AlmanacServiceType.php',
|
'AlmanacServiceType' => 'applications/almanac/servicetype/AlmanacServiceType.php',
|
||||||
'AlmanacServiceTypeDatasource' => 'applications/almanac/typeahead/AlmanacServiceTypeDatasource.php',
|
'AlmanacServiceTypeDatasource' => 'applications/almanac/typeahead/AlmanacServiceTypeDatasource.php',
|
||||||
'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php',
|
'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php',
|
||||||
|
'AlmanacServiceTypeTransaction' => 'applications/almanac/xaction/AlmanacServiceTypeTransaction.php',
|
||||||
'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php',
|
'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php',
|
||||||
'AlmanacTransaction' => 'applications/almanac/storage/AlmanacTransaction.php',
|
'AlmanacTransaction' => 'applications/almanac/storage/AlmanacTransaction.php',
|
||||||
'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php',
|
'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php',
|
||||||
|
@ -5331,6 +5332,7 @@ phutil_register_library_map(array(
|
||||||
'AlmanacServiceType' => 'Phobject',
|
'AlmanacServiceType' => 'Phobject',
|
||||||
'AlmanacServiceTypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
'AlmanacServiceTypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||||
'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase',
|
'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase',
|
||||||
|
'AlmanacServiceTypeTransaction' => 'AlmanacServiceTransactionType',
|
||||||
'AlmanacServiceViewController' => 'AlmanacServiceController',
|
'AlmanacServiceViewController' => 'AlmanacServiceController',
|
||||||
'AlmanacTransaction' => 'PhabricatorApplicationTransaction',
|
'AlmanacTransaction' => 'PhabricatorApplicationTransaction',
|
||||||
'AlmanacTransactionType' => 'PhabricatorModularTransactionType',
|
'AlmanacTransactionType' => 'PhabricatorModularTransactionType',
|
||||||
|
|
|
@ -41,6 +41,37 @@ final class AlmanacServiceEditEngine
|
||||||
return AlmanacService::initializeNewService($service_type);
|
return AlmanacService::initializeNewService($service_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function newEditableObjectFromConduit(array $raw_xactions) {
|
||||||
|
$type = null;
|
||||||
|
foreach ($raw_xactions as $raw_xaction) {
|
||||||
|
if ($raw_xaction['type'] !== 'type') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = $raw_xaction['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($type === null) {
|
||||||
|
throw new Exception(
|
||||||
|
pht(
|
||||||
|
'When creating a new Almanac service via the Conduit API, you '.
|
||||||
|
'must provide a "type" transaction to select a type.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$map = AlmanacServiceType::getAllServiceTypes();
|
||||||
|
if (!isset($map[$type])) {
|
||||||
|
throw new Exception(
|
||||||
|
pht(
|
||||||
|
'Service type "%s" is unrecognized. Valid types are: %s.',
|
||||||
|
$type,
|
||||||
|
implode(', ', array_keys($map))));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setServiceType($type);
|
||||||
|
|
||||||
|
return $this->newEditableObject();
|
||||||
|
}
|
||||||
|
|
||||||
protected function newEditableObjectForDocumentation() {
|
protected function newEditableObjectForDocumentation() {
|
||||||
$service_type = new AlmanacCustomServiceType();
|
$service_type = new AlmanacCustomServiceType();
|
||||||
$this->setServiceType($service_type->getServiceTypeConstant());
|
$this->setServiceType($service_type->getServiceTypeConstant());
|
||||||
|
@ -101,6 +132,16 @@ final class AlmanacServiceEditEngine
|
||||||
->setTransactionType(AlmanacServiceNameTransaction::TRANSACTIONTYPE)
|
->setTransactionType(AlmanacServiceNameTransaction::TRANSACTIONTYPE)
|
||||||
->setIsRequired(true)
|
->setIsRequired(true)
|
||||||
->setValue($object->getName()),
|
->setValue($object->getName()),
|
||||||
|
id(new PhabricatorTextEditField())
|
||||||
|
->setKey('type')
|
||||||
|
->setLabel(pht('Type'))
|
||||||
|
->setIsConduitOnly(true)
|
||||||
|
->setTransactionType(
|
||||||
|
AlmanacServiceTypeTransaction::TRANSACTIONTYPE)
|
||||||
|
->setDescription(pht('When creating a service, set the type.'))
|
||||||
|
->setConduitDescription(pht('Set the service type.'))
|
||||||
|
->setConduitTypeDescription(pht('Service type.'))
|
||||||
|
->setValue($object->getServiceType()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ final class AlmanacServiceNameTransaction
|
||||||
public function getTitle() {
|
public function getTitle() {
|
||||||
return pht(
|
return pht(
|
||||||
'%s renamed this service from %s to %s.',
|
'%s renamed this service from %s to %s.',
|
||||||
$this->renderAuthorLink(),
|
$this->renderAuthor(),
|
||||||
$this->renderOldValue(),
|
$this->renderOldValue(),
|
||||||
$this->renderNewValue());
|
$this->renderNewValue());
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ final class AlmanacServiceNameTransaction
|
||||||
public function getTitleForFeed() {
|
public function getTitleForFeed() {
|
||||||
return pht(
|
return pht(
|
||||||
'%s renamed %s from %s to %s.',
|
'%s renamed %s from %s to %s.',
|
||||||
$this->renderAuthorLink(),
|
$this->renderAuthor(),
|
||||||
$this->renderObject(),
|
$this->renderObject(),
|
||||||
$this->renderOldValue(),
|
$this->renderOldValue(),
|
||||||
$this->renderNewValue());
|
$this->renderNewValue());
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class AlmanacServiceTypeTransaction
|
||||||
|
extends AlmanacServiceTransactionType {
|
||||||
|
|
||||||
|
const TRANSACTIONTYPE = 'almanac:service:type';
|
||||||
|
|
||||||
|
public function generateOldValue($object) {
|
||||||
|
return $object->getServiceType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function applyInternalEffects($object, $value) {
|
||||||
|
$object->setServiceType($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle() {
|
||||||
|
// This transaction can only be applied during object creation via
|
||||||
|
// Conduit and never generates a timeline event.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function validateTransactions($object, array $xactions) {
|
||||||
|
$errors = array();
|
||||||
|
|
||||||
|
if ($this->isEmptyTextTransaction($object->getServiceType(), $xactions)) {
|
||||||
|
$errors[] = $this->newRequiredError(
|
||||||
|
pht('You must select a service type when creating a service.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$map = AlmanacServiceType::getAllServiceTypes();
|
||||||
|
|
||||||
|
foreach ($xactions as $xaction) {
|
||||||
|
if (!$this->isNewObject()) {
|
||||||
|
$errors[] = $this->newInvalidError(
|
||||||
|
pht(
|
||||||
|
'The type of a service can not be changed once it has '.
|
||||||
|
'been created.'),
|
||||||
|
$xaction);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$new = $xaction->getNewValue();
|
||||||
|
if (!isset($map[$new])) {
|
||||||
|
$errors[] = $this->newInvalidError(
|
||||||
|
pht(
|
||||||
|
'Service type "%s" is not valid. Valid types are: %s.',
|
||||||
|
$new,
|
||||||
|
implode(', ', array_keys($map))));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $errors;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue