Introduces a new command that will create notifications for users if they have shares that will expire the next day. Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>pull/17727/head
parent
4326b03b13
commit
1ac57e76fa
@ -0,0 +1,98 @@ |
||||
<?php |
||||
declare(strict_types=1); |
||||
/** |
||||
* @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @author Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Files_Sharing\Command; |
||||
|
||||
use OCP\AppFramework\Utility\ITimeFactory; |
||||
use OCP\IDBConnection; |
||||
use OCP\Notification\IManager as NotificationManager; |
||||
use OCP\Share\IManager as ShareManager; |
||||
use OCP\Share\IShare; |
||||
use Symfony\Component\Console\Command\Command; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
|
||||
class ExiprationNotification extends Command { |
||||
/** @var NotificationManager */ |
||||
private $notificationManager; |
||||
/** @var IDBConnection */ |
||||
private $connection; |
||||
/** @var ITimeFactory */ |
||||
private $time; |
||||
/** @var ShareManager */ |
||||
private $shareManager; |
||||
|
||||
public function __construct(ITimeFactory $time, |
||||
NotificationManager $notificationManager, |
||||
IDBConnection $connection, |
||||
ShareManager $shareManager) { |
||||
parent::__construct(); |
||||
|
||||
$this->notificationManager = $notificationManager; |
||||
$this->connection = $connection; |
||||
$this->time = $time; |
||||
$this->shareManager = $shareManager; |
||||
} |
||||
|
||||
protected function configure() { |
||||
$this |
||||
->setName('sharing:expiration-notification') |
||||
->setDescription('Notify share initiators when a share will expire the next day.'); |
||||
} |
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output) { |
||||
//Current time |
||||
$minTime = $this->time->getDateTime(); |
||||
$minTime->add(new \DateInterval('P1D')); |
||||
$minTime->setTime(0,0,0); |
||||
|
||||
$maxTime = clone $minTime; |
||||
$maxTime->setTime(23, 59, 59); |
||||
|
||||
$shares = $this->shareManager->getAllShares(); |
||||
|
||||
$now = $this->time->getDateTime(); |
||||
|
||||
/** @var IShare $share */ |
||||
foreach ($shares as $share) { |
||||
if ($share->getExpirationDate() === null |
||||
|| $share->getExpirationDate()->getTimestamp() < $minTime->getTimestamp() |
||||
|| $share->getExpirationDate()->getTimestamp() > $maxTime->getTimestamp()) { |
||||
continue; |
||||
} |
||||
|
||||
$notification = $this->notificationManager->createNotification(); |
||||
$notification->setApp('files_sharing') |
||||
->setDateTime($now) |
||||
->setObject('share', $share->getFullId()) |
||||
->setSubject('expiresTomorrow'); |
||||
|
||||
// Only send to initiator for now |
||||
$notification->setUser($share->getSharedBy()); |
||||
$this->notificationManager->notify($notification); |
||||
} |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,98 @@ |
||||
<?php |
||||
declare(strict_types=1); |
||||
/** |
||||
* @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @author Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Files_Sharing\Notification; |
||||
|
||||
use OCP\Files\IRootFolder; |
||||
use OCP\L10N\IFactory; |
||||
use OCP\Notification\AlreadyProcessedException; |
||||
use OCP\Notification\INotification; |
||||
use OCP\Notification\INotifier; |
||||
use OCP\Share\Exceptions\ShareNotFound; |
||||
use OCP\Share\IManager; |
||||
|
||||
class Notifier implements INotifier { |
||||
|
||||
/** @var IFactory */ |
||||
protected $l10nFactory; |
||||
|
||||
/** @var IManager */ |
||||
private $shareManager; |
||||
|
||||
/** @var IRootFolder */ |
||||
private $rootFolder; |
||||
|
||||
public function __construct(IFactory $l10nFactory, |
||||
IManager $shareManager, |
||||
IRootFolder $rootFolder) { |
||||
$this->l10nFactory = $l10nFactory; |
||||
$this->shareManager = $shareManager; |
||||
$this->rootFolder = $rootFolder; |
||||
} |
||||
|
||||
public function getID(): string { |
||||
return 'files_sharing'; |
||||
} |
||||
|
||||
public function getName(): string { |
||||
return $this->l10nFactory->get('files_sharing')->t('Files sharing'); |
||||
} |
||||
|
||||
public function prepare(INotification $notification, string $languageCode): INotification { |
||||
if ($notification->getApp() !== 'files_sharing' || |
||||
$notification->getSubject() !== 'expiresTomorrow') { |
||||
throw new \InvalidArgumentException('Unhandled app or subject'); |
||||
} |
||||
|
||||
$l = $this->l10nFactory->get('files_sharing', $languageCode); |
||||
$attemptId = $notification->getObjectId(); |
||||
|
||||
try { |
||||
$share = $this->shareManager->getShareById($attemptId); |
||||
} catch (ShareNotFound $e) { |
||||
throw new AlreadyProcessedException(); |
||||
} |
||||
|
||||
$node = $share->getNode(); |
||||
$userFolder = $this->rootFolder->getUserFolder($notification->getUser()); |
||||
$path = $userFolder->getRelativePath($node->getPath()); |
||||
|
||||
$notification |
||||
->setParsedSubject($l->t('Share will expire tomorrow')) |
||||
->setParsedMessage($l->t('One or more of your shares will expire tomorrow')) |
||||
->setRichMessage( |
||||
$l->t('Your share of {node} will expire tomorrow'), |
||||
[ |
||||
'node' => [ |
||||
'type' => 'file', |
||||
'id' => $node->getId(), |
||||
'name' => $node->getName(), |
||||
'path' => $path, |
||||
], |
||||
] |
||||
); |
||||
|
||||
return $notification; |
||||
} |
||||
} |
Loading…
Reference in new issue