API: Added better error handling, make some more api calls similar to statusnet

This commit is contained in:
Michael Vogel 2013-12-20 23:07:11 +01:00
parent 9cfa60fe15
commit 165a201ca7

View file

@ -68,10 +68,12 @@
} }
if (!isset($_SERVER['PHP_AUTH_USER'])) { if (!isset($_SERVER['PHP_AUTH_USER'])) {
logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG); logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
header('WWW-Authenticate: Basic realm="Friendica"'); header('WWW-Authenticate: Basic realm="Friendica"');
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
die('This api requires login'); die((api_error(&$a, 'json', "This api requires login")));
//die('This api requires login');
} }
$user = $_SERVER['PHP_AUTH_USER']; $user = $_SERVER['PHP_AUTH_USER'];
@ -169,7 +171,12 @@
} }
header("HTTP/1.1 404 Not Found"); header("HTTP/1.1 404 Not Found");
logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true)); logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true));
$r = '<status><error>not implemented</error></status>'; return(api_error(&$a, $type, "not implemented"));
}
function api_error(&$a, $type, $error) {
$r = "<status><error>".$error."</error><request>".$a->query_string."</request></status>";
switch($type){ switch($type){
case "xml": case "xml":
header ("Content-Type: text/xml"); header ("Content-Type: text/xml");
@ -177,7 +184,7 @@
break; break;
case "json": case "json":
header ("Content-Type: application/json"); header ("Content-Type: application/json");
return json_encode(array('error' => 'not implemented')); return json_encode(array('error' => $error, 'request' => $a->query_string));
break; break;
case "rss": case "rss":
header ("Content-Type: application/rss+xml"); header ("Content-Type: application/rss+xml");
@ -225,7 +232,7 @@
/** /**
* Returns user info array. * Returns user info array.
*/ */
function api_get_user(&$a, $contact_id = Null){ function api_get_user(&$a, $contact_id = Null, $type = "json"){
global $called_api; global $called_api;
$user = null; $user = null;
$extra_query = ""; $extra_query = "";
@ -245,7 +252,7 @@
$user = dbesc(api_unique_id_to_url($contact_id)); $user = dbesc(api_unique_id_to_url($contact_id));
if ($user == "") if ($user == "")
return false; die(api_error($a, $type, t("User not found.")));
$url = $user; $url = $user;
$extra_query = "AND `contact`.`nurl` = '%s' "; $extra_query = "AND `contact`.`nurl` = '%s' ";
@ -256,7 +263,7 @@
$user = dbesc(api_unique_id_to_url($_GET['user_id'])); $user = dbesc(api_unique_id_to_url($_GET['user_id']));
if ($user == "") if ($user == "")
return false; die(api_error($a, $type, t("User not found.")));
$url = $user; $url = $user;
$extra_query = "AND `contact`.`nurl` = '%s' "; $extra_query = "AND `contact`.`nurl` = '%s' ";
@ -344,7 +351,7 @@
return $ret; return $ret;
} else } else
return False; die(api_error($a, $type, t("User not found.")));
} }
@ -448,7 +455,7 @@
function api_item_get_user(&$a, $item) { function api_item_get_user(&$a, $item) {
$author = q("SELECT id 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']))); dbesc(normalise_link($item['author-link'])));
if (count($author) == 0) { if (count($author) == 0) {
@ -457,6 +464,9 @@
$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']))); 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 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",
@ -468,6 +478,9 @@
$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']))); 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 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. // Comments in threads may appear as wall-to-wall postings.
@ -519,6 +532,18 @@
if (api_user()===false) return false; if (api_user()===false) return false;
$user_info = api_get_user($a); $user_info = api_get_user($a);
// "verified" isn't used here in the standard
unset($user_info["verified"]);
// - Adding last status
$user_info["status"] = api_status_show($a,"raw");
unset($user_info["status"]["user"]);
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset($user_info["cid"]);
unset($user_info["uid"]);
unset($user_info["self"]);
return api_apply_template("user", $type, array('$user' => $user_info)); return api_apply_template("user", $type, array('$user' => $user_info));
} }
@ -701,12 +726,10 @@
'in_reply_to_screen_name' => $in_reply_to_screen_name, 'in_reply_to_screen_name' => $in_reply_to_screen_name,
'geo' => NULL, 'geo' => NULL,
'favorited' => false, 'favorited' => false,
// attachments
'user' => $user_info, 'user' => $user_info,
'statusnet_html' => trim(bbcode($lastwall['body'], false, false)), 'statusnet_html' => trim(bbcode($lastwall['body'], false, false)),
'statusnet_conversation_id' => $lastwall['parent'], 'statusnet_conversation_id' => $lastwall['parent'],
//'coordinates' => $lastwall['coord'],
//'place' => $lastwall['location'],
//'contributors' => ''
); );
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here // "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
@ -715,6 +738,9 @@
unset($status_info["user"]["self"]); unset($status_info["user"]["self"]);
} }
if ($type == "raw")
return($status_info);
return api_apply_template("status", $type, array('$status' => $status_info)); return api_apply_template("status", $type, array('$status' => $status_info));
} }
@ -980,6 +1006,9 @@
intval($id) intval($id)
); );
if (!$r)
die(api_error($a, $type, t("There is no status with this id.")));
$ret = api_format_items($r,$user_info); $ret = api_format_items($r,$user_info);
if ($conversation) { if ($conversation) {
@ -1111,6 +1140,7 @@
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false); //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
// Ugly code - should be changed
$myurl = $a->get_baseurl() . '/profile/'. $a->user['nickname']; $myurl = $a->get_baseurl() . '/profile/'. $a->user['nickname'];
$myurl = substr($myurl,strpos($myurl,'://')+3); $myurl = substr($myurl,strpos($myurl,'://')+3);
//$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl); //$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
@ -1402,7 +1432,6 @@
$status_user = api_item_get_user($a,$item); $status_user = api_item_get_user($a,$item);
// Look if the posts are matching if they should be filtered by user id // Look if the posts are matching if they should be filtered by user id
// To-Do: Fix for wall-to-wall-posts
if ($filter_user AND ($status_user["id"] != $user_info["id"])) if ($filter_user AND ($status_user["id"] != $user_info["id"]))
continue; continue;
@ -1459,7 +1488,7 @@
'in_reply_to_screen_name' => $in_reply_to_screen_name, 'in_reply_to_screen_name' => $in_reply_to_screen_name,
'geo' => NULL, 'geo' => NULL,
'favorited' => $item['starred'] ? true : false, 'favorited' => $item['starred'] ? true : false,
'attachments' => array(), //'attachments' => array(),
'user' => $status_user , 'user' => $status_user ,
'statusnet_html' => trim(bbcode($item['body'], false, false)), 'statusnet_html' => trim(bbcode($item['body'], false, false)),
'statusnet_conversation_id' => $item['parent'], 'statusnet_conversation_id' => $item['parent'],
@ -1516,7 +1545,7 @@
'reset_time_in_seconds' => strtotime('now + 1 hour'), 'reset_time_in_seconds' => strtotime('now + 1 hour'),
'remaining_hits' => (string) 150, 'remaining_hits' => (string) 150,
'hourly_limit' => (string) 150, 'hourly_limit' => (string) 150,
'reset_time' => datetime_convert('UTC','UTC','now + 1 hour',ATOM_TIME), 'reset_time' => api_date(datetime_convert('UTC','UTC','now + 1 hour',ATOM_TIME)),
); );
if ($type == "xml") if ($type == "xml")
$hash['resettime_in_seconds'] = $hash['reset_time_in_seconds']; $hash['resettime_in_seconds'] = $hash['reset_time_in_seconds'];
@ -1622,16 +1651,16 @@
$config = array( $config = array(
'site' => array('name' => $name,'server' => $server, 'theme' => 'default', 'path' => '', 'site' => array('name' => $name,'server' => $server, 'theme' => 'default', 'path' => '',
'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '', 'logo' => $logo, 'fancy' => true, 'language' => 'en', 'email' => $email, 'broughtby' => '',
'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false', 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => false,
'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl, 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
'shorturllength' => '30', 'shorturllength' => '30',
'friendica' => array( 'friendica' => array(
'FRIENDICA_PLATFORM' => FRIENDICA_PLATFORM, 'FRIENDICA_PLATFORM' => FRIENDICA_PLATFORM,
'FRIENDICA_VERSION' => FRIENDICA_VERSION, 'FRIENDICA_VERSION' => FRIENDICA_VERSION,
'DFRN_PROTOCOL_VERSION' => DFRN_PROTOCOL_VERSION, 'DFRN_PROTOCOL_VERSION' => DFRN_PROTOCOL_VERSION,
'DB_UPDATE_VERSION' => DB_UPDATE_VERSION 'DB_UPDATE_VERSION' => DB_UPDATE_VERSION
) )
), ),
); );
@ -1771,7 +1800,9 @@
$start = $page*$count; $start = $page*$count;
$profile_url = $a->get_baseurl() . '/profile/' . $a->user['nickname']; //$profile_url = $a->get_baseurl() . '/profile/' . $a->user['nickname'];
$profile_url = $user_info["url"];
if ($box=="sentbox") { if ($box=="sentbox") {
$sql_extra = "`from-url`='".dbesc( $profile_url )."'"; $sql_extra = "`from-url`='".dbesc( $profile_url )."'";
} }
@ -1860,15 +1891,6 @@
api_register_func('api/oauth/request_token', 'api_oauth_request_token', false); api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
api_register_func('api/oauth/access_token', 'api_oauth_access_token', false); api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
/*
To-Do:
- renewing of unique contacts
- support of repeated items
Bugs:
*/
/* /*
Not implemented by now: Not implemented by now:
favorites favorites