Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
broadcast event on group name change
Signed-off-by: Maxence Lange <[email protected]>
  • Loading branch information
ArtificialOwl authored and provokateurin committed Mar 24, 2025
commit 98d80bb37a8bceaffa3f8f0cde5d1bae1e9d05aa
9 changes: 9 additions & 0 deletions lib/FederatedItems/CircleEdit.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,11 @@ public function verify(FederatedEvent $event): void {
$event->getData()->s('name', $new->getName());
}

if ($data->hasKey('displayName')) {
$new->setDisplayName($data->g('displayName'));
$event->getData()->s('displayName', $new->getDisplayName());
}

if ($data->hasKey('description')) {
$new->setDescription($data->g('description'));
$event->getData()->s('description', $new->getDescription());
Expand All @@ -134,6 +139,10 @@ public function manage(FederatedEvent $event): void {
$circle->setName($data->g('name'));
}

if ($data->hasKey('displayName')) {
$circle->setDisplayName($data->g('displayName'));
}

$this->circleService->confirmName($circle);

if ($data->hasKey('description')) {
Expand Down
43 changes: 28 additions & 15 deletions lib/Listeners/GroupChanged.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,23 @@

namespace OCA\Circles\Listeners;

use OCA\Circles\AppInfo\Application;
use OCA\Circles\Db\CircleRequest;
use OCA\Circles\Exceptions\CircleNotFoundException;
use OCA\Circles\Model\Circle;
use OCA\Circles\Model\Member;
use OCA\Circles\Service\CircleService;
use OCA\Circles\Service\FederatedUserService;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Group\Events\GroupChangedEvent;
use OCP\IUserSession;
use Psr\Log\LoggerInterface;

/** @template-implements IEventListener<GroupChangedEvent|Event> */
class GroupChanged implements IEventListener {
public function __construct(
private IUserSession $userSession,
private FederatedUserService $federatedUserService,
private CircleService $circleService,
private LoggerInterface $logger,
private CircleRequest $circleRequest,
) {
}

Expand All @@ -37,19 +38,31 @@ public function handle(Event $event): void {
return;
}

$user = $this->userSession->getUser();
$this->federatedUserService->setLocalCurrentUser($user);

$groupId = $event->getGroup()->getGID();

$circle = new Circle();
$circle->setName('group:' . $groupId)
->setConfig(Circle::CFG_SYSTEM | Circle::CFG_NO_OWNER | Circle::CFG_HIDDEN)
->setSource(Member::TYPE_GROUP);

$owner = $this->federatedUserService->getAppInitiator(
Application::APP_ID,
Member::APP_CIRCLES,
Application::APP_NAME
);
$member = new Member();
$member->importFromIFederatedUser($owner);
$member->setLevel(Member::LEVEL_OWNER)
->setStatus(Member::STATUS_MEMBER);
$circle->setOwner($member);

try {
$this->circleService->updateName("group:$groupId", $event->getValue());
} catch (CircleNotFoundException $e) {
// Silently ignore (there is no circle for the group yet)
} catch (\Exception $e) {
$this->logger->warning("Failed to update display name of circle of group $groupId: " . $e->getMessage(), [
'exception' => $e,
'groupId' => $groupId,
]);
$this->federatedUserService->setCurrentUser($owner);
$circle = $this->circleRequest->searchCircle($circle);
} catch (CircleNotFoundException) {
return;
}

$this->circleService->updateDisplayName($circle->getSingleId(), $event->getValue());
}
}
11 changes: 11 additions & 0 deletions lib/Service/CircleService.php
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,17 @@ public function updateName(string $circleId, string $name): array {
return $event->getOutcome();
}

public function updateDisplayName(string $circleId, string $displayName): array {
$circle = $this->getCircle($circleId);

$event = new FederatedEvent(CircleEdit::class);
$event->setCircle($circle);
$event->setParams(new SimpleDataStore(['displayName' => $displayName]));
$this->federatedEventService->newEvent($event);

return $event->getOutcome();
}

/**
* @param string $circleId
* @param string $description
Expand Down
Loading