Skip to content

Commit

Permalink
Merge pull request #19890 from nextcloud/enh/comments-reference-id
Browse files Browse the repository at this point in the history
Add optional comments reference_id
  • Loading branch information
nickvergessen authored Apr 2, 2020
2 parents c1368b8 + 1f5ba56 commit bc6a5ef
Show file tree
Hide file tree
Showing 17 changed files with 344 additions and 31 deletions.
21 changes: 13 additions & 8 deletions apps/dav/tests/unit/Comments/CommentsNodeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public function testDelete() {
$this->node->delete();
}


public function testDeleteForbidden() {
$this->expectException(\Sabre\DAV\Exception\Forbidden::class);

Expand Down Expand Up @@ -150,7 +150,7 @@ public function testGetName() {
$this->assertSame($this->node->getName(), $id);
}


public function testSetName() {
$this->expectException(\Sabre\DAV\Exception\MethodNotAllowed::class);

Expand Down Expand Up @@ -195,7 +195,7 @@ public function testUpdateComment() {
$this->assertTrue($this->node->updateComment($msg));
}


public function testUpdateCommentLogException() {
$this->expectException(\Exception::class);
$this->expectExceptionMessage('buh!');
Expand Down Expand Up @@ -236,7 +236,7 @@ public function testUpdateCommentLogException() {
$this->node->updateComment($msg);
}


public function testUpdateCommentMessageTooLongException() {
$this->expectException(\Sabre\DAV\Exception\BadRequest::class);
$this->expectExceptionMessage('Message exceeds allowed character limit of');
Expand Down Expand Up @@ -275,7 +275,7 @@ public function testUpdateCommentMessageTooLongException() {
$this->node->updateComment('foo');
}


public function testUpdateForbiddenByUser() {
$this->expectException(\Sabre\DAV\Exception\Forbidden::class);

Expand Down Expand Up @@ -310,7 +310,7 @@ public function testUpdateForbiddenByUser() {
$this->node->updateComment($msg);
}


public function testUpdateForbiddenByType() {
$this->expectException(\Sabre\DAV\Exception\Forbidden::class);

Expand Down Expand Up @@ -340,7 +340,7 @@ public function testUpdateForbiddenByType() {
$this->node->updateComment($msg);
}


public function testUpdateForbiddenByNotLoggedIn() {
$this->expectException(\Sabre\DAV\Exception\Forbidden::class);

Expand Down Expand Up @@ -403,6 +403,7 @@ public function testGetProperties() {
$ns . 'latestChildDateTime' => new \DateTime('2016-01-12 18:48:00'),
$ns . 'objectType' => 'files',
$ns . 'objectId' => '1848',
$ns . 'referenceId' => 'ref',
$ns . 'isUnread' => null,
];

Expand Down Expand Up @@ -469,6 +470,10 @@ public function testGetProperties() {
->method('getObjectId')
->willReturn($expected[$ns . 'objectId']);

$this->comment->expects($this->once())
->method('getReferenceId')
->willReturn($expected[$ns . 'referenceId']);

$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
Expand All @@ -484,7 +489,7 @@ public function testGetProperties() {
$properties = $this->node->getProperties(null);

foreach($properties as $name => $value) {
$this->assertTrue(array_key_exists($name, $expected));
$this->assertArrayHasKey($name, $expected);
$this->assertSame($expected[$name], $value);
unset($expected[$name]);
}
Expand Down
11 changes: 11 additions & 0 deletions apps/settings/lib/Controller/CheckSetupController.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
use OC;
use OC\AppFramework\Http;
use OC\DB\Connection;
use OC\DB\MissingColumnInformation;
use OC\DB\MissingIndexInformation;
use OC\DB\SchemaWrapper;
use OC\IntegrityCheck\Checker;
Expand Down Expand Up @@ -445,6 +446,15 @@ protected function hasMissingIndexes(): array {
return $indexInfo->getListOfMissingIndexes();
}

protected function hasMissingColumns(): array {
$indexInfo = new MissingColumnInformation();
// Dispatch event so apps can also hint for pending index updates if needed
$event = new GenericEvent($indexInfo);
$this->dispatcher->dispatch(IDBConnection::CHECK_MISSING_COLUMNS_EVENT, $event);

return $indexInfo->getListOfMissingColumns();
}

protected function isSqliteUsed() {
return strpos($this->config->getSystemValue('dbtype'), 'sqlite') !== false;
}
Expand Down Expand Up @@ -693,6 +703,7 @@ public function check() {
'isSettimelimitAvailable' => $this->isSettimelimitAvailable(),
'hasFreeTypeSupport' => $this->hasFreeTypeSupport(),
'missingIndexes' => $this->hasMissingIndexes(),
'missingColumns' => $this->hasMissingColumns(),
'isSqliteUsed' => $this->isSqliteUsed(),
'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'),
'isPHPMailerUsed' => $this->isPHPMailerUsed(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,7 @@ public function testCheck() {
'isSqliteUsed' => false,
'databaseConversionDocumentation' => 'http://docs.example.org/server/go.php?to=admin-db-conversion',
'missingIndexes' => [],
'missingColumns' => [],
'isPHPMailerUsed' => false,
'mailSettingsDocumentation' => 'https://server/index.php/settings/admin',
'isMemoryLimitSufficient' => true,
Expand Down
18 changes: 18 additions & 0 deletions core/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
use OC\Authentication\Listeners\UserDeletedStoreCleanupListener;
use OC\Authentication\Notifications\Notifier as AuthenticationNotifier;
use OC\Core\Notification\RemoveLinkSharesNotifier;
use OC\DB\MissingColumnInformation;
use OC\DB\MissingIndexInformation;
use OC\DB\SchemaWrapper;
use OCP\AppFramework\App;
Expand Down Expand Up @@ -167,6 +168,23 @@ function (GenericEvent $event) use ($container) {
}
);

$eventDispatcher->addListener(IDBConnection::CHECK_MISSING_COLUMNS_EVENT,
function (GenericEvent $event) use ($container) {
/** @var MissingColumnInformation $subject */
$subject = $event->getSubject();

$schema = new SchemaWrapper($container->query(IDBConnection::class));

if ($schema->hasTable('comments')) {
$table = $schema->getTable('comments');

if (!$table->hasColumn('reference_id')) {
$subject->addHintForMissingColumn($table->getName(), 'reference_id');
}
}
}
);

$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeActivityListener::class);
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeNotificationsListener::class);
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeEmailListener::class);
Expand Down
105 changes: 105 additions & 0 deletions core/Command/Db/AddMissingColumns.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com>
*
* @author Joas Schilling <coding@schilljs.com>
*
* @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 OC\Core\Command\Db;

use OC\DB\SchemaWrapper;
use OCP\IDBConnection;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;

/**
* Class AddMissingColumns
*
* if you added a new lazy column to the database, this is the right place to add
* your update routine for existing instances
*
* @package OC\Core\Command\Db
*/
class AddMissingColumns extends Command {

/** @var IDBConnection */
private $connection;

/** @var EventDispatcherInterface */
private $dispatcher;

public function __construct(IDBConnection $connection, EventDispatcherInterface $dispatcher) {
parent::__construct();

$this->connection = $connection;
$this->dispatcher = $dispatcher;
}

protected function configure() {
$this
->setName('db:add-missing-columns')
->setDescription('Add missing optional columns to the database tables');
}

protected function execute(InputInterface $input, OutputInterface $output) {
$this->addCoreColumns($output);

// Dispatch event so apps can also update columns if needed
$event = new GenericEvent($output);
$this->dispatcher->dispatch(IDBConnection::ADD_MISSING_COLUMNS_EVENT, $event);
}

/**
* add missing indices to the share table
*
* @param OutputInterface $output
* @throws \Doctrine\DBAL\Schema\SchemaException
*/
private function addCoreColumns(OutputInterface $output) {

$output->writeln('<info>Check columns of the comments table.</info>');

$schema = new SchemaWrapper($this->connection);
$updated = false;

if ($schema->hasTable('comments')) {
$table = $schema->getTable('comments');
if (!$table->hasColumn('reference_id')) {
$output->writeln('<info>Adding additional reference_id column to the comments table, this can take some time...</info>');
$table->addColumn('reference_id', 'string', [
'notnull' => false,
'length' => 64,
]);
$this->connection->migrateToSchema($schema->getWrappedSchema());
$updated = true;
$output->writeln('<info>Comments table updated successfully.</info>');
}
}

if (!$updated) {
$output->writeln('<info>Done.</info>');
}
}
}
2 changes: 1 addition & 1 deletion core/Command/Db/AddMissingIndices.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
* Class AddMissingIndices
*
* if you added any new indices to the database, this is the right place to add
* it your update routine for existing instances
* your update routine for existing instances
*
* @package OC\Core\Command\Db
*/
Expand Down
4 changes: 4 additions & 0 deletions core/Migrations/Version13000Date20170718121200.php
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,10 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op
'length' => 64,
'default' => '',
]);
$table->addColumn('reference_id', 'string', [
'notnull' => false,
'length' => 64,
]);
$table->setPrimaryKey(['id']);
$table->addIndex(['parent_id'], 'comments_parent_id_index');
$table->addIndex(['topmost_parent_id'], 'comments_topmost_parent_id_idx');
Expand Down
15 changes: 15 additions & 0 deletions core/js/setupchecks.js
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,21 @@
type: OC.SetupChecks.MESSAGE_TYPE_INFO
})
}
if (data.missingColumns.length > 0) {
var listOfMissingColumns = "";
data.missingColumns.forEach(function(element){
listOfMissingColumns += "<li>";
listOfMissingColumns += t('core', 'Missing optional column "{columnName}" in table "{tableName}".', element);
listOfMissingColumns += "</li>";
});
messages.push({
msg: t(
'core',
'The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running "occ db:add-missing-columns" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability.'
) + "<ul>" + listOfMissingColumns + "</ul>",
type: OC.SetupChecks.MESSAGE_TYPE_INFO
})
}
if (data.recommendedPHPModules.length > 0) {
var listOfRecommendedPHPModules = "";
data.recommendedPHPModules.forEach(function(element){
Expand Down
Loading

0 comments on commit bc6a5ef

Please sign in to comment.