]> git.mxchange.org Git - friendica.git/blobdiff - include/api.php
reformat todo according to doxygen style
[friendica.git] / include / api.php
index 35ebaef0341994589d4c51a5437ecd05ca9c71af..70022067293a556413b4939dfc079f9dc15d4835 100644 (file)
@@ -1,7 +1,30 @@
 <?php
-/* To-Do:
- - Automatically detect if incoming data is HTML or BBCode
-*/
+/**
+ * @file include/api.php
+ * 
+ * @todo Automatically detect if incoming data is HTML or BBCode
+ */
+
+/* Contact details:
+       Gerhard Seeber          Mail: gerhard@seeber.at         Friendica: http://mozartweg.dyndns.org/friendica/gerhard
+
+ */
+
+
+/*
+ * Change history:
+       Gerhard Seeber          2015-NOV-25     Add API call /friendica/group_show to return all or a single group
+                                               with the containing contacts (necessary for Windows 10 Universal app)
+       Gerhard Seeber          2015-NOV-27     Add API call /friendica/group_delete to delete the specified group id
+                                               (necessary for Windows 10 Universal app)
+       Gerhard Seeber          2015-DEC-01     Add API call /friendica/group_create to create a group with the specified 
+                                               name and the given list of contacts (necessary for Windows 10 Universal
+                                               app)
+       Gerhard Seeber          2015-DEC-07     Add API call /friendica/group_update to update a group with the given 
+                                               list of contacts (necessary for Windows 10 Universal app)
+ *
+ */
+
        require_once("include/bbcode.php");
        require_once("include/datetime.php");
        require_once("include/conversation.php");
@@ -16,6 +39,7 @@
        require_once('mod/wall_upload.php');
        require_once("mod/proxy.php");
        require_once("include/message.php");
+       require_once("include/group.php");
 
 
        /*
        }
 
        function api_error(&$a, $type, $error) {
-               # TODO:  https://dev.twitter.com/overview/api/response-codes
+               /// @TODO  https://dev.twitter.com/overview/api/response-codes
                $r = "<status><error>".$error."</error><request>".$a->query_string."</request></status>";
                switch($type){
                        case "xml":
         * Unique contact to contact url.
         */
        function api_unique_id_to_url($id){
-               $r = q("SELECT url FROM unique_contacts WHERE id=%d LIMIT 1",
+               $r = q("SELECT `url` FROM `unique_contacts` WHERE `id`=%d LIMIT 1",
                        intval($id));
                if ($r)
                        return ($r[0]["url"]);
                        $r = array();
 
                        if ($url != "")
-                               $r = q("SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1", $url);
+                               $r = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", $url);
                        elseif ($nick != "")
-                               $r = q("SELECT * FROM unique_contacts WHERE nick='%s' LIMIT 1", $nick);
+                               $r = q("SELECT * FROM `unique_contacts` WHERE `nick`='%s' LIMIT 1", $nick);
 
                        if ($r) {
                                // If no nick where given, extract it from the address
                }
 
                // Fetching unique id
-               $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
+               $r = q("SELECT id FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
 
                // If not there, then add it
                if (count($r) == 0) {
-                       q("INSERT INTO unique_contacts (url, name, nick, avatar) VALUES ('%s', '%s', '%s', '%s')",
+                       q("INSERT INTO `unique_contacts` (`url`, `name`, `nick`, `avatar`) VALUES ('%s', '%s', '%s', '%s')",
                                dbesc(normalise_link($uinfo[0]['url'])), dbesc($uinfo[0]['name']),dbesc($uinfo[0]['nick']), dbesc($uinfo[0]['micro']));
 
-                       $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
+                       $r = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
                }
 
                $network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']);
                        'verified' => true,
                        'statusnet_blocking' => false,
                        'notifications' => false,
-                       'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
+                       //'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
+                       'statusnet_profile_url' => $uinfo[0]['url'],
                        'uid' => intval($uinfo[0]['uid']),
                        'cid' => intval($uinfo[0]['cid']),
                        'self' => $uinfo[0]['self'],
 
        function api_item_get_user(&$a, $item) {
 
-               $author = q("SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1",
+               $author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
                        dbesc(normalise_link($item['author-link'])));
 
                if (count($author) == 0) {
-                       q("INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s')",
-                       dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"]));
+                       q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')",
+                               dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"]));
 
-                       $author = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
+                       $author = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
                                dbesc(normalise_link($item['author-link'])));
                } else if ($item["author-link"].$item["author-name"] != $author[0]["url"].$author[0]["name"]) {
-                       q("UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE (`name` != '%s' OR `avatar` != '%s') AND url = '%s'",
-                       dbesc($item["author-name"]), dbesc($item["author-avatar"]),
-                       dbesc($item["author-name"]), dbesc($item["author-avatar"]),
-                       dbesc(normalise_link($item["author-link"])));
+                       $r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'",
+                               dbesc($item["author-name"]), dbesc($item["author-avatar"]),
+                               dbesc(normalise_link($item["author-link"])));
+
+                       if (!$r)
+                               q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'",
+                                       dbesc($item["author-name"]), dbesc($item["author-avatar"]),
+                                       dbesc(normalise_link($item["author-link"])));
                }
 
-               $owner = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
+               $owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
                        dbesc(normalise_link($item['owner-link'])));
 
                if (count($owner) == 0) {
-                       q("INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s')",
-                       dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"]));
+                       q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')",
+                               dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"]));
 
-                       $owner = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
+                       $owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
                                dbesc(normalise_link($item['owner-link'])));
                } else if ($item["owner-link"].$item["owner-name"] != $owner[0]["url"].$owner[0]["name"]) {
-                       q("UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE (`name` != '%s' OR `avatar` != '%s') AND url = '%s'",
-                       dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
-                       dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
-                       dbesc(normalise_link($item["owner-link"])));
+                       $r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'",
+                               dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
+                               dbesc(normalise_link($item["owner-link"])));
+
+                       if (!$r)
+                               q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'",
+                                       dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
+                                       dbesc(normalise_link($item["owner-link"])));
                }
 
                // Comments in threads may appear as wall-to-wall postings.
                                $_REQUEST['body'] .= "\n\n".$media;
                }
 
-               // To-Do: Multiple IDs
+               /// @TODO Multiple IDs
                if (requestdata('media_ids')) {
                        $r = q("SELECT `resource-id`, `scale`, `nickname`, `type` FROM `photo` INNER JOIN `user` ON `user`.`uid` = `photo`.`uid` WHERE `resource-id` IN (SELECT `resource-id` FROM `photo` WHERE `id` = %d) AND `scale` > 0 AND `photo`.`uid` = %d ORDER BY `photo`.`width` DESC LIMIT 1",
                                intval(requestdata('media_ids')), api_user());
                                $in_reply_to_status_id= intval($lastwall['parent']);
                                $in_reply_to_status_id_str = (string) intval($lastwall['parent']);
 
-                               $r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
+                               $r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
                                if ($r) {
                                        if ($r[0]['nick'] == "")
                                                $r[0]['nick'] = api_get_nick($r[0]["url"]);
                                        $in_reply_to_status_id = intval($lastwall['parent']);
                                        $in_reply_to_status_id_str = (string) intval($lastwall['parent']);
 
-                                       $r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
+                                       $r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
                                        if ($r) {
                                                if ($r[0]['nick'] == "")
                                                        $r[0]['nick'] = api_get_nick($r[0]["url"]);
                $userlist = array();
 
                if (isset($_GET["q"])) {
-                       $r = q("SELECT id FROM unique_contacts WHERE name='%s'", dbesc($_GET["q"]));
+                       $r = q("SELECT id FROM `unique_contacts` WHERE `name`='%s'", dbesc($_GET["q"]));
                        if (!count($r))
-                               $r = q("SELECT id FROM unique_contacts WHERE nick='%s'", dbesc($_GET["q"]));
+                               $r = q("SELECT `id` FROM `unique_contacts` WHERE `nick`='%s'", dbesc($_GET["q"]));
 
                        if (count($r)) {
                                foreach ($r AS $user) {
         *
         * http://developer.twitter.com/doc/get/statuses/home_timeline
         *
-        * TODO: Optional parameters
-        * TODO: Add reply info
+        * @TODO Optional parameters
+        * @TODO Add reply info
         */
        function api_statuses_home_timeline(&$a, $type){
                if (api_user()===false) return false;
        function api_favorites_create_destroy(&$a, $type){
                if (api_user()===false) return false;
 
-               # for versioned api.
-               # TODO: we need a better global soluton
+               // for versioned api.
+               /// @TODO We need a better global soluton
                $action_argv_id=2;
                if ($a->argv[1]=="1.1") $action_argv_id=3;
 
        }
 
        function api_get_entitities(&$text, $bbcode) {
-               /*
-               To-Do:
-               * Links at the first character of the post
-               */
+               /// @todo
+               /// Links at the first character of the post
 
                $a = get_app();
 
                                        intval(api_user()),
                                        intval($in_reply_to_status_id));
                                if ($r) {
-                                       $r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
+                                       $r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
 
                                        if ($r) {
                                                if ($r[0]['nick'] == "")
 
                $stringify_ids = (x($_REQUEST,'stringify_ids')?$_REQUEST['stringify_ids']:false);
 
-               $r = q("SELECT unique_contacts.id FROM contact, unique_contacts WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
+               $r = q("SELECT `unique_contact`.`id` FROM contact, `unique_contacts` WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
                        intval(api_user())
                );
 
@@ -2840,16 +2871,28 @@ function api_share_as_retweet(&$item) {
 }
 
 function api_get_nick($profile) {
-/* To-Do:
- - remove trailing jung from profile url
- - pump.io check has to check the website
-*/
+/// @TODO Remove trailing junk from profile url
+/// @TODO pump.io check has to check the website
 
        $nick = "";
 
-       $friendica = preg_replace("=https?://(.*)/profile/(.*)=ism", "$2", $profile);
-       if ($friendica != $profile)
-               $nick = $friendica;
+       $r = q("SELECT `nick` FROM `gcontact` WHERE `nurl` = '%s'",
+               dbesc(normalise_link($profile)));
+       if ($r)
+               $nick = $r[0]["nick"];
+
+       if (!$nick == "") {
+               $r = q("SELECT `nick` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s'",
+                       dbesc(normalise_link($profile)));
+               if ($r)
+                       $nick = $r[0]["nick"];
+       }
+
+       if (!$nick == "") {
+               $friendica = preg_replace("=https?://(.*)/profile/(.*)=ism", "$2", $profile);
+               if ($friendica != $profile)
+                       $nick = $friendica;
+       }
 
        if (!$nick == "") {
                $diaspora = preg_replace("=https?://(.*)/u/(.*)=ism", "$2", $profile);
@@ -2877,7 +2920,7 @@ function api_get_nick($profile) {
                }
        }
 
-       // To-Do: look at the page if its really a pumpio site
+       /// @TODO Look at the page if its really a pumpio site
        //if (!$nick == "") {
        //      $pumpio = preg_replace("=https?://(.*)/(.*)/=ism", "$2", $profile."/");
        //      if ($pumpio != $profile)
@@ -2887,7 +2930,7 @@ function api_get_nick($profile) {
        //}
 
        if ($nick != "") {
-               q("UPDATE unique_contacts SET nick = '%s' WHERE `nick` != '%s' AND url = '%s'",
+               q("UPDATE `unique_contacts` SET `nick` = '%s' WHERE `nick` != '%s' AND url = '%s'",
                        dbesc($nick), dbesc($nick), dbesc(normalise_link($profile)));
                return($nick);
        }
@@ -2989,6 +3032,205 @@ function api_best_nickname(&$contacts) {
                $contacts = array($contacts[0]);
 }
 
+       // return all or a specified group of the user with the containing contacts
+       function api_friendica_group_show(&$a, $type) {
+               if (api_user()===false) return false;           
+
+               // params
+               $user_info = api_get_user($a);
+               $gid = (x($_REQUEST,'gid') ? $_REQUEST['gid'] : 0);
+               $uid = $user_info['uid'];
+       
+               // get data of the specified group id or all groups if not specified
+               if ($gid != 0) {
+                       $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d AND `id` = %d",
+                               intval($uid), 
+                               intval($gid));
+                       // error message if specified gid is not in database
+                       if (count($r) == 0) 
+                               die(api_error($a, $type, 'gid not available'));
+               }
+               else 
+                       $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d",
+                               intval($uid));
+               
+               // loop through all groups and retrieve all members for adding data in the user array
+               foreach ($r as $rr) {
+                       $members = group_get_members($rr['id']);
+                       $users = array();
+                       foreach ($members as $member) {
+                               $user = api_get_user($a, $member['nurl']);
+                               $users[] = $user;
+                       }
+                       $grps[] = array('name' => $rr['name'], 'gid' => $rr['id'], 'user' => $users);
+               }
+               return api_apply_template("group_show", $type, array('$groups' => $grps));
+       }
+       api_register_func('api/friendica/group_show', 'api_friendica_group_show', true);
+
+
+       // delete the specified group of the user
+       function api_friendica_group_delete(&$a, $type) {
+               if (api_user()===false) return false;           
+
+               // params
+               $user_info = api_get_user($a);
+               $gid = (x($_REQUEST,'gid') ? $_REQUEST['gid'] : 0);
+               $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+               $uid = $user_info['uid'];
+       
+               // error if no gid specified
+               if ($gid == 0 || $name == "")
+                       die(api_error($a, $type, 'gid or name not specified'));
+
+               // get data of the specified group id
+               $r = q("SELECT * FROM `group` WHERE `uid` = %d AND `id` = %d",
+                       intval($uid), 
+                       intval($gid));
+               // error message if specified gid is not in database
+               if (count($r) == 0) 
+                       die(api_error($a, $type, 'gid not available'));
+
+               // get data of the specified group id and group name
+               $rname = q("SELECT * FROM `group` WHERE `uid` = %d AND `id` = %d AND `name` = '%s'",
+                       intval($uid), 
+                       intval($gid),
+                       dbesc($name));
+               // error message if specified gid is not in database
+               if (count($rname) == 0) 
+                       die(api_error($a, $type, 'wrong group name'));
+
+               // delete group
+               $ret = group_rmv($uid, $name);
+               if ($ret) {
+                       // return success
+                       $success = array('success' => $ret, 'gid' => $gid, 'name' => $name, 'status' => 'deleted', 'wrong users' => array());
+                       return api_apply_template("group_delete", $type, array('$result' => $success));
+               }
+               else
+                       die(api_error($a, $type, 'other API error'));
+       }
+       api_register_func('api/friendica/group_delete', 'api_friendica_group_delete', true);
+
+
+       // create the specified group with the posted array of contacts 
+       function api_friendica_group_create(&$a, $type) {
+               if (api_user()===false) return false;           
+
+               // params
+               $user_info = api_get_user($a);
+               $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+               $uid = $user_info['uid'];
+               $json = json_decode($_POST['json'], true);
+               $users = $json['user'];
+
+               // error if no name specified
+               if ($name == "")
+                       die(api_error($a, $type, 'group name not specified'));
+
+               // get data of the specified group name
+               $rname = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' AND `deleted` = 0",
+                       intval($uid), 
+                       dbesc($name));
+               // error message if specified group name already exists
+               if (count($rname) != 0) 
+                       die(api_error($a, $type, 'group name already exists'));
+
+               // check if specified group name is a deleted group
+               $rname = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' AND `deleted` = 1",
+                       intval($uid), 
+                       dbesc($name));
+               // error message if specified group name already exists
+               if (count($rname) != 0) 
+                       $reactivate_group = true;
+
+               // create group
+               $ret = group_add($uid, $name);
+               if ($ret) 
+                       $gid = group_byname($uid, $name);
+               else
+                       die(api_error($a, $type, 'other API error'));
+               
+               // add members
+               $erroraddinguser = false;
+               $errorusers = array();
+               foreach ($users as $user) {
+                       $cid = $user['cid'];
+                       // check if user really exists as contact
+                       $contact = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d", 
+                               intval($cid),
+                               intval($uid));
+                       if (count($contact))
+                               $result = group_add_member($uid, $name, $cid, $gid);
+                       else {
+                               $erroraddinguser = true;
+                               $errorusers[] = $cid;
+                       }
+               }
+
+               // return success message incl. missing users in array
+               $status = ($erroraddinguser ? "missing user" : ($reactivate_group ? "reactivated" : "ok"));
+               $success = array('success' => true, 'gid' => $gid, 'name' => $name, 'status' => $status, 'wrong users' => $errorusers);
+               return api_apply_template("group_create", $type, array('result' => $success));          
+       }
+       api_register_func('api/friendica/group_create', 'api_friendica_group_create', true);
+
+
+       // update the specified group with the posted array of contacts 
+       function api_friendica_group_update(&$a, $type) {
+               if (api_user()===false) return false;           
+
+               // params
+               $user_info = api_get_user($a);
+               $uid = $user_info['uid'];
+               $gid = (x($_REQUEST, 'gid') ? $_REQUEST['gid'] : 0);
+               $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+               $json = json_decode($_POST['json'], true);
+               $users = $json['user'];
+
+               // error if no name specified
+               if ($name == "")
+                       die(api_error($a, $type, 'group name not specified'));
+
+               // error if no gid specified
+               if ($gid == "")
+                       die(api_error($a, $type, 'gid not specified'));
+
+               // remove members
+               $members = group_get_members($gid);
+               foreach ($members as $member) {
+                       $cid = $member['id'];
+                       foreach ($users as $user) {
+                               $found = ($user['cid'] == $cid ? true : false);
+                       }
+                       if (!$found) {
+                               $ret = group_rmv_member($uid, $name, $cid);
+                       }
+               }
+
+               // add members
+               $erroraddinguser = false;
+               $errorusers = array();
+               foreach ($users as $user) {
+                       $cid = $user['cid'];
+                       // check if user really exists as contact
+                       $contact = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d", 
+                               intval($cid),
+                               intval($uid));
+                       if (count($contact))
+                               $result = group_add_member($uid, $name, $cid, $gid);
+                       else {
+                               $erroraddinguser = true;
+                               $errorusers[] = $cid;
+                       }
+               }
+               
+               // return success message incl. missing users in array
+               $status = ($erroraddinguser ? "missing user" : "ok");
+               $success = array('success' => true, 'gid' => $gid, 'name' => $name, 'status' => $status, 'wrong users' => $errorusers);
+               return api_apply_template("group_update", $type, array('result' => $success));          
+       }
+       api_register_func('api/friendica/group_update', 'api_friendica_group_update', true);
 
 /*
 To.Do: