1515use OCA \FilesReminders \Db \Reminder ;
1616use OCA \FilesReminders \Db \ReminderMapper ;
1717use OCA \FilesReminders \Exception \NodeNotFoundException ;
18+ use OCA \FilesReminders \Exception \ReminderNotFoundException ;
1819use OCA \FilesReminders \Exception \UserNotFoundException ;
1920use OCA \FilesReminders \Model \RichReminder ;
2021use OCP \AppFramework \Db \DoesNotExistException ;
22+ use OCP \Files \Folder ;
2123use OCP \Files \IRootFolder ;
2224use OCP \Files \Node ;
25+ use OCP \ICache ;
26+ use OCP \ICacheFactory ;
2327use OCP \IURLGenerator ;
2428use OCP \IUser ;
2529use OCP \IUserManager ;
2832use Throwable ;
2933
3034class ReminderService {
35+
36+ private ICache $ cache ;
37+
3138 public function __construct (
3239 protected IUserManager $ userManager ,
3340 protected IURLGenerator $ urlGenerator ,
3441 protected INotificationManager $ notificationManager ,
3542 protected ReminderMapper $ reminderMapper ,
3643 protected IRootFolder $ root ,
3744 protected LoggerInterface $ logger ,
45+ protected ICacheFactory $ cacheFactory ,
3846 ) {
47+ $ this ->cache = $ this ->cacheFactory ->createInMemory ();
3948 }
4049
41- /**
42- * @throws DoesNotExistException
43- */
44- public function get (int $ id ): RichReminder {
45- $ reminder = $ this ->reminderMapper ->find ($ id );
46- return new RichReminder ($ reminder , $ this ->root );
50+ public function cacheFolder (IUser $ user , Folder $ folder ): void {
51+ $ reminders = $ this ->reminderMapper ->findAllInFolder ($ user , $ folder );
52+ $ reminderMap = [];
53+ foreach ($ reminders as $ reminder ) {
54+ $ reminderMap [$ reminder ->getFileId ()] = $ reminder ;
55+ }
56+
57+ $ nodes = $ folder ->getDirectoryListing ();
58+ foreach ($ nodes as $ node ) {
59+ $ reminder = $ reminderMap [$ node ->getId ()] ?? false ;
60+ $ this ->cache ->set ("{$ user ->getUID ()}- {$ node ->getId ()}" , $ reminder );
61+ }
4762 }
4863
4964 /**
50- * @throws DoesNotExistException
65+ * @throws NodeNotFoundException
5166 */
52- public function getDueForUser (IUser $ user , int $ fileId ): RichReminder {
53- $ reminder = $ this ->reminderMapper ->findDueForUser ($ user , $ fileId );
54- return new RichReminder ($ reminder , $ this ->root );
67+ public function getDueForUser (IUser $ user , int $ fileId ): ?RichReminder {
68+ $ this ->checkNode ($ user , $ fileId );
69+ /** @var null|false|Reminder $cachedReminder */
70+ $ cachedReminder = $ this ->cache ->get ("{$ user ->getUID ()}- $ fileId " );
71+ if ($ cachedReminder === false ) {
72+ return null ;
73+ }
74+ if ($ cachedReminder instanceof Reminder) {
75+ return new RichReminder ($ cachedReminder , $ this ->root );
76+ }
77+
78+ try {
79+ $ reminder = $ this ->reminderMapper ->findDueForUser ($ user , $ fileId );
80+ $ this ->cache ->set ("{$ user ->getUID ()}- $ fileId " , $ reminder );
81+ return new RichReminder ($ reminder , $ this ->root );
82+ } catch (DoesNotExistException $ e ) {
83+ $ this ->cache ->set ("{$ user ->getUID ()}- $ fileId " , false );
84+ return null ;
85+ }
5586 }
5687
5788 /**
@@ -74,48 +105,50 @@ public function getAll(?IUser $user = null) {
74105 */
75106 public function createOrUpdate (IUser $ user , int $ fileId , DateTime $ dueDate ): bool {
76107 $ now = new DateTime ('now ' , new DateTimeZone ('UTC ' ));
77- try {
78- $ reminder = $ this ->reminderMapper ->findDueForUser ($ user , $ fileId );
79- $ reminder ->setDueDate ($ dueDate );
80- $ reminder ->setUpdatedAt ($ now );
81- $ this ->reminderMapper ->update ($ reminder );
82- return false ;
83- } catch (DoesNotExistException $ e ) {
84- $ node = $ this ->root ->getUserFolder ($ user ->getUID ())->getFirstNodeById ($ fileId );
85- if (!$ node ) {
86- throw new NodeNotFoundException ();
87- }
88- // Create new reminder if no reminder is found
108+ $ this ->checkNode ($ user , $ fileId );
109+ $ reminder = $ this ->getDueForUser ($ user , $ fileId );
110+ if ($ reminder === null ) {
89111 $ reminder = new Reminder ();
90112 $ reminder ->setUserId ($ user ->getUID ());
91113 $ reminder ->setFileId ($ fileId );
92114 $ reminder ->setDueDate ($ dueDate );
93115 $ reminder ->setUpdatedAt ($ now );
94116 $ reminder ->setCreatedAt ($ now );
95117 $ this ->reminderMapper ->insert ($ reminder );
118+ $ this ->cache ->set ("{$ user ->getUID ()}- $ fileId " , $ reminder );
96119 return true ;
97120 }
121+ $ reminder ->setDueDate ($ dueDate );
122+ $ reminder ->setUpdatedAt ($ now );
123+ $ this ->reminderMapper ->update ($ reminder );
124+ $ this ->cache ->set ("{$ user ->getUID ()}- $ fileId " , $ reminder );
125+ return false ;
98126 }
99127
100128 /**
101- * @throws DoesNotExistException
129+ * @throws NodeNotFoundException
130+ * @throws ReminderNotFoundException
102131 */
103132 public function remove (IUser $ user , int $ fileId ): void {
104- $ reminder = $ this ->reminderMapper ->findDueForUser ($ user , $ fileId );
105- $ this ->reminderMapper ->delete ($ reminder );
133+ $ this ->checkNode ($ user , $ fileId );
134+ $ reminder = $ this ->getDueForUser ($ user , $ fileId );
135+ if ($ reminder === null ) {
136+ throw new ReminderNotFoundException ();
137+ }
138+ $ this ->deleteReminder ($ reminder );
106139 }
107140
108141 public function removeAllForNode (Node $ node ): void {
109142 $ reminders = $ this ->reminderMapper ->findAllForNode ($ node );
110143 foreach ($ reminders as $ reminder ) {
111- $ this ->reminderMapper -> delete ($ reminder );
144+ $ this ->deleteReminder ($ reminder );
112145 }
113146 }
114147
115148 public function removeAllForUser (IUser $ user ): void {
116149 $ reminders = $ this ->reminderMapper ->findAllForUser ($ user );
117150 foreach ($ reminders as $ reminder ) {
118- $ this ->reminderMapper -> delete ($ reminder );
151+ $ this ->deleteReminder ($ reminder );
119152 }
120153 }
121154
@@ -147,6 +180,7 @@ public function send(Reminder $reminder): void {
147180 try {
148181 $ this ->notificationManager ->notify ($ notification );
149182 $ this ->reminderMapper ->markNotified ($ reminder );
183+ $ this ->cache ->set ("{$ user ->getUID ()}- {$ reminder ->getFileId ()}" , $ reminder );
150184 } catch (Throwable $ th ) {
151185 $ this ->logger ->error ($ th ->getMessage (), $ th ->getTrace ());
152186 }
@@ -158,7 +192,24 @@ public function cleanUp(?int $limit = null): void {
158192 ->modify ('-1 day ' );
159193 $ reminders = $ this ->reminderMapper ->findNotified ($ buffer , $ limit );
160194 foreach ($ reminders as $ reminder ) {
161- $ this ->reminderMapper ->delete ($ reminder );
195+ $ this ->deleteReminder ($ reminder );
196+ }
197+ }
198+
199+ private function deleteReminder (Reminder $ reminder ): void {
200+ $ this ->reminderMapper ->delete ($ reminder );
201+ $ this ->cache ->set ("{$ reminder ->getUserId ()}- {$ reminder ->getFileId ()}" , false );
202+ }
203+
204+
205+ /**
206+ * @throws NodeNotFoundException
207+ */
208+ private function checkNode (IUser $ user , int $ fileId ): void {
209+ $ userFolder = $ this ->root ->getUserFolder ($ user ->getUID ());
210+ $ node = $ userFolder ->getFirstNodeById ($ fileId );
211+ if ($ node === null ) {
212+ throw new NodeNotFoundException ();
162213 }
163214 }
164215}
0 commit comments