]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat(files_reminders): add api controller
authorChristopher Ng <chrng8@gmail.com>
Mon, 31 Jul 2023 19:10:50 +0000 (12:10 -0700)
committerChristopher Ng <chrng8@gmail.com>
Thu, 3 Aug 2023 22:30:11 +0000 (15:30 -0700)
Signed-off-by: Christopher Ng <chrng8@gmail.com>
apps/files_reminders/appinfo/routes.php [new file with mode: 0644]
apps/files_reminders/lib/Controller/ApiController.php [new file with mode: 0644]
apps/files_reminders/lib/Db/ReminderMapper.php
apps/files_reminders/lib/Service/ReminderService.php

diff --git a/apps/files_reminders/appinfo/routes.php b/apps/files_reminders/appinfo/routes.php
new file mode 100644 (file)
index 0000000..f36d6cf
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright 2023 Christopher Ng <chrng8@gmail.com>
+ *
+ * @author Christopher Ng <chrng8@gmail.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/>.
+ *
+ */
+
+$requirements = [
+       'version' => '1',
+];
+
+return [
+       'ocs' => [
+               ['name' => 'Api#get', 'url' => '/api/v{version}/get', 'verb' => 'GET', 'requirements' => $requirements],
+               ['name' => 'Api#create', 'url' => '/api/v{version}/create', 'verb' => 'POST', 'requirements' => $requirements],
+       ],
+];
diff --git a/apps/files_reminders/lib/Controller/ApiController.php b/apps/files_reminders/lib/Controller/ApiController.php
new file mode 100644 (file)
index 0000000..b372a87
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright 2023 Christopher Ng <chrng8@gmail.com>
+ *
+ * @author Christopher Ng <chrng8@gmail.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 OCA\FilesReminders\Controller;
+
+use DateTime;
+use DateTimeInterface;
+use DateTimeZone;
+use Exception;
+use OCA\FilesReminders\Service\ReminderService;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\JSONResponse;
+use OCP\AppFramework\OCSController;
+use OCP\IRequest;
+use OCP\IUserSession;
+use Psr\Log\LoggerInterface;
+use Throwable;
+
+class ApiController extends OCSController {
+       public function __construct(
+               string $appName,
+               IRequest $request,
+               protected ReminderService $reminderService,
+               protected IUserSession $userSession,
+               protected LoggerInterface $logger,
+       ) {
+               parent::__construct($appName, $request);
+       }
+
+       /**
+        * Get a reminder
+        */
+       public function get(int $fileId): JSONResponse {
+               $user = $this->userSession->getUser();
+               if ($user === null) {
+                       return new JSONResponse([], Http::STATUS_UNAUTHORIZED);
+               }
+
+               try {
+                       $reminder = $this->reminderService->getDueForUser($user, $fileId);
+                       $reminderData = [
+                               'remindAt' => $reminder->getRemindAt()->format(DateTimeInterface::ATOM), // ISO 8601
+                       ];
+                       return new JSONResponse($reminderData, Http::STATUS_OK);
+               } catch (DoesNotExistException $e) {
+                       // Return null when no reminder is found
+                       $reminderData = [
+                               'remindAt' => null,
+                       ];
+                       return new JSONResponse($reminderData, Http::STATUS_OK);
+               } catch (Throwable $th) {
+                       $this->logger->error($th->getMessage(), ['exception' => $th]);
+                       return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
+               }
+       }
+
+       /**
+        * Create a reminder
+        *
+        * @param string $remindAt ISO 8601 formatted date time string
+        */
+       public function create(int $fileId, string $remindAt): JSONResponse {
+               try {
+                       $remindAt = (new DateTime($remindAt))->setTimezone(new DateTimeZone('UTC'));
+               } catch (Exception $e) {
+                       $this->logger->error($e->getMessage(), ['exception' => $e]);
+                       return new JSONResponse([], Http::STATUS_BAD_REQUEST);
+               }
+
+               $user = $this->userSession->getUser();
+               if ($user === null) {
+                       return new JSONResponse([], Http::STATUS_UNAUTHORIZED);
+               }
+
+               try {
+                       $this->reminderService->create($user, $fileId, $remindAt);
+                       return new JSONResponse([], Http::STATUS_OK);
+               } catch (Throwable $th) {
+                       $this->logger->error($th->getMessage(), ['exception' => $th]);
+                       return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
+               }
+       }
+}
index 4d1ebab35b141e2a4380e9d9b6bb37e20ff2b24c..7368ef2acc7d5a8791e2a3b8f897fb46b13f13f0 100644 (file)
@@ -26,6 +26,7 @@ declare(strict_types=1);
 
 namespace OCA\FilesReminders\Db;
 
+use OCP\AppFramework\Db\DoesNotExistException;
 use OCP\AppFramework\Db\QBMapper;
 use OCP\DB\QueryBuilder\IQueryBuilder;
 use OCP\IDBConnection;
@@ -62,6 +63,23 @@ class ReminderMapper extends QBMapper {
                return $this->findEntity($qb);
        }
 
+       /**
+        * @throws DoesNotExistException
+        */
+       public function findDueForUser(IUser $user, int $fileId): Reminder {
+               $qb = $this->db->getQueryBuilder();
+
+               $qb->select('user_id', 'file_id', 'remind_at', 'created_at', 'notified')
+                       ->from($this->getTableName())
+                       ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user->getUID(), IQueryBuilder::PARAM_STR)))
+                       ->andWhere($qb->expr()->eq('file_id', $qb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
+                       ->andWhere($qb->expr()->eq('notified', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
+                       ->orderBy('created_at', 'DESC')
+                       ->setMaxResults(1);
+
+               return $this->findEntity($qb);
+       }
+
        /**
         * @return Reminder[]
         */
index 8411cdb9cf743d26cf314258f04743c53b3688a7..7106c8e5514f2d3325093248abb597c6ec7b2ed3 100644 (file)
@@ -27,6 +27,7 @@ declare(strict_types=1);
 namespace OCA\FilesReminders\Service;
 
 use DateTime;
+use DateTimeZone;
 use InvalidArgumentException;
 use OCA\FilesReminders\AppInfo\Application;
 use OCA\FilesReminders\Db\Reminder;
@@ -56,6 +57,14 @@ class ReminderService {
                return new RichReminder($reminder, $this->root);
        }
 
+       /**
+        * @throws DoesNotExistException
+        */
+       public function getDueForUser(IUser $user, int $fileId): RichReminder {
+               $reminder = $this->reminderMapper->findDueForUser($user, $fileId);
+               return new RichReminder($reminder, $this->root);
+       }
+
        /**
         * @return RichReminder[]
         */
@@ -69,6 +78,15 @@ class ReminderService {
                );
        }
 
+       public function create(IUser $user, int $fileId, DateTime $remindAt): void {
+               $reminder = new Reminder();
+               $reminder->setUserId($user->getUID());
+               $reminder->setFileId($fileId);
+               $reminder->setRemindAt($remindAt);
+               $reminder->setCreatedAt(new DateTime('now', new DateTimeZone('UTC')));
+               $this->reminderMapper->insert($reminder);
+       }
+
        /**
         * @throws DoesNotExistException
         * @throws UserNotFoundException