Merge pull request #19785 from nextcloud/backport/19392/stable17

[stable17] Introduce a default refresh rate app setting for calendar subscriptions
This commit is contained in:
Roeland Jago Douma 2020-03-05 15:36:58 +01:00 committed by GitHub
commit 50ea452682
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 4 deletions

View file

@ -29,6 +29,7 @@ use DateInterval;
use OC\BackgroundJob\Job; use OC\BackgroundJob\Job;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService; use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCP\AppFramework\Utility\ITimeFactory; use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IConfig;
use OCP\ILogger; use OCP\ILogger;
use Sabre\VObject\DateTimeParser; use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException; use Sabre\VObject\InvalidDataException;
@ -40,6 +41,11 @@ class RefreshWebcalJob extends Job {
*/ */
private $refreshWebcalService; private $refreshWebcalService;
/**
* @var IConfig
*/
private $config;
/** @var ILogger */ /** @var ILogger */
private $logger; private $logger;
@ -50,11 +56,13 @@ class RefreshWebcalJob extends Job {
* RefreshWebcalJob constructor. * RefreshWebcalJob constructor.
* *
* @param RefreshWebcalService $refreshWebcalService * @param RefreshWebcalService $refreshWebcalService
* @param IConfig $config
* @param ILogger $logger * @param ILogger $logger
* @param ITimeFactory $timeFactory * @param ITimeFactory $timeFactory
*/ */
public function __construct(RefreshWebcalService $refreshWebcalService, ILogger $logger, ITimeFactory $timeFactory) { public function __construct(RefreshWebcalService $refreshWebcalService, IConfig $config, ILogger $logger, ITimeFactory $timeFactory) {
$this->refreshWebcalService = $refreshWebcalService; $this->refreshWebcalService = $refreshWebcalService;
$this->config = $config;
$this->logger = $logger; $this->logger = $logger;
$this->timeFactory = $timeFactory; $this->timeFactory = $timeFactory;
} }
@ -73,12 +81,14 @@ class RefreshWebcalJob extends Job {
$this->fixSubscriptionRowTyping($subscription); $this->fixSubscriptionRowTyping($subscription);
// if no refresh rate was configured, just refresh once a week // if no refresh rate was configured, just refresh once a week
$defaultRefreshRate = $this->config->getAppValue('dav', 'calendarSubscriptionRefreshRate', 'P1W');
$refreshRate = $subscription[RefreshWebcalService::REFRESH_RATE] ?? $defaultRefreshRate;
$subscriptionId = $subscription['id']; $subscriptionId = $subscription['id'];
$refreshrate = $subscription[RefreshWebcalService::REFRESH_RATE] ?? 'P1W';
try { try {
/** @var DateInterval $dateInterval */ /** @var DateInterval $dateInterval */
$dateInterval = DateTimeParser::parseDuration($refreshrate); $dateInterval = DateTimeParser::parseDuration($refreshRate);
} catch(InvalidDataException $ex) { } catch(InvalidDataException $ex) {
$this->logger->logException($ex); $this->logger->logException($ex);
$this->logger->warning("Subscription $subscriptionId could not be refreshed, refreshrate in database is invalid"); $this->logger->warning("Subscription $subscriptionId could not be refreshed, refreshrate in database is invalid");

View file

@ -28,6 +28,7 @@ use OCA\DAV\BackgroundJob\RefreshWebcalJob;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService; use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCP\AppFramework\Utility\ITimeFactory; use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList; use OCP\BackgroundJob\IJobList;
use OCP\IConfig;
use OCP\ILogger; use OCP\ILogger;
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase; use Test\TestCase;
@ -39,6 +40,9 @@ class RefreshWebcalJobTest extends TestCase {
/** @var RefreshWebcalService | MockObject */ /** @var RefreshWebcalService | MockObject */
private $refreshWebcalService; private $refreshWebcalService;
/** @var IConfig | MockObject */
private $config;
/** @var ILogger | MockObject */ /** @var ILogger | MockObject */
private $logger; private $logger;
@ -52,6 +56,7 @@ class RefreshWebcalJobTest extends TestCase {
parent::setUp(); parent::setUp();
$this->refreshWebcalService = $this->createMock(RefreshWebcalService::class); $this->refreshWebcalService = $this->createMock(RefreshWebcalService::class);
$this->config = $this->createMock(IConfig::class);
$this->logger = $this->createMock(ILogger::class); $this->logger = $this->createMock(ILogger::class);
$this->timeFactory = $this->createMock(ITimeFactory::class); $this->timeFactory = $this->createMock(ITimeFactory::class);
@ -67,7 +72,7 @@ class RefreshWebcalJobTest extends TestCase {
* @dataProvider runDataProvider * @dataProvider runDataProvider
*/ */
public function testRun(int $lastRun, int $time, bool $process) { public function testRun(int $lastRun, int $time, bool $process) {
$backgroundJob = new RefreshWebcalJob($this->refreshWebcalService, $this->logger, $this->timeFactory); $backgroundJob = new RefreshWebcalJob($this->refreshWebcalService, $this->config, $this->logger, $this->timeFactory);
$backgroundJob->setArgument([ $backgroundJob->setArgument([
'principaluri' => 'principals/users/testuser', 'principaluri' => 'principals/users/testuser',
@ -88,6 +93,11 @@ class RefreshWebcalJobTest extends TestCase {
'source' => 'webcal://foo.bar/bla' 'source' => 'webcal://foo.bar/bla'
]); ]);
$this->config->expects($this->once())
->method('getAppValue')
->with('dav', 'calendarSubscriptionRefreshRate', 'P1W')
->will($this->returnValue('P1W'));
$this->timeFactory->expects($this->once()) $this->timeFactory->expects($this->once())
->method('getTime') ->method('getTime')
->willReturn($time); ->willReturn($time);