[COMPONENT][Group] Fix group creation, Refactor related entities to inside the component
Other minor bug fixes and improvements
This commit is contained in:
parent
d03572e366
commit
c9d05d71f5
@ -29,6 +29,7 @@ use App\Core\DB\DB;
|
||||
use App\Core\Form;
|
||||
use function App\Core\I18n\_m;
|
||||
use App\Core\Log;
|
||||
use App\Core\UserRoles;
|
||||
use App\Entity\Actor;
|
||||
use App\Entity as E;
|
||||
use App\Util\Common;
|
||||
@ -36,6 +37,8 @@ use App\Util\Exception\ClientException;
|
||||
use App\Util\Exception\RedirectException;
|
||||
use App\Util\Form\ActorForms;
|
||||
use App\Util\Nickname;
|
||||
use Component\Group\Entity\GroupMember;
|
||||
use Component\Group\Entity\LocalGroup;
|
||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
@ -58,7 +61,7 @@ class Group extends ActorController
|
||||
public function groupViewNickname(Request $request, string $nickname)
|
||||
{
|
||||
Nickname::validate($nickname, which: Nickname::CHECK_LOCAL_GROUP); // throws
|
||||
$group = Actor::getByNickname($nickname, type: Actor::GROUP);
|
||||
$group = LocalGroup::getActorByNickname($nickname);
|
||||
if (\is_null($group)) {
|
||||
$actor = Common::actor();
|
||||
if (!\is_null($actor)) {
|
||||
@ -75,21 +78,21 @@ class Group extends ActorController
|
||||
),
|
||||
);
|
||||
|
||||
$group = Actor::create([
|
||||
DB::persist($group = Actor::create([
|
||||
'nickname' => $nickname,
|
||||
'type' => Actor::GROUP,
|
||||
'is_local' => true,
|
||||
]);
|
||||
DB::persist($group);
|
||||
'roles' => UserRoles::BOT,
|
||||
]));
|
||||
DB::persist(LocalGroup::create([
|
||||
'group_id' => $group->getId(),
|
||||
'nickname' => $nickname,
|
||||
]));
|
||||
DB::persist(E\Subscription::create([
|
||||
'subscriber' => $group->getId(),
|
||||
'subscribed' => $group->getId(),
|
||||
]));
|
||||
DB::persist(E\Subscription::create([
|
||||
'subscriber' => $actor->getId(),
|
||||
'subscribed' => $group->getId(),
|
||||
]));
|
||||
DB::persist(E\GroupMember::create([
|
||||
DB::persist(GroupMember::create([
|
||||
'group_id' => $group->getId(),
|
||||
'actor_id' => $actor->getId(),
|
||||
'is_admin' => true,
|
||||
@ -97,7 +100,7 @@ class Group extends ActorController
|
||||
DB::flush();
|
||||
Cache::delete(Actor::cacheKeys($actor->getId())['subscriber']);
|
||||
Cache::delete(Actor::cacheKeys($actor->getId())['subscribed']);
|
||||
throw new RedirectException;
|
||||
throw new RedirectException();
|
||||
}
|
||||
|
||||
return [
|
||||
@ -114,6 +117,7 @@ class Group extends ActorController
|
||||
join activity a with n.id = a.object_id
|
||||
join group_inbox gi with a.id = gi.activity_id
|
||||
where a.object_type = 'note' and gi.group_id = :group_id
|
||||
order by a.created desc, a.id desc
|
||||
EOF,
|
||||
['group_id' => $group->getId()],
|
||||
) : [];
|
||||
@ -128,7 +132,7 @@ class Group extends ActorController
|
||||
|
||||
public function groupSettings(Request $request, string $nickname)
|
||||
{
|
||||
$group = Actor::getByNickname($nickname, type: Actor::GROUP);
|
||||
$group = LocalGroup::getActorByNickname($nickname);
|
||||
$actor = Common::actor();
|
||||
if (!\is_null($group) && $actor->canAdmin($group)) {
|
||||
return [
|
||||
|
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
// {{{ License
|
||||
// This file is part of GNU social - https://www.gnu.org/software/social
|
||||
//
|
||||
@ -17,7 +19,7 @@
|
||||
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
||||
// }}}
|
||||
|
||||
namespace App\Entity;
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\Entity;
|
||||
use DateTimeInterface;
|
||||
@ -42,11 +44,11 @@ class GroupAlias extends Entity
|
||||
// @codeCoverageIgnoreStart
|
||||
private string $alias;
|
||||
private int $group_id;
|
||||
private \DateTimeInterface $modified;
|
||||
private DateTimeInterface $modified;
|
||||
|
||||
public function setAlias(string $alias): self
|
||||
{
|
||||
$this->alias = \mb_substr($alias, 0, 64);
|
||||
$this->alias = mb_substr($alias, 0, 64);
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -66,13 +68,13 @@ class GroupAlias extends Entity
|
||||
return $this->group_id;
|
||||
}
|
||||
|
||||
public function setModified(\DateTimeInterface $modified): self
|
||||
public function setModified(DateTimeInterface $modified): self
|
||||
{
|
||||
$this->modified = $modified;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getModified(): \DateTimeInterface
|
||||
public function getModified(): DateTimeInterface
|
||||
{
|
||||
return $this->modified;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
// {{{ License
|
||||
// This file is part of GNU social - https://www.gnu.org/software/social
|
||||
//
|
||||
@ -17,7 +19,7 @@
|
||||
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
||||
// }}}
|
||||
|
||||
namespace App\Entity;
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\Entity;
|
||||
use DateTimeInterface;
|
||||
@ -43,7 +45,7 @@ class GroupBlock extends Entity
|
||||
private int $group_id;
|
||||
private int $blocked_actor;
|
||||
private int $blocker_user;
|
||||
private \DateTimeInterface $modified;
|
||||
private DateTimeInterface $modified;
|
||||
|
||||
public function setGroupId(int $group_id): self
|
||||
{
|
||||
@ -78,13 +80,13 @@ class GroupBlock extends Entity
|
||||
return $this->blocker_user;
|
||||
}
|
||||
|
||||
public function setModified(\DateTimeInterface $modified): self
|
||||
public function setModified(DateTimeInterface $modified): self
|
||||
{
|
||||
$this->modified = $modified;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getModified(): \DateTimeInterface
|
||||
public function getModified(): DateTimeInterface
|
||||
{
|
||||
return $this->modified;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
// {{{ License
|
||||
// This file is part of GNU social - https://www.gnu.org/software/social
|
||||
//
|
||||
@ -17,7 +19,7 @@
|
||||
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
||||
// }}}
|
||||
|
||||
namespace App\Entity;
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\Entity;
|
||||
use DateTimeInterface;
|
||||
@ -42,7 +44,7 @@ class GroupInbox extends Entity
|
||||
// @codeCoverageIgnoreStart
|
||||
private int $group_id;
|
||||
private int $activity_id;
|
||||
private \DateTimeInterface $created;
|
||||
private DateTimeInterface $created;
|
||||
|
||||
public function setGroupId(int $group_id): self
|
||||
{
|
||||
@ -66,13 +68,13 @@ class GroupInbox extends Entity
|
||||
return $this->activity_id;
|
||||
}
|
||||
|
||||
public function setCreated(\DateTimeInterface $created): self
|
||||
public function setCreated(DateTimeInterface $created): self
|
||||
{
|
||||
$this->created = $created;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreated(): \DateTimeInterface
|
||||
public function getCreated(): DateTimeInterface
|
||||
{
|
||||
return $this->created;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
// {{{ License
|
||||
// This file is part of GNU social - https://www.gnu.org/software/social
|
||||
//
|
||||
@ -17,7 +19,7 @@
|
||||
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
||||
// }}}
|
||||
|
||||
namespace App\Entity;
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\Entity;
|
||||
|
@ -19,7 +19,7 @@ declare(strict_types = 1);
|
||||
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
||||
// }}}
|
||||
|
||||
namespace App\Entity;
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\Entity;
|
||||
use DateTimeInterface;
|
||||
@ -46,8 +46,8 @@ class GroupMember extends Entity
|
||||
private int $actor_id;
|
||||
private ?bool $is_admin = false;
|
||||
private ?string $uri = null;
|
||||
private \DateTimeInterface $created;
|
||||
private \DateTimeInterface $modified;
|
||||
private DateTimeInterface $created;
|
||||
private DateTimeInterface $modified;
|
||||
|
||||
public function setGroupId(int $group_id): self
|
||||
{
|
||||
@ -84,7 +84,7 @@ class GroupMember extends Entity
|
||||
|
||||
public function setUri(?string $uri): self
|
||||
{
|
||||
$this->uri = \is_null($uri) ? null : \mb_substr($uri, 0, 191);
|
||||
$this->uri = \is_null($uri) ? null : mb_substr($uri, 0, 191);
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -93,24 +93,24 @@ class GroupMember extends Entity
|
||||
return $this->uri;
|
||||
}
|
||||
|
||||
public function setCreated(\DateTimeInterface $created): self
|
||||
public function setCreated(DateTimeInterface $created): self
|
||||
{
|
||||
$this->created = $created;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreated(): \DateTimeInterface
|
||||
public function getCreated(): DateTimeInterface
|
||||
{
|
||||
return $this->created;
|
||||
}
|
||||
|
||||
public function setModified(\DateTimeInterface $modified): self
|
||||
public function setModified(DateTimeInterface $modified): self
|
||||
{
|
||||
$this->modified = $modified;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getModified(): \DateTimeInterface
|
||||
public function getModified(): DateTimeInterface
|
||||
{
|
||||
return $this->modified;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
// {{{ License
|
||||
// This file is part of GNU social - https://www.gnu.org/software/soci
|
||||
//
|
||||
@ -17,11 +19,12 @@
|
||||
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
||||
// }}}
|
||||
|
||||
namespace App\Entity;
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\DB\DB;
|
||||
use App\Core\Entity;
|
||||
|
||||
use App\Entity\Actor;
|
||||
use DateTimeInterface;
|
||||
|
||||
/**
|
||||
@ -44,8 +47,8 @@ class LocalGroup extends Entity
|
||||
// @codeCoverageIgnoreStart
|
||||
private int $group_id;
|
||||
private ?string $nickname = null;
|
||||
private \DateTimeInterface $created;
|
||||
private \DateTimeInterface $modified;
|
||||
private DateTimeInterface $created;
|
||||
private DateTimeInterface $modified;
|
||||
|
||||
public function setGroupId(int $group_id): self
|
||||
{
|
||||
@ -60,7 +63,7 @@ class LocalGroup extends Entity
|
||||
|
||||
public function setNickname(?string $nickname): self
|
||||
{
|
||||
$this->nickname = \is_null($nickname) ? null : \mb_substr($nickname, 0, 64);
|
||||
$this->nickname = \is_null($nickname) ? null : mb_substr($nickname, 0, 64);
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -69,24 +72,24 @@ class LocalGroup extends Entity
|
||||
return $this->nickname;
|
||||
}
|
||||
|
||||
public function setCreated(\DateTimeInterface $created): self
|
||||
public function setCreated(DateTimeInterface $created): self
|
||||
{
|
||||
$this->created = $created;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreated(): \DateTimeInterface
|
||||
public function getCreated(): DateTimeInterface
|
||||
{
|
||||
return $this->created;
|
||||
}
|
||||
|
||||
public function setModified(\DateTimeInterface $modified): self
|
||||
public function setModified(DateTimeInterface $modified): self
|
||||
{
|
||||
$this->modified = $modified;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getModified(): \DateTimeInterface
|
||||
public function getModified(): DateTimeInterface
|
||||
{
|
||||
return $this->modified;
|
||||
}
|
||||
@ -99,6 +102,18 @@ class LocalGroup extends Entity
|
||||
return DB::find('actor', ['id' => $this->group_id]);
|
||||
}
|
||||
|
||||
public static function getByNickname(string $nickname): ?self
|
||||
{
|
||||
$res = DB::findBy(self::class, ['nickname' => $nickname]);
|
||||
return $res === [] ? null : $res[0];
|
||||
}
|
||||
|
||||
public static function getActorByNickname(string $nickname): ?Actor
|
||||
{
|
||||
$res = DB::findBy(Actor::class, ['nickname' => $nickname, 'type' => Actor::GROUP]);
|
||||
return $res === [] ? null : $res[0];
|
||||
}
|
||||
|
||||
public static function schemaDef(): array
|
||||
{
|
||||
return [
|
@ -31,6 +31,7 @@ use App\Util\Common;
|
||||
use App\Util\HTML;
|
||||
use App\Util\Nickname;
|
||||
use Component\Group\Controller as C;
|
||||
use Component\Group\Entity\LocalGroup;
|
||||
use Component\Tag\Controller\Tag as TagController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
@ -62,7 +63,7 @@ class Group extends Component
|
||||
{
|
||||
if ($section === 'profile' && $request->get('_route') === 'group_settings') {
|
||||
$nickname = $request->get('nickname');
|
||||
$group = Actor::getByNickname($nickname, type: Actor::GROUP);
|
||||
$group = LocalGroup::getActorByNickname($nickname);
|
||||
$tabs[] = [
|
||||
'title' => 'Self tags',
|
||||
'desc' => 'Add or remove tags on this group',
|
||||
@ -82,7 +83,7 @@ class Group extends Component
|
||||
if (!\is_null($id = $request->get('id'))) {
|
||||
return Actor::getById((int) $id);
|
||||
} elseif (!\is_null($nickname = $request->get('nickname'))) {
|
||||
return Actor::getByNickname($nickname, type: Actor::GROUP);
|
||||
return LocalGroup::getActorByNickname($nickname);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
@ -34,7 +34,6 @@ use App\Core\Security;
|
||||
use App\Core\VisibilityScope;
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\Actor;
|
||||
use App\Entity\GroupInbox;
|
||||
use App\Entity\Note;
|
||||
use App\Util\Common;
|
||||
use App\Util\Exception\BugFoundException;
|
||||
@ -47,6 +46,8 @@ use App\Util\Formatting;
|
||||
use Component\Attachment\Entity\ActorToAttachment;
|
||||
use Component\Attachment\Entity\AttachmentToNote;
|
||||
use Component\Conversation\Conversation;
|
||||
use Component\Group\Entity\GroupInbox;
|
||||
use Component\Group\Entity\LocalGroup;
|
||||
use Component\Language\Entity\Language;
|
||||
use Functional as F;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
@ -255,13 +256,13 @@ class Posting extends Component
|
||||
switch ($target[0]) {
|
||||
case '!':
|
||||
$mentions[] = [
|
||||
'mentioned' => [Actor::getByNickname(mb_substr($target, 1), type: Actor::GROUP)],
|
||||
'mentioned' => [LocalGroup::getActorByNickname(mb_substr($target, 1))],
|
||||
'type' => 'group',
|
||||
'text' => mb_substr($target, 1),
|
||||
];
|
||||
break;
|
||||
default:
|
||||
throw new ClientException(_m('Unkown target type give in \'in\' field: ' . $target));
|
||||
throw new ClientException(_m('Unknown target type give in \'In\' field: ' . $target));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -274,20 +274,6 @@ class Actor extends Entity
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ?self
|
||||
*/
|
||||
public static function getByNickname(string $nickname, int $type = self::PERSON): ?self
|
||||
{
|
||||
try {
|
||||
return DB::findOneBy(self::class, ['nickname' => $nickname, 'type' => $type]);
|
||||
} catch (NotFoundException) {
|
||||
return null;
|
||||
} catch (DuplicateFoundException $e) {
|
||||
throw new BugFoundException("Multiple actors with the same nickname '{$nickname}' found", previous: $e);
|
||||
}
|
||||
}
|
||||
|
||||
public function getAvatarUrl(string $size = 'medium')
|
||||
{
|
||||
return Avatar::getUrl($this->getId(), $size);
|
||||
@ -560,7 +546,6 @@ class Actor extends Entity
|
||||
}
|
||||
},
|
||||
);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ use App\Entity\Actor;
|
||||
use App\Entity\Note;
|
||||
use App\Util\Exception\NicknameException;
|
||||
use App\Util\Exception\ServerException;
|
||||
use Component\Group\Entity\LocalGroup;
|
||||
use Exception;
|
||||
use Functional as F;
|
||||
use InvalidArgumentException;
|
||||
@ -356,7 +357,7 @@ abstract class Formatting
|
||||
$group_matches = self::findMentionsRaw($text, '!');
|
||||
foreach ($group_matches as $group_match) {
|
||||
$nickname = Nickname::normalize($group_match[0], check_already_used: false, check_is_allowed: false);
|
||||
$group = Actor::getByNickname($nickname, Actor::GROUP);
|
||||
$group = LocalGroup::getActorByNickname($nickname, Actor::GROUP);
|
||||
|
||||
$mentions[] = [
|
||||
'mentioned' => [$group],
|
||||
|
Loading…
Reference in New Issue
Block a user