Loading Core/Subscriptions/Requests/Delegates/NotificationsDelegate.php 0 → 100644 +37 −0 Original line number Original line Diff line number Diff line <?php namespace Minds\Core\Subscriptions\Requests\Delegates; use Minds\Core\Subscriptions\Requests\SubscriptionRequest; class NotificationsDelegate { /** * Called when subscription request is made * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onAdd(SubscriptionRequest $subscriptionRequest): void { // TODO } /** * Called when subscription request is accepted * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onAccept(SubscriptionRequest $subscriptionRequest): void { // TODO } /** * Called when subscription request is declined * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onDecline(SubscriptionRequest $subscriptionRequest): void { // TODO } } Core/Subscriptions/Requests/Delegates/SubscriptionsDelegate.php 0 → 100644 +17 −0 Original line number Original line Diff line number Diff line <?php namespace Minds\Core\Subscriptions\Requests\Delegates; use Minds\Core\Subscriptions\Requests\SubscriptionRequest; class SubscriptionsDelegate { /** * Called when subscription request is accepted * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onAccept(SubscriptionRequest $subscriptionRequest): void { // TODO } } Core/Subscriptions/Requests/Manager.php +94 −2 Original line number Original line Diff line number Diff line Loading @@ -4,25 +4,117 @@ */ */ namespace Minds\Core\Subscriptions\Requests; namespace Minds\Core\Subscriptions\Requests; use Minds\Core\Subscriptions\Requests\Delegates\NotificationsDelegate; use Minds\Core\Subscriptions\Requests\Delegates\SubscriptionsDelegate; use Minds\Common\Repository\Response; class Manager class Manager { { /** @var Repository */ private $repository; /** @var NotificationsDelegate */ private $notificationsDelegate; /** @var SubscriptionsDelegate */ private $subscriptionsDelegate; public function __construct($repository = null, $notificationsDelegate = null, $subscriptionsDelegate = null) { $this->repository = $repository ?? new Repository(); $this->notificationsDelegate = $notificationsDelegate ?? new NotificationsDelegate; $this->subscriptionsDelegate = $subscriptionsDelegate ?? new SubscriptionsDelegate; } /** * Return a list of incoming subscription requests * @param array $opts * @return Response */ public function getIncomingList(array $opts = []) { $response = $this->repository->getList($opts); return $response; } /** * Return a subscription request * @param string $urn * @return SubscriptionRequest */ public function get(string $urn): ?SubscriptionRequest { return $this->repository->get($urn); } /** * Add a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function add(SubscriptionRequest $subscriptionRequest): bool public function add(SubscriptionRequest $subscriptionRequest): bool { { // Check if exists // Check if exists $existing = $this->get($subscriptionRequest->getUrn()); if ($existing) { throw new SubscriptionRequestExistsException(); } $this->repository->add($subscriptionRequest); $this->repository->add($subscriptionRequest); $this->notificationsDelegate->onAdd($subscriptionRequest); return true; } } /** * Accept a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function accept(SubscriptionRequest $subscriptionRequest): bool public function accept(SubscriptionRequest $subscriptionRequest): bool { { // Check if exists // Check if exists $existing = $this->get($subscriptionRequest->getUrn()); if (!$existing) { throw new SubscriptionRequestDoesntExistException(); } if ($existing->getAccepted() !== null) { throw new SubscriptionRequestAlreadyCompletedException(); } $subscriptionRequest->setAccepted(true); $subscriptionRequest->setAccepted(true); $this->repository->add($subscriptionRequest); $this->repository->update($subscriptionRequest); $this->notificationsDelegate->onAccept($subscriptionRequest); $this->subscriptionsDelegate->onAccept($subscriptionRequest); return true; } } /** * Decline a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function decline(SubscriptionRequest $subscriptionRequest): bool public function decline(SubscriptionRequest $subscriptionRequest): bool { { // Check if exists // Check if exists $existing = $this->get($subscriptionRequest->getUrn()); if (!$existing) { throw new SubscriptionRequestDoesntExistException(); } if ($existing->getAccepted() !== null) { throw new SubscriptionRequestAlreadyCompletedException(); } $subscriptionRequest->setAccepted(false); $subscriptionRequest->setAccepted(false); $this->repository->add($subscriptionRequest); $this->repository->update($subscriptionRequest); $this->notificationsDelegate->onDecline($subscriptionRequest); return true; } } } } Core/Subscriptions/Requests/Repository.php +151 −0 Original line number Original line Diff line number Diff line <?php /** * Subscriptions Requests Repository */ namespace Minds\Core\Subscriptions\Requests; use Minds\Core\Di\Di; use Minds\Core\Data\Cassandra\Client; use Minds\Common\Repository\Response; class Repository { /** @var Client */ private $db; public function __construct($db = null) { $this->db = $db ?? Di::_()->get('Database\Cassandra\Cql'); } /** * Return a list of subscription requests * @param array $opts * @return Response */ public function getList(array $opts = []): Response { $prepared = new Prepared\Custom(); $prepared->query( "SELECT * FROM subscription_requests WHERE publisher_guid = ?", [ $opts['publisher_guid'], ] ); $result = $this->db->request($prepared); $response = new Response; foreach ($result as $row) { $subscriptionRequest = new SubscriptionRequest(); $subscriptionRequest ->setPublisherGuid((string) $row['publisher_guid']) ->setSubscriberGuid((string) $row['subscriber_guid']) ->setAccepted((bool) $row['accepted']) ->setTimestampMs((int) $row['timestamp']->time()); $result[] = $subscriptionRequest; } return $response; } /** * Return a single subscription request from a urn * @param string $urn * @return SubscriptionRequest */ public function get(string $urn): ?SubscriptionRequest { $urn = new Urn($urn); list($publisherGuid, $subscriberGuid) = explode('-', $urn->getNss()); $prepared = new Prepared\Custom(); $prepared->query( "SELECT * FROM subscription_requests WHERE publisher_guid = ? AND subscriber_guid = ?", [ $publisherGuid, $subscriberGuid, ] ); $result = $this->db->request($prepared); if (!$result) { return null; } $row = $result[0]; $subscriptionRequest = new SubscriptionRequest(); $subscriptionRequest ->setPublisherGuid((string) $row['publisher_guid']) ->setSubscriberGuid((string) $row['subscriber_guid']) ->setAccepted((bool) $row['accepted']) ->setTimestampMs((int) $row['timestamp']->time()); return $subscriptionRequest; } /** * Add a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function add(SubscriptionRequest $subscriptionRequest): bool { $statement = "INSERT INTO subscription_requests (publisher_guid, subscriber_guid, timestamp) VALUES (?, ?, ?)"; $values = [ new Bigint($subscriptionRequest->getPublisherGuid()), new Bigint($subscriptionRequest->getSubscriberGuid()), new Timestamp($subscriptionRequest->getTimestamp() ?? round(microtime(true) * 1000)), ]; $prepared = new Custom\Prepared(); $prepared->query($statement, $values); return (bool) $this->db->request($prepared); } /** * Update a subscription request * @param SubscriptionRequest $subscriptionRequest * @param array $fields * @return bool */ public function update(SubscriptionRequest $subscriptionRequest, array $field = []): bool { $statement = "INSERT INTO subscription_requests (publisher_guid, subscriber_guid, timestamp) VALUES (?, ?, ?)"; $values = [ new Bigint($subscriptionRequest->getPublisherGuid()), new Bigint($subscriptionRequest->getSubscriberGuid()), new Timestamp($subscriptionRequest->getTimestamp() ?? round(microtime(true) * 1000)), ]; $prepared = new Custom\Prepared(); $prepared->query($statement, $values); return (bool) $this->db->request($prepared); } /** * Delete a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function delete(SubscriptionRequest $subscriptionRequest): bool { $statement = "DELETE FROM subscription_requests WHERE publisher_guid = ? AND subscriber_guid = ?"; $values = [ new Bigint($subscriptionRequest->getPublisherGuid()), new Bigint($subscriptionRequest->getSubscriberGuid()), ]; $prepared = new Custom\Prepared(); $prepared->query($statement, $values); return (bool) $this->db->request($prepared); } } Core/Subscriptions/Requests/SubscriptionRequest.php +10 −2 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,7 @@ use Minds\Traits\MagicAttributes; */ */ class SubscriptionRequest class SubscriptionRequest { { use MagicAttibutes; use MagicAttributes; /** @var string */ /** @var string */ private $publisherGuid; private $publisherGuid; Loading @@ -27,11 +27,19 @@ class SubscriptionRequest private $subscriberGuid; private $subscriberGuid; /** @var bool */ /** @var bool */ private $accepted = false; private $accepted; /** @var int */ /** @var int */ private $timestampMs; private $timestampMs; /** * @return string */ public function getUrn(): string { return "urn:subscription-request:" . implode('-', [ $this->publisherGuid, $this->subscriberGuid ]); } /** /** * Export * Export * @return array * @return array Loading Loading
Core/Subscriptions/Requests/Delegates/NotificationsDelegate.php 0 → 100644 +37 −0 Original line number Original line Diff line number Diff line <?php namespace Minds\Core\Subscriptions\Requests\Delegates; use Minds\Core\Subscriptions\Requests\SubscriptionRequest; class NotificationsDelegate { /** * Called when subscription request is made * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onAdd(SubscriptionRequest $subscriptionRequest): void { // TODO } /** * Called when subscription request is accepted * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onAccept(SubscriptionRequest $subscriptionRequest): void { // TODO } /** * Called when subscription request is declined * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onDecline(SubscriptionRequest $subscriptionRequest): void { // TODO } }
Core/Subscriptions/Requests/Delegates/SubscriptionsDelegate.php 0 → 100644 +17 −0 Original line number Original line Diff line number Diff line <?php namespace Minds\Core\Subscriptions\Requests\Delegates; use Minds\Core\Subscriptions\Requests\SubscriptionRequest; class SubscriptionsDelegate { /** * Called when subscription request is accepted * @param SubscriptionRequest $subscriptionRequest * @return void */ public function onAccept(SubscriptionRequest $subscriptionRequest): void { // TODO } }
Core/Subscriptions/Requests/Manager.php +94 −2 Original line number Original line Diff line number Diff line Loading @@ -4,25 +4,117 @@ */ */ namespace Minds\Core\Subscriptions\Requests; namespace Minds\Core\Subscriptions\Requests; use Minds\Core\Subscriptions\Requests\Delegates\NotificationsDelegate; use Minds\Core\Subscriptions\Requests\Delegates\SubscriptionsDelegate; use Minds\Common\Repository\Response; class Manager class Manager { { /** @var Repository */ private $repository; /** @var NotificationsDelegate */ private $notificationsDelegate; /** @var SubscriptionsDelegate */ private $subscriptionsDelegate; public function __construct($repository = null, $notificationsDelegate = null, $subscriptionsDelegate = null) { $this->repository = $repository ?? new Repository(); $this->notificationsDelegate = $notificationsDelegate ?? new NotificationsDelegate; $this->subscriptionsDelegate = $subscriptionsDelegate ?? new SubscriptionsDelegate; } /** * Return a list of incoming subscription requests * @param array $opts * @return Response */ public function getIncomingList(array $opts = []) { $response = $this->repository->getList($opts); return $response; } /** * Return a subscription request * @param string $urn * @return SubscriptionRequest */ public function get(string $urn): ?SubscriptionRequest { return $this->repository->get($urn); } /** * Add a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function add(SubscriptionRequest $subscriptionRequest): bool public function add(SubscriptionRequest $subscriptionRequest): bool { { // Check if exists // Check if exists $existing = $this->get($subscriptionRequest->getUrn()); if ($existing) { throw new SubscriptionRequestExistsException(); } $this->repository->add($subscriptionRequest); $this->repository->add($subscriptionRequest); $this->notificationsDelegate->onAdd($subscriptionRequest); return true; } } /** * Accept a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function accept(SubscriptionRequest $subscriptionRequest): bool public function accept(SubscriptionRequest $subscriptionRequest): bool { { // Check if exists // Check if exists $existing = $this->get($subscriptionRequest->getUrn()); if (!$existing) { throw new SubscriptionRequestDoesntExistException(); } if ($existing->getAccepted() !== null) { throw new SubscriptionRequestAlreadyCompletedException(); } $subscriptionRequest->setAccepted(true); $subscriptionRequest->setAccepted(true); $this->repository->add($subscriptionRequest); $this->repository->update($subscriptionRequest); $this->notificationsDelegate->onAccept($subscriptionRequest); $this->subscriptionsDelegate->onAccept($subscriptionRequest); return true; } } /** * Decline a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function decline(SubscriptionRequest $subscriptionRequest): bool public function decline(SubscriptionRequest $subscriptionRequest): bool { { // Check if exists // Check if exists $existing = $this->get($subscriptionRequest->getUrn()); if (!$existing) { throw new SubscriptionRequestDoesntExistException(); } if ($existing->getAccepted() !== null) { throw new SubscriptionRequestAlreadyCompletedException(); } $subscriptionRequest->setAccepted(false); $subscriptionRequest->setAccepted(false); $this->repository->add($subscriptionRequest); $this->repository->update($subscriptionRequest); $this->notificationsDelegate->onDecline($subscriptionRequest); return true; } } } }
Core/Subscriptions/Requests/Repository.php +151 −0 Original line number Original line Diff line number Diff line <?php /** * Subscriptions Requests Repository */ namespace Minds\Core\Subscriptions\Requests; use Minds\Core\Di\Di; use Minds\Core\Data\Cassandra\Client; use Minds\Common\Repository\Response; class Repository { /** @var Client */ private $db; public function __construct($db = null) { $this->db = $db ?? Di::_()->get('Database\Cassandra\Cql'); } /** * Return a list of subscription requests * @param array $opts * @return Response */ public function getList(array $opts = []): Response { $prepared = new Prepared\Custom(); $prepared->query( "SELECT * FROM subscription_requests WHERE publisher_guid = ?", [ $opts['publisher_guid'], ] ); $result = $this->db->request($prepared); $response = new Response; foreach ($result as $row) { $subscriptionRequest = new SubscriptionRequest(); $subscriptionRequest ->setPublisherGuid((string) $row['publisher_guid']) ->setSubscriberGuid((string) $row['subscriber_guid']) ->setAccepted((bool) $row['accepted']) ->setTimestampMs((int) $row['timestamp']->time()); $result[] = $subscriptionRequest; } return $response; } /** * Return a single subscription request from a urn * @param string $urn * @return SubscriptionRequest */ public function get(string $urn): ?SubscriptionRequest { $urn = new Urn($urn); list($publisherGuid, $subscriberGuid) = explode('-', $urn->getNss()); $prepared = new Prepared\Custom(); $prepared->query( "SELECT * FROM subscription_requests WHERE publisher_guid = ? AND subscriber_guid = ?", [ $publisherGuid, $subscriberGuid, ] ); $result = $this->db->request($prepared); if (!$result) { return null; } $row = $result[0]; $subscriptionRequest = new SubscriptionRequest(); $subscriptionRequest ->setPublisherGuid((string) $row['publisher_guid']) ->setSubscriberGuid((string) $row['subscriber_guid']) ->setAccepted((bool) $row['accepted']) ->setTimestampMs((int) $row['timestamp']->time()); return $subscriptionRequest; } /** * Add a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function add(SubscriptionRequest $subscriptionRequest): bool { $statement = "INSERT INTO subscription_requests (publisher_guid, subscriber_guid, timestamp) VALUES (?, ?, ?)"; $values = [ new Bigint($subscriptionRequest->getPublisherGuid()), new Bigint($subscriptionRequest->getSubscriberGuid()), new Timestamp($subscriptionRequest->getTimestamp() ?? round(microtime(true) * 1000)), ]; $prepared = new Custom\Prepared(); $prepared->query($statement, $values); return (bool) $this->db->request($prepared); } /** * Update a subscription request * @param SubscriptionRequest $subscriptionRequest * @param array $fields * @return bool */ public function update(SubscriptionRequest $subscriptionRequest, array $field = []): bool { $statement = "INSERT INTO subscription_requests (publisher_guid, subscriber_guid, timestamp) VALUES (?, ?, ?)"; $values = [ new Bigint($subscriptionRequest->getPublisherGuid()), new Bigint($subscriptionRequest->getSubscriberGuid()), new Timestamp($subscriptionRequest->getTimestamp() ?? round(microtime(true) * 1000)), ]; $prepared = new Custom\Prepared(); $prepared->query($statement, $values); return (bool) $this->db->request($prepared); } /** * Delete a subscription request * @param SubscriptionRequest $subscriptionRequest * @return bool */ public function delete(SubscriptionRequest $subscriptionRequest): bool { $statement = "DELETE FROM subscription_requests WHERE publisher_guid = ? AND subscriber_guid = ?"; $values = [ new Bigint($subscriptionRequest->getPublisherGuid()), new Bigint($subscriptionRequest->getSubscriberGuid()), ]; $prepared = new Custom\Prepared(); $prepared->query($statement, $values); return (bool) $this->db->request($prepared); } }
Core/Subscriptions/Requests/SubscriptionRequest.php +10 −2 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,7 @@ use Minds\Traits\MagicAttributes; */ */ class SubscriptionRequest class SubscriptionRequest { { use MagicAttibutes; use MagicAttributes; /** @var string */ /** @var string */ private $publisherGuid; private $publisherGuid; Loading @@ -27,11 +27,19 @@ class SubscriptionRequest private $subscriberGuid; private $subscriberGuid; /** @var bool */ /** @var bool */ private $accepted = false; private $accepted; /** @var int */ /** @var int */ private $timestampMs; private $timestampMs; /** * @return string */ public function getUrn(): string { return "urn:subscription-request:" . implode('-', [ $this->publisherGuid, $this->subscriberGuid ]); } /** /** * Export * Export * @return array * @return array Loading