forked from GNUsocial/gnu-social
Refactor subs_* functions for remote use
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.
This commit is contained in:
parent
48edade751
commit
52e8aa798a
@ -868,4 +868,16 @@ class Profile extends Memcached_DataObject
|
|||||||
return $uri;
|
return $uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hasBlocked($other)
|
||||||
|
{
|
||||||
|
$block = Profile_block::get($this->id, $other->id);
|
||||||
|
|
||||||
|
if (empty($block)) {
|
||||||
|
$result = false;
|
||||||
|
} else {
|
||||||
|
$result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,4 +50,150 @@ class Subscription extends Memcached_DataObject
|
|||||||
{
|
{
|
||||||
return Memcached_DataObject::pkeyGet('Subscription', $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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,11 +80,7 @@ class User extends Memcached_DataObject
|
|||||||
|
|
||||||
function isSubscribed($other)
|
function isSubscribed($other)
|
||||||
{
|
{
|
||||||
assert(!is_null($other));
|
return Subscription::exists($this->getProfile(), $other);
|
||||||
// XXX: cache results of this query
|
|
||||||
$sub = Subscription::pkeyGet(array('subscriber' => $this->id,
|
|
||||||
'subscribed' => $other->id));
|
|
||||||
return (is_null($sub)) ? false : true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 'update' won't write key columns, so we have to do it ourselves.
|
// '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)
|
function hasBlocked($other)
|
||||||
{
|
{
|
||||||
|
$profile = $this->getProfile();
|
||||||
$block = Profile_block::get($this->id, $other->id);
|
return $profile->hasBlocked($other);
|
||||||
|
|
||||||
if (is_null($block)) {
|
|
||||||
$result = false;
|
|
||||||
} else {
|
|
||||||
$result = true;
|
|
||||||
$block->free();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
110
lib/subs.php
110
lib/subs.php
@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||||
|
|
||||||
require_once('XMPPHP/XMPP.php');
|
|
||||||
|
|
||||||
/* Subscribe $user to nickname $other_nickname
|
/* Subscribe $user to nickname $other_nickname
|
||||||
Returns true or an error message.
|
Returns true or an error message.
|
||||||
*/
|
*/
|
||||||
@ -44,72 +42,12 @@ function subs_subscribe_user($user, $other_nickname)
|
|||||||
|
|
||||||
function subs_subscribe_to($user, $other)
|
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 {
|
try {
|
||||||
if (Event::handle('StartSubscribe', array($user, $other))) {
|
Subscription::start($user->getProfile(), $other);
|
||||||
|
return true;
|
||||||
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));
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return $e->getMessage();
|
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
|
/* Unsubscribe $user from nickname $other_nickname
|
||||||
@ -128,52 +66,12 @@ function subs_unsubscribe_user($user, $other_nickname)
|
|||||||
return subs_unsubscribe_to($user, $other->getProfile());
|
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)
|
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 {
|
try {
|
||||||
if (Event::handle('StartUnsubscribe', array($user, $other))) {
|
Subscription::cancel($user->getProfile(), $other);
|
||||||
|
return true;
|
||||||
$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));
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return $e->getMessage();
|
return $e->getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user