diff --git a/.gitignore b/.gitignore index de380d992bb..ed7da3d2ab2 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ !/apps/sharebymail !/apps/encryption !/apps/files_external +!/apps/files_reminders !/apps/files_sharing !/apps/files_trashbin !/apps/files_versions diff --git a/apps/files_reminders/lib/Db/Reminder.php b/apps/files_reminders/lib/Db/Reminder.php new file mode 100644 index 00000000000..98e2cc5838f --- /dev/null +++ b/apps/files_reminders/lib/Db/Reminder.php @@ -0,0 +1,56 @@ + + * + * @author Christopher Ng + * + * @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 . + * + */ + +namespace OCA\FilesReminders\Db; + +use OCP\AppFramework\Db\Entity; + +/** + * @method void setUserId(string $userId) + * @method string getUserId() + * + * @method void setFileId(int $fileId) + * @method int getFileId() + * + * @method void setRemindAt(int $remindAt) + * @method int getRemindAt() + * + * @method void setNotified(bool $notified) + * @method bool getNotified() + */ +class Reminder extends Entity { + protected string $userId; + protected int $fileId; + protected int $remindAt; + protected bool $notified = false; + + public function __construct() { + $this->addType('userId', 'string'); + $this->addType('fileId', 'integer'); + $this->addType('remindAt', 'integer'); + $this->addType('notified', 'boolean'); + } +} diff --git a/apps/files_reminders/lib/Db/ReminderMapper.php b/apps/files_reminders/lib/Db/ReminderMapper.php new file mode 100644 index 00000000000..974416245fa --- /dev/null +++ b/apps/files_reminders/lib/Db/ReminderMapper.php @@ -0,0 +1,67 @@ + + * + * @author Christopher Ng + * + * @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 . + * + */ + +namespace OCA\FilesReminders\Db; + +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; + +/** + * @template-extends QBMapper + */ +class ReminderMapper extends QBMapper { + public const TABLE_NAME = 'files_reminders'; + + public function __construct(IDBConnection $db) { + parent::__construct( + $db, + static::TABLE_NAME, + Reminder::class, + ); + } + + public function markNotified(Reminder $reminder): Reminder { + $reminderUpdate = new Reminder(); + $reminderUpdate->setId($reminder->getId()); + $reminderUpdate->setNotified(true); + return parent::update($reminderUpdate); + } + + /** + * @return Reminder[] + */ + public function findToRemind() { + $qb = $this->db->getQueryBuilder(); + + $qb->select('user_id', 'file_id', 'remind_at') + ->from($this->getTableName()) + ->where($qb->expr()->lt('remind_at', $qb->createFunction('NOW()'))) + ->andWhere($qb->expr()->eq('notified', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))); + + return $this->findEntities($qb); + } +} diff --git a/apps/files_reminders/lib/Migration/Version10000Date20230725162149.php b/apps/files_reminders/lib/Migration/Version10000Date20230725162149.php new file mode 100644 index 00000000000..ab0afd5aec6 --- /dev/null +++ b/apps/files_reminders/lib/Migration/Version10000Date20230725162149.php @@ -0,0 +1,71 @@ + + * + * @author Christopher Ng + * + * @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 . + * + */ + +namespace OCA\FilesReminders\Migration; + +use Closure; +use OCA\FilesReminders\Db\ReminderMapper; +use OCP\DB\ISchemaWrapper; +use OCP\DB\Types; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + +class Version10000Date20230725162149 extends SimpleMigrationStep { + /** + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + $table = $schema->createTable(ReminderMapper::TABLE_NAME); + $table->addColumn('id', Types::BIGINT, [ + 'autoincrement' => true, + 'notnull' => true, + 'length' => 20, + 'unsigned' => true, + ]); + $table->addColumn('user_id', Types::STRING, [ + 'notnull' => true, + 'length' => 64, + ]); + $table->addColumn('file_id', Types::BIGINT, [ + 'notnull' => true, + 'length' => 20, + ]); + $table->addColumn('remind_at', Types::BIGINT, [ + 'notnull' => true, + ]); + $table->addColumn('notified', Types::BOOLEAN, [ + 'notnull' => false, + 'default' => false, + ]); + $table->setPrimaryKey(['id']); + $table->addUniqueIndex(['user_id', 'file_id', 'remind_at'], 'reminders_uniq_idx'); + + return $schema; + } +}