X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FApi%2FApiResponse.php;h=a6a94ad81c559e209635013e2da2039b35eb1e73;hb=7ec4d42461f6fb8397e55df27a83c889c31c7f6d;hp=9521e2270a6e2938ac875fc70ee4313b717f51ce;hpb=e7f84d493489c4850cd766b83ee5457d777eb03e;p=friendica.git diff --git a/src/Module/Api/ApiResponse.php b/src/Module/Api/ApiResponse.php index 9521e2270a..a6a94ad81c 100644 --- a/src/Module/Api/ApiResponse.php +++ b/src/Module/Api/ApiResponse.php @@ -3,16 +3,19 @@ namespace Friendica\Module\Api; use Friendica\App\Arguments; +use Friendica\App\BaseURL; use Friendica\Core\L10n; +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; @@ -20,40 +23,18 @@ class ApiResponse protected $args; /** @var LoggerInterface */ protected $logger; + /** @var BaseURL */ + protected $baseUrl; + /** @var TwitterUser */ + protected $twitterUser; - /** - * @param L10n $l10n - * @param Arguments $args - * @param LoggerInterface $logger - */ - public function __construct(L10n $l10n, Arguments $args, LoggerInterface $logger) + public function __construct(L10n $l10n, Arguments $args, LoggerInterface $logger, BaseURL $baseUrl, TwitterUser $twitterUser) { - $this->l10n = $l10n; - $this->args = $args; - $this->logger = $logger; - } - - /** - * Sets header directly - * mainly used to override it for tests - * - * @param string $header - */ - protected function setHeader(string $header) - { - header($header); - } - - /** - * Prints output directly to the caller - * mainly used to override it for tests - * - * @param string $output - */ - protected function printOutput(string $output) - { - echo $output; - exit; + $this->l10n = $l10n; + $this->args = $args; + $this->logger = $logger; + $this->baseUrl = $baseUrl; + $this->twitterUser = $twitterUser; } /** @@ -102,20 +83,51 @@ class ApiResponse return XML::fromArray($data3, $xml, 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) + { + 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; + } + /** * 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 + * @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': return $this->createXML($data, $root_element); case 'json': @@ -178,18 +190,18 @@ 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': - $this->setHeader('Content-Type: text/xml'); + $this->setType(static::TYPE_XML); break; case 'json': - $this->setHeader('Content-Type: application/json'); + $this->setType(static::TYPE_JSON); if (!empty($return)) { $json = json_encode(end($return)); if (!empty($_GET['callback'])) { @@ -199,25 +211,36 @@ class ApiResponse } break; case 'rss': - $this->setHeader('Content-Type: application/rss+xml'); + $this->setType(static::TYPE_RSS); break; case 'atom': - $this->setHeader('Content-Type: application/atom+xml'); + $this->setType(static::TYPE_ATOM); break; } - $this->printOutput($return); + $this->addContent($return); + } + + /** + * Wrapper around exit() for JSON only responses + * + * @param array $data + */ + 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 function unsupported(string $method = 'all') + public function unsupported(string $method = 'all', array $request = []) { $path = $this->args->getQueryString(); $this->logger->info('Unimplemented API call', @@ -225,7 +248,7 @@ class ApiResponse 'method' => $method, 'path' => $path, 'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', - 'request' => HTTPInputData::process() + 'request' => $request, ]); $error = $this->l10n->t('API endpoint %s %s is not implemented', strtoupper($method), $path); $error_description = $this->l10n->t('The API endpoint is currently not implemented but might be in the future.');