X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FApi%2FApiResponse.php;h=b5b2a4717c45bf9a25c9a34c15a1463aff8d5769;hb=706444bdb22b57f18c284044bdbdaeb7610990fe;hp=47d52ca1fc8415a56a4c5925e3d07eb6ec98601e;hpb=ea0f41ecf0218644e5c83f7dd2269a8947f775c6;p=friendica.git diff --git a/src/Module/Api/ApiResponse.php b/src/Module/Api/ApiResponse.php index 47d52ca1fc..b5b2a4717c 100644 --- a/src/Module/Api/ApiResponse.php +++ b/src/Module/Api/ApiResponse.php @@ -1,35 +1,59 @@ . + * + */ namespace Friendica\Module\Api; use Friendica\App\Arguments; +use Friendica\App\BaseURL; use Friendica\Core\L10n; -use Friendica\Core\Logger; -use Friendica\Core\System; -use Friendica\DI; -use Friendica\Object\Api\Mastodon\Error; +use Friendica\Module\Response; use Friendica\Util\Arrays; -use Friendica\Util\HTTPInputData; +use Friendica\Util\DateTimeFormat; use Friendica\Util\XML; +use Psr\Log\LoggerInterface; +use Friendica\Factory\Api\Twitter\User as TwitterUser; /** - * This class is used to format and return API responses + * This class is used to format and create API responses */ -class ApiResponse +class ApiResponse extends Response { /** @var L10n */ protected $l10n; /** @var Arguments */ protected $args; + /** @var LoggerInterface */ + protected $logger; + /** @var BaseURL */ + protected $baseUrl; + /** @var TwitterUser */ + protected $twitterUser; - /** - * @param L10n $l10n - * @param Arguments $args - */ - public function __construct(L10n $l10n, Arguments $args) + public function __construct(L10n $l10n, Arguments $args, LoggerInterface $logger, BaseURL $baseUrl, TwitterUser $twitterUser) { - $this->l10n = $l10n; - $this->args = $args; + $this->l10n = $l10n; + $this->args = $args; + $this->logger = $logger; + $this->baseUrl = $baseUrl; + $this->twitterUser = $twitterUser; } /** @@ -75,7 +99,37 @@ class ApiResponse $data3 = [$root_element => $data2]; - return XML::fromArray($data3, $xml, false, $namespaces); + return XML::fromArray($data3, $dummy, false, $namespaces); + } + + /** + * Set values for RSS template + * + * @param array $arr Array to be passed to template + * @param int $cid Contact ID of template + * + * @return array + */ + private function addRSSValues(array $arr, int $cid): array + { + if (empty($cid)) { + return $arr; + } + + $user_info = $this->twitterUser->createFromContactId($cid)->toArray(); + + $arr['$user'] = $user_info; + $arr['$rss'] = [ + 'alternate' => $user_info['url'], + 'self' => $this->baseUrl . '/' . $this->args->getQueryString(), + 'base' => $this->baseUrl, + 'updated' => DateTimeFormat::utcNow(DateTimeFormat::API), + 'atom_updated' => DateTimeFormat::utcNow(DateTimeFormat::ATOM), + 'language' => $user_info['lang'], + 'logo' => $this->baseUrl . '/images/friendica-32.png', + ]; + + return $arr; } /** @@ -84,23 +138,23 @@ class ApiResponse * @param string $root_element Name of the root element * @param string $type Return type (atom, rss, xml, json) * @param array $data JSON style array + * @param int $cid ID of the contact for RSS * * @return array|string (string|array) XML data or JSON data */ - public function formatData(string $root_element, string $type, array $data) + public function formatData(string $root_element, string $type, array $data, int $cid = 0) { switch ($type) { - case 'atom': case 'rss': + $data = $this->addRSSValues($data, $cid); + case 'atom': case 'xml': - $ret = $this->createXML($data, $root_element); - break; + return $this->createXML($data, $root_element); + case 'json': default: - $ret = $data; - break; + return $data; } - return $ret; } /** @@ -135,17 +189,17 @@ class ApiResponse * * @return void */ - public static function error(int $code, string $description, string $message, string $format = null) + public function error(int $code, string $description, string $message, string $format = null) { $error = [ 'error' => $message ?: $description, 'code' => $code . ' ' . $description, - 'request' => DI::args()->getQueryString() + 'request' => $this->args->getQueryString() ]; - header(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1') . ' ' . $code . ' ' . $description); + $this->setHeader(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1') . ' ' . $code . ' ' . $description); - DI::apiResponse()->exit('status', ['status' => $error], $format); + $this->exit('status', ['status' => $error], $format); } /** @@ -157,18 +211,19 @@ class ApiResponse * * @return void */ - public function exit(string $root_element, array $data, string $format = null) + public function exit(string $root_element, array $data, string $format = null, int $cid = 0) { $format = $format ?? 'json'; - $return = $this->formatData($root_element, $format, $data); + $return = $this->formatData($root_element, $format, $data, $cid); switch ($format) { case 'xml': - header('Content-Type: text/xml'); + $this->setType(static::TYPE_XML); break; + case 'json': - header('Content-Type: application/json'); + $this->setType(static::TYPE_JSON); if (!empty($return)) { $json = json_encode(end($return)); if (!empty($_GET['callback'])) { @@ -177,41 +232,52 @@ class ApiResponse $return = $json; } break; + case 'rss': - header('Content-Type: application/rss+xml'); - $return = '' . "\n" . $return; + $this->setType(static::TYPE_RSS); break; + case 'atom': - header('Content-Type: application/atom+xml'); - $return = '' . "\n" . $return; + $this->setType(static::TYPE_ATOM); break; } - echo $return; - exit; + $this->addContent($return); + } + + /** + * Wrapper around exit() for JSON only responses + * + * @param array $data + * + * @return void + */ + public function exitWithJson(array $data) + { + $this->exit('content', ['content' => $data], static::TYPE_JSON); } /** * Quit execution with the message that the endpoint isn't implemented * * @param string $method + * @param array $request (optional) The request content of the current call for later analysis * * @return void * @throws \Exception */ - public static function unsupported(string $method = 'all') + public function unsupported(string $method = 'all', array $request = []) { - $path = DI::args()->getQueryString(); - Logger::info('Unimplemented API call', + $path = $this->args->getQueryString(); + $this->logger->info('Unimplemented API call', [ 'method' => $method, 'path' => $path, 'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', - 'request' => HTTPInputData::process() + 'request' => $request, ]); - $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()); + $error = $this->l10n->t('API endpoint %s %s is not implemented but might be in the future.', strtoupper($method), $path); + + $this->error(501, 'Not Implemented', $error); } }