3 final class PhabricatorBadgesBadgeAwardTransaction
4 extends PhabricatorBadgesBadgeTransactionType
{
6 const TRANSACTIONTYPE
= 'badge.award';
8 public function generateOldValue($object) {
12 public function applyExternalEffects($object, $value) {
13 foreach ($value as $phid) {
14 $award = PhabricatorBadgesAward
::initializeNewBadgesAward(
23 public function getTitle() {
24 $new = $this->getNewValue();
25 if (!is_array($new)) {
28 $handles = $this->renderHandleList($new);
30 '%s awarded this badge to %s recipient(s): %s.',
31 $this->renderAuthor(),
32 new PhutilNumber(count($new)),
36 public function getTitleForFeed() {
37 $new = $this->getNewValue();
38 if (!is_array($new)) {
41 $handles = $this->renderHandleList($new);
43 '%s awarded %s to %s recipient(s): %s.',
44 $this->renderAuthor(),
45 $this->renderObject(),
46 new PhutilNumber(count($new)),
50 public function getIcon() {
51 return 'fa-user-plus';
54 public function validateTransactions($object, array $xactions) {
57 foreach ($xactions as $xaction) {
58 $user_phids = $xaction->getNewValue();
60 $errors[] = $this->newRequiredError(
61 pht('Recipient is required.'));
65 foreach ($user_phids as $user_phid) {
66 // Check if a valid user
67 $user = id(new PhabricatorPeopleQuery())
68 ->setViewer($this->getActor())
69 ->withPHIDs(array($user_phid))
72 $errors[] = $this->newInvalidError(
74 'Recipient PHID "%s" is not a valid user PHID.',
79 // Check if already awarded
80 $award = id(new PhabricatorBadgesAwardQuery())
81 ->setViewer($this->getActor())
82 ->withRecipientPHIDs(array($user_phid))
83 ->withBadgePHIDs(array($object->getPHID()))
86 $errors[] = $this->newInvalidError(
88 '%s has already been awarded this badge.',
89 $user->getUsername()));