Changeset View
Changeset View
Standalone View
Standalone View
src/applications/chronicle/storage/ChronicleTrigger.php
- This file was added.
<?php | |||||
final class ChronicleTrigger extends ChronicleDAO | |||||
implements | |||||
PhabricatorPolicyInterface, | |||||
PhabricatorCustomFieldInterface { | |||||
protected $name; | |||||
protected $epochNext; | |||||
protected $epochConfig = array(); | |||||
protected $actionClass; | |||||
protected $actionData = array(); | |||||
protected $viewPolicy; | |||||
protected $editPolicy; | |||||
private $implementation; | |||||
private $customFields = self::ATTACHABLE; | |||||
const EPOCH_NEVER = 0; | |||||
const TYPE_NEVER = 'never'; | |||||
const TYPE_ONCE = 'once'; | |||||
const TYPE_DAILY = 'daily'; | |||||
const DAY_SUNDAY = 0; | |||||
const DAY_MONDAY = 1; | |||||
const DAY_TUESDAY = 2; | |||||
const DAY_WEDNESDAY = 3; | |||||
const DAY_THURSDAY = 4; | |||||
const DAY_FRIDAY = 5; | |||||
const DAY_SATURDAY = 6; | |||||
public static function initializeNewTrigger($class) { | |||||
return id(new ChronicleTrigger()) | |||||
->setEpochType(self::TYPE_NEVER) | |||||
->setActionClass($class); | |||||
} | |||||
public function getConfiguration() { | |||||
return array( | |||||
self::CONFIG_AUX_PHID => true, | |||||
self::CONFIG_SERIALIZATION => array( | |||||
'actionData' => self::SERIALIZATION_JSON, | |||||
'epochConfig' => self::SERIALIZATION_JSON | |||||
) | |||||
) + parent::getConfiguration(); | |||||
} | |||||
public function generatePHID() { | |||||
return PhabricatorPHID::generateNewPHID( | |||||
ChroniclePHIDTypeTrigger::TYPECONST); | |||||
} | |||||
public function getEpochType() { | |||||
return $this->getEpochConfigSetting('type', self::TYPE_NEVER); | |||||
} | |||||
public function setEpochType($type) { | |||||
return $this->setEpochConfigSetting('type', $type); | |||||
} | |||||
public function getEpochConfigSetting($key, $default = null) { | |||||
return idx($this->epochConfig, $key, $default); | |||||
} | |||||
public function setEpochConfigSetting($key, $value) { | |||||
$this->epochConfig[$key] = $value; | |||||
return $this; | |||||
} | |||||
public function getActionConfigSetting($key, $default = null) { | |||||
return idx($this->actionData, $key, $default); | |||||
} | |||||
public function setActionConfigSetting($key, $value) { | |||||
$this->actionData[$key] = $value; | |||||
return $this; | |||||
} | |||||
public function getActionImplementation() { | |||||
if ($this->implementation === null) { | |||||
$obj = ChronicleAction::requireImplementation( | |||||
$this->actionClass); | |||||
$obj->loadSettings($this->getActionData()); | |||||
$this->implementation = $obj; | |||||
} | |||||
return $this->implementation; | |||||
} | |||||
public function calculateNextEpoch($now = null) { | |||||
if ($now === null) { | |||||
$now = time(); | |||||
} | |||||
switch ($this->getEpochType()) { | |||||
case self::TYPE_NEVER: | |||||
return self::EPOCH_NEVER; | |||||
case self::TYPE_ONCE: | |||||
$epoch = $this->getEpochConfigSetting('epoch'); | |||||
if ($epoch > $now) { | |||||
return $epoch; | |||||
} else { | |||||
return self::EPOCH_NEVER; | |||||
} | |||||
case self::TYPE_DAILY: | |||||
$days = array( | |||||
self::DAY_SUNDAY => 'Sunday', | |||||
self::DAY_MONDAY => 'Monday', | |||||
self::DAY_TUESDAY => 'Tuesday', | |||||
self::DAY_WEDNESDAY => 'Wednesday', | |||||
self::DAY_THURSDAY => 'Thursday', | |||||
self::DAY_FRIDAY => 'Friday', | |||||
self::DAY_SATURDAY => 'Saturday'); | |||||
$days_active = $this->getEpochConfigSetting('days'); | |||||
$times_active = $this->getEpochConfigSetting('times'); | |||||
$current_next = null; | |||||
foreach ($days as $key => $value) { | |||||
if (in_array($key, $days_active)) { | |||||
$midnight = strtotime('midnight '.$value, $now); | |||||
foreach ($times_active as $time) { | |||||
$time_of_day = $midnight + (int)($time * 60 * 60); | |||||
if ($time_of_day <= $now) { | |||||
$midnight = strtotime('midnight next '.$value, $now); | |||||
$time_of_day = $midnight + (int)($time * 60 * 60); | |||||
} | |||||
if ($current_next === null || $time_of_day < $current_next) { | |||||
$current_next = $time_of_day; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return $current_next; | |||||
} | |||||
} | |||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */ | |||||
public function getCapabilities() { | |||||
return array( | |||||
PhabricatorPolicyCapability::CAN_VIEW, | |||||
PhabricatorPolicyCapability::CAN_EDIT, | |||||
); | |||||
} | |||||
public function getPolicy($capability) { | |||||
switch ($capability) { | |||||
case PhabricatorPolicyCapability::CAN_VIEW: | |||||
return $this->getViewPolicy(); | |||||
case PhabricatorPolicyCapability::CAN_EDIT: | |||||
return $this->getEditPolicy(); | |||||
} | |||||
} | |||||
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { | |||||
$impl = $this->getActionImplementation(); | |||||
return $impl->canCreateOrEdit($viewer); | |||||
} | |||||
public function describeAutomaticCapability($capability) { | |||||
return pht( | |||||
'Users which are provided create or edit permissions by the action '. | |||||
'can also edit the trigger.'); | |||||
} | |||||
/* -( PhabricatorCustomFieldInterface )------------------------------------ */ | |||||
public function getCustomFieldSpecificationForRole($role) { | |||||
return array(); | |||||
} | |||||
public function getCustomFieldBaseClass() { | |||||
return 'ChronicleTriggerCustomField'; | |||||
} | |||||
public function getCustomFields() { | |||||
return $this->assertAttached($this->customFields); | |||||
} | |||||
public function attachCustomFields(PhabricatorCustomFieldAttachment $fields) { | |||||
$this->customFields = $fields; | |||||
return $this; | |||||
} | |||||
} |