]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Refactor subs_* functions for remote use
authorEvan Prodromou <evan@status.net>
Fri, 19 Feb 2010 13:16:45 +0000 (08:16 -0500)
committerEvan Prodromou <evan@status.net>
Fri, 19 Feb 2010 13:16:45 +0000 (08:16 -0500)
The subs_* functions in subs.php have made a lot of assumptions
about users versus profiles. I've refactored the functions to
be methods of the Subscription class instead, and to use Profile
objects throughout.

Some of the checks for blocks or existing subscriptions depended
on users or profiles, so I've moved those methods around a bit.

I've left stubs for the subs_* functions until we get time to replace
them.

classes/Profile.php
classes/Subscription.php
classes/User.php
lib/subs.php

index 494c697e425fab0fa9726cba9bf0aac41635e2ff..6b396c8c340b64115b7c4377b3d148c1921eba23 100644 (file)
@@ -868,4 +868,16 @@ class Profile extends Memcached_DataObject
         return $uri;
     }
 
+    function hasBlocked($other)
+    {
+        $block = Profile_block::get($this->id, $other->id);
+
+        if (empty($block)) {
+            $result = false;
+        } else {
+            $result = true;
+        }
+
+        return $result;
+    }
 }
index faf1331cda11565eec0655ea4a266079ceca0618..d6fb3fcbdda82f17d70dcce6692868dfed6f1840 100644 (file)
@@ -24,7 +24,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
  */
 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
-class Subscription extends Memcached_DataObject 
+class Subscription extends Memcached_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -34,8 +34,8 @@ class Subscription extends Memcached_DataObject
     public $subscribed;                      // int(4)  primary_key not_null
     public $jabber;                          // tinyint(1)   default_1
     public $sms;                             // tinyint(1)   default_1
-    public $token;                           // varchar(255)  
-    public $secret;                          // varchar(255)  
+    public $token;                           // varchar(255)
+    public $secret;                          // varchar(255)
     public $created;                         // datetime()   not_null
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 
@@ -45,9 +45,155 @@ class Subscription extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-    
+
     function pkeyGet($kv)
     {
         return Memcached_DataObject::pkeyGet('Subscription', $kv);
     }
+
+    /**
+     * Make a new subscription
+     *
+     * @param Profile $subscriber party to receive new notices
+     * @param Profile $other      party sending notices; publisher
+     *
+     * @return Subscription new subscription
+     */
+
+    static function start($subscriber, $other)
+    {
+        if (!$subscriber->hasRight(Right::SUBSCRIBE)) {
+            throw new Exception(_('You have been banned from subscribing.'));
+        }
+
+        if (self::exists($subscriber, $other)) {
+            throw new Exception(_('Already subscribed!'));
+        }
+
+        if ($other->hasBlocked($subscriber)) {
+            throw new Exception(_('User has blocked you.'));
+        }
+
+        if (Event::handle('StartSubscribe', array($subscriber, $other))) {
+
+            $sub = new Subscription();
+
+            $sub->subscriber = $subscriber->id;
+            $sub->subscribed = $other->id;
+            $sub->created    = common_sql_now();
+
+            $result = $sub->insert();
+
+            if (!$result) {
+                common_log_db_error($sub, 'INSERT', __FILE__);
+                throw new Exception(_('Could not save subscription.'));
+            }
+
+            $sub->notify();
+
+            self::blow('user:notices_with_friends:%d', $subscriber->id);
+
+            $subscriber->blowSubscriptionsCount();
+            $other->blowSubscribersCount();
+
+            $otherUser = User::staticGet('id', $other->id);
+
+            if (!empty($otherUser) &&
+                $otherUser->autosubscribe &&
+                !self::exists($other, $subscriber) &&
+                !$subscriber->hasBlocked($other)) {
+
+                $auto = new Subscription();
+
+                $auto->subscriber = $subscriber->id;
+                $auto->subscribed = $other->id;
+                $auto->created    = common_sql_now();
+
+                $result = $auto->insert();
+
+                if (!$result) {
+                    common_log_db_error($auto, 'INSERT', __FILE__);
+                    throw new Exception(_('Could not save subscription.'));
+                }
+
+                $auto->notify();
+            }
+
+            Event::handle('EndSubscribe', array($subscriber, $other));
+        }
+
+        return true;
+    }
+
+    function notify()
+    {
+        # XXX: add other notifications (Jabber, SMS) here
+        # XXX: queue this and handle it offline
+        # XXX: Whatever happens, do it in Twitter-like API, too
+
+        $this->notifyEmail();
+    }
+
+    function notifyEmail()
+    {
+        $subscribedUser = User::staticGet('id', $this->subscribed);
+
+        if (!empty($subscribedUser)) {
+
+            $subscriber = Profile::staticGet('id', $this->subscriber);
+
+            mail_subscribe_notify_profile($subscribedUser, $subscriber);
+        }
+    }
+
+    /**
+     * Cancel a subscription
+     *
+     */
+
+    function cancel($subscriber, $other)
+    {
+        if (!self::exists($subscriber, $other)) {
+            throw new Exception(_('Not subscribed!'));
+        }
+
+        // Don't allow deleting self subs
+
+        if ($subscriber->id == $other->id) {
+            throw new Exception(_('Couldn\'t delete self-subscription.'));
+        }
+
+        if (Event::handle('StartUnsubscribe', array($subscriber, $other))) {
+
+            $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id,
+                                               'subscribed' => $other->id));
+
+            // note we checked for existence above
+
+            assert(!empty($sub));
+
+            $result = $sub->delete();
+
+            if (!$result) {
+                common_log_db_error($sub, 'DELETE', __FILE__);
+                throw new Exception(_('Couldn\'t delete subscription.'));
+            }
+
+            self::blow('user:notices_with_friends:%d', $subscriber->id);
+
+            $subscriber->blowSubscriptionsCount();
+            $other->blowSubscribersCount();
+
+            Event::handle('EndUnsubscribe', array($subscriber, $other));
+        }
+
+        return;
+    }
+
+    function exists($subscriber, $other)
+    {
+        $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id,
+                                           'subscribed' => $other->id));
+        return (empty($sub)) ? false : true;
+    }
 }
index 72c3f39e947e507d191bae34a2a9ed1b674e02fa..10b1f486513a4bb5b38ecc5c48d4f8e371c5b684 100644 (file)
@@ -80,11 +80,7 @@ class User extends Memcached_DataObject
 
     function isSubscribed($other)
     {
-        assert(!is_null($other));
-        // XXX: cache results of this query
-        $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
-                                           'subscribed' => $other->id));
-        return (is_null($sub)) ? false : true;
+        return Subscription::exists($this->getProfile(), $other);
     }
 
     // 'update' won't write key columns, so we have to do it ourselves.
@@ -167,17 +163,8 @@ class User extends Memcached_DataObject
 
     function hasBlocked($other)
     {
-
-        $block = Profile_block::get($this->id, $other->id);
-
-        if (is_null($block)) {
-            $result = false;
-        } else {
-            $result = true;
-            $block->free();
-        }
-
-        return $result;
+        $profile = $this->getProfile();
+        return $profile->hasBlocked($other);
     }
 
     /**
index 5ac1a75a5ce80aecf1fa70221451aa5edb0c3ae3..5376e21bda11a6962101d7b797be9c3b7f9040d6 100644 (file)
@@ -19,8 +19,6 @@
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
-require_once('XMPPHP/XMPP.php');
-
 /* Subscribe $user to nickname $other_nickname
   Returns true or an error message.
 */
@@ -44,72 +42,12 @@ function subs_subscribe_user($user, $other_nickname)
 
 function subs_subscribe_to($user, $other)
 {
-    if (!$user->hasRight(Right::SUBSCRIBE)) {
-        return _('You have been banned from subscribing.');
-    }
-
-    if ($user->isSubscribed($other)) {
-        return _('Already subscribed!');
-    }
-
-    if ($other->hasBlocked($user)) {
-        return _('User has blocked you.');
-    }
-
     try {
-        if (Event::handle('StartSubscribe', array($user, $other))) {
-
-            if (!$user->subscribeTo($other)) {
-                return _('Could not subscribe.');
-                return;
-            }
-
-            subs_notify($other, $user);
-
-            $cache = common_memcache();
-
-            if ($cache) {
-                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-            }
-
-            $profile = $user->getProfile();
-
-            $profile->blowSubscriptionsCount();
-            $other->blowSubscribersCount();
-
-            if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
-                if (!$other->subscribeTo($user)) {
-                    return _('Could not subscribe other to you.');
-                }
-                $cache = common_memcache();
-
-                if ($cache) {
-                    $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
-                }
-
-                subs_notify($user, $other);
-            }
-
-            Event::handle('EndSubscribe', array($user, $other));
-        }
+        Subscription::start($user->getProfile(), $other);
+        return true;
     } catch (Exception $e) {
         return $e->getMessage();
     }
-
-    return true;
-}
-
-function subs_notify($listenee, $listener)
-{
-    # XXX: add other notifications (Jabber, SMS) here
-    # XXX: queue this and handle it offline
-    # XXX: Whatever happens, do it in Twitter-like API, too
-    subs_notify_email($listenee, $listener);
-}
-
-function subs_notify_email($listenee, $listener)
-{
-    mail_subscribe_notify($listenee, $listener);
 }
 
 /* Unsubscribe $user from nickname $other_nickname
@@ -128,52 +66,12 @@ function subs_unsubscribe_user($user, $other_nickname)
     return subs_unsubscribe_to($user, $other->getProfile());
 }
 
-/* Unsubscribe user $user from profile $other
- * NB: other can be a remote user. */
-
 function subs_unsubscribe_to($user, $other)
 {
-    if (!$user->isSubscribed($other))
-        return _('Not subscribed!');
-
-    // Don't allow deleting self subs
-
-    if ($user->id == $other->id) {
-        return _('Couldn\'t delete self-subscription.');
-    }
-
     try {
-        if (Event::handle('StartUnsubscribe', array($user, $other))) {
-
-            $sub = DB_DataObject::factory('subscription');
-
-            $sub->subscriber = $user->id;
-            $sub->subscribed = $other->id;
-
-            $sub->find(true);
-
-            // note we checked for existence above
-
-            if (!$sub->delete())
-              return _('Couldn\'t delete subscription.');
-
-            $cache = common_memcache();
-
-            if ($cache) {
-                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-            }
-
-            $profile = $user->getProfile();
-
-            $profile->blowSubscriptionsCount();
-            $other->blowSubscribersCount();
-
-            Event::handle('EndUnsubscribe', array($user, $other));
-        }
+        Subscription::cancel($user->getProfile(), $other);
+        return true;
     } catch (Exception $e) {
         return $e->getMessage();
     }
-
-    return true;
-}
-
+}
\ No newline at end of file