From b365ffc3b5b1fb6b65ef5fb5d9b6ba3c4f912a4d Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <hypolite@mrpetovan.com>
Date: Thu, 5 Dec 2019 08:12:59 -0500
Subject: [PATCH] Add API base module

---
 src/Module/Base/Api.php | 105 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 105 insertions(+)
 create mode 100644 src/Module/Base/Api.php

diff --git a/src/Module/Base/Api.php b/src/Module/Base/Api.php
new file mode 100644
index 0000000000..f3453e0323
--- /dev/null
+++ b/src/Module/Base/Api.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Friendica\Module\Base;
+
+use Friendica\App\Arguments;
+use Friendica\BaseModule;
+use Friendica\Core\L10n;
+use Friendica\Network\HTTPException;
+
+require_once __DIR__ . '/../../../include/api.php';
+
+class Api extends BaseModule
+{
+	/**
+	 * @var string json|xml|rss|atom
+	 */
+	protected static $format = 'json';
+	/**
+	 * @var bool|int
+	 */
+	protected static $current_user_id;
+
+	public static function init(array $parameters = [])
+	{
+		$Arguments = self::getClass(Arguments::class);
+
+		if (substr($Arguments->getQueryString(), -4) === '.xml') {
+			self::$format = 'xml';
+		}
+		if (substr($Arguments->getQueryString(), -4) === '.rss') {
+			self::$format = 'rss';
+		}
+		if (substr($Arguments->getQueryString(), -4) === '.atom') {
+			self::$format = 'atom';
+		}
+	}
+
+	public static function post(array $parameters = [])
+	{
+		if (!api_user()) {
+			throw new HTTPException\UnauthorizedException(L10n::t('Permission denied.'));
+		}
+
+		$a = self::getApp();
+
+		if (!empty($a->user['uid']) && $a->user['uid'] != api_user()) {
+			throw new HTTPException\ForbiddenException(L10n::t('Permission denied.'));
+		}
+	}
+
+	/**
+	 * Log in user via OAuth1 or Simple HTTP Auth.
+	 * Simple Auth allow username in form of <pre>user@server</pre>, ignoring server part
+	 *
+	 * @brief Login API user
+	 *
+	 * @throws HTTPException\ForbiddenException
+	 * @throws HTTPException\UnauthorizedException
+	 * @throws HTTPException\InternalServerErrorException
+	 * @hook  'authenticate'
+	 *               array $addon_auth
+	 *               'username' => username from login form
+	 *               'password' => password from login form
+	 *               'authenticated' => return status,
+	 *               'user_record' => return authenticated user record
+	 */
+	protected static function login()
+	{
+		api_login(self::getApp());
+
+		self::$current_user_id = api_user();
+	}
+
+	/**
+	 * @brief 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)
+	{
+		return api_get_user(self::getApp(), $contact_id);
+	}
+
+	protected static function format($root_element, $data)
+	{
+		switch (self::$format) {
+			case "atom":
+			case "rss":
+			case "xml":
+				$ret = api_create_xml($data, $root_element);
+				break;
+			case "json":
+			default:
+				$ret = $data;
+				break;
+		}
+
+		return $ret;
+	}
+}