X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FGroup.php;h=17e0a18e2e49dd0c8019f2779dcb2b541898e5c8;hb=6dbbd081795fa1c8fe57db2248ac162efeeada88;hp=64b868466a589d4c3203935db09bf64fbd8211fa;hpb=1de3960e267a8d298348fbca18cf1be1f6a20f7a;p=friendica.git diff --git a/src/Model/Group.php b/src/Model/Group.php index 64b868466a..17e0a18e2e 100644 --- a/src/Model/Group.php +++ b/src/Model/Group.php @@ -1,22 +1,39 @@ . + * */ namespace Friendica\Model; use Friendica\BaseModule; -use Friendica\BaseObject; -use Friendica\Core\L10n; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Core\Renderer; +use Friendica\Database\Database; use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Network\HTTPException; /** - * @brief functions for interacting with the group database table + * functions for interacting with the group database table */ -class Group extends BaseObject +class Group { const FOLLOWERS = '~'; const MUTUALS = '&'; @@ -51,7 +68,7 @@ class Group extends BaseObject } /** - * @brief Create a new contact group + * Create a new contact group * * Note: If we found a deleted group with the same name, we restore it * @@ -74,7 +91,7 @@ class Group extends BaseObject $group = DBA::selectFirst('group', ['deleted'], ['id' => $gid]); if (DBA::isResult($group) && $group['deleted']) { DBA::update('group', ['deleted' => 0], ['id' => $gid]); - notice(L10n::t('A deleted group with this name was revived. Existing item permissions may apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL); + notice(DI::l10n()->t('A deleted group with this name was revived. Existing item permissions may apply to this group and any future members. If this is not what you intended, please create another group with a different name.')); } return true; } @@ -102,7 +119,7 @@ class Group extends BaseObject } /** - * @brief Get a list of group ids a contact belongs to + * Get a list of group ids a contact belongs to * * @param int $cid * @return array @@ -118,11 +135,21 @@ class Group extends BaseObject } DBA::close($stmt); + // Meta-groups + $contact = Contact::getById($cid, ['rel']); + if ($contact['rel'] == Contact::FOLLOWER || $contact['rel'] == Contact::FRIEND) { + $return[] = self::FOLLOWERS; + } + + if ($contact['rel'] == Contact::FRIEND) { + $return[] = self::MUTUALS; + } + return $return; } /** - * @brief count unread group items + * count unread group items * * Count unread items of each groups of the local user * @@ -135,7 +162,7 @@ class Group extends BaseObject public static function countUnseen() { $stmt = DBA::p("SELECT `group`.`id`, `group`.`name`, - (SELECT COUNT(*) FROM `item` FORCE INDEX (`uid_unseen_contactid`) + (SELECT COUNT(*) FROM `post-user` WHERE `uid` = ? AND `unseen` AND `contact-id` IN @@ -153,7 +180,7 @@ class Group extends BaseObject } /** - * @brief Get the group id for a user/name couple + * Get the group id for a user/name couple * * Returns false if no group has been found. * @@ -177,7 +204,7 @@ class Group extends BaseObject } /** - * @brief Mark a group as deleted + * Mark a group as deleted * * @param int $gid * @return boolean @@ -227,93 +254,63 @@ class Group extends BaseObject } /** - * @brief Mark a group as deleted based on its name - * - * @param int $uid - * @param string $name - * @return bool - * @throws \Exception - * @deprecated Use Group::remove instead - * - */ - public static function removeByName($uid, $name) - { - $return = false; - if (!empty($uid) && !empty($name)) { - $gid = self::getIdByName($uid, $name); - - $return = self::remove($gid); - } - - return $return; - } - - /** - * @brief Adds a contact to a group + * Adds a contact to a group * * @param int $gid * @param int $cid * @return boolean * @throws \Exception */ - public static function addMember($gid, $cid) + public static function addMember(int $gid, int $cid): bool { if (!$gid || !$cid) { return false; } - $row_exists = DBA::exists('group_member', ['gid' => $gid, 'contact-id' => $cid]); - if ($row_exists) { - // Row already existing, nothing to do - $return = true; - } else { - $return = DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $cid]); + // @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.'); + } + + $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']); + if (empty($cdata['user'])) { + throw new HTTPException\NotFoundException('Invalid contact.'); } - return $return; + return DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $cdata['user']], Database::INSERT_IGNORE); } /** - * @brief Removes a contact from a group + * Removes a contact from a group * * @param int $gid * @param int $cid * @return boolean * @throws \Exception */ - public static function removeMember($gid, $cid) + public static function removeMember(int $gid, int $cid): bool { if (!$gid || !$cid) { return false; } - $return = DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $cid]); - - return $return; - } - - /** - * @brief Removes a contact from a group based on its name - * - * @param int $uid - * @param string $name - * @param int $cid - * @return boolean - * @throws \Exception - * @deprecated Use Group::removeMember instead - * - */ - public static function removeMemberByName($uid, $name, $cid) - { - $gid = self::getIdByName($uid, $name); + // @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.'); + } - $return = self::removeMember($gid, $cid); + $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']); + if (empty($cdata['user'])) { + throw new HTTPException\NotFoundException('Invalid contact.'); + } - return $return; + return DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $cid]); } /** - * @brief Returns the combined list of contact ids from a group id list + * Returns the combined list of contact ids from a group id list * * @param int $uid * @param array $group_ids @@ -328,13 +325,28 @@ class Group extends BaseObject } $return = []; + $pubmail = false; + $networks = Protocol::SUPPORT_PRIVATE; + + $mailacct = DBA::selectFirst('mailacct', ['pubmail'], ['`uid` = ? AND `server` != ""', $uid]); + if (DBA::isResult($mailacct)) { + $pubmail = $mailacct['pubmail']; + } + + if (!$pubmail) { + $networks = array_diff($networks, [Protocol::MAIL]); + } $key = array_search(self::FOLLOWERS, $group_ids); if ($key !== false) { $followers = Contact::selectToArray(['id'], [ 'uid' => $uid, 'rel' => [Contact::FOLLOWER, Contact::FRIEND], - 'network' => Protocol::SUPPORT_PRIVATE, + 'network' => $networks, + 'contact-type' => [Contact::TYPE_UNKNOWN, Contact::TYPE_PERSON], + 'archive' => false, + 'pending' => false, + 'blocked' => false, ]); foreach ($followers as $follower) { @@ -349,7 +361,11 @@ class Group extends BaseObject $mutuals = Contact::selectToArray(['id'], [ 'uid' => $uid, 'rel' => [Contact::FRIEND], - 'network' => Protocol::SUPPORT_PRIVATE, + 'network' => $networks, + 'contact-type' => [Contact::TYPE_UNKNOWN, Contact::TYPE_PERSON], + 'archive' => false, + 'pending' => false, + 'blocked' => false, ]); foreach ($mutuals as $mutual) { @@ -366,14 +382,14 @@ class Group extends BaseObject DBA::close($stmt); if ($check_dead) { - Contact::pruneUnavailable($return); + $return = Contact::pruneUnavailable($return); } return $return; } /** - * @brief Returns a templated group selection list + * Returns a templated group selection list * * @param int $uid * @param int $gid An optional pre-selected group @@ -404,7 +420,7 @@ class Group extends BaseObject Logger::info('Got groups', $display_groups); if ($label == '') { - $label = L10n::t('Default privacy group for new contacts'); + $label = DI::l10n()->t('Default privacy group for new contacts'); } $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('group_selection.tpl'), [ @@ -415,7 +431,7 @@ class Group extends BaseObject } /** - * @brief Create group sidebar widget + * Create group sidebar widget * * @param string $every * @param string $each @@ -436,7 +452,7 @@ class Group extends BaseObject $display_groups = [ [ - 'text' => L10n::t('Everybody'), + 'text' => DI::l10n()->t('Everybody'), 'id' => 0, 'selected' => (($group_id === 'everyone') ? 'group-selected' : ''), 'href' => $every, @@ -455,16 +471,23 @@ class Group extends BaseObject if ($editmode == 'full') { $groupedit = [ 'href' => 'group/' . $group['id'], - 'title' => L10n::t('edit'), + 'title' => DI::l10n()->t('edit'), ]; } else { $groupedit = null; } + if ($each == 'group') { + $count = DBA::count('group_member', ['gid' => $group['id']]); + $group_name = sprintf('%s (%d)', $group['name'], $count); + } else { + $group_name = $group['name']; + } + $display_groups[] = [ 'id' => $group['id'], 'cid' => $cid, - 'text' => $group['name'], + 'text' => $group_name, 'href' => $each . '/' . $group['id'], 'edit' => $groupedit, 'selected' => $selected, @@ -480,17 +503,17 @@ class Group extends BaseObject $tpl = Renderer::getMarkupTemplate('group_side.tpl'); $o = Renderer::replaceMacros($tpl, [ - '$add' => L10n::t('add'), - '$title' => L10n::t('Groups'), + '$add' => DI::l10n()->t('add'), + '$title' => DI::l10n()->t('Groups'), '$groups' => $display_groups, 'newgroup' => $editmode == 'extended' || $editmode == 'full' ? 1 : '', 'grouppage' => 'group/', - '$edittext' => L10n::t('Edit group'), - '$ungrouped' => $every === 'contact' ? L10n::t('Contacts not in any group') : '', + '$edittext' => DI::l10n()->t('Edit group'), + '$ungrouped' => $every === 'contact' ? DI::l10n()->t('Contacts not in any group') : '', '$ungrouped_selected' => (($group_id === 'none') ? 'group-selected' : ''), - '$createtext' => L10n::t('Create a new group'), - '$creategroup' => L10n::t('Group Name: '), - '$editgroupstext' => L10n::t('Edit groups'), + '$createtext' => DI::l10n()->t('Create a new group'), + '$creategroup' => DI::l10n()->t('Group Name: '), + '$editgroupstext' => DI::l10n()->t('Edit groups'), '$form_security_token' => BaseModule::getFormSecurityToken('group_edit'), ]);