@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at recaptime-dev/main 150 lines 3.6 kB view raw
1<?php 2 3final class DifferentialViewState 4 extends DifferentialDAO 5 implements PhabricatorPolicyInterface { 6 7 protected $viewerPHID; 8 protected $objectPHID; 9 protected $viewState = array(); 10 11 private $hasModifications; 12 13 protected function getConfiguration() { 14 return array( 15 self::CONFIG_SERIALIZATION => array( 16 'viewState' => self::SERIALIZATION_JSON, 17 ), 18 self::CONFIG_KEY_SCHEMA => array( 19 'key_viewer' => array( 20 'columns' => array('viewerPHID', 'objectPHID'), 21 'unique' => true, 22 ), 23 'key_object' => array( 24 'columns' => array('objectPHID'), 25 ), 26 'key_modified' => array( 27 'columns' => array('dateModified'), 28 ), 29 ), 30 ) + parent::getConfiguration(); 31 } 32 33 public function setChangesetProperty( 34 DifferentialChangeset $changeset, 35 $key, 36 $value) { 37 38 if ($this->getChangesetProperty($changeset, $key) === $value) { 39 return; 40 } 41 42 $properties = array( 43 'value' => $value, 44 'epoch' => PhabricatorTime::getNow(), 45 ); 46 47 $diff_id = $changeset->getDiffID(); 48 if ($diff_id !== null) { 49 $properties['diffID'] = (int)$diff_id; 50 } 51 52 $changeset_id = $changeset->getID(); 53 if ($changeset_id !== null) { 54 $properties['changesetID'] = (int)$changeset_id; 55 } 56 57 $path_hash = $this->getChangesetPathHash($changeset); 58 $changeset_phid = $this->getChangesetKey($changeset); 59 60 $this->hasModifications = true; 61 62 $this->viewState['changesets'][$path_hash][$key][$changeset_phid] = 63 $properties; 64 } 65 66 public function getChangesetProperty( 67 DifferentialChangeset $changeset, 68 $key, 69 $default = null) { 70 71 $entries = $this->getChangesetPropertyEntries( 72 $changeset, 73 $key); 74 75 $entries = isort($entries, 'epoch'); 76 77 $entry = last($entries); 78 if (!is_array($entry)) { 79 $entry = array(); 80 } 81 82 return idx($entry, 'value', $default); 83 } 84 85 public function getChangesetPropertyEntries( 86 DifferentialChangeset $changeset, 87 $key) { 88 $path_hash = $this->getChangesetPathHash($changeset); 89 90 $entries = idxv($this->viewState, array('changesets', $path_hash, $key)); 91 if (!is_array($entries)) { 92 $entries = array(); 93 } 94 95 return $entries; 96 } 97 98 public function getHasModifications() { 99 return $this->hasModifications; 100 } 101 102 private function getChangesetPathHash(DifferentialChangeset $changeset) { 103 $path = $changeset->getFilename(); 104 return PhabricatorHash::digestForIndex($path); 105 } 106 107 private function getChangesetKey(DifferentialChangeset $changeset) { 108 $key = $changeset->getID(); 109 110 if ($key === null) { 111 return '*'; 112 } 113 114 return (string)$key; 115 } 116 117 public static function copyViewStatesToObject($src_phid, $dst_phid) { 118 $table = new self(); 119 $conn = $table->establishConnection('w'); 120 121 queryfx( 122 $conn, 123 'INSERT IGNORE INTO %R 124 (viewerPHID, objectPHID, viewState, dateCreated, dateModified) 125 SELECT viewerPHID, %s, viewState, dateCreated, dateModified 126 FROM %R WHERE objectPHID = %s', 127 $table, 128 $dst_phid, 129 $table, 130 $src_phid); 131 } 132 133/* -( PhabricatorPolicyInterface )----------------------------------------- */ 134 135 136 public function getCapabilities() { 137 return array( 138 PhabricatorPolicyCapability::CAN_VIEW, 139 ); 140 } 141 142 public function getPolicy($capability) { 143 return PhabricatorPolicies::POLICY_NOONE; 144 } 145 146 public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { 147 return ($viewer->getPHID() === $this->getViewerPHID()); 148 } 149 150}