]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
New actions for managing subscriptions (friendships)
authorZach Copley <zach@status.net>
Mon, 5 Oct 2009 16:57:59 +0000 (09:57 -0700)
committerZach Copley <zach@status.net>
Mon, 5 Oct 2009 17:03:12 +0000 (10:03 -0700)
actions/apifriendshipscreate.php [new file with mode: 0644]
actions/apifriendshipsdestroy.php [new file with mode: 0644]
actions/apifriendshipsexists.php [new file with mode: 0644]
actions/apifriendshipsshow.php [new file with mode: 0644]
actions/twitapifriendships.php [deleted file]

diff --git a/actions/apifriendshipscreate.php b/actions/apifriendshipscreate.php
new file mode 100644 (file)
index 0000000..d691b5b
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Subscribe to a user via the API
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  API
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/apiauth.php';
+
+/**
+ * Allows the authenticating users to follow (subscribe) the user specified in
+ * the ID parameter.  Returns the befriended user in the requested format when
+ * successful.  Returns a string describing the failure condition when unsuccessful.
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiFriendshipsCreateAction extends ApiAuthAction
+{
+
+    var $format = null;
+    var $user   = null;
+    var $other  = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     *
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        if ($this->requiresAuth()) {
+            if ($this->checkBasicAuthUser() == false) {
+                return;
+            }
+        }
+
+        $this->format = $this->arg('format');
+        $this->user   = $this->auth_user;
+        $this->other  = $this->getTargetUser($id);
+
+        return true;
+    }
+
+    /**
+     * Handle the request
+     *
+     * Check the format and show the user info
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->clientError(
+                _('This method requires a POST.'),
+                400,
+                $this->format
+            );
+            return;
+        }
+
+        if (empty($this->other)) {
+            $this->clientError(
+                _('Could not follow user: User not found.'),
+                403,
+                $this->format
+            );
+            return;
+        }
+
+        if ($this->user->isSubscribed($this->other)) {
+            $errmsg = sprintf(
+                _('Could not follow user: %s is already on your list.'),
+                $this->other->nickname
+            );
+            $this->clientError($errmsg, 403, $this->format);
+            return;
+        }
+
+        $result = subs_subscribe_to($this->user, $this->other);
+
+        if (is_string($result)) {
+            $this->clientError($result, 403, $this->format);
+            return;
+        }
+
+        $this->init_document($this->format);
+        $this->show_profile($this->other, $this->format);
+        $this->end_document($this->format);
+    }
+
+}
diff --git a/actions/apifriendshipsdestroy.php b/actions/apifriendshipsdestroy.php
new file mode 100644 (file)
index 0000000..d97c5aa
--- /dev/null
@@ -0,0 +1,136 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Unsubscribe to a user via API
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  API
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/apiauth.php';
+
+/**
+ * Allows the authenticating users to unfollow (unsubscribe) the user specified in
+ * the ID parameter.  Returns the unfollowed user in the requested format when
+ * successful.  Returns a string describing the failure condition when unsuccessful.
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiFriendshipsDestroyAction extends ApiAuthAction
+{
+
+    var $format = null;
+    var $user   = null;
+    var $other  = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     *
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        if ($this->requiresAuth()) {
+            if ($this->checkBasicAuthUser() == false) {
+                return;
+            }
+        }
+
+        $this->format = $this->arg('format');
+        $this->user   = $this->auth_user;
+        $this->other  = $this->getTargetUser($id);
+
+        return true;
+    }
+
+    /**
+     * Handle the request
+     *
+     * Check the format and show the user info
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->clientError(
+                _('This method requires a POST.'),
+                400,
+                $this->format
+            );
+            return;
+        }
+
+        if (empty($this->other)) {
+            $this->clientError(
+                _('Could not unfollow user: User not found.'),
+                403,
+                $this->format
+            );
+            return;
+        }
+
+        // Don't allow unsubscribing from yourself!
+
+        if ($this->user->id == $this->other->id) {
+            $this->clientError(
+                _("You cannot unfollow yourself!"),
+                403,
+                $this->format
+            );
+            return;
+        }
+
+        $result = subs_unsubscribe_user($this->user, $this->other->nickname);
+
+        if (is_string($result)) {
+            $this->clientError($result, 403, $this->format);
+            return;
+        }
+
+        $this->init_document($this->format);
+        $this->show_profile($this->other, $this->format);
+        $this->end_document($this->format);
+    }
+
+}
diff --git a/actions/apifriendshipsexists.php b/actions/apifriendshipsexists.php
new file mode 100644 (file)
index 0000000..3d6e744
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Show whether there is a friendship between two users
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  API
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/twitterapi.php';
+
+/**
+ * Tests for the existence of friendship between two users. Will return true if 
+ * user_a follows user_b, otherwise will return false.
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiFriendshipsExistsAction extends TwitterApiAction
+{
+
+    var $format = null;
+    var $user_a = null;
+    var $user_b = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     *
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        $this->format = $this->arg('format');
+
+        $user_a_id = $this->trimmed('user_a');
+        $user_b_id = $this->trimmed('user_b');
+
+        common_debug("user_a = " . $user_a_id);
+        common_debug("user_b = " . $user_b_id);
+
+
+        $this->user_a = $this->getTargetUser($user_a_id);
+
+        if (empty($this->user_a)) {
+            common_debug('gargargra');
+        }
+
+        $this->user_b = $this->getTargetUser($user_b_id);
+
+        return true;
+    }
+
+    /**
+     * Handle the request
+     *
+     * Check the format and show the user info
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+
+        if (empty($this->user_a) || empty($this->user_b)) {
+            $this->clientError(
+                _('Two user ids or screen_names must be supplied.'),
+                400,
+                $this->format
+            );
+            return;
+        }
+
+        $result = $this->user_a->isSubscribed($this->user_b);
+
+        switch ($this->format) {
+        case 'xml':
+            $this->init_document('xml');
+            $this->element('friends', null, $result);
+            $this->end_document('xml');
+            break;
+        case 'json':
+            $this->init_document('json');
+            print json_encode($result);
+            $this->end_document('json');
+            break;
+        default:
+            break;
+        }
+    }
+
+}
diff --git a/actions/apifriendshipsshow.php b/actions/apifriendshipsshow.php
new file mode 100644 (file)
index 0000000..d35825a
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Show information about the relationship between two users
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  API
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/apibareauth.php';
+
+/**
+ * Outputs detailed information about the relationship between two users
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiFriendshipsShowAction extends ApiBareAuthAction
+{
+
+    var $format = null;
+    var $user   = null;
+    var $source = null;
+    var $target = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     *
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        if ($this->requiresAuth()) {
+            if ($this->checkBasicAuthUser() == false) {
+                return;
+            }
+        }
+
+        $this->format = $this->arg('format');
+
+        $source_id          = (int)$this->trimmed('source_id');
+        $source_screen_name = $this->trimmed('source_screen_name');
+        $target_id          = (int)$this->trimmed('target_id');
+        $target_screen_name = $this->trimmed('target_screen_name');
+    
+        if (!empty($source_id)) {
+            $this->source = User::staticGet($source_id);
+        } elseif (!empty($source_screen_name)) {
+            $this->source = User::staticGet('nickname', $source_screen_name);
+        } else {
+            $this->source = $this->auth_user;
+        }
+
+        if (!empty($target_id)) {
+            $this->target = User::staticGet($target_id);
+        } elseif (!empty($target_screen_name)) {
+            $this->target = User::staticGet('nickname', $target_screen_name);
+        }
+
+        return true;
+    }
+
+
+    /**
+     * Determines whether this API resource requires auth.  Overloaded to look
+     * return true in case source_id and source_screen_name are both empty
+     *
+     * @return boolean true or false
+     */
+       
+    function requiresAuth()
+    {
+        if (common_config('site', 'private')) {
+            return true;
+        }
+
+        $source_id          = $this->trimmed('source_id');
+        $source_screen_name = $this->trimmed('source_screen_name');
+
+        if (empty($source_id) && empty($source_screen_name)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Handle the request
+     *
+     * Check the format and show the user info
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+
+        if (!in_array($this->format, array('xml', 'json'))) {
+            $this->clientError(_('API method not found!'), 404);
+            return;
+        }
+        
+        if (empty($this->source)) {
+            $this->clientError(
+                _('Could not determine source user.'),
+                404
+             );
+            return;
+        }
+              
+        if (empty($this->target)) {
+            $this->clientError(
+                _('Could not find target user.'),
+                404
+            );
+            return;
+        }
+        
+        $result = $this->twitter_relationship_array($this->source, $this->target);
+
+        switch ($this->format) {
+        case 'xml':
+            $this->init_document('xml');
+            $this->show_twitter_xml_relationship($result[relationship]);
+            $this->end_document('xml');
+            break;
+        case 'json':
+            $this->init_document('json');
+            print json_encode($result);
+            $this->end_document('json');
+            break;
+        default:
+            break;
+        }
+        
+    }
+
+}
diff --git a/actions/twitapifriendships.php b/actions/twitapifriendships.php
deleted file mode 100644 (file)
index eea8945..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
-
-require_once(INSTALLDIR.'/lib/twitterapi.php');
-
-class TwitapifriendshipsAction extends TwitterapiAction
-{
-
-    function create($args, $apidata)
-    {
-        parent::handle($args);
-
-        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-            $this->clientError(_('This method requires a POST.'),
-                400, $apidata['content-type']);
-            return;
-        }
-
-        $id    = $apidata['api_arg'];
-        $other = $this->get_user($id);
-
-        if (empty($other)) {
-            $this->clientError(_('Could not follow user: User not found.'),
-                403, $apidata['content-type']);
-            return;
-        }
-
-        $user = $apidata['user'];
-
-        if ($user->isSubscribed($other)) {
-            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'),
-                $other->nickname);
-            $this->clientError($errmsg, 403, $apidata['content-type']);
-            return;
-        }
-
-        $sub = new Subscription();
-
-        $sub->query('BEGIN');
-
-        $sub->subscriber = $user->id;
-        $sub->subscribed = $other->id;
-        $sub->created = DB_DataObject_Cast::dateTime(); # current time
-
-        $result = $sub->insert();
-
-        if (empty($result)) {
-            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'),
-                $other->nickname);
-            $this->clientError($errmsg, 400, $apidata['content-type']);
-            return;
-        }
-
-        $sub->query('COMMIT');
-
-        mail_subscribe_notify($other, $user);
-
-        $type = $apidata['content-type'];
-        $this->init_document($type);
-        $this->show_profile($other, $type);
-        $this->end_document($type);
-
-    }
-
-    function destroy($args, $apidata)
-    {
-        parent::handle($args);
-
-        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-            $this->clientError(_('This method requires a POST or DELETE.'),
-                400, $apidata['content-type']);
-            return;
-        }
-
-        $id = $apidata['api_arg'];
-
-        # We can't subscribe to a remote person, but we can unsub
-
-        $other = $this->get_profile($id);
-        $user = $apidata['user']; // Alwyas the auth user
-
-       if ($user->id == $other->id) {
-           $this->clientError(_("You cannot unfollow yourself!"),
-                              403, $apidata['content-type']);
-           return;
-       }
-
-        $sub = new Subscription();
-        $sub->subscriber = $user->id;
-        $sub->subscribed = $other->id;
-
-        if ($sub->find(true)) {
-            $sub->query('BEGIN');
-            $sub->delete();
-            $sub->query('COMMIT');
-        } else {
-            $this->clientError(_('You are not friends with the specified user.'),
-                403, $apidata['content-type']);
-            return;
-        }
-
-        $type = $apidata['content-type'];
-        $this->init_document($type);
-        $this->show_profile($other, $type);
-        $this->end_document($type);
-
-    }
-
-    function exists($args, $apidata)
-    {
-        parent::handle($args);
-
-        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-            $this->clientError(_('API method not found!'), $code = 404);
-            return;
-        }
-
-        $user_a_id = $this->trimmed('user_a');
-        $user_b_id = $this->trimmed('user_b');
-
-        $user_a = $this->get_user($user_a_id);
-        $user_b = $this->get_user($user_b_id);
-
-        if (empty($user_a) || empty($user_b)) {
-            $this->clientError(_('Two user ids or screen_names must be supplied.'),
-                400, $apidata['content-type']);
-            return;
-        }
-
-        $result = $user_a->isSubscribed($user_b);
-
-        switch ($apidata['content-type']) {
-         case 'xml':
-            $this->init_document('xml');
-            $this->element('friends', null, $result);
-            $this->end_document('xml');
-            break;
-         case 'json':
-            $this->init_document('json');
-            print json_encode($result);
-            $this->end_document('json');
-            break;
-         default:
-            break;
-        }
-
-    }
-
-    function show($args, $apidata)
-    {
-        parent::handle($args);
-
-        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-            $this->clientError(_('API method not found!'), $code = 404);
-            return;
-        }
-
-        $source_id          = (int)$this->trimmed('source_id');
-        $source_screen_name = $this->trimmed('source_screen_name');
-
-        // If the source is not specified for an unauthenticated request,
-        // the method will return an HTTP 403.
-
-        if (empty($source_id) && empty($source_screen_name)) {
-            if (empty($apidata['user'])) {
-                $this->clientError(_('Could not determine source user.'),
-                        $code = 403);
-                return;
-            }
-        }
-
-        $source = null;
-
-        if (!empty($source_id)) {
-            $source = User::staticGet($source_id);
-        } elseif (!empty($source_screen_name)) {
-            $source = User::staticGet('nickname', $source_screen_name);
-        } else {
-            $source = $apidata['user'];
-        }
-
-        // If a source or target is specified but does not exist,
-        // the method will return an HTTP 404.
-
-        if (empty($source)) {
-            $this->clientError(_('Could not determine source user.'),
-                $code = 404);
-            return;
-        }
-
-        $target_id          = (int)$this->trimmed('target_id');
-        $target_screen_name = $this->trimmed('target_screen_name');
-
-        $target = null;
-
-        if (!empty($target_id)) {
-            $target = User::staticGet($target_id);
-        } elseif (!empty($target_screen_name)) {
-            $target = User::staticGet('nickname', $target_screen_name);
-        } else {
-            $this->clientError(_('Target user not specified.'),
-                $code = 403);
-            return;
-        }
-
-        if (empty($target)) {
-            $this->clientError(_('Could not find target user.'),
-                $code = 404);
-            return;
-        }
-
-        $result = $this->twitter_relationship_array($source, $target);
-
-        switch ($apidata['content-type']) {
-        case 'xml':
-            $this->init_document('xml');
-            $this->show_twitter_xml_relationship($result[relationship]);
-            $this->end_document('xml');
-            break;
-        case 'json':
-            $this->init_document('json');
-            print json_encode($result);
-            $this->end_document('json');
-            break;
-        default:
-            break;
-        }
-    }
-
-}