]> git.mxchange.org Git - friendica.git/blobdiff - include/api.php
linking new Admin FAQ in home
[friendica.git] / include / api.php
index 1020db3287365c1fc625d437ed4a7cd4df8caeba..164a9de5320f59f988c0d622034f7a714c4d7192 100644 (file)
@@ -24,7 +24,6 @@
  */
 
 use Friendica\App;
-use Friendica\Collection\Api\Notifications as ApiNotifications;
 use Friendica\Content\ContactSelector;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
@@ -43,6 +42,7 @@ use Friendica\Model\Post;
 use Friendica\Model\Profile;
 use Friendica\Model\User;
 use Friendica\Model\Verb;
+use Friendica\Module\Api\ApiResponse;
 use Friendica\Module\BaseApi;
 use Friendica\Network\HTTPException;
 use Friendica\Network\HTTPException\BadRequestException;
@@ -52,7 +52,6 @@ use Friendica\Network\HTTPException\MethodNotAllowedException;
 use Friendica\Network\HTTPException\NotFoundException;
 use Friendica\Network\HTTPException\TooManyRequestsException;
 use Friendica\Network\HTTPException\UnauthorizedException;
-use Friendica\Object\Api\Friendica\Notification as ApiNotification;
 use Friendica\Object\Image;
 use Friendica\Protocol\Activity;
 use Friendica\Security\BasicAuth;
@@ -284,49 +283,10 @@ function api_call(App $a, App\Arguments $args = null)
                Logger::warning(API_LOG_PREFIX . 'not implemented', ['module' => 'api', 'action' => 'call', 'query' => DI::args()->getQueryString()]);
                throw new NotFoundException();
        } catch (HTTPException $e) {
-               header("HTTP/1.1 {$e->getCode()} {$e->getDescription()}");
-               return api_error($type, $e, $args);
+               DI::apiResponse()->error($e->getCode(), $e->getDescription(), $e->getMessage(), $type);
        }
 }
 
-/**
- * Format API error string
- *
- * @param string $type Return type (xml, json, rss, as)
- * @param object $e    HTTPException Error object
- * @param App\Arguments $args The App arguments
- * @return string|array error message formatted as $type
- */
-function api_error($type, $e, App\Arguments $args)
-{
-       $error = ($e->getMessage() !== "" ? $e->getMessage() : $e->getDescription());
-       /// @TODO:  https://dev.twitter.com/overview/api/response-codes
-
-       $error = ["error" => $error,
-                       "code" => $e->getCode() . " " . $e->getDescription(),
-                       "request" => $args->getQueryString()];
-
-       $return = BaseApi::formatData('status', $type, ['status' => $error]);
-
-       switch ($type) {
-               case "xml":
-                       header("Content-Type: text/xml");
-                       break;
-               case "json":
-                       header("Content-Type: application/json");
-                       $return = json_encode($return);
-                       break;
-               case "rss":
-                       header("Content-Type: application/rss+xml");
-                       break;
-               case "atom":
-                       header("Content-Type: application/atom+xml");
-                       break;
-       }
-
-       return $return;
-}
-
 /**
  * Set values for RSS template
  *
@@ -461,7 +421,7 @@ function api_get_user($contact_id = null)
                if (!empty(DI::args()->getArgv()[$argid])) {
                        $data = explode(".", DI::args()->getArgv()[$argid]);
                        if (count($data) > 1) {
-                               list($user, $null) = $data;
+                               [$user, $null] = $data;
                        }
                }
                if (is_numeric($user)) {
@@ -747,7 +707,7 @@ function api_account_verify_credentials($type)
        unset($user_info["uid"]);
        unset($user_info["self"]);
 
-       return BaseApi::formatData("user", $type, ['user' => $user_info]);
+       return DI::apiResponse()->formatData("user", $type, ['user' => $user_info]);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1136,7 +1096,7 @@ function api_status_show($type, $item_id)
 
        Logger::info(API_LOG_PREFIX . 'End', ['action' => 'get_status', 'status_info' => $status_info]);
 
-       return BaseApi::formatData('statuses', $type, ['status' => $status_info]);
+       return DI::apiResponse()->formatData('statuses', $type, ['status' => $status_info]);
 }
 
 /**
@@ -1202,7 +1162,7 @@ function api_users_show($type)
        unset($user_info['uid']);
        unset($user_info['self']);
 
-       return BaseApi::formatData('user', $type, ['user' => $user_info]);
+       return DI::apiResponse()->formatData('user', $type, ['user' => $user_info]);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1258,7 +1218,7 @@ function api_users_search($type)
                throw new BadRequestException('No search term specified.');
        }
 
-       return BaseApi::formatData('users', $type, $userlist);
+       return DI::apiResponse()->formatData('users', $type, $userlist);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1294,7 +1254,7 @@ function api_users_lookup($type)
                throw new NotFoundException;
        }
 
-       return BaseApi::formatData("users", $type, ['users' => $users]);
+       return DI::apiResponse()->formatData("users", $type, ['users' => $users]);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1357,7 +1317,7 @@ function api_search($type)
                DBA::close($tags);
 
                if (empty($uriids)) {
-                       return BaseApi::formatData('statuses', $type, $data);
+                       return DI::apiResponse()->formatData('statuses', $type, $data);
                }
 
                $condition = ['uri-id' => $uriids];
@@ -1398,7 +1358,7 @@ function api_search($type)
 
        bindComments($data['status']);
 
-       return BaseApi::formatData('statuses', $type, $data);
+       return DI::apiResponse()->formatData('statuses', $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1495,7 +1455,7 @@ function api_statuses_home_timeline($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 
@@ -1581,7 +1541,7 @@ function api_statuses_public_timeline($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1640,7 +1600,7 @@ function api_statuses_networkpublic_timeline($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -1716,10 +1676,10 @@ function api_statuses_show($type)
 
        if ($conversation) {
                $data = ['status' => $ret];
-               return BaseApi::formatData("statuses", $type, $data);
+               return DI::apiResponse()->formatData("statuses", $type, $data);
        } else {
                $data = ['status' => $ret[0]];
-               return BaseApi::formatData("status", $type, $data);
+               return DI::apiResponse()->formatData("status", $type, $data);
        }
 }
 
@@ -1798,7 +1758,7 @@ function api_conversation_show($type)
        $ret = api_format_items(Post::toArray($statuses), $user_info, false, $type);
 
        $data = ['status' => $ret];
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -2009,7 +1969,7 @@ function api_statuses_mentions($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -2087,7 +2047,7 @@ function api_statuses_user_timeline($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -2169,7 +2129,7 @@ function api_favorites_create_destroy($type)
                        break;
        }
 
-       return BaseApi::formatData("status", $type, $data);
+       return DI::apiResponse()->formatData("status", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -2242,7 +2202,7 @@ function api_favorites($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -2751,7 +2711,7 @@ function api_format_items($items, $user_info, $filter_user = false, $type = "jso
        }
 
        foreach ((array)$items as $item) {
-               list($status_user, $author_user, $owner_user) = api_item_get_user($a, $item);
+               [$status_user, $author_user, $owner_user] = api_item_get_user($a, $item);
 
                // Look if the posts are matching if they should be filtered by user id
                if ($filter_user && ($status_user["id"] != $user_info["id"])) {
@@ -2783,7 +2743,7 @@ function api_format_item($item, $type = "json", $status_user = null, $author_use
        $a = Friendica\DI::app();
 
        if (empty($status_user) || empty($author_user) || empty($owner_user)) {
-               list($status_user, $author_user, $owner_user) = api_item_get_user($a, $item);
+               [$status_user, $author_user, $owner_user] = api_item_get_user($a, $item);
        }
 
        DI::contentItem()->localize($item);
@@ -2948,7 +2908,7 @@ function api_lists_list($type)
 {
        $ret = [];
        /// @TODO $ret is not filled here?
-       return BaseApi::formatData('lists', $type, ["lists_list" => $ret]);
+       return DI::apiResponse()->formatData('lists', $type, ["lists_list" => $ret]);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -2998,7 +2958,7 @@ function api_lists_ownerships($type)
                        'mode' => $mode
                ];
        }
-       return BaseApi::formatData("lists", $type, ['lists' => ['lists' => $lists]]);
+       return DI::apiResponse()->formatData("lists", $type, ['lists' => ['lists' => $lists]]);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -3078,7 +3038,7 @@ function api_lists_statuses($type)
                        break;
        }
 
-       return BaseApi::formatData("statuses", $type, $data);
+       return DI::apiResponse()->formatData("statuses", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -3192,7 +3152,7 @@ function api_statuses_friends($type)
        if ($data === false) {
                return false;
        }
-       return BaseApi::formatData("users", $type, $data);
+       return DI::apiResponse()->formatData("users", $type, $data);
 }
 
 /**
@@ -3211,7 +3171,7 @@ function api_statuses_followers($type)
        if ($data === false) {
                return false;
        }
-       return BaseApi::formatData("users", $type, $data);
+       return DI::apiResponse()->formatData("users", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -3235,7 +3195,7 @@ function api_blocks_list($type)
        if ($data === false) {
                return false;
        }
-       return BaseApi::formatData("users", $type, $data);
+       return DI::apiResponse()->formatData("users", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -3264,54 +3224,12 @@ function api_friendships_incoming($type)
                $ids[] = $user['id'];
        }
 
-       return BaseApi::formatData("ids", $type, ['id' => $ids]);
+       return DI::apiResponse()->formatData("ids", $type, ['id' => $ids]);
 }
 
 /// @TODO move to top of file or somewhere better
 api_register_func('api/friendships/incoming', 'api_friendships_incoming', true);
 
-/**
- * Returns the instance's configuration information.
- *
- * @param string $type Return type (atom, rss, xml, json)
- *
- * @return array|string
- * @throws InternalServerErrorException
- */
-function api_statusnet_config($type)
-{
-       $name      = DI::config()->get('config', 'sitename');
-       $server    = DI::baseUrl()->getHostname();
-       $logo      = DI::baseUrl() . '/images/friendica-64.png';
-       $email     = DI::config()->get('config', 'admin_email');
-       $closed    = intval(DI::config()->get('config', 'register_policy')) === \Friendica\Module\Register::CLOSED ? 'true' : 'false';
-       $private   = DI::config()->get('system', 'block_public') ? 'true' : 'false';
-       $textlimit = (string) DI::config()->get('config', 'api_import_size', DI::config()->get('config', 'max_import_size', 200000));
-       $ssl       = DI::config()->get('system', 'have_ssl') ? 'true' : 'false';
-       $sslserver = DI::config()->get('system', 'have_ssl') ? str_replace('http:', 'https:', DI::baseUrl()) : '';
-
-       $config = [
-               'site' => ['name' => $name,'server' => $server, 'theme' => 'default', 'path' => '',
-                       'logo' => $logo, 'fancy' => true, 'language' => 'en', 'email' => $email, 'broughtby' => '',
-                       'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => false,
-                       'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
-                       'shorturllength' => '30',
-                       'friendica' => [
-                                       'FRIENDICA_PLATFORM' => FRIENDICA_PLATFORM,
-                                       'FRIENDICA_VERSION' => FRIENDICA_VERSION,
-                                       'DFRN_PROTOCOL_VERSION' => DFRN_PROTOCOL_VERSION,
-                                       'DB_UPDATE_VERSION' => DB_UPDATE_VERSION
-                                       ]
-               ],
-       ];
-
-       return BaseApi::formatData('config', $type, ['config' => $config]);
-}
-
-/// @TODO move to top of file or somewhere better
-api_register_func('api/gnusocial/config', 'api_statusnet_config', false);
-api_register_func('api/statusnet/config', 'api_statusnet_config', false);
-
 /**
  * Sends a new direct message.
  *
@@ -3389,7 +3307,7 @@ function api_direct_messages_new($type)
                        break;
        }
 
-       return BaseApi::formatData("direct-messages", $type, $data);
+       return DI::apiResponse()->formatData("direct-messages", $type, $data);
 }
 
 /// @TODO move to top of file or somewhere better
@@ -3428,7 +3346,7 @@ function api_direct_messages_destroy($type)
        // error if no id or parenturi specified (for clients posting parent-uri as well)
        if ($verbose == "true" && ($id == 0 || $parenturi == "")) {
                $answer = ['result' => 'error', 'message' => 'message id or parenturi not specified'];
-               return BaseApi::formatData("direct_messages_delete", $type, ['$result' => $answer]);
+               return DI::apiResponse()->formatData("direct_messages_delete", $type, ['$result' => $answer]);
        }
 
        // BadRequestException if no id specified (for clients using Twitter API)
@@ -3443,7 +3361,7 @@ function api_direct_messages_destroy($type)
        if (!DBA::exists('mail', ["`uid` = ? AND `id` = ? " . $sql_extra, $uid, $id])) {
                if ($verbose == "true") {
                        $answer = ['result' => 'error', 'message' => 'message id not in database'];
-                       return BaseApi::formatData("direct_messages_delete", $type, ['$result' => $answer]);
+                       return DI::apiResponse()->formatData("direct_messages_delete", $type, ['$result' => $answer]);
                }
                /// @todo BadRequestException ok for Twitter API clients?
                throw new BadRequestException('message id not in database');
@@ -3456,10 +3374,10 @@ function api_direct_messages_destroy($type)
                if ($result) {
                        // return success
                        $answer = ['result' => 'ok', 'message' => 'message deleted'];
-                       return BaseApi::formatData("direct_message_delete", $type, ['$result' => $answer]);
+                       return DI::apiResponse()->formatData("direct_message_delete", $type, ['$result' => $answer]);
                } else {
                        $answer = ['result' => 'error', 'message' => 'unknown error'];
-                       return BaseApi::formatData("direct_messages_delete", $type, ['$result' => $answer]);
+                       return DI::apiResponse()->formatData("direct_messages_delete", $type, ['$result' => $answer]);
                }
        }
        /// @todo return JSON data like Twitter API not yet implemented
@@ -3544,8 +3462,9 @@ function api_friendships_destroy($type)
        // Set screen_name since Twidere requests it
        $contact['screen_name'] = $contact['nick'];
 
-       return BaseApi::formatData('friendships-destroy', $type, ['user' => $contact]);
+       return DI::apiResponse()->formatData('friendships-destroy', $type, ['user' => $contact]);
 }
+
 api_register_func('api/friendships/destroy', 'api_friendships_destroy', true, API_METHOD_POST);
 
 /**
@@ -3625,7 +3544,7 @@ function api_direct_messages_box($type, $box, $verbose)
        ));
        if ($verbose == "true" && !DBA::isResult($r)) {
                $answer = ['result' => 'error', 'message' => 'no mails available'];
-               return BaseApi::formatData("direct_messages_all", $type, ['$result' => $answer]);
+               return DI::apiResponse()->formatData("direct_messages_all", $type, ['$result' => $answer]);
        }
 
        $ret = [];
@@ -3653,7 +3572,7 @@ function api_direct_messages_box($type, $box, $verbose)
                        break;
        }
 
-       return BaseApi::formatData("direct-messages", $type, $data);
+       return DI::apiResponse()->formatData("direct-messages", $type, $data);
 }
 
 /**
@@ -3722,95 +3641,6 @@ api_register_func('api/direct_messages/all', 'api_direct_messages_all', true);
 api_register_func('api/direct_messages/sent', 'api_direct_messages_sentbox', true);
 api_register_func('api/direct_messages', 'api_direct_messages_inbox', true);
 
-/**
- * delete a complete photoalbum with all containing photos from database through api
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string|array
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws InternalServerErrorException
- */
-function api_fr_photoalbum_delete($type)
-{
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-       // input params
-       $album = $_REQUEST['album'] ?? '';
-
-       // we do not allow calls without album string
-       if ($album == "") {
-               throw new BadRequestException("no albumname specified");
-       }
-       // check if album is existing
-
-       $photos = DBA::selectToArray('photo', ['resource-id'], ['uid' => api_user(), 'album' => $album], ['group_by' => ['resource-id']]);
-       if (!DBA::isResult($photos)) {
-               throw new BadRequestException("album not available");
-       }
-
-       $resourceIds = array_column($photos, 'resource-id');
-
-       // function for setting the items to "deleted = 1" which ensures that comments, likes etc. are not shown anymore
-       // to the user and the contacts of the users (drop_items() performs the federation of the deletion to other networks
-       $condition = ['uid' => api_user(), 'resource-id' => $resourceIds, 'type' => 'photo'];
-       Item::deleteForUser($condition, api_user());
-
-       // now let's delete all photos from the album
-       $result = Photo::delete(['uid' => api_user(), 'album' => $album]);
-
-       // return success of deletion or error message
-       if ($result) {
-               $answer = ['result' => 'deleted', 'message' => 'album `' . $album . '` with all containing photos has been deleted.'];
-               return BaseApi::formatData("photoalbum_delete", $type, ['$result' => $answer]);
-       } else {
-               throw new InternalServerErrorException("unknown error - deleting from database failed");
-       }
-}
-
-/**
- * update the name of the album for all photos of an album
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string|array
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws InternalServerErrorException
- */
-function api_fr_photoalbum_update($type)
-{
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-       // input params
-       $album = $_REQUEST['album'] ?? '';
-       $album_new = $_REQUEST['album_new'] ?? '';
-
-       // we do not allow calls without album string
-       if ($album == "") {
-               throw new BadRequestException("no albumname specified");
-       }
-       if ($album_new == "") {
-               throw new BadRequestException("no new albumname specified");
-       }
-       // check if album is existing
-       if (!Photo::exists(['uid' => api_user(), 'album' => $album])) {
-               throw new BadRequestException("album not available");
-       }
-       // now let's update all photos to the albumname
-       $result = Photo::update(['album' => $album_new], ['uid' => api_user(), 'album' => $album]);
-
-       // return success of updating or error message
-       if ($result) {
-               $answer = ['result' => 'updated', 'message' => 'album `' . $album . '` with all containing photos has been renamed to `' . $album_new . '`.'];
-               return BaseApi::formatData("photoalbum_update", $type, ['$result' => $answer]);
-       } else {
-               throw new InternalServerErrorException("unknown error - updating in database failed");
-       }
-}
-
-
 /**
  * list all photos of the authenticated user
  *
@@ -3856,7 +3686,7 @@ function api_fr_photos_list($type)
                        }
                }
        }
-       return BaseApi::formatData("photos", $type, $data);
+       return DI::apiResponse()->formatData("photos", $type, $data);
 }
 
 /**
@@ -3928,7 +3758,7 @@ function api_fr_photo_create_update($type)
 
                // return success of updating or error message
                if (!is_null($data)) {
-                       return BaseApi::formatData("photo_create", $type, $data);
+                       return DI::apiResponse()->formatData("photo_create", $type, $data);
                } else {
                        throw new InternalServerErrorException("unknown error - uploading photo failed, see Friendica log for more information");
                }
@@ -3979,18 +3809,18 @@ function api_fr_photo_create_update($type)
                        $media = $_FILES['media'];
                        $data = save_media_to_database("photo", $media, $type, $album, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $desc, Photo::DEFAULT, $visibility, $photo_id);
                        if (!is_null($data)) {
-                               return BaseApi::formatData("photo_update", $type, $data);
+                               return DI::apiResponse()->formatData("photo_update", $type, $data);
                        }
                }
 
                // return success of updating or error message
                if ($result) {
                        $answer = ['result' => 'updated', 'message' => 'Image id `' . $photo_id . '` has been updated.'];
-                       return BaseApi::formatData("photo_update", $type, ['$result' => $answer]);
+                       return DI::apiResponse()->formatData("photo_update", $type, ['$result' => $answer]);
                } else {
                        if ($nothingtodo) {
                                $answer = ['result' => 'cancelled', 'message' => 'Nothing to update for image id `' . $photo_id . '`.'];
-                               return BaseApi::formatData("photo_update", $type, ['$result' => $answer]);
+                               return DI::apiResponse()->formatData("photo_update", $type, ['$result' => $answer]);
                        }
                        throw new InternalServerErrorException("unknown error - update photo entry in database failed");
                }
@@ -3998,53 +3828,6 @@ function api_fr_photo_create_update($type)
        throw new InternalServerErrorException("unknown error - this error on uploading or updating a photo should never happen");
 }
 
-/**
- * delete a single photo from the database through api
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string|array
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws InternalServerErrorException
- */
-function api_fr_photo_delete($type)
-{
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-
-       // input params
-       $photo_id = $_REQUEST['photo_id'] ?? null;
-
-       // do several checks on input parameters
-       // we do not allow calls without photo id
-       if ($photo_id == null) {
-               throw new BadRequestException("no photo_id specified");
-       }
-
-       // check if photo is existing in database
-       if (!Photo::exists(['resource-id' => $photo_id, 'uid' => api_user()])) {
-               throw new BadRequestException("photo not available");
-       }
-
-       // now we can perform on the deletion of the photo
-       $result = Photo::delete(['uid' => api_user(), 'resource-id' => $photo_id]);
-
-       // return success of deletion or error message
-       if ($result) {
-               // function for setting the items to "deleted = 1" which ensures that comments, likes etc. are not shown anymore
-               // to the user and the contacts of the users (drop_items() do all the necessary magic to avoid orphans in database and federate deletion)
-               $condition = ['uid' => api_user(), 'resource-id' => $photo_id, 'type' => 'photo'];
-               Item::deleteForUser($condition, api_user());
-
-               $result = ['result' => 'deleted', 'message' => 'photo with id `' . $photo_id . '` has been deleted from server.'];
-               return BaseApi::formatData("photo_delete", $type, ['$result' => $result]);
-       } else {
-               throw new InternalServerErrorException("unknown error on deleting photo from database table");
-       }
-}
-
-
 /**
  * returns the details of a specified photo id, if scale is given, returns the photo data in base 64
  *
@@ -4070,7 +3853,7 @@ function api_fr_photo_detail($type)
        // prepare json/xml output with data from database for the requested photo
        $data = prepare_photo_data($type, $scale, $photo_id);
 
-       return BaseApi::formatData("photo_detail", $type, $data);
+       return DI::apiResponse()->formatData("photo_detail", $type, $data);
 }
 
 
@@ -4161,12 +3944,9 @@ function api_account_update_profile_image($type)
 }
 
 // place api-register for photoalbum calls before 'api/friendica/photo', otherwise this function is never reached
-api_register_func('api/friendica/photoalbum/delete', 'api_fr_photoalbum_delete', true, API_METHOD_DELETE);
-api_register_func('api/friendica/photoalbum/update', 'api_fr_photoalbum_update', true, API_METHOD_POST);
 api_register_func('api/friendica/photos/list', 'api_fr_photos_list', true);
 api_register_func('api/friendica/photo/create', 'api_fr_photo_create_update', true, API_METHOD_POST);
 api_register_func('api/friendica/photo/update', 'api_fr_photo_create_update', true, API_METHOD_POST);
-api_register_func('api/friendica/photo/delete', 'api_fr_photo_delete', true, API_METHOD_DELETE);
 api_register_func('api/friendica/photo', 'api_fr_photo_detail', true);
 api_register_func('api/account/update_profile_image', 'api_account_update_profile_image', true, API_METHOD_POST);
 
@@ -4804,69 +4584,10 @@ function api_friendica_group_show($type)
                }
                $grps[] = ['name' => $rr['name'], 'gid' => $rr['id'], $user_element => $users];
        }
-       return BaseApi::formatData("groups", $type, ['group' => $grps]);
+       return DI::apiResponse()->formatData("groups", $type, ['group' => $grps]);
 }
-api_register_func('api/friendica/group_show', 'api_friendica_group_show', true);
-
-
-/**
- * Delete the specified group of the user.
- *
- * @param string $type Return type (atom, rss, xml, json)
- *
- * @return array|string
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws ImagickException
- * @throws InternalServerErrorException
- * @throws UnauthorizedException
- */
-function api_friendica_group_delete($type)
-{
-       $a = DI::app();
-
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
 
-       // params
-       $user_info = api_get_user();
-       $gid = $_REQUEST['gid'] ?? 0;
-       $name = $_REQUEST['name'] ?? '';
-       $uid = $user_info['uid'];
-
-       // error if no gid specified
-       if ($gid == 0 || $name == "") {
-               throw new BadRequestException('gid or name not specified');
-       }
-
-       // error message if specified gid is not in database
-       if (!DBA::exists('group', ['uid' => $uid, 'id' => $gid])) {
-               throw new BadRequestException('gid not available');
-       }
-
-       // error message if specified gid is not in database
-       if (!DBA::exists('group', ['uid' => $uid, 'id' => $gid, 'name' => $name])) {
-               throw new BadRequestException('wrong group name');
-       }
-
-       // delete group
-       $gid = Group::getIdByName($uid, $name);
-       if (empty($gid)) {
-               throw new BadRequestException('other API error');
-       }
-
-       $ret = Group::remove($gid);
-
-       if ($ret) {
-               // return success
-               $success = ['success' => $ret, 'gid' => $gid, 'name' => $name, 'status' => 'deleted', 'wrong users' => []];
-               return BaseApi::formatData("group_delete", $type, ['result' => $success]);
-       } else {
-               throw new BadRequestException('other API error');
-       }
-}
-api_register_func('api/friendica/group_delete', 'api_friendica_group_delete', true, API_METHOD_DELETE);
+api_register_func('api/friendica/group_show', 'api_friendica_group_show', true);
 
 /**
  * Delete a group.
@@ -4914,9 +4635,10 @@ function api_lists_destroy($type)
                        'user' => $user_info
                ];
 
-               return BaseApi::formatData("lists", $type, ['lists' => $list]);
+               return DI::apiResponse()->formatData("lists", $type, ['lists' => $list]);
        }
 }
+
 api_register_func('api/lists/destroy', 'api_lists_destroy', true, API_METHOD_DELETE);
 
 /**
@@ -5002,8 +4724,9 @@ function api_friendica_group_create($type)
 
        $success = group_create($name, $uid, $users);
 
-       return BaseApi::formatData("group_create", $type, ['result' => $success]);
+       return DI::apiResponse()->formatData("group_create", $type, ['result' => $success]);
 }
+
 api_register_func('api/friendica/group_create', 'api_friendica_group_create', true, API_METHOD_POST);
 
 /**
@@ -5041,9 +4764,10 @@ function api_lists_create($type)
                        'user' => $user_info
                ];
 
-               return BaseApi::formatData("lists", $type, ['lists'=>$grp]);
+               return DI::apiResponse()->formatData("lists", $type, ['lists' => $grp]);
        }
 }
+
 api_register_func('api/lists/create', 'api_lists_create', true, API_METHOD_POST);
 
 /**
@@ -5114,7 +4838,7 @@ function api_friendica_group_update($type)
        // return success message incl. missing users in array
        $status = ($erroraddinguser ? "missing user" : "ok");
        $success = ['success' => true, 'gid' => $gid, 'name' => $name, 'status' => $status, 'wrong users' => $errorusers];
-       return BaseApi::formatData("group_update", $type, ['result' => $success]);
+       return DI::apiResponse()->formatData("group_update", $type, ['result' => $success]);
 }
 
 api_register_func('api/friendica/group_update', 'api_friendica_group_update', true, API_METHOD_POST);
@@ -5166,102 +4890,12 @@ function api_lists_update($type)
                        'user' => $user_info
                ];
 
-               return BaseApi::formatData("lists", $type, ['lists' => $list]);
+               return DI::apiResponse()->formatData("lists", $type, ['lists' => $list]);
        }
 }
 
 api_register_func('api/lists/update', 'api_lists_update', true, API_METHOD_POST);
 
-/**
- *
- * @param string $type Return type (atom, rss, xml, json)
- *
- * @return array|string
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws ImagickException
- * @throws InternalServerErrorException
- */
-function api_friendica_activity($type)
-{
-       $a = DI::app();
-
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-       $verb = strtolower(DI::args()->getArgv()[3]);
-       $verb = preg_replace("|\..*$|", "", $verb);
-
-       $id = $_REQUEST['id'] ?? 0;
-
-       $res = Item::performActivity($id, $verb, api_user());
-
-       if ($res) {
-               if ($type == "xml") {
-                       $ok = "true";
-               } else {
-                       $ok = "ok";
-               }
-               return BaseApi::formatData('ok', $type, ['ok' => $ok]);
-       } else {
-               throw new BadRequestException('Error adding activity');
-       }
-}
-
-/// @TODO move to top of file or somewhere better
-api_register_func('api/friendica/activity/like', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/dislike', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/attendyes', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/attendno', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/attendmaybe', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/unlike', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/undislike', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/unattendyes', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/unattendno', 'api_friendica_activity', true, API_METHOD_POST);
-api_register_func('api/friendica/activity/unattendmaybe', 'api_friendica_activity', true, API_METHOD_POST);
-
-/**
- * Returns notifications
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- *
- * @return string|array
- * @throws ForbiddenException
- * @throws BadRequestException
- * @throws Exception
- */
-function api_friendica_notification($type)
-{
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-       if (DI::args()->getArgc()!==3) {
-               throw new BadRequestException('Invalid argument count');
-       }
-
-       $Notifies = DI::notify()->selectAllForUser(local_user(), 50);
-
-       $notifications = new ApiNotifications();
-       foreach ($Notifies as $Notify) {
-               $notifications[] = new ApiNotification($Notify);
-       }
-
-       if ($type == 'xml') {
-               $xmlnotes = [];
-               foreach ($notifications as $notification) {
-                       $xmlnotes[] = ['@attributes' => $notification->toArray()];
-               }
-
-               $result = $xmlnotes;
-       } elseif (count($notifications) > 0) {
-               $result = $notifications->getArrayCopy();
-       } else {
-               $result = false;
-       }
-
-       return BaseApi::formatData('notes', $type, ['note' => $result]);
-}
-
 /**
  * Set notification as seen and returns associated item (if possible)
  *
@@ -5308,12 +4942,12 @@ function api_friendica_notification_seen($type)
                                // we found the item, return it to the user
                                $ret  = api_format_items([$item], $user_info, false, $type);
                                $data = ['status' => $ret];
-                               return BaseApi::formatData('status', $type, $data);
+                               return DI::apiResponse()->formatData('status', $type, $data);
                        }
                        // the item can't be found, but we set the notification as seen, so we count this as a success
                }
 
-               return BaseApi::formatData('result', $type, ['result' => 'success']);
+               return DI::apiResponse()->formatData('result', $type, ['result' => 'success']);
        } catch (NotFoundException $e) {
                throw new BadRequestException('Invalid argument', $e);
        } catch (Exception $e) {
@@ -5323,58 +4957,6 @@ function api_friendica_notification_seen($type)
 
 /// @TODO move to top of file or somewhere better
 api_register_func('api/friendica/notification/seen', 'api_friendica_notification_seen', true, API_METHOD_POST);
-api_register_func('api/friendica/notification', 'api_friendica_notification', true, API_METHOD_GET);
-
-/**
- * update a direct_message to seen state
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string|array (success result=ok, error result=error with error message)
- * @throws BadRequestException
- * @throws ForbiddenException
- * @throws ImagickException
- * @throws InternalServerErrorException
- * @throws UnauthorizedException
- */
-function api_friendica_direct_messages_setseen($type)
-{
-       $a = DI::app();
-       if (api_user() === false) {
-               throw new ForbiddenException();
-       }
-
-       // params
-       $user_info = api_get_user();
-       $uid = $user_info['uid'];
-       $id = $_REQUEST['id'] ?? 0;
-
-       // return error if id is zero
-       if ($id == "") {
-               $answer = ['result' => 'error', 'message' => 'message id not specified'];
-               return BaseApi::formatData("direct_messages_setseen", $type, ['$result' => $answer]);
-       }
-
-       // error message if specified id is not in database
-       if (!DBA::exists('mail', ['id' => $id, 'uid' => $uid])) {
-               $answer = ['result' => 'error', 'message' => 'message id not in database'];
-               return BaseApi::formatData("direct_messages_setseen", $type, ['$result' => $answer]);
-       }
-
-       // update seen indicator
-       $result = DBA::update('mail', ['seen' => true], ['id' => $id]);
-
-       if ($result) {
-               // return success
-               $answer = ['result' => 'ok', 'message' => 'message set to seen'];
-               return BaseApi::formatData("direct_message_setseen", $type, ['$result' => $answer]);
-       } else {
-               $answer = ['result' => 'error', 'message' => 'unknown error'];
-               return BaseApi::formatData("direct_messages_setseen", $type, ['$result' => $answer]);
-       }
-}
-
-/// @TODO move to top of file or somewhere better
-api_register_func('api/friendica/direct_messages_setseen', 'api_friendica_direct_messages_setseen', true);
 
 /**
  * search for direct_messages containing a searchstring through api
@@ -5406,7 +4988,7 @@ function api_friendica_direct_messages_search($type, $box = "")
        // error if no searchstring specified
        if ($searchstring == "") {
                $answer = ['result' => 'error', 'message' => 'searchstring not specified'];
-               return BaseApi::formatData("direct_messages_search", $type, ['$result' => $answer]);
+               return DI::apiResponse()->formatData("direct_messages_search", $type, ['$result' => $answer]);
        }
 
        // get data for the specified searchstring
@@ -5441,46 +5023,12 @@ function api_friendica_direct_messages_search($type, $box = "")
                $success = ['success' => true, 'search_results' => $ret];
        }
 
-       return BaseApi::formatData("direct_message_search", $type, ['$result' => $success]);
+       return DI::apiResponse()->formatData("direct_message_search", $type, ['$result' => $success]);
 }
 
 /// @TODO move to top of file or somewhere better
 api_register_func('api/friendica/direct_messages_search', 'api_friendica_direct_messages_search', true);
 
-/**
- * Returns a list of saved searches.
- *
- * @see https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-saved_searches-list
- *
- * @param  string $type Return format: json or xml
- *
- * @return string|array
- * @throws Exception
- */
-function api_saved_searches_list($type)
-{
-       $terms = DBA::select('search', ['id', 'term'], ['uid' => local_user()]);
-
-       $result = [];
-       while ($term = DBA::fetch($terms)) {
-               $result[] = [
-                       'created_at' => api_date(time()),
-                       'id' => intval($term['id']),
-                       'id_str' => $term['id'],
-                       'name' => $term['term'],
-                       'position' => null,
-                       'query' => $term['term']
-               ];
-       }
-
-       DBA::close($terms);
-
-       return BaseApi::formatData("terms", $type, ['terms' => $result]);
-}
-
-/// @TODO move to top of file or somewhere better
-api_register_func('api/saved_searches/list', 'api_saved_searches_list', true);
-
 /*
  * Number of comments
  *