3 final class PhabricatorBadgesBadgeRevokeTransaction
4 extends PhabricatorBadgesBadgeTransactionType
{
6 const TRANSACTIONTYPE
= 'badge.revoke';
8 public function generateOldValue($object) {
12 public function applyExternalEffects($object, $value) {
13 $awards = id(new PhabricatorBadgesAwardQuery())
14 ->setViewer($this->getActor())
15 ->withRecipientPHIDs($value)
16 ->withBadgePHIDs(array($object->getPHID()))
18 $awards = mpull($awards, null, 'getRecipientPHID');
20 foreach ($value as $phid) {
21 $awards[$phid]->delete();
26 public function getTitle() {
27 $new = $this->getNewValue();
28 if (!is_array($new)) {
31 $handles = $this->renderHandleList($new);
33 '%s revoked this badge from %s recipient(s): %s.',
34 $this->renderAuthor(),
35 new PhutilNumber(count($new)),
39 public function getTitleForFeed() {
40 $new = $this->getNewValue();
41 if (!is_array($new)) {
44 $handles = $this->renderHandleList($new);
46 '%s revoked %s from %s recipient(s): %s.',
47 $this->renderAuthor(),
48 $this->renderObject(),
49 new PhutilNumber(count($new)),
53 public function getIcon() {
54 return 'fa-user-times';
57 public function validateTransactions($object, array $xactions) {
60 foreach ($xactions as $xaction) {
61 $award_phids = $xaction->getNewValue();
63 $errors[] = $this->newRequiredError(
64 pht('Recipient is required.'));
68 foreach ($award_phids as $award_phid) {
69 $award = id(new PhabricatorBadgesAwardQuery())
70 ->setViewer($this->getActor())
71 ->withRecipientPHIDs(array($award_phid))
72 ->withBadgePHIDs(array($object->getPHID()))
75 $errors[] = $this->newInvalidError(
77 'Recipient PHID "%s" has not been awarded.',