Merge pull request #54084 from nextcloud/feat/dav/absence-get-set-commands

feat(dav): add occ commands to get and set absences
pull/54085/head
Christoph Wurst 2025-07-31 12:43:36 +07:00 committed by GitHub
commit 6033c25630
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 163 additions and 0 deletions

@ -65,6 +65,7 @@
<command>OCA\DAV\Command\DeleteSubscription</command>
<command>OCA\DAV\Command\ExportCalendar</command>
<command>OCA\DAV\Command\FixCalendarSyncCommand</command>
<command>OCA\DAV\Command\GetAbsenceCommand</command>
<command>OCA\DAV\Command\ListAddressbooks</command>
<command>OCA\DAV\Command\ListCalendarShares</command>
<command>OCA\DAV\Command\ListCalendars</command>
@ -73,6 +74,7 @@
<command>OCA\DAV\Command\RemoveInvalidShares</command>
<command>OCA\DAV\Command\RetentionCleanupCommand</command>
<command>OCA\DAV\Command\SendEventReminders</command>
<command>OCA\DAV\Command\SetAbsenceCommand</command>
<command>OCA\DAV\Command\SyncBirthdayCalendar</command>
<command>OCA\DAV\Command\SyncSystemAddressBook</command>
</commands>

@ -165,6 +165,7 @@ return array(
'OCA\\DAV\\Command\\DeleteSubscription' => $baseDir . '/../lib/Command/DeleteSubscription.php',
'OCA\\DAV\\Command\\ExportCalendar' => $baseDir . '/../lib/Command/ExportCalendar.php',
'OCA\\DAV\\Command\\FixCalendarSyncCommand' => $baseDir . '/../lib/Command/FixCalendarSyncCommand.php',
'OCA\\DAV\\Command\\GetAbsenceCommand' => $baseDir . '/../lib/Command/GetAbsenceCommand.php',
'OCA\\DAV\\Command\\ListAddressbooks' => $baseDir . '/../lib/Command/ListAddressbooks.php',
'OCA\\DAV\\Command\\ListCalendarShares' => $baseDir . '/../lib/Command/ListCalendarShares.php',
'OCA\\DAV\\Command\\ListCalendars' => $baseDir . '/../lib/Command/ListCalendars.php',
@ -173,6 +174,7 @@ return array(
'OCA\\DAV\\Command\\RemoveInvalidShares' => $baseDir . '/../lib/Command/RemoveInvalidShares.php',
'OCA\\DAV\\Command\\RetentionCleanupCommand' => $baseDir . '/../lib/Command/RetentionCleanupCommand.php',
'OCA\\DAV\\Command\\SendEventReminders' => $baseDir . '/../lib/Command/SendEventReminders.php',
'OCA\\DAV\\Command\\SetAbsenceCommand' => $baseDir . '/../lib/Command/SetAbsenceCommand.php',
'OCA\\DAV\\Command\\SyncBirthdayCalendar' => $baseDir . '/../lib/Command/SyncBirthdayCalendar.php',
'OCA\\DAV\\Command\\SyncSystemAddressBook' => $baseDir . '/../lib/Command/SyncSystemAddressBook.php',
'OCA\\DAV\\Comments\\CommentNode' => $baseDir . '/../lib/Comments/CommentNode.php',

@ -180,6 +180,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Command\\DeleteSubscription' => __DIR__ . '/..' . '/../lib/Command/DeleteSubscription.php',
'OCA\\DAV\\Command\\ExportCalendar' => __DIR__ . '/..' . '/../lib/Command/ExportCalendar.php',
'OCA\\DAV\\Command\\FixCalendarSyncCommand' => __DIR__ . '/..' . '/../lib/Command/FixCalendarSyncCommand.php',
'OCA\\DAV\\Command\\GetAbsenceCommand' => __DIR__ . '/..' . '/../lib/Command/GetAbsenceCommand.php',
'OCA\\DAV\\Command\\ListAddressbooks' => __DIR__ . '/..' . '/../lib/Command/ListAddressbooks.php',
'OCA\\DAV\\Command\\ListCalendarShares' => __DIR__ . '/..' . '/../lib/Command/ListCalendarShares.php',
'OCA\\DAV\\Command\\ListCalendars' => __DIR__ . '/..' . '/../lib/Command/ListCalendars.php',
@ -188,6 +189,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Command\\RemoveInvalidShares' => __DIR__ . '/..' . '/../lib/Command/RemoveInvalidShares.php',
'OCA\\DAV\\Command\\RetentionCleanupCommand' => __DIR__ . '/..' . '/../lib/Command/RetentionCleanupCommand.php',
'OCA\\DAV\\Command\\SendEventReminders' => __DIR__ . '/..' . '/../lib/Command/SendEventReminders.php',
'OCA\\DAV\\Command\\SetAbsenceCommand' => __DIR__ . '/..' . '/../lib/Command/SetAbsenceCommand.php',
'OCA\\DAV\\Command\\SyncBirthdayCalendar' => __DIR__ . '/..' . '/../lib/Command/SyncBirthdayCalendar.php',
'OCA\\DAV\\Command\\SyncSystemAddressBook' => __DIR__ . '/..' . '/../lib/Command/SyncSystemAddressBook.php',
'OCA\\DAV\\Comments\\CommentNode' => __DIR__ . '/..' . '/../lib/Comments/CommentNode.php',

@ -0,0 +1,62 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\DAV\Command;
use OCA\DAV\Service\AbsenceService;
use OCP\IUserManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class GetAbsenceCommand extends Command {
public function __construct(
private IUserManager $userManager,
private AbsenceService $absenceService,
) {
parent::__construct();
}
protected function configure(): void {
$this->setName('dav:absence:get');
$this->addArgument(
'user-id',
InputArgument::REQUIRED,
'User ID of the affected account'
);
}
public function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('user-id');
$user = $this->userManager->get($userId);
if ($user === null) {
$output->writeln('<error>User not found</error>');
return 1;
}
$absence = $this->absenceService->getAbsence($userId);
if ($absence === null) {
$output->writeln('<info>No absence set</info>');
return 0;
}
$output->writeln('<info>Start day:</info> ' . $absence->getFirstDay());
$output->writeln('<info>End day:</info> ' . $absence->getLastDay());
$output->writeln('<info>Short message:</info> ' . $absence->getStatus());
$output->writeln('<info>Message:</info> ' . $absence->getMessage());
$output->writeln('<info>Replacement user:</info> ' . ($absence->getReplacementUserId() ?? 'none'));
$output->writeln('<info>Replacement display name:</info> ' . ($absence->getReplacementUserDisplayName() ?? 'none'));
return 0;
}
}

@ -0,0 +1,95 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\DAV\Command;
use OCA\DAV\Service\AbsenceService;
use OCP\IUserManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class SetAbsenceCommand extends Command {
public function __construct(
private IUserManager $userManager,
private AbsenceService $absenceService,
) {
parent::__construct();
}
protected function configure(): void {
$this->setName('dav:absence:set');
$this->addArgument(
'user-id',
InputArgument::REQUIRED,
'User ID of the affected account'
);
$this->addArgument(
'first-day',
InputArgument::REQUIRED,
'Inclusive start day formatted as YYYY-MM-DD'
);
$this->addArgument(
'last-day',
InputArgument::REQUIRED,
'Inclusive end day formatted as YYYY-MM-DD'
);
$this->addArgument(
'short-message',
InputArgument::REQUIRED,
'Short message'
);
$this->addArgument(
'message',
InputArgument::REQUIRED,
'Message'
);
$this->addArgument(
'replacement-user-id',
InputArgument::OPTIONAL,
'Replacement user id'
);
}
public function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('user-id');
$user = $this->userManager->get($userId);
if ($user === null) {
$output->writeln('<error>User not found</error>');
return 1;
}
$replacementUserId = $input->getArgument('replacement-user-id');
if ($replacementUserId === null) {
$replacementUser = null;
} else {
$replacementUser = $this->userManager->get($replacementUserId);
if ($replacementUser === null) {
$output->writeln('<error>Replacement user not found</error>');
return 2;
}
}
$this->absenceService->createOrUpdateAbsence(
$user,
$input->getArgument('first-day'),
$input->getArgument('last-day'),
$input->getArgument('short-message'),
$input->getArgument('message'),
$replacementUser?->getUID(),
$replacementUser?->getDisplayName(),
);
return 0;
}
}