mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00: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',
|
||||
'AlmanacServiceTypeDatasource' => 'applications/almanac/typeahead/AlmanacServiceTypeDatasource.php',
|
||||
'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php',
|
||||
'AlmanacServiceTypeTransaction' => 'applications/almanac/xaction/AlmanacServiceTypeTransaction.php',
|
||||
'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php',
|
||||
'AlmanacTransaction' => 'applications/almanac/storage/AlmanacTransaction.php',
|
||||
'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php',
|
||||
|
@ -5331,6 +5332,7 @@ phutil_register_library_map(array(
|
|||
'AlmanacServiceType' => 'Phobject',
|
||||
'AlmanacServiceTypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||
'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase',
|
||||
'AlmanacServiceTypeTransaction' => 'AlmanacServiceTransactionType',
|
||||
'AlmanacServiceViewController' => 'AlmanacServiceController',
|
||||
'AlmanacTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'AlmanacTransactionType' => 'PhabricatorModularTransactionType',
|
||||
|
|
|
@ -41,6 +41,37 @@ final class AlmanacServiceEditEngine
|
|||
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() {
|
||||
$service_type = new AlmanacCustomServiceType();
|
||||
$this->setServiceType($service_type->getServiceTypeConstant());
|
||||
|
@ -101,6 +132,16 @@ final class AlmanacServiceEditEngine
|
|||
->setTransactionType(AlmanacServiceNameTransaction::TRANSACTIONTYPE)
|
||||
->setIsRequired(true)
|
||||
->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() {
|
||||
return pht(
|
||||
'%s renamed this service from %s to %s.',
|
||||
$this->renderAuthorLink(),
|
||||
$this->renderAuthor(),
|
||||
$this->renderOldValue(),
|
||||
$this->renderNewValue());
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ final class AlmanacServiceNameTransaction
|
|||
public function getTitleForFeed() {
|
||||
return pht(
|
||||
'%s renamed %s from %s to %s.',
|
||||
$this->renderAuthorLink(),
|
||||
$this->renderAuthor(),
|
||||
$this->renderObject(),
|
||||
$this->renderOldValue(),
|
||||
$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