@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
at recaptime-dev/main 75 lines 2.7 kB view raw
1<?php 2 3/** 4 * A trigger clock implements scheduling rules for an event. 5 * 6 * Two examples of triggered events are a subscription which bills on the 12th 7 * of every month, or a meeting reminder which sends an email 15 minutes before 8 * an event. A trigger clock contains the logic to figure out exactly when 9 * those times are. 10 * 11 * For example, it might schedule an event every hour, or every Thursday, or on 12 * the 15th of every month at 3PM, or only at a specific time. 13 */ 14abstract class PhabricatorTriggerClock extends Phobject { 15 16 private $properties; 17 18 public function __construct(array $properties) { 19 $this->validateProperties($properties); 20 $this->properties = $properties; 21 } 22 23 public function getProperties() { 24 return $this->properties; 25 } 26 27 public function getProperty($key, $default = null) { 28 return idx($this->properties, $key, $default); 29 } 30 31 32 /** 33 * Validate clock configuration. 34 * 35 * @param map<string, mixed> $properties Map of clock properties. 36 * @return void 37 */ 38 abstract public function validateProperties(array $properties); 39 40 41 /** 42 * Get the next occurrence of this event. 43 * 44 * This method takes two parameters: the last time this event occurred (or 45 * null if it has never triggered before) and a flag distinguishing between 46 * a normal reschedule (after a successful trigger) or an update because of 47 * a trigger change. 48 * 49 * If this event does not occur again, return `null` to stop it from being 50 * rescheduled. For example, a meeting reminder may be sent only once before 51 * the meeting. 52 * 53 * If this event does occur again, return the epoch timestamp of the next 54 * occurrence. 55 * 56 * When performing routine reschedules, the event must move forward in time: 57 * any timestamp you return must be later than the last event. For instance, 58 * if this event triggers an invoice, the next invoice date must be after 59 * the previous invoice date. This prevents an event from looping more than 60 * once per second. 61 * 62 * In contrast, after an update (not a routine reschedule), the next event 63 * may be scheduled at any time. For example, if a meeting is moved from next 64 * week to 3 minutes from now, the clock may reschedule the notification to 65 * occur 12 minutes ago. This will cause it to execute immediately. 66 * 67 * @param int|null $last_epoch Last time the event occurred, or null if it 68 * has never triggered before. 69 * @param bool $is_reschedule True if this is a reschedule after a successful 70 * trigger. 71 * @return int|null Next event, or null to decline to reschedule. 72 */ 73 abstract public function getNextEventEpoch($last_epoch, $is_reschedule); 74 75}