use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
+use Friendica\Model\Contact;
use Friendica\Model\Post;
+use Friendica\Model\User;
use Friendica\Network\HTTPException;
use Friendica\Security\BasicAuth;
use Friendica\Security\OAuth;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\HTTPInputData;
-require_once __DIR__ . '/../../include/api.php';
-
class BaseApi extends BaseModule
{
const SCOPE_READ = 'read';
const SCOPE_FOLLOW = 'follow';
const SCOPE_PUSH = 'push';
- /**
- * @var string json|xml|rss|atom
- */
- protected static $format = 'json';
-
/**
* @var array
*/
*/
protected static $request = [];
- public static function init(array $parameters = [])
- {
- $arguments = DI::args();
-
- if (substr($arguments->getCommand(), -4) === '.xml') {
- self::$format = 'xml';
- }
- if (substr($arguments->getCommand(), -4) === '.rss') {
- self::$format = 'rss';
- }
- if (substr($arguments->getCommand(), -4) === '.atom') {
- self::$format = 'atom';
- }
- }
-
- public static function delete(array $parameters = [])
+ public function delete()
{
self::checkAllowedScope(self::SCOPE_WRITE);
- $a = DI::app();
-
- if (!empty($a->user['uid']) && $a->user['uid'] != self::getCurrentUserID()) {
+ if (!DI::app()->isLoggedIn()) {
throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
}
}
- public static function patch(array $parameters = [])
+ public function patch()
{
self::checkAllowedScope(self::SCOPE_WRITE);
- $a = DI::app();
-
- if (!empty($a->user['uid']) && $a->user['uid'] != self::getCurrentUserID()) {
+ if (!DI::app()->isLoggedIn()) {
throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
}
}
- public static function post(array $parameters = [])
+ public function post()
{
self::checkAllowedScope(self::SCOPE_WRITE);
- $a = DI::app();
-
- if (!empty($a->user['uid']) && $a->user['uid'] != self::getCurrentUserID()) {
+ if (!DI::app()->isLoggedIn()) {
throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
}
}
- public static function put(array $parameters = [])
+ public function put()
{
self::checkAllowedScope(self::SCOPE_WRITE);
- $a = DI::app();
-
- if (!empty($a->user['uid']) && $a->user['uid'] != self::getCurrentUserID()) {
+ if (!DI::app()->isLoggedIn()) {
throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
}
}
- /**
- * 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
*
* Set boundaries for the "link" header
* @param array $boundaries
* @param int $id
- * @return array
*/
protected static function setBoundaries(int $id)
{
*
* @return int User ID
*/
- protected static function getCurrentUserID()
+ public static function getCurrentUserID()
{
$uid = OAuth::getCurrentUserID();
$datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60);
$condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom];
- $posts_day = Post::count($condition);
+ $posts_day = Post::countThread($condition);
if ($posts_day > $throttle_day) {
Logger::info('Daily posting limit reached', ['uid' => $uid, 'posts' => $posts_day, 'limit' => $throttle_day]);
$datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*7);
$condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom];
- $posts_week = Post::count($condition);
+ $posts_week = Post::countThread($condition);
if ($posts_week > $throttle_week) {
Logger::info('Weekly posting limit reached', ['uid' => $uid, 'posts' => $posts_week, 'limit' => $throttle_week]);
$datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*30);
$condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom];
- $posts_month = Post::count($condition);
+ $posts_month = Post::countThread($condition);
if ($posts_month > $throttle_month) {
Logger::info('Monthly posting limit reached', ['uid' => $uid, 'posts' => $posts_month, 'limit' => $throttle_month]);
}
}
- /**
- * Get user info array.
- *
- * @param int|string $contact_id Contact ID or URL
- * @return array|bool
- * @throws HTTPException\BadRequestException
- * @throws HTTPException\InternalServerErrorException
- * @throws HTTPException\UnauthorizedException
- * @throws \ImagickException
- */
- protected static function getUser($contact_id = null)
+ public static function getContactIDForSearchterm(string $screen_name = null, int $cid = null, int $uid)
{
- return api_get_user(DI::app(), $contact_id);
- }
+ if (!empty($cid)) {
+ return $cid;
+ }
- /**
- * Formats the data according to the data type
- *
- * @param string $root_element
- * @param array $data An array with a single element containing the returned result
- * @return false|string
- */
- protected static function format(string $root_element, array $data)
- {
- $return = api_format_data($root_element, self::$format, $data);
-
- switch (self::$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;
+ if (strpos($screen_name, '@') !== false) {
+ $cid = Contact::getIdForURL($screen_name, 0, false);
+ } else {
+ $user = User::getByNickname($screen_name, ['uid']);
+ if (!empty($user['uid'])) {
+ $cid = Contact::getPublicIdByUserId($user['uid']);
+ }
}
- return $return;
- }
+ if (empty($cid) && ($uid != 0)) {
+ $cid = Contact::getPublicIdByUserId($uid);
+ }
- /**
- * Creates the XML from a JSON style array
- *
- * @param $data
- * @param $root_element
- * @return string
- */
- protected static function createXml($data, $root_element)
- {
- return api_create_xml($data, $root_element);
+ return $cid;
}
}