99namespace OCA \WorkflowEngine \Entity ;
1010
1111use OC \Files \Config \UserMountCache ;
12+ use OC \SystemTag \Events \SingleTagAssignedEvent ;
1213use OCP \EventDispatcher \Event ;
13- use OCP \EventDispatcher \GenericEvent ;
14+ use OCP \Files \Events \Node \AbstractNodeEvent ;
15+ use OCP \Files \Events \Node \NodeCopiedEvent ;
16+ use OCP \Files \Events \Node \NodeCreatedEvent ;
17+ use OCP \Files \Events \Node \NodeDeletedEvent ;
18+ use OCP \Files \Events \Node \NodeRenamedEvent ;
19+ use OCP \Files \Events \Node \NodeTouchedEvent ;
20+ use OCP \Files \Events \Node \NodeUpdatedEvent ;
1421use OCP \Files \InvalidPathException ;
1522use OCP \Files \IRootFolder ;
1623use OCP \Files \Mount \IMountManager ;
2229use OCP \IUserManager ;
2330use OCP \IUserSession ;
2431use OCP \SystemTag \ISystemTagManager ;
25- use OCP \SystemTag \MapperEvent ;
2632use OCP \WorkflowEngine \EntityContext \IContextPortation ;
2733use OCP \WorkflowEngine \EntityContext \IDisplayText ;
2834use OCP \WorkflowEngine \EntityContext \IIcon ;
2935use OCP \WorkflowEngine \EntityContext \IUrl ;
3036use OCP \WorkflowEngine \GenericEntityEvent ;
3137use OCP \WorkflowEngine \IEntity ;
3238use OCP \WorkflowEngine \IRuleMatcher ;
39+ use Override ;
3340
3441class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
35- private const EVENT_NAMESPACE = ' \OCP\Files:: ' ;
42+ /** @var ?class-string<Event> $eventName */
3643 protected ?string $ eventName = null ;
3744 protected ?Event $ event = null ;
3845 private ?Node $ node = null ;
3946 private ?IUser $ actingUser = null ;
4047
4148 public function __construct (
42- protected IL10N $ l10n ,
43- protected IURLGenerator $ urlGenerator ,
44- protected IRootFolder $ root ,
45- private IUserSession $ userSession ,
46- private ISystemTagManager $ tagManager ,
47- private IUserManager $ userManager ,
48- private UserMountCache $ userMountCache ,
49- private IMountManager $ mountManager ,
49+ protected readonly IL10N $ l10n ,
50+ protected readonly IURLGenerator $ urlGenerator ,
51+ protected readonly IRootFolder $ root ,
52+ private readonly IUserSession $ userSession ,
53+ private readonly ISystemTagManager $ tagManager ,
54+ private readonly IUserManager $ userManager ,
55+ private readonly UserMountCache $ userMountCache ,
56+ private readonly IMountManager $ mountManager ,
5057 ) {
5158 }
5259
60+ #[Override]
5361 public function getName (): string {
5462 return $ this ->l10n ->t ('File ' );
5563 }
5664
65+ #[Override]
5766 public function getIcon (): string {
5867 return $ this ->urlGenerator ->imagePath ('core ' , 'categories/files.svg ' );
5968 }
6069
70+ #[Override]
6171 public function getEvents (): array {
6272 return [
63- new GenericEntityEvent ($ this ->l10n ->t ('File created ' ), self :: EVENT_NAMESPACE . ' postCreate ' ),
64- new GenericEntityEvent ($ this ->l10n ->t ('File updated ' ), self :: EVENT_NAMESPACE . ' postWrite ' ),
65- new GenericEntityEvent ($ this ->l10n ->t ('File renamed ' ), self :: EVENT_NAMESPACE . ' postRename ' ),
66- new GenericEntityEvent ($ this ->l10n ->t ('File deleted ' ), self :: EVENT_NAMESPACE . ' postDelete ' ),
67- new GenericEntityEvent ($ this ->l10n ->t ('File accessed ' ), self :: EVENT_NAMESPACE . ' postTouch ' ),
68- new GenericEntityEvent ($ this ->l10n ->t ('File copied ' ), self :: EVENT_NAMESPACE . ' postCopy ' ),
69- new GenericEntityEvent ($ this ->l10n ->t ('Tag assigned ' ), MapperEvent:: EVENT_ASSIGN ),
73+ new GenericEntityEvent ($ this ->l10n ->t ('File created ' ), NodeCreatedEvent::class ),
74+ new GenericEntityEvent ($ this ->l10n ->t ('File updated ' ), NodeUpdatedEvent::class ),
75+ new GenericEntityEvent ($ this ->l10n ->t ('File renamed ' ), NodeRenamedEvent::class ),
76+ new GenericEntityEvent ($ this ->l10n ->t ('File deleted ' ), NodeDeletedEvent::class ),
77+ new GenericEntityEvent ($ this ->l10n ->t ('File accessed ' ), NodeTouchedEvent::class ),
78+ new GenericEntityEvent ($ this ->l10n ->t ('File copied ' ), NodeCopiedEvent::class ),
79+ new GenericEntityEvent ($ this ->l10n ->t ('Tag assigned ' ), SingleTagAssignedEvent::class ),
7080 ];
7181 }
7282
83+ #[Override]
7384 public function prepareRuleMatcher (IRuleMatcher $ ruleMatcher , string $ eventName , Event $ event ): void {
74- if (!$ event instanceof GenericEvent && !$ event instanceof MapperEvent) {
85+ $ isSupported = array_any ($ this ->getEvents (), static fn (GenericEntityEvent $ genericEvent ): bool => is_a ($ event , $ genericEvent ->getEventName ()));
86+ if (!$ isSupported ) {
7587 return ;
7688 }
89+
7790 $ this ->eventName = $ eventName ;
7891 $ this ->event = $ event ;
7992 $ this ->actingUser = $ this ->actingUser ?? $ this ->userSession ->getUser ();
8093 try {
8194 $ node = $ this ->getNode ();
8295 $ ruleMatcher ->setEntitySubject ($ this , $ node );
8396 $ ruleMatcher ->setFileInfo ($ node ->getStorage (), $ node ->getInternalPath ());
84- } catch (NotFoundException $ e ) {
97+ } catch (NotFoundException ) {
8598 // pass
8699 }
87100 }
88101
102+ #[Override]
89103 public function isLegitimatedForUserId (string $ userId ): bool {
90104 try {
91105 $ node = $ this ->getNode ();
92106 if ($ node ->getOwner ()?->getUID() === $ userId ) {
93107 return true ;
94108 }
95109
96- if ($ this ->eventName === self :: EVENT_NAMESPACE . ' postDelete ' ) {
110+ if ($ this ->eventName === NodeDeletedEvent::class ) {
97111 // At postDelete, the file no longer exists. Check for parent folder instead.
98112 $ fileId = $ node ->getParentId ();
99113 } else {
@@ -120,35 +134,27 @@ protected function getNode(): Node {
120134 if ($ this ->node ) {
121135 return $ this ->node ;
122136 }
123- if (!$ this ->event instanceof GenericEvent && !$ this ->event instanceof MapperEvent) {
137+
138+ if ($ this ->event instanceof AbstractNodeEvent) {
139+ return $ this ->event ->getNode ();
140+ }
141+
142+ if (!$ this ->event instanceof SingleTagAssignedEvent || $ this ->event ->getObjectType () !== 'files ' ) {
124143 throw new NotFoundException ();
125144 }
126- switch ($ this ->eventName ) {
127- case self ::EVENT_NAMESPACE . 'postCreate ' :
128- case self ::EVENT_NAMESPACE . 'postWrite ' :
129- case self ::EVENT_NAMESPACE . 'postDelete ' :
130- case self ::EVENT_NAMESPACE . 'postTouch ' :
131- return $ this ->event ->getSubject ();
132- case self ::EVENT_NAMESPACE . 'postRename ' :
133- case self ::EVENT_NAMESPACE . 'postCopy ' :
134- return $ this ->event ->getSubject ()[1 ];
135- case MapperEvent::EVENT_ASSIGN :
136- if (!$ this ->event instanceof MapperEvent || $ this ->event ->getObjectType () !== 'files ' ) {
137- throw new NotFoundException ();
138- }
139- $ this ->node = $ this ->root ->getFirstNodeById ((int )$ this ->event ->getObjectId ());
140- if ($ this ->node !== null ) {
141- return $ this ->node ;
142- }
143- break ;
145+
146+ $ this ->node = $ this ->root ->getFirstNodeById ((int )$ this ->event ->getObjectId ());
147+ if ($ this ->node === null ) {
148+ throw new NotFoundException ();
144149 }
145- throw new NotFoundException ();
150+
151+ return $ this ->node ;
146152 }
147153
148154 public function getDisplayText (int $ verbosity = 0 ): string {
149155 try {
150156 $ node = $ this ->getNode ();
151- } catch (NotFoundException $ e ) {
157+ } catch (NotFoundException ) {
152158 return '' ;
153159 }
154160
@@ -158,21 +164,21 @@ public function getDisplayText(int $verbosity = 0): string {
158164 ];
159165
160166 switch ($ this ->eventName ) {
161- case self :: EVENT_NAMESPACE . ' postCreate ' :
167+ case NodeCreatedEvent::class :
162168 return $ this ->l10n ->t ('%s created %s ' , $ options );
163- case self :: EVENT_NAMESPACE . ' postWrite ' :
169+ case NodeUpdatedEvent::class :
164170 return $ this ->l10n ->t ('%s modified %s ' , $ options );
165- case self :: EVENT_NAMESPACE . ' postDelete ' :
171+ case NodeDeletedEvent::class :
166172 return $ this ->l10n ->t ('%s deleted %s ' , $ options );
167- case self :: EVENT_NAMESPACE . ' postTouch ' :
173+ case NodeTouchedEvent::class :
168174 return $ this ->l10n ->t ('%s accessed %s ' , $ options );
169- case self :: EVENT_NAMESPACE . ' postRename ' :
175+ case NodeRenamedEvent::class :
170176 return $ this ->l10n ->t ('%s renamed %s ' , $ options );
171- case self :: EVENT_NAMESPACE . ' postCopy ' :
177+ case NodeCopiedEvent::class :
172178 return $ this ->l10n ->t ('%s copied %s ' , $ options );
173- case MapperEvent:: EVENT_ASSIGN :
179+ case SingleTagAssignedEvent::class :
174180 $ tagNames = [];
175- if ($ this ->event instanceof MapperEvent ) {
181+ if ($ this ->event instanceof SingleTagAssignedEvent ) {
176182 $ tagIDs = $ this ->event ->getTags ();
177183 $ tagObjects = $ this ->tagManager ->getTagsByIds ($ tagIDs );
178184 foreach ($ tagObjects as $ systemTag ) {
@@ -201,9 +207,7 @@ public function getUrl(): string {
201207 }
202208 }
203209
204- /**
205- * @inheritDoc
206- */
210+ #[Override]
207211 public function exportContextIDs (): array {
208212 $ nodeOwner = $ this ->getNode ()->getOwner ();
209213 $ actingUserId = null ;
@@ -215,14 +219,12 @@ public function exportContextIDs(): array {
215219 return [
216220 'eventName ' => $ this ->eventName ,
217221 'nodeId ' => $ this ->getNode ()->getId (),
218- 'nodeOwnerId ' => $ nodeOwner ? $ nodeOwner ->getUID () : null ,
222+ 'nodeOwnerId ' => $ nodeOwner? ->getUID(),
219223 'actingUserId ' => $ actingUserId ,
220224 ];
221225 }
222226
223- /**
224- * @inheritDoc
225- */
227+ #[Override]
226228 public function importContextIDs (array $ contextIDs ): void {
227229 $ this ->eventName = $ contextIDs ['eventName ' ];
228230 if ($ contextIDs ['nodeOwnerId ' ] !== null ) {
@@ -237,9 +239,7 @@ public function importContextIDs(array $contextIDs): void {
237239 }
238240 }
239241
240- /**
241- * @inheritDoc
242- */
242+ #[Override]
243243 public function getIconUrl (): string {
244244 return $ this ->getIcon ();
245245 }
0 commit comments