diff --git a/src/Model/Group.php b/src/Model/Group.php index 58c59268e..da77335f1 100644 --- a/src/Model/Group.php +++ b/src/Model/Group.php @@ -310,6 +310,64 @@ class Group return DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $cid]); } + /** + * Adds contacts to a group + * + * @param int $gid + * @param array $contacts + * @throws \Exception + */ + public static function addMembers(int $gid, array $contacts) + { + if (!$gid || !$contacts) { + return false; + } + + // @TODO Backward compatibility with user contacts, remove by version 2022.03 + $group = DBA::selectFirst('group', ['uid'], ['id' => $gid]); + if (empty($group)) { + throw new HTTPException\NotFoundException('Group not found.'); + } + + foreach ($contacts as $cid) { + $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']); + if (empty($cdata['user'])) { + throw new HTTPException\NotFoundException('Invalid contact.'); + } + + DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $cdata['user']], Database::INSERT_IGNORE); + } + } + + /** + * Removes contacts from a group + * + * @param int $gid + * @param array $contacts + * @throws \Exception + */ + public static function removeMembers(int $gid, array $contacts) + { + if (!$gid || !$contacts) { + return false; + } + + // @TODO Backward compatibility with user contacts, remove by version 2022.03 + $group = DBA::selectFirst('group', ['uid'], ['id' => $gid]); + if (empty($group)) { + throw new HTTPException\NotFoundException('Group not found.'); + } + + foreach ($contacts as $cid) { + $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']); + if (empty($cdata['user'])) { + throw new HTTPException\NotFoundException('Invalid contact.'); + } + + DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $cdata['user']]); + } + } + /** * Returns the combined list of contact ids from a group id list * diff --git a/src/Module/Api/Mastodon/Lists/Accounts.php b/src/Module/Api/Mastodon/Lists/Accounts.php index 6dcde12b7..8d27207fc 100644 --- a/src/Module/Api/Mastodon/Lists/Accounts.php +++ b/src/Module/Api/Mastodon/Lists/Accounts.php @@ -36,12 +36,30 @@ class Accounts extends BaseApi { protected function delete(array $request = []) { - $this->response->unsupported(Router::DELETE, $request); + self::checkAllowedScope(self::SCOPE_WRITE); + + $request = $this->getRequest([ + 'account_ids' => [], // Array of account IDs to remove from the list + ], $request); + + if (empty($request['account_ids']) || empty($this->parameters['id'])) { + DI::mstdnError()->UnprocessableEntity(); + } + return Group::removeMembers($this->parameters['id'], $request['account_ids']); } protected function post(array $request = []) { - $this->response->unsupported(Router::POST, $request); + self::checkAllowedScope(self::SCOPE_WRITE); + + $request = $this->getRequest([ + 'account_ids' => [], // Array of account IDs to add to the list + ], $request); + + if (empty($request['account_ids']) || empty($this->parameters['id'])) { + DI::mstdnError()->UnprocessableEntity(); + } + return Group::addMembers($this->parameters['id'], $request['account_ids']); } /**