]> git.mxchange.org Git - friendica.git/blobdiff - include/api.php
Bugfix: probing failed when a profile was hidden
[friendica.git] / include / api.php
index fdaf50e661130fb02496d363d525a26a63290632..b93f8cf72a32b0ce14dcabe9f1754b54f17431c1 100644 (file)
                        'attendno' => array(),
                        'attendmaybe' => array()
                );
+
                $items = q('SELECT * FROM item
                                        WHERE uid=%d AND `thr-parent`="%s" AND visible AND NOT deleted',
                                        intval($item['uid']),
                                        dbesc($item['uri']));
+
                foreach ($items as $i){
-                       builtin_activity_puller($i, $activities);
+                       // not used as result should be structured like other user data
+                       //builtin_activity_puller($i, $activities);
+
+                       // get user data and add it to the array of the activity
+                       $user = api_get_user($a, $i['author-link']);                    
+                       switch($i['verb']) {
+                               case ACTIVITY_LIKE:
+                                       $activities['like'][] = $user;
+                                       break;
+                               case ACTIVITY_DISLIKE:
+                                       $activities['dislike'][] = $user;
+                                       break;
+                               case ACTIVITY_ATTEND:
+                                       $activities['attendyes'][] = $user;
+                                       break;
+                               case ACTIVITY_ATTENDNO:
+                                       $activities['attendno'][] = $user;
+                                       break;
+                               case ACTIVITY_ATTENDMAYBE:
+                                       $activities['attendmaybe'][] = $user;
+                                       break;
+                               default:
+                                       break;
+                       }
                }
 
                if ($type == "xml") {
                        $xml_activities = array();
-                       foreach ($activities as $k => $v)
+                       foreach ($activities as $k => $v) {
+                               // change xml element from "like" to "friendica:like"
                                $xml_activities["friendica:".$k] = $v;
-
+                               // add user data into xml output
+                               $k_user = 0;
+                               foreach ($v as $user)
+                                       $xml_activities["friendica:".$k][$k_user++.":user"] = $user;
+                       }
                        $activities = $xml_activities;
                }
 
-               $res = array();
-               $uri = $item['uri']."-l";
-               foreach($activities as $k => $v) {
-                       $res[$k] = (x($v,$uri)?count($v[$uri]):0);
-                       #$res[$k] = ( x($v,$uri) ? array_map("api_contactlink_to_array", $v[$uri]) : array() );
-               }
-               return $res;
+               return $activities;
+
+       }
+
+
+       /**
+        * @brief return data from profiles
+        *
+        * @param array $profile array containing data from db table 'profile'
+        * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+        * @return array
+        */
+       function api_format_items_profiles(&$profile = null, $type = "json") {
+               if ($profile != null) {
+                       $profile = array('profile_id' => $profile['id'],
+                                                       'profile_name' => $profile['profile-name'],
+                                                       'is_default' => $profile['is-default'] ? true : false,
+                                                       'hide_friends'=> $profile['hide-friends'] ? true : false,
+                                                       'profile_photo' => $profile['photo'],
+                                                       'profile_thumb' => $profile['thumb'],
+                                                       'publish' => $profile['publish'] ? true : false,
+                                                       'net_publish' => $profile['net-publish'] ? true : false,
+                                                       'description' => $profile['pdesc'],
+                                                       'date_of_birth' => $profile['dob'],
+                                                       'address' => $profile['address'],
+                                                       'city' => $profile['locality'],
+                                                       'region' => $profile['region'],
+                                                       'postal_code' => $profile['postal-code'],
+                                                       'country' => $profile['country-name'],
+                                                       'hometown' => $profile['hometown'],
+                                                       'gender' => $profile['gender'],
+                                                       'marital' => $profile['marital'],
+                                                       'marital_with' => $profile['with'],
+                                                       'marital_since' => $profile['howlong'],
+                                                       'sexual' => $profile['sexual'],
+                                                       'politic' => $profile['politic'],
+                                                       'religion' => $profile['religion'],
+                                                       'public_keywords' => $profile['pub_keywords'],
+                                                       'private_keywords' => $profile['prv_keywords'],
+                                                       'likes' => bbcode(api_clean_plain_items($profile['likes']), false, false, 2, true),
+                                                       'dislikes' => bbcode(api_clean_plain_items($profile['dislikes']), false, false, 2, true),
+                                                       'about' => bbcode(api_clean_plain_items($profile['about']), false, false, 2, true),
+                                                       'music' => bbcode(api_clean_plain_items($profile['music']), false, false, 2, true),
+                                                       'book' => bbcode(api_clean_plain_items($profile['book']), false, false, 2, true),
+                                                       'tv' => bbcode(api_clean_plain_items($profile['tv']), false, false, 2, true),
+                                                       'film' => bbcode(api_clean_plain_items($profile['film']), false, false, 2, true),
+                                                       'interest' => bbcode(api_clean_plain_items($profile['interest']), false, false, 2, true),
+                                                       'romance' => bbcode(api_clean_plain_items($profile['romance']), false, false, 2, true),
+                                                       'work' => bbcode(api_clean_plain_items($profile['work']), false, false, 2, true),
+                                                       'education' => bbcode(api_clean_plain_items($profile['education']), false, false, 2, true),
+                                                       'social_networks' => bbcode(api_clean_plain_items($profile['contact']), false, false, 2, true),
+                                                       'homepage' => $profile['homepage'],
+                                                       'users' => null);
+                       return $profile;
+               } 
        }
 
        /**
        }
        api_register_func('api/direct_messages/new','api_direct_messages_new',true, API_METHOD_POST);
 
-       function api_direct_messages_box($type, $box) {
+
+       /**
+        * @brief delete a direct_message from mail table through api
+        *
+        * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+        * @return string 
+        */
+       function api_direct_messages_destroy($type){
+               $a = get_app();
+
+               if (api_user()===false) throw new ForbiddenException();
+
+               // params
+               $user_info = api_get_user($a);
+               //required
+               $id = (x($_REQUEST,'id') ? $_REQUEST['id'] : 0);
+               // optional
+               $parenturi = (x($_REQUEST, 'friendica_parenturi') ? $_REQUEST['friendica_parenturi'] : "");
+               $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+               /// @todo optional parameter 'include_entities' from Twitter API not yet implemented
+
+               $uid = $user_info['uid'];
+               // error if no id or parenturi specified (for clients posting parent-uri as well)
+               if ($verbose == "true") {
+                       if ($id == 0 || $parenturi == "") {
+                               $answer = array('result' => 'error', 'message' => 'message id or parenturi not specified');
+                               return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
+                       }
+               }
+
+               // BadRequestException if no id specified (for clients using Twitter API)
+               if ($id == 0) throw new BadRequestException('Message id not specified');
+
+               // add parent-uri to sql command if specified by calling app            
+               $sql_extra = ($parenturi != "" ? " AND `parent-uri` = '" . dbesc($parenturi) . "'" : "");
+
+               // get data of the specified message id
+               $r = q("SELECT `id` FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra,
+                       intval($uid), 
+                       intval($id));
+       
+               // error message if specified id is not in database
+               if (!dbm::is_result($r)) {
+                       if ($verbose == "true") {
+                               $answer = array('result' => 'error', 'message' => 'message id not in database');
+                               return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
+                       }
+                       /// @todo BadRequestException ok for Twitter API clients?
+                       throw new BadRequestException('message id not in database');
+               }
+
+               // delete message
+               $result = q("DELETE FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra, 
+                       intval($uid), 
+                       intval($id));
+
+               if ($verbose == "true") {
+                       if ($result) {
+                               // return success
+                               $answer = array('result' => 'ok', 'message' => 'message deleted');
+                               return api_format_data("direct_message_delete", $type, array('$result' => $answer));
+                       }
+                       else {
+                               $answer = array('result' => 'error', 'message' => 'unknown error');
+                               return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
+                       }
+               }
+               /// @todo return JSON data like Twitter API not yet implemented
+
+       }
+       api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true, API_METHOD_DELETE);
+
+
+       function api_direct_messages_box($type, $box, $verbose) {
 
                $a = get_app();
 
                                intval($since_id),
                                intval($start), intval($count)
                );
-
+               if ($verbose == "true") {
+                       // stop execution and return error message if no mails available
+                       if($r == null) {
+                               $answer = array('result' => 'error', 'message' => 'no mails available');
+                               return api_format_data("direct_messages_all", $type, array('$result' => $answer));
+                       }
+               }
 
                $ret = Array();
                foreach($r as $item) {
        }
 
        function api_direct_messages_sentbox($type){
-               return api_direct_messages_box($type, "sentbox");
+               $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+               return api_direct_messages_box($type, "sentbox", $verbose);
        }
        function api_direct_messages_inbox($type){
-               return api_direct_messages_box($type, "inbox");
+               $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+               return api_direct_messages_box($type, "inbox", $verbose);
        }
        function api_direct_messages_all($type){
-               return api_direct_messages_box($type, "all");
+               $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+               return api_direct_messages_box($type, "all", $verbose);
        }
        function api_direct_messages_conversation($type){
-               return api_direct_messages_box($type, "conversation");
+               $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+               return api_direct_messages_box($type, "conversation", $verbose);
        }
        api_register_func('api/direct_messages/conversation','api_direct_messages_conversation',true);
        api_register_func('api/direct_messages/all','api_direct_messages_all',true);
        api_register_func('api/friendica/notification', 'api_friendica_notification', true, API_METHOD_GET);
 
 
-       /**
-        * @brief return direct_messages (similar to direct_messages/all, but additional 
-        * error string returned if no mails available to react in client with notification)
-        *
-        * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
-        * @return string (error -> No Mails available, success -> return messages)
-        */
-       function api_friendica_direct_messages_all($type){
-               $a = get_app();
-
-               if (api_user()===false) throw new ForbiddenException();
-
-               // params
-               $count = (x($_GET,'count')?$_GET['count']:20);
-               $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
-               if ($page<0) $page=0;
-
-               $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
-               $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
-
-               $user_id = (x($_REQUEST,'user_id')?$_REQUEST['user_id']:"");
-               $screen_name = (x($_REQUEST,'screen_name')?$_REQUEST['screen_name']:"");
-
-               //  caller user info
-               unset($_REQUEST["user_id"]);
-               unset($_GET["user_id"]);
-
-               unset($_REQUEST["screen_name"]);
-               unset($_GET["screen_name"]);
-
-               $user_info = api_get_user($a);
-               $profile_url = $user_info["url"];
-
-               // pagination
-               $start = $page*$count;
-
-               // filters
-               $sql_extra = "true";
-
-               if ($max_id > 0)
-                       $sql_extra .= ' AND `mail`.`id` <= '.intval($max_id);
-
-               if ($user_id !="") {
-                       $sql_extra .= ' AND `mail`.`contact-id` = ' . intval($user_id);
-               }
-               elseif($screen_name !=""){
-                       $sql_extra .= " AND `contact`.`nick` = '" . dbesc($screen_name). "'";
-               }
-
-               $r = q("SELECT `mail`.*, `contact`.`nurl` AS `contact-url` FROM `mail`,`contact` WHERE `mail`.`contact-id` = `contact`.`id` AND `mail`.`uid`=%d AND $sql_extra AND `mail`.`id` > %d ORDER BY `mail`.`id` DESC LIMIT %d,%d",
-                               intval(api_user()),
-                               intval($since_id),
-                               intval($start), intval($count)
-               );
-
-               // stop execution and return error message if no mails available
-               if($r == null) {
-                       $answer = array('result' => 'error', 'message' => 'no mails available');
-                       return api_format_data("direct_messages_all", $type, array('$result' => $answer));
-               }
-
-               $ret = Array();
-               foreach($r as $item) {
-                       if ($box == "inbox" || $item['from-url'] != $profile_url){
-                               $recipient = $user_info;
-                               $sender = api_get_user($a,normalise_link($item['contact-url']));
-                       }
-                       elseif ($box == "sentbox" || $item['from-url'] == $profile_url){
-                               $recipient = api_get_user($a,normalise_link($item['contact-url']));
-                               $sender = $user_info;
-
-                       }
-                       $ret[]=api_format_messages($item, $recipient, $sender);
-               }
-
-
-               $data = array('direct-messages' => $ret);
-               switch($type){
-                       case "atom":
-                       case "rss":
-                               $data = api_rss_extra($a, $data, $user_info);
-               }
-
-               return  api_format_data("direct-messages", $type, $data);
-
-       }
-       api_register_func('api/friendica/direct_messages_all', 'api_friendica_direct_messages_all', true);
-
-
        /**
         * @brief update a direct_message to seen state
         *
                }
 
                // get data of the specified message id
-               $r = q("SELECT * FROM `mail` WHERE `id` = %d AND `uid` = %d",
+               $r = q("SELECT `id` FROM `mail` WHERE `id` = %d AND `uid` = %d",
                        intval($id), 
                        intval($uid));
                // error message if specified id is not in database
-               if (count($r) == 0) {
+               if (!dbm::is_result($r)) {
                        $answer = array('result' => 'error', 'message' => 'message id not in database');
                        return api_format_data("direct_messages_setseen", $type, array('$result' => $answer));
                }
        api_register_func('api/friendica/direct_messages_setseen', 'api_friendica_direct_messages_setseen', true);
 
 
-       /**
-        * @brief delete a direct_message from mail table through api
-        *
-        * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
-        * @return string (success result=ok, error result=error with error message)
-        */
-       function api_friendica_direct_messages_delete($type){
-               $a = get_app();
-
-               if (api_user()===false) throw new ForbiddenException();
-
-               // params
-               $user_info = api_get_user($a);
-               $id = (x($_REQUEST,'id') ? $_REQUEST['id'] : 0);
-               $parenturi = (x($_REQUEST, 'parenturi') ? $_REQUEST['parenturi'] : "");
-               $uid = $user_info['uid'];
-       
-               // error if no id or parenturi specified
-               if ($id == 0 || $parenturi == "") {
-                       $answer = array('result' => 'error', 'message' => 'message id or parenturi not specified');
-                       return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
-               }
-
-               // get data of the specified message id
-               $r = q("SELECT * FROM `mail` WHERE `uid` = %d AND `id` = %d",
-                       intval($uid), 
-                       intval($id));
-               // error message if specified id is not in database
-               if (count($r) == 0) {
-                       $answer = array('result' => 'error', 'message' => 'message id not in database');
-                       return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
-               }
-
-               // delete message
-               $result = q("DELETE FROM `mail` WHERE `uid` = %d AND `id` = %d AND `parent-uri` = '%s'", 
-                       intval($uid), 
-                       intval($id), 
-                       dbesc($parenturi));
-
-               if ($result) {
-                       // return success
-                       $answer = array('result' => 'ok', 'message' => 'message deleted');
-                       return api_format_data("direct_message_delete", $type, array('$result' => $answer));
-               }
-               else {
-                       $answer = array('result' => 'error', 'message' => 'unknown error');
-                       return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
-               }
-       }
-       api_register_func('api/friendica/direct_messages_delete', 'api_friendica_direct_messages_delete', true);
 
 
        /**
        api_register_func('api/friendica/direct_messages_search', 'api_friendica_direct_messages_search', true);
 
 
+       /**
+        * @brief return data of all the profiles a user has to the client
+        *
+        * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+        * @return string
+        */
+       function api_friendica_profile_show($type){
+               $a = get_app();
+
+               if (api_user()===false) throw new ForbiddenException();
+
+               // input params
+               $profileid = (x($_REQUEST,'profile_id') ? $_REQUEST['profile_id'] : 0);
+
+               // retrieve general information about profiles for user
+               $multi_profiles = feature_enabled(api_user(),'multi_profiles');
+               $directory = get_config('system', 'directory');
+
+// get data of the specified profile id or all profiles of the user if not specified
+               if ($profileid != 0) {
+                       $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d",
+                               intval(api_user()),
+                               intval($profileid));
+                       // error message if specified gid is not in database
+                       if (count($r) == 0)
+                               throw new BadRequestException("profile_id not available");
+               }
+               else
+                       $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+                               intval(api_user()));
+
+               // loop through all returned profiles and retrieve data and users
+               $k = 0;
+               foreach ($r as $rr) {
+                       $profile = api_format_items_profiles($rr, $type);
+
+                       // select all users from contact table, loop and prepare standard return for user data
+                       $users = array();
+                       $r = q("SELECT `id`, `nurl` FROM `contact` WHERE `uid`= %d AND `profile-id` = %d",
+                               intval(api_user()),
+                               intval($rr['profile_id']));
+
+                       foreach ($r as $rr) {
+                               $user = api_get_user($a, $rr['nurl']);
+                               ($type == "xml") ? $users[$k++.":user"] = $user : $users[] = $user;
+                       }
+                       $profile['users'] = $users;
+
+                       // add prepared profile data to array for final return
+                       if ($type == "xml") {
+                               $profiles[$k++.":profile"] = $profile;
+                       } else {
+                               $profiles[] = $profile;
+                       }
+               }
+
+               // return settings, authenticated user and profiles data
+               $result = array('multi_profiles' => $multi_profiles ? true : false,
+                                               'global_dir' => $directory,
+                                               'friendica_owner' => api_get_user($a, intval(api_user())),
+                                               'profiles' => $profiles);
+               return api_format_data("friendica_profiles", $type, array('$result' => $result));
+       }
+       api_register_func('api/friendica/profile/show', 'api_friendica_profile_show', true, API_METHOD_GET);
+
 /*
 To.Do:
     [pagename] => api/1.1/statuses/lookup.json
@@ -3936,6 +4023,9 @@ account/update_profile_background_image
 account/update_profile_image
 blocks/create
 blocks/destroy
+friendica/profile/update
+friendica/profile/create
+friendica/profile/delete
 
 Not implemented in status.net:
 statuses/retweeted_to_me