mirror of
https://github.com/friendica/friendica
synced 2025-04-23 08:30:10 +00:00
Move API Response methods into an own class to make them mockable
This commit is contained in:
parent
893b8e5df3
commit
319f91301d
22 changed files with 327 additions and 259 deletions
215
src/Module/Api/ApiResponse.php
Normal file
215
src/Module/Api/ApiResponse.php
Normal file
|
@ -0,0 +1,215 @@
|
|||
<?php
|
||||
|
||||
namespace Friendica\Module\Api;
|
||||
|
||||
use Friendica\App\Arguments;
|
||||
use Friendica\Core\L10n;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\DI;
|
||||
use Friendica\Object\Api\Mastodon\Error;
|
||||
use Friendica\Util\Arrays;
|
||||
use Friendica\Util\HTTPInputData;
|
||||
use Friendica\Util\XML;
|
||||
|
||||
/**
|
||||
* This class is used to format and return API responses
|
||||
*/
|
||||
class ApiResponse
|
||||
{
|
||||
/** @var L10n */
|
||||
protected $l10n;
|
||||
/** @var Arguments */
|
||||
protected $args;
|
||||
|
||||
/**
|
||||
* @param L10n $l10n
|
||||
* @param Arguments $args
|
||||
*/
|
||||
public function __construct(L10n $l10n, Arguments $args)
|
||||
{
|
||||
$this->l10n = $l10n;
|
||||
$this->args = $args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the XML from a JSON style array
|
||||
*
|
||||
* @param array $data JSON style array
|
||||
* @param string $root_element Name of the root element
|
||||
*
|
||||
* @return string The XML data
|
||||
*/
|
||||
public static function createXML(array $data, string $root_element): string
|
||||
{
|
||||
$childname = key($data);
|
||||
$data2 = array_pop($data);
|
||||
|
||||
$namespaces = ['' => 'http://api.twitter.com',
|
||||
'statusnet' => 'http://status.net/schema/api/1/',
|
||||
'friendica' => 'http://friendi.ca/schema/api/1/',
|
||||
'georss' => 'http://www.georss.org/georss'];
|
||||
|
||||
/// @todo Auto detection of needed namespaces
|
||||
if (in_array($root_element, ['ok', 'hash', 'config', 'version', 'ids', 'notes', 'photos'])) {
|
||||
$namespaces = [];
|
||||
}
|
||||
|
||||
if (is_array($data2)) {
|
||||
$key = key($data2);
|
||||
Arrays::walkRecursive($data2, ['Friendica\Module\Api\ApiResponse', 'reformatXML']);
|
||||
|
||||
if ($key == '0') {
|
||||
$data4 = [];
|
||||
$i = 1;
|
||||
|
||||
foreach ($data2 as $item) {
|
||||
$data4[$i++ . ':' . $childname] = $item;
|
||||
}
|
||||
|
||||
$data2 = $data4;
|
||||
}
|
||||
}
|
||||
|
||||
$data3 = [$root_element => $data2];
|
||||
|
||||
return XML::fromArray($data3, $xml, false, $namespaces);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the data according to the data type
|
||||
*
|
||||
* @param string $root_element Name of the root element
|
||||
* @param string $type Return type (atom, rss, xml, json)
|
||||
* @param array $data JSON style array
|
||||
*
|
||||
* @return array|string (string|array) XML data or JSON data
|
||||
*/
|
||||
public static function formatData(string $root_element, string $type, array $data)
|
||||
{
|
||||
switch ($type) {
|
||||
case 'atom':
|
||||
case 'rss':
|
||||
case 'xml':
|
||||
$ret = static::createXML($data, $root_element);
|
||||
break;
|
||||
case 'json':
|
||||
default:
|
||||
$ret = $data;
|
||||
break;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function to transform the array in an array that can be transformed in a XML file
|
||||
*
|
||||
* @param mixed $item Array item value
|
||||
* @param string $key Array key
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function reformatXML(&$item, string &$key): bool
|
||||
{
|
||||
if (is_bool($item)) {
|
||||
$item = ($item ? 'true' : 'false');
|
||||
}
|
||||
|
||||
if (substr($key, 0, 10) == 'statusnet_') {
|
||||
$key = 'statusnet:' . substr($key, 10);
|
||||
} elseif (substr($key, 0, 10) == 'friendica_') {
|
||||
$key = 'friendica:' . substr($key, 10);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exit with error code
|
||||
*
|
||||
* @param int $code
|
||||
* @param string $description
|
||||
* @param string $message
|
||||
* @param string|null $format
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function error(int $code, string $description, string $message, string $format = null)
|
||||
{
|
||||
$error = [
|
||||
'error' => $message ?: $description,
|
||||
'code' => $code . ' ' . $description,
|
||||
'request' => DI::args()->getQueryString()
|
||||
];
|
||||
|
||||
header(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1') . ' ' . $code . ' ' . $description);
|
||||
|
||||
self::exit('status', ['status' => $error], $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs formatted data according to the data type and then exits the execution.
|
||||
*
|
||||
* @param string $root_element
|
||||
* @param array $data An array with a single element containing the returned result
|
||||
* @param string|null $format Output format (xml, json, rss, atom)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function exit(string $root_element, array $data, string $format = null)
|
||||
{
|
||||
$format = $format ?? 'json';
|
||||
|
||||
$return = static::formatData($root_element, $format, $data);
|
||||
|
||||
switch ($format) {
|
||||
case 'xml':
|
||||
header('Content-Type: text/xml');
|
||||
break;
|
||||
case 'json':
|
||||
header('Content-Type: application/json');
|
||||
if (!empty($return)) {
|
||||
$json = json_encode(end($return));
|
||||
if (!empty($_GET['callback'])) {
|
||||
$json = $_GET['callback'] . '(' . $json . ')';
|
||||
}
|
||||
$return = $json;
|
||||
}
|
||||
break;
|
||||
case 'rss':
|
||||
header('Content-Type: application/rss+xml');
|
||||
$return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
|
||||
break;
|
||||
case 'atom':
|
||||
header('Content-Type: application/atom+xml');
|
||||
$return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
|
||||
break;
|
||||
}
|
||||
|
||||
echo $return;
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Quit execution with the message that the endpoint isn't implemented
|
||||
*
|
||||
* @param string $method
|
||||
*
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function unsupported(string $method = 'all')
|
||||
{
|
||||
$path = DI::args()->getQueryString();
|
||||
Logger::info('Unimplemented API call',
|
||||
[
|
||||
'method' => $method,
|
||||
'path' => $path,
|
||||
'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
|
||||
'request' => HTTPInputData::process()
|
||||
]);
|
||||
$error = DI::l10n()->t('API endpoint %s %s is not implemented', strtoupper($method), $path);
|
||||
$error_description = DI::l10n()->t('The API endpoint is currently not implemented but might be in the future.');
|
||||
$errorobj = new Error($error, $error_description);
|
||||
System::jsonError(501, $errorobj->toArray());
|
||||
}
|
||||
}
|
|
@ -22,6 +22,7 @@
|
|||
namespace Friendica\Module\Api\Friendica;
|
||||
|
||||
use Friendica\Model\Item;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -56,9 +57,9 @@ class Activity extends BaseApi
|
|||
} else {
|
||||
$ok = 'ok';
|
||||
}
|
||||
self::exit('ok', ['ok' => $ok], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('ok', ['ok' => $ok], $parameters['extension'] ?? null);
|
||||
} else {
|
||||
self::error(500, 'Error adding activity', '', $parameters['extension'] ?? null);
|
||||
ApiResponse::error(500, 'Error adding activity', '', $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
namespace Friendica\Module\Api\Friendica\DirectMessages;
|
||||
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -41,13 +42,13 @@ class Setseen extends BaseApi
|
|||
// return error if id is zero
|
||||
if (empty($request['id'])) {
|
||||
$answer = ['result' => 'error', 'message' => 'message id not specified'];
|
||||
self::exit('direct_messages_setseen', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('direct_messages_setseen', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
}
|
||||
|
||||
// error message if specified id is not in database
|
||||
if (!DBA::exists('mail', ['id' => $request['id'], 'uid' => $uid])) {
|
||||
$answer = ['result' => 'error', 'message' => 'message id not in database'];
|
||||
self::exit('direct_messages_setseen', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('direct_messages_setseen', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
}
|
||||
|
||||
// update seen indicator
|
||||
|
@ -57,6 +58,6 @@ class Setseen extends BaseApi
|
|||
$answer = ['result' => 'error', 'message' => 'unknown error'];
|
||||
}
|
||||
|
||||
self::exit('direct_messages_setseen', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('direct_messages_setseen', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Friendica\Module\Api\Friendica\Events;
|
|||
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Network\HTTPException;
|
||||
|
||||
|
@ -70,6 +71,6 @@ class Index extends BaseApi
|
|||
];
|
||||
}
|
||||
|
||||
self::exit('events', ['events' => $items], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('events', ['events' => $items], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Friendica\Module\Api\Friendica;
|
|||
|
||||
use Friendica\Collection\Api\Notifications as ApiNotifications;
|
||||
use Friendica\DI;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Object\Api\Friendica\Notification as ApiNotification;
|
||||
|
||||
|
@ -56,6 +57,6 @@ class Notification extends BaseApi
|
|||
$result = false;
|
||||
}
|
||||
|
||||
self::exit('notes', ['note' => $result], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('notes', ['note' => $result], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Friendica\Module\Api\Friendica\Photo;
|
|||
|
||||
use Friendica\Model\Item;
|
||||
use Friendica\Model\Photo;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Network\HTTPException\BadRequestException;
|
||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||
|
@ -63,7 +64,7 @@ class Delete extends BaseApi
|
|||
Item::deleteForUser($condition, $uid);
|
||||
|
||||
$result = ['result' => 'deleted', 'message' => 'photo with id `' . $request['photo_id'] . '` has been deleted from server.'];
|
||||
self::exit('photo_delete', ['$result' => $result], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('photo_delete', ['$result' => $result], $parameters['extension'] ?? null);
|
||||
} else {
|
||||
throw new InternalServerErrorException("unknown error on deleting photo from database table");
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ namespace Friendica\Module\Api\Friendica\Photoalbum;
|
|||
use Friendica\Database\DBA;
|
||||
use Friendica\Model\Item;
|
||||
use Friendica\Model\Photo;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Network\HTTPException\BadRequestException;
|
||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||
|
@ -66,7 +67,7 @@ class Delete extends BaseApi
|
|||
// return success of deletion or error message
|
||||
if ($result) {
|
||||
$answer = ['result' => 'deleted', 'message' => 'album `' . $request['album'] . '` with all containing photos has been deleted.'];
|
||||
self::exit('photoalbum_delete', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('photoalbum_delete', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
} else {
|
||||
throw new InternalServerErrorException("unknown error - deleting from database failed");
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
namespace Friendica\Module\Api\Friendica\Photoalbum;
|
||||
|
||||
use Friendica\Model\Photo;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Network\HTTPException\BadRequestException;
|
||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||
|
@ -58,7 +59,7 @@ class Update extends BaseApi
|
|||
// return success of updating or error message
|
||||
if ($result) {
|
||||
$answer = ['result' => 'updated', 'message' => 'album `' . $request['album'] . '` with all containing photos has been renamed to `' . $request['album_new'] . '`.'];
|
||||
self::exit('photoalbum_update', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('photoalbum_update', ['$result' => $answer], $parameters['extension'] ?? null);
|
||||
} else {
|
||||
throw new InternalServerErrorException("unknown error - updating in database failed");
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
namespace Friendica\Module\Api\Friendica\Profile;
|
||||
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Profile\ProfileField\Collection\ProfileFields;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\DI;
|
||||
|
@ -66,7 +67,7 @@ class Show extends BaseApi
|
|||
'profiles' => $profiles
|
||||
];
|
||||
|
||||
self::exit('friendica_profiles', ['$result' => $result], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('friendica_profiles', ['$result' => $result], $parameters['extension'] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
namespace Friendica\Module\Api\GNUSocial\GNUSocial;
|
||||
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -30,6 +31,6 @@ class Version extends BaseApi
|
|||
{
|
||||
public static function rawContent(array $parameters = [])
|
||||
{
|
||||
self::exit('version', ['version' => '0.9.7'], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('version', ['version' => '0.9.7'], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
namespace Friendica\Module\Api\GNUSocial\Help;
|
||||
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -36,6 +37,6 @@ class Test extends BaseApi
|
|||
$ok = 'ok';
|
||||
}
|
||||
|
||||
self::exit('ok', ['ok' => $ok], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('ok', ['ok' => $ok], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Friendica\Module\Api\Mastodon\Accounts;
|
|||
|
||||
use Friendica\App\Router;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Util\HTTPInputData;
|
||||
|
||||
|
@ -40,6 +41,6 @@ class UpdateCredentials extends BaseApi
|
|||
|
||||
Logger::info('Patch data', ['data' => $data]);
|
||||
|
||||
self::unsupported(Router::PATCH);
|
||||
ApiResponse::unsupported(Router::PATCH);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Friendica\Module\Api\Mastodon;
|
|||
|
||||
use Friendica\App\Router;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -34,7 +35,7 @@ class Filters extends BaseApi
|
|||
{
|
||||
self::checkAllowedScope(self::SCOPE_WRITE);
|
||||
|
||||
self::unsupported(Router::POST);
|
||||
ApiResponse::unsupported(Router::POST);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -25,6 +25,7 @@ use Friendica\App\Router;
|
|||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -36,12 +37,12 @@ class Accounts extends BaseApi
|
|||
{
|
||||
public static function delete(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::DELETE);
|
||||
ApiResponse::unsupported(Router::DELETE);
|
||||
}
|
||||
|
||||
public static function post(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::POST);
|
||||
ApiResponse::unsupported(Router::POST);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Friendica\Module\Api\Mastodon;
|
|||
|
||||
use Friendica\App\Router;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -34,7 +35,7 @@ class Markers extends BaseApi
|
|||
{
|
||||
self::checkAllowedScope(self::SCOPE_WRITE);
|
||||
|
||||
self::unsupported(Router::POST);
|
||||
ApiResponse::unsupported(Router::POST);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -26,6 +26,7 @@ use Friendica\Core\System;
|
|||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Post;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -38,7 +39,7 @@ class ScheduledStatuses extends BaseApi
|
|||
self::checkAllowedScope(self::SCOPE_WRITE);
|
||||
$uid = self::getCurrentUserID();
|
||||
|
||||
self::unsupported(Router::PUT);
|
||||
ApiResponse::unsupported(Router::PUT);
|
||||
}
|
||||
|
||||
public static function delete(array $parameters = [])
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
namespace Friendica\Module\Api\Mastodon;
|
||||
|
||||
use Friendica\App\Router;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -35,7 +36,7 @@ class Unimplemented extends BaseApi
|
|||
*/
|
||||
public static function delete(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::DELETE);
|
||||
ApiResponse::unsupported(Router::DELETE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -44,7 +45,7 @@ class Unimplemented extends BaseApi
|
|||
*/
|
||||
public static function patch(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::PATCH);
|
||||
ApiResponse::unsupported(Router::PATCH);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -53,7 +54,7 @@ class Unimplemented extends BaseApi
|
|||
*/
|
||||
public static function post(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::POST);
|
||||
ApiResponse::unsupported(Router::POST);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -62,7 +63,7 @@ class Unimplemented extends BaseApi
|
|||
*/
|
||||
public static function put(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::PUT);
|
||||
ApiResponse::unsupported(Router::PUT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -71,6 +72,6 @@ class Unimplemented extends BaseApi
|
|||
*/
|
||||
public static function rawContent(array $parameters = [])
|
||||
{
|
||||
self::unsupported(Router::GET);
|
||||
ApiResponse::unsupported(Router::GET);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
namespace Friendica\Module\Api\Twitter\Account;
|
||||
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
|
||||
|
@ -51,6 +52,6 @@ class RateLimitStatus extends BaseApi
|
|||
];
|
||||
}
|
||||
|
||||
self::exit('hash', ['hash' => $hash], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('hash', ['hash' => $hash], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
namespace Friendica\Module\Api\Twitter;
|
||||
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\Module\Api\ApiResponse;
|
||||
use Friendica\Module\BaseApi;
|
||||
|
||||
/**
|
||||
|
@ -44,6 +45,6 @@ class SavedSearches extends BaseApi
|
|||
|
||||
DBA::close($terms);
|
||||
|
||||
self::exit('terms', ['terms' => $result], $parameters['extension'] ?? null);
|
||||
ApiResponse::exit('terms', ['terms' => $result], $parameters['extension'] ?? null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -89,22 +89,6 @@ class BaseApi extends BaseModule
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Quit execution with the message that the endpoint isn't implemented
|
||||
*
|
||||
* @param string $method
|
||||
* @return void
|
||||
*/
|
||||
public static function unsupported(string $method = 'all')
|
||||
{
|
||||
$path = DI::args()->getQueryString();
|
||||
Logger::info('Unimplemented API call', ['method' => $method, 'path' => $path, 'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'request' => HTTPInputData::process()]);
|
||||
$error = DI::l10n()->t('API endpoint %s %s is not implemented', strtoupper($method), $path);
|
||||
$error_description = DI::l10n()->t('The API endpoint is currently not implemented but might be in the future.');
|
||||
$errorobj = new \Friendica\Object\Api\Mastodon\Error($error, $error_description);
|
||||
System::jsonError(501, $errorobj->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes data from GET requests and sets defaults
|
||||
*
|
||||
|
@ -326,160 +310,4 @@ class BaseApi extends BaseModule
|
|||
{
|
||||
return api_get_user($contact_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exit with error code
|
||||
*
|
||||
* @param int $code
|
||||
* @param string $description
|
||||
* @param string $message
|
||||
* @param string|null $format
|
||||
* @return void
|
||||
*/
|
||||
public static function error(int $code, string $description, string $message, string $format = null)
|
||||
{
|
||||
$error = [
|
||||
'error' => $message ?: $description,
|
||||
'code' => $code . ' ' . $description,
|
||||
'request' => DI::args()->getQueryString()
|
||||
];
|
||||
|
||||
header(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1') . ' ' . $code . ' ' . $description);
|
||||
|
||||
self::exit('status', ['status' => $error], $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs formatted data according to the data type and then exits the execution.
|
||||
*
|
||||
* @param string $root_element
|
||||
* @param array $data An array with a single element containing the returned result
|
||||
* @param string $format Output format (xml, json, rss, atom)
|
||||
* @return false|string
|
||||
*/
|
||||
protected static function exit(string $root_element, array $data, string $format = null)
|
||||
{
|
||||
$format = $format ?? 'json';
|
||||
|
||||
$return = self::formatData($root_element, $format, $data);
|
||||
|
||||
switch ($format) {
|
||||
case 'xml':
|
||||
header('Content-Type: text/xml');
|
||||
break;
|
||||
case 'json':
|
||||
header('Content-Type: application/json');
|
||||
if (!empty($return)) {
|
||||
$json = json_encode(end($return));
|
||||
if (!empty($_GET['callback'])) {
|
||||
$json = $_GET['callback'] . '(' . $json . ')';
|
||||
}
|
||||
$return = $json;
|
||||
}
|
||||
break;
|
||||
case 'rss':
|
||||
header('Content-Type: application/rss+xml');
|
||||
$return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
|
||||
break;
|
||||
case 'atom':
|
||||
header('Content-Type: application/atom+xml');
|
||||
$return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
|
||||
break;
|
||||
}
|
||||
|
||||
echo $return;
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the data according to the data type
|
||||
*
|
||||
* @param string $root_element Name of the root element
|
||||
* @param string $type Return type (atom, rss, xml, json)
|
||||
* @param array $data JSON style array
|
||||
*
|
||||
* @return array|string (string|array) XML data or JSON data
|
||||
*/
|
||||
public static function formatData($root_element, string $type, array $data)
|
||||
{
|
||||
switch ($type) {
|
||||
case 'atom':
|
||||
case 'rss':
|
||||
case 'xml':
|
||||
$ret = self::createXML($data, $root_element);
|
||||
break;
|
||||
case 'json':
|
||||
default:
|
||||
$ret = $data;
|
||||
break;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function to transform the array in an array that can be transformed in a XML file
|
||||
*
|
||||
* @param mixed $item Array item value
|
||||
* @param string $key Array key
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function reformatXML(&$item, &$key)
|
||||
{
|
||||
if (is_bool($item)) {
|
||||
$item = ($item ? 'true' : 'false');
|
||||
}
|
||||
|
||||
if (substr($key, 0, 10) == 'statusnet_') {
|
||||
$key = 'statusnet:'.substr($key, 10);
|
||||
} elseif (substr($key, 0, 10) == 'friendica_') {
|
||||
$key = 'friendica:'.substr($key, 10);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the XML from a JSON style array
|
||||
*
|
||||
* @param array $data JSON style array
|
||||
* @param string $root_element Name of the root element
|
||||
*
|
||||
* @return string The XML data
|
||||
*/
|
||||
public static function createXML(array $data, $root_element)
|
||||
{
|
||||
$childname = key($data);
|
||||
$data2 = array_pop($data);
|
||||
|
||||
$namespaces = ['' => 'http://api.twitter.com',
|
||||
'statusnet' => 'http://status.net/schema/api/1/',
|
||||
'friendica' => 'http://friendi.ca/schema/api/1/',
|
||||
'georss' => 'http://www.georss.org/georss'];
|
||||
|
||||
/// @todo Auto detection of needed namespaces
|
||||
if (in_array($root_element, ['ok', 'hash', 'config', 'version', 'ids', 'notes', 'photos'])) {
|
||||
$namespaces = [];
|
||||
}
|
||||
|
||||
if (is_array($data2)) {
|
||||
$key = key($data2);
|
||||
Arrays::walkRecursive($data2, ['Friendica\Module\BaseApi', 'reformatXML']);
|
||||
|
||||
if ($key == '0') {
|
||||
$data4 = [];
|
||||
$i = 1;
|
||||
|
||||
foreach ($data2 as $item) {
|
||||
$data4[$i++ . ':' . $childname] = $item;
|
||||
}
|
||||
|
||||
$data2 = $data4;
|
||||
}
|
||||
}
|
||||
|
||||
$data3 = [$root_element => $data2];
|
||||
|
||||
$ret = XML::fromArray($data3, $xml, false, $namespaces);
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue