[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/tokens/editor/ -> PhabricatorTokenGivenEditor.php (source)

   1  <?php
   2  
   3  final class PhabricatorTokenGivenEditor
   4    extends PhabricatorEditor {
   5  
   6    private $contentSource;
   7  
   8    public function setContentSource(PhabricatorContentSource $content_source) {
   9      $this->contentSource = $content_source;
  10      return $this;
  11    }
  12  
  13    public function getContentSource() {
  14      return $this->contentSource;
  15    }
  16  
  17    public function addToken($object_phid, $token_phid) {
  18      $token = $this->validateToken($token_phid);
  19      $object = $this->validateObject($object_phid);
  20      $current_token = $this->loadCurrentToken($object);
  21  
  22      $actor = $this->requireActor();
  23  
  24      $token_given = id(new PhabricatorTokenGiven())
  25        ->setAuthorPHID($actor->getPHID())
  26        ->setObjectPHID($object->getPHID())
  27        ->setTokenPHID($token->getPHID());
  28  
  29      $token_given->openTransaction();
  30  
  31        if ($current_token) {
  32          $this->executeDeleteToken($object, $current_token);
  33        }
  34  
  35        $token_given->save();
  36  
  37        queryfx(
  38          $token_given->establishConnection('w'),
  39          'INSERT INTO %T (objectPHID, tokenCount) VALUES (%s, 1)
  40            ON DUPLICATE KEY UPDATE tokenCount = tokenCount + 1',
  41          id(new PhabricatorTokenCount())->getTableName(),
  42          $object->getPHID());
  43  
  44      $token_given->saveTransaction();
  45  
  46      $current_token_phid = null;
  47      if ($current_token) {
  48        $current_token_phid = $current_token->getTokenPHID();
  49      }
  50  
  51      $this->publishTransaction(
  52        $object,
  53        $current_token_phid,
  54        $token->getPHID());
  55  
  56      $subscribed_phids = $object->getUsersToNotifyOfTokenGiven();
  57      if ($subscribed_phids) {
  58        $related_phids = $subscribed_phids;
  59        $related_phids[] = $actor->getPHID();
  60  
  61        $story_type = 'PhabricatorTokenGivenFeedStory';
  62        $story_data = array(
  63          'authorPHID' => $actor->getPHID(),
  64          'tokenPHID' => $token->getPHID(),
  65          'objectPHID' => $object->getPHID(),
  66        );
  67  
  68        id(new PhabricatorFeedStoryPublisher())
  69          ->setStoryType($story_type)
  70          ->setStoryData($story_data)
  71          ->setStoryTime(time())
  72          ->setStoryAuthorPHID($actor->getPHID())
  73          ->setRelatedPHIDs($related_phids)
  74          ->setPrimaryObjectPHID($object->getPHID())
  75          ->setSubscribedPHIDs($subscribed_phids)
  76          ->publish();
  77      }
  78  
  79      return $token_given;
  80    }
  81  
  82    public function deleteToken($object_phid) {
  83      $object = $this->validateObject($object_phid);
  84      $token_given = $this->loadCurrentToken($object);
  85      if (!$token_given) {
  86        return;
  87      }
  88  
  89      $this->executeDeleteToken($object, $token_given);
  90      $this->publishTransaction(
  91        $object,
  92        $token_given->getTokenPHID(),
  93        null);
  94    }
  95  
  96    private function executeDeleteToken(
  97      PhabricatorTokenReceiverInterface $object,
  98      PhabricatorTokenGiven $token_given) {
  99  
 100      $token_given->openTransaction();
 101        $token_given->delete();
 102  
 103        queryfx(
 104          $token_given->establishConnection('w'),
 105          'INSERT INTO %T (objectPHID, tokenCount) VALUES (%s, 0)
 106            ON DUPLICATE KEY UPDATE tokenCount = tokenCount - 1',
 107          id(new PhabricatorTokenCount())->getTableName(),
 108          $object->getPHID());
 109      $token_given->saveTransaction();
 110    }
 111  
 112    private function validateToken($token_phid) {
 113      $token = id(new PhabricatorTokenQuery())
 114        ->setViewer($this->requireActor())
 115        ->withPHIDs(array($token_phid))
 116        ->executeOne();
 117  
 118      if (!$token) {
 119        throw new Exception(pht('No such token "%s"!', $token_phid));
 120      }
 121  
 122      return $token;
 123    }
 124  
 125    private function validateObject($object_phid) {
 126      $object = id(new PhabricatorObjectQuery())
 127        ->setViewer($this->requireActor())
 128        ->withPHIDs(array($object_phid))
 129        ->executeOne();
 130  
 131      if (!$object) {
 132        throw new Exception(pht('No such object "%s"!', $object_phid));
 133      }
 134  
 135      return $object;
 136    }
 137  
 138    private function loadCurrentToken(PhabricatorTokenReceiverInterface $object) {
 139      return id(new PhabricatorTokenGiven())->loadOneWhere(
 140        'authorPHID = %s AND objectPHID = %s',
 141        $this->requireActor()->getPHID(),
 142        $object->getPHID());
 143    }
 144  
 145  
 146    private function publishTransaction(
 147      PhabricatorTokenReceiverInterface $object,
 148      $old_token_phid,
 149      $new_token_phid) {
 150  
 151      if (!($object instanceof PhabricatorApplicationTransactionInterface)) {
 152        return;
 153      }
 154  
 155      $actor = $this->requireActor();
 156  
 157      $xactions = array();
 158      $xactions[] = id($object->getApplicationTransactionTemplate())
 159        ->setTransactionType(PhabricatorTransactions::TYPE_TOKEN)
 160        ->setOldValue($old_token_phid)
 161        ->setNewValue($new_token_phid);
 162  
 163      $editor = $object->getApplicationTransactionEditor()
 164        ->setActor($actor)
 165        ->setContentSource($this->getContentSource())
 166        ->setContinueOnNoEffect(true)
 167        ->setContinueOnMissingFields(true);
 168  
 169      $editor->applyTransactions(
 170        $object->getApplicationTransactionObject(),
 171        $xactions);
 172    }
 173  
 174  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1