3
final class PhabricatorOwnersPackageTransactionEditor
4
extends PhabricatorApplicationTransactionEditor {
6
public function getEditorApplicationClass() {
7
return 'PhabricatorOwnersApplication';
10
public function getEditorObjectsDescription() {
11
return pht('Owners Packages');
14
public function getTransactionTypes() {
15
$types = parent::getTransactionTypes();
17
$types[] = PhabricatorOwnersPackageTransaction::TYPE_NAME;
18
$types[] = PhabricatorOwnersPackageTransaction::TYPE_PRIMARY;
19
$types[] = PhabricatorOwnersPackageTransaction::TYPE_OWNERS;
20
$types[] = PhabricatorOwnersPackageTransaction::TYPE_AUDITING;
21
$types[] = PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION;
22
$types[] = PhabricatorOwnersPackageTransaction::TYPE_PATHS;
27
protected function getCustomTransactionOldValue(
28
PhabricatorLiskDAO $object,
29
PhabricatorApplicationTransaction $xaction) {
31
switch ($xaction->getTransactionType()) {
32
case PhabricatorOwnersPackageTransaction::TYPE_NAME:
33
return $object->getName();
34
case PhabricatorOwnersPackageTransaction::TYPE_PRIMARY:
35
return $object->getPrimaryOwnerPHID();
36
case PhabricatorOwnersPackageTransaction::TYPE_OWNERS:
37
// TODO: needOwners() this on the Query.
38
$phids = mpull($object->loadOwners(), 'getUserPHID');
39
$phids = array_values($phids);
41
case PhabricatorOwnersPackageTransaction::TYPE_AUDITING:
42
return (int)$object->getAuditingEnabled();
43
case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION:
44
return $object->getDescription();
45
case PhabricatorOwnersPackageTransaction::TYPE_PATHS:
46
// TODO: needPaths() this on the query
47
$paths = $object->loadPaths();
48
return mpull($paths, 'getRef');
52
protected function getCustomTransactionNewValue(
53
PhabricatorLiskDAO $object,
54
PhabricatorApplicationTransaction $xaction) {
56
switch ($xaction->getTransactionType()) {
57
case PhabricatorOwnersPackageTransaction::TYPE_NAME:
58
case PhabricatorOwnersPackageTransaction::TYPE_PRIMARY:
59
case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION:
60
case PhabricatorOwnersPackageTransaction::TYPE_PATHS:
61
return $xaction->getNewValue();
62
case PhabricatorOwnersPackageTransaction::TYPE_AUDITING:
63
return (int)$xaction->getNewValue();
64
case PhabricatorOwnersPackageTransaction::TYPE_OWNERS:
65
$phids = $xaction->getNewValue();
66
$phids = array_unique($phids);
67
$phids = array_values($phids);
72
protected function transactionHasEffect(
73
PhabricatorLiskDAO $object,
74
PhabricatorApplicationTransaction $xaction) {
76
switch ($xaction->getTransactionType()) {
77
case PhabricatorOwnersPackageTransaction::TYPE_PATHS:
78
$old = $xaction->getOldValue();
79
$new = $xaction->getNewValue();
81
$diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new);
82
list($rem, $add) = $diffs;
84
return ($rem || $add);
87
return parent::transactionHasEffect($object, $xaction);
90
protected function applyCustomInternalTransaction(
91
PhabricatorLiskDAO $object,
92
PhabricatorApplicationTransaction $xaction) {
94
switch ($xaction->getTransactionType()) {
95
case PhabricatorOwnersPackageTransaction::TYPE_NAME:
96
$object->setName($xaction->getNewValue());
98
case PhabricatorOwnersPackageTransaction::TYPE_PRIMARY:
99
$object->setPrimaryOwnerPHID($xaction->getNewValue());
101
case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION:
102
$object->setDescription($xaction->getNewValue());
104
case PhabricatorOwnersPackageTransaction::TYPE_AUDITING:
105
$object->setAuditingEnabled($xaction->getNewValue());
107
case PhabricatorOwnersPackageTransaction::TYPE_OWNERS:
108
case PhabricatorOwnersPackageTransaction::TYPE_PATHS:
112
return parent::applyCustomInternalTransaction($object, $xaction);
115
protected function applyCustomExternalTransaction(
116
PhabricatorLiskDAO $object,
117
PhabricatorApplicationTransaction $xaction) {
119
switch ($xaction->getTransactionType()) {
120
case PhabricatorOwnersPackageTransaction::TYPE_NAME:
121
case PhabricatorOwnersPackageTransaction::TYPE_PRIMARY:
122
case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION:
123
case PhabricatorOwnersPackageTransaction::TYPE_AUDITING:
125
case PhabricatorOwnersPackageTransaction::TYPE_OWNERS:
126
$old = $xaction->getOldValue();
127
$new = $xaction->getNewValue();
129
// TODO: needOwners this
130
$owners = $object->loadOwners();
131
$owners = mpull($owners, null, 'getUserPHID');
133
$rem = array_diff($old, $new);
134
foreach ($rem as $phid) {
135
if (isset($owners[$phid])) {
136
$owners[$phid]->delete();
137
unset($owners[$phid]);
141
$add = array_diff($new, $old);
142
foreach ($add as $phid) {
143
$owners[$phid] = id(new PhabricatorOwnersOwner())
144
->setPackageID($object->getID())
149
// TODO: Attach owners here
151
case PhabricatorOwnersPackageTransaction::TYPE_PATHS:
152
$old = $xaction->getOldValue();
153
$new = $xaction->getNewValue();
155
// TODO: needPaths this
156
$paths = $object->loadPaths();
158
$diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new);
159
list($rem, $add) = $diffs;
161
$set = PhabricatorOwnersPath::getSetFromTransactionValue($rem);
162
foreach ($paths as $path) {
163
$ref = $path->getRef();
164
if (PhabricatorOwnersPath::isRefInSet($ref, $set)) {
169
foreach ($add as $ref) {
170
$path = PhabricatorOwnersPath::newFromRef($ref)
171
->setPackageID($object->getID())
178
return parent::applyCustomExternalTransaction($object, $xaction);
181
protected function validateTransaction(
182
PhabricatorLiskDAO $object,
186
$errors = parent::validateTransaction($object, $type, $xactions);
189
case PhabricatorOwnersPackageTransaction::TYPE_NAME:
190
$missing = $this->validateIsEmptyTextField(
195
$error = new PhabricatorApplicationTransactionValidationError(
198
pht('Package name is required.'),
199
nonempty(last($xactions), null));
201
$error->setIsMissingFieldError(true);
205
case PhabricatorOwnersPackageTransaction::TYPE_PRIMARY:
206
$missing = $this->validateIsEmptyTextField(
207
$object->getPrimaryOwnerPHID(),
211
$error = new PhabricatorApplicationTransactionValidationError(
214
pht('Packages must have a primary owner.'),
215
nonempty(last($xactions), null));
217
$error->setIsMissingFieldError(true);
226
protected function extractFilePHIDsFromCustomTransaction(
227
PhabricatorLiskDAO $object,
228
PhabricatorApplicationTransaction $xaction) {
230
switch ($xaction->getTransactionType()) {
231
case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION:
232
return array($xaction->getNewValue());
235
return parent::extractFilePHIDsFromCustomTransaction($object, $xaction);
238
protected function shouldSendMail(
239
PhabricatorLiskDAO $object,
244
protected function getMailSubjectPrefix() {
245
return PhabricatorEnv::getEnvConfig('metamta.package.subject-prefix');
248
protected function getMailTo(PhabricatorLiskDAO $object) {
250
$object->getPrimaryOwnerPHID(),
251
$this->requireActor()->getPHID(),
255
protected function getMailCC(PhabricatorLiskDAO $object) {
256
// TODO: needOwners() this
257
return mpull($object->loadOwners(), 'getUserPHID');
260
protected function buildReplyHandler(PhabricatorLiskDAO $object) {
261
return id(new OwnersPackageReplyHandler())
262
->setMailReceiver($object);
265
protected function buildMailTemplate(PhabricatorLiskDAO $object) {
266
$id = $object->getID();
267
$name = $object->getName();
269
return id(new PhabricatorMetaMTAMail())
271
->addHeader('Thread-Topic', $object->getPHID());
274
protected function buildMailBody(
275
PhabricatorLiskDAO $object,
278
$body = parent::buildMailBody($object, $xactions);
280
$detail_uri = PhabricatorEnv::getProductionURI(
281
'/owners/package/'.$object->getID().'/');
283
$body->addLinkSection(
284
pht('PACKAGE DETAIL'),