Path: blob/master/src/applications/herald/storage/HeraldWebhookRequest.php
12256 views
<?php12final class HeraldWebhookRequest3extends HeraldDAO4implements5PhabricatorPolicyInterface,6PhabricatorExtendedPolicyInterface {78protected $webhookPHID;9protected $objectPHID;10protected $status;11protected $properties = array();12protected $lastRequestResult;13protected $lastRequestEpoch;1415private $webhook = self::ATTACHABLE;1617const RETRY_NEVER = 'never';18const RETRY_FOREVER = 'forever';1920const STATUS_QUEUED = 'queued';21const STATUS_FAILED = 'failed';22const STATUS_SENT = 'sent';2324const RESULT_NONE = 'none';25const RESULT_OKAY = 'okay';26const RESULT_FAIL = 'fail';2728const ERRORTYPE_HOOK = 'hook';29const ERRORTYPE_HTTP = 'http';30const ERRORTYPE_TIMEOUT = 'timeout';3132const ERROR_SILENT = 'silent';33const ERROR_DISABLED = 'disabled';34const ERROR_URI = 'uri';35const ERROR_OBJECT = 'object';3637protected function getConfiguration() {38return array(39self::CONFIG_AUX_PHID => true,40self::CONFIG_SERIALIZATION => array(41'properties' => self::SERIALIZATION_JSON,42),43self::CONFIG_COLUMN_SCHEMA => array(44'status' => 'text32',45'lastRequestResult' => 'text32',46'lastRequestEpoch' => 'epoch',47),48self::CONFIG_KEY_SCHEMA => array(49'key_ratelimit' => array(50'columns' => array(51'webhookPHID',52'lastRequestResult',53'lastRequestEpoch',54),55),56'key_collect' => array(57'columns' => array('dateCreated'),58),59),60) + parent::getConfiguration();61}6263public function getPHIDType() {64return HeraldWebhookRequestPHIDType::TYPECONST;65}6667public static function initializeNewWebhookRequest(HeraldWebhook $hook) {68return id(new self())69->setWebhookPHID($hook->getPHID())70->attachWebhook($hook)71->setStatus(self::STATUS_QUEUED)72->setRetryMode(self::RETRY_NEVER)73->setLastRequestResult(self::RESULT_NONE)74->setLastRequestEpoch(0);75}7677public function getWebhook() {78return $this->assertAttached($this->webhook);79}8081public function attachWebhook(HeraldWebhook $hook) {82$this->webhook = $hook;83return $this;84}8586protected function setProperty($key, $value) {87$this->properties[$key] = $value;88return $this;89}9091protected function getProperty($key, $default = null) {92return idx($this->properties, $key, $default);93}9495public function setRetryMode($mode) {96return $this->setProperty('retry', $mode);97}9899public function getRetryMode() {100return $this->getProperty('retry');101}102103public function setErrorType($error_type) {104return $this->setProperty('errorType', $error_type);105}106107public function getErrorType() {108return $this->getProperty('errorType');109}110111public function setErrorCode($error_code) {112return $this->setProperty('errorCode', $error_code);113}114115public function getErrorCode() {116return $this->getProperty('errorCode');117}118119public function getErrorTypeForDisplay() {120$map = array(121self::ERRORTYPE_HOOK => pht('Hook Error'),122self::ERRORTYPE_HTTP => pht('HTTP Status Code'),123self::ERRORTYPE_TIMEOUT => pht('Request Timeout'),124);125126$type = $this->getErrorType();127return idx($map, $type, $type);128}129130public function getErrorCodeForDisplay() {131$code = $this->getErrorCode();132133if ($this->getErrorType() !== self::ERRORTYPE_HOOK) {134return $code;135}136137$spec = $this->getHookErrorSpec($code);138return idx($spec, 'display', $code);139}140141public function setTransactionPHIDs(array $phids) {142return $this->setProperty('transactionPHIDs', $phids);143}144145public function getTransactionPHIDs() {146return $this->getProperty('transactionPHIDs', array());147}148149public function setTriggerPHIDs(array $phids) {150return $this->setProperty('triggerPHIDs', $phids);151}152153public function getTriggerPHIDs() {154return $this->getProperty('triggerPHIDs', array());155}156157public function setIsSilentAction($bool) {158return $this->setProperty('silent', $bool);159}160161public function getIsSilentAction() {162return $this->getProperty('silent', false);163}164165public function setIsTestAction($bool) {166return $this->setProperty('test', $bool);167}168169public function getIsTestAction() {170return $this->getProperty('test', false);171}172173public function setIsSecureAction($bool) {174return $this->setProperty('secure', $bool);175}176177public function getIsSecureAction() {178return $this->getProperty('secure', false);179}180181public function queueCall() {182PhabricatorWorker::scheduleTask(183'HeraldWebhookWorker',184array(185'webhookRequestPHID' => $this->getPHID(),186),187array(188'objectPHID' => $this->getPHID(),189));190191return $this;192}193194public function newStatusIcon() {195switch ($this->getStatus()) {196case self::STATUS_QUEUED:197$icon = 'fa-refresh';198$color = 'blue';199$tooltip = pht('Queued');200break;201case self::STATUS_SENT:202$icon = 'fa-check';203$color = 'green';204$tooltip = pht('Sent');205break;206case self::STATUS_FAILED:207default:208$icon = 'fa-times';209$color = 'red';210$tooltip = pht('Failed');211break;212213}214215return id(new PHUIIconView())216->setIcon($icon, $color)217->setTooltip($tooltip);218}219220private function getHookErrorSpec($code) {221$map = $this->getHookErrorMap();222return idx($map, $code, array());223}224225private function getHookErrorMap() {226return array(227self::ERROR_SILENT => array(228'display' => pht('In Silent Mode'),229),230self::ERROR_DISABLED => array(231'display' => pht('Hook Disabled'),232),233self::ERROR_URI => array(234'display' => pht('Invalid URI'),235),236self::ERROR_OBJECT => array(237'display' => pht('Invalid Object'),238),239);240}241242243/* -( PhabricatorPolicyInterface )----------------------------------------- */244245246public function getCapabilities() {247return array(248PhabricatorPolicyCapability::CAN_VIEW,249);250}251252public function getPolicy($capability) {253switch ($capability) {254case PhabricatorPolicyCapability::CAN_VIEW:255return PhabricatorPolicies::getMostOpenPolicy();256}257}258259public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {260return false;261}262263264/* -( PhabricatorExtendedPolicyInterface )--------------------------------- */265266267public function getExtendedPolicy($capability, PhabricatorUser $viewer) {268return array(269array($this->getWebhook(), PhabricatorPolicyCapability::CAN_VIEW),270);271}272273274275}276277278