X-Git-Url: https://git.cweiske.de/phinde.git/blobdiff_plain/dd3e0698a71ca2746166f006135aeace83dfeb20..b7bd33c14a0e1fa8a382a6c4345941e854b95bf2:/src/phinde/Subscriptions.php diff --git a/src/phinde/Subscriptions.php b/src/phinde/Subscriptions.php index 5aac9b2..403f5d4 100644 --- a/src/phinde/Subscriptions.php +++ b/src/phinde/Subscriptions.php @@ -37,6 +37,22 @@ class Subscriptions return $stmt->fetchObject(); } + /** + * Remove a topic + * + * @param string $topic Topic URL + * + * @return void + */ + public function remove($topic) + { + $stmt = $this->db->prepare( + 'DELETE FROM subscriptions' + . ' WHERE sub_topic = :topic' + ); + $stmt->execute([':topic' => $topic]); + } + /** * Count number of subscriptions * @@ -59,6 +75,31 @@ class Subscriptions return $res; } + /** + * Get all topics that either expired or expire soon + * + * @return \PDOStatement Result iterator + */ + public function getExpiring() + { + $stmt = $this->db->prepare( + 'SELECT * FROM subscriptions' + . ' WHERE' + . '(' + //expire soon + . ' sub_status IN ("active", "expired")' + . ' AND DATEDIFF(sub_expires, NOW()) <= 2' + . ') OR (' + //no reaction to subscription within 10 minutes + . ' sub_status = "subscribing"' + . ' AND TIMEDIFF(NOW(), sub_created) > "00:10:00"' + . ')' + ); + $stmt->execute(); + + return $stmt; + } + /** * Create a new subscription entry in database. * Automatically generates secret, capkey and lease seconds. @@ -69,19 +110,20 @@ class Subscriptions * - send subscription requests to the hub * * @param string $topic URL to subscribe to + * @param string $hub URL of the hub subscribing to * * @return void */ - public function create($topic) + public function create($topic, $hub) { $stmt = $this->db->prepare( 'INSERT INTO subscriptions' . ' (sub_topic, sub_status, sub_lease_seconds, sub_expires' - . ', sub_secret, sub_capkey, sub_created, sub_updated' + . ', sub_secret, sub_capkey, sub_hub, sub_created, sub_updated' . ', sub_pings, sub_lastping, sub_statusmessage)' . ' VALUES ' . ' (:topic, "subscribing", :lease_seconds, "0000-00-00 00:00:00"' - . ', :secret, :capkey, NOW(), NOW()' + . ', :secret, :capkey, :hub, NOW(), NOW()' . ', 0, "0000-00-00 00:00:00", "")' ); $stmt->execute( @@ -90,10 +132,28 @@ class Subscriptions ':lease_seconds' => 86400 * 30, ':secret' => bin2hex(openssl_random_pseudo_bytes(16)), ':capkey' => bin2hex(openssl_random_pseudo_bytes(16)), + ':hub' => $hub, ] ); } + /** + * Renew a subscription: Set its status to "subscribing" + * + * @param integer $subId Subscription ID + * + * @return void + */ + public function renew($subId) + { + $this->db->prepare( + 'UPDATE subscriptions' + . ' SET sub_status = "subscribing"' + . ' , sub_updated = NOW()' + . ' WHERE sub_id = :id' + )->execute([':id' => $subId]); + } + /** * A subscription has been confirmed by the hub - mark it as active. * @@ -121,22 +181,44 @@ class Subscriptions } /** - * Mark a subscription as "unsubscribed" + * Begin removal of a a subscription: Set its status to "unsubscribing" * * @param integer $subId Subscription ID * * @return void */ - public function unsubscribed($subId) + public function unsubscribing($subId) { $this->db->prepare( 'UPDATE subscriptions' - . ' SET sub_status = "unsubscribed"' + . ' SET sub_status = "unsubscribing"' . ' , sub_updated = NOW()' . ' WHERE sub_id = :id' )->execute([':id' => $subId]); } + /** + * Mark a subscription as "unsubscribed" - delete it + * + * @param integer $subId Subscription ID + * + * @return void + */ + public function unsubscribed($subId) + { + $this->db + ->prepare('DELETE FROM subscriptions WHERE sub_id = :id') + ->execute([':id' => $subId]); + } + + /** + * Subscription has been cancelled/denied for some reason + * + * @param integer $subId Subscription ID + * @param string $reason Cancellation reason + * + * @return void + */ public function denied($subId, $reason) { $this->db->prepare( @@ -148,6 +230,13 @@ class Subscriptions )->execute([':id' => $subId, ':reason' => $reason]); } + /** + * Topic update notification has been received + * + * @param integer $subId Subscription ID + * + * @return void + */ public function pinged($subId) { $this->db->prepare(