36
36
use ArtificialOwl \MySmallPhpTools \Traits \Nextcloud \nc23 \TNC23Logger ;
37
37
use Exception ;
38
38
use OC \AppFramework \Http ;
39
+ use OC \Files \Node \File ;
40
+ use OC \Files \Node \Folder ;
41
+ use OC \User \NoUserException ;
39
42
use OCA \Backup \Db \EventRequest ;
43
+ use OCA \Backup \Exceptions \RestoringPointException ;
40
44
use OCA \Backup \Exceptions \RestoringPointNotFoundException ;
41
45
use OCA \Backup \Model \BackupEvent ;
46
+ use OCA \Backup \Model \RestoringPoint ;
42
47
use OCA \Backup \Service \ConfigService ;
43
48
use OCA \Backup \Service \CronService ;
44
49
use OCA \Backup \Service \ExportService ;
45
50
use OCA \Backup \Service \ExternalFolderService ;
46
51
use OCA \Backup \Service \FilesService ;
47
52
use OCA \Backup \Service \PointService ;
53
+ use OCA \Backup \Service \RestoreService ;
48
54
use OCP \AppFramework \Http \DataResponse ;
49
55
use OCP \AppFramework \OCS \OCSException ;
50
56
use OCP \AppFramework \OCSController ;
57
+ use OCP \Files \FileInfo ;
58
+ use OCP \Files \IRootFolder ;
59
+ use OCP \Files \NotPermittedException ;
51
60
use OCP \IRequest ;
52
61
use OCP \IUserSession ;
62
+ use OCP \Lock \LockedException ;
53
63
54
64
/**
55
65
* Class LocalController
@@ -65,6 +75,9 @@ class LocalController extends OcsController {
65
75
/** @var IUserSession */
66
76
private $ userSession ;
67
77
78
+ /** @var IRootFolder */
79
+ private $ rootFolder ;
80
+
68
81
/** @var EventRequest */
69
82
private $ eventRequest ;
70
83
@@ -83,6 +96,9 @@ class LocalController extends OcsController {
83
96
/** @var ExportService */
84
97
private $ exportService ;
85
98
99
+ /** @var RestoreService */
100
+ private $ restoreService ;
101
+
86
102
/** @var ConfigService */
87
103
private $ configService ;
88
104
@@ -93,35 +109,41 @@ class LocalController extends OcsController {
93
109
* @param string $appName
94
110
* @param IRequest $request
95
111
* @param IUserSession $userSession
112
+ * @param IRootFolder $rootFolder
96
113
* @param EventRequest $eventRequest
97
114
* @param PointService $pointService
98
115
* @param FilesService $filesService
99
116
* @param CronService $cronService
100
117
* @param ExternalFolderService $externalFolderService
101
118
* @param ExportService $exportService
119
+ * @param RestoreService $restoreService
102
120
* @param ConfigService $configService
103
121
*/
104
122
public function __construct (
105
123
string $ appName ,
106
124
IRequest $ request ,
107
125
IUserSession $ userSession ,
126
+ IRootFolder $ rootFolder ,
108
127
EventRequest $ eventRequest ,
109
128
PointService $ pointService ,
110
129
FilesService $ filesService ,
111
130
CronService $ cronService ,
112
131
ExternalFolderService $ externalFolderService ,
113
132
ExportService $ exportService ,
133
+ RestoreService $ restoreService ,
114
134
ConfigService $ configService
115
135
) {
116
136
parent ::__construct ($ appName , $ request );
117
137
118
138
$ this ->userSession = $ userSession ;
139
+ $ this ->rootFolder = $ rootFolder ;
119
140
$ this ->eventRequest = $ eventRequest ;
120
141
$ this ->pointService = $ pointService ;
121
142
$ this ->filesService = $ filesService ;
122
143
$ this ->cronService = $ cronService ;
123
144
$ this ->externalFolderService = $ externalFolderService ;
124
145
$ this ->exportService = $ exportService ;
146
+ $ this ->restoreService = $ restoreService ;
125
147
$ this ->configService = $ configService ;
126
148
}
127
149
@@ -286,27 +308,77 @@ public function unsetExternalFolder(int $storageId): DataResponse {
286
308
* @throws OCSException
287
309
*/
288
310
private function initActionScanLocalFolder (int $ fileId ): DataResponse {
311
+ $ userId = $ this ->userSession ->getUser ()->getUID ();
312
+
289
313
try {
290
- $ userId = $ this ->userSession ->getUser ()->getUID ();
291
314
$ point = $ this ->filesService ->getPointFromFileId ($ fileId , $ userId );
292
315
$ event = new BackupEvent ();
293
316
$ event ->setAuthor ($ userId );
294
317
$ event ->setData (['fileId ' => $ fileId ]);
295
318
$ event ->setType ('ScanLocalFolder ' );
296
319
297
320
$ this ->eventRequest ->save ($ event );
321
+
322
+ return new DataResponse (
323
+ [
324
+ 'message ' => 'The restoring point have been scheduled for a scan. (id: ' . $ point ->getId ()
325
+ . ') '
326
+ ]
327
+ );
298
328
} catch (RestoringPointNotFoundException $ e ) {
329
+ try {
330
+ $ point = $ this ->actionFromFileId ($ fileId , $ userId );
331
+
332
+ return new DataResponse (
333
+ [
334
+ 'message ' => 'The restoring point \'s metadata have been generated. (id: '
335
+ . $ point ->getId () . ') '
336
+ ]
337
+ );
338
+ } catch (RestoringPointException $ e ) {
339
+ } catch (Exception $ e ) {
340
+ throw new OcsException ($ e ->getMessage (), Http::STATUS_BAD_REQUEST );
341
+ }
342
+
299
343
throw new OcsException (
300
344
'file does not seems to be a valid restoring point ' ,
301
345
Http::STATUS_BAD_REQUEST
302
346
);
303
347
} catch (Exception $ e ) {
304
348
throw new OcsException ($ e ->getMessage (), Http::STATUS_BAD_REQUEST );
305
349
}
350
+ }
351
+
352
+
353
+ /**
354
+ * @param int $fileId
355
+ * @param string $owner
356
+ * @param Folder|null $folder
357
+ *
358
+ * @return RestoringPoint
359
+ * @throws LockedException
360
+ * @throws NoUserException
361
+ * @throws NotPermittedException
362
+ * @throws RestoringPointException
363
+ */
364
+ public function actionFromFileId (int $ fileId , string $ owner , ?Folder &$ folder = null ): RestoringPoint {
365
+ $ storage = $ this ->rootFolder ->getUserFolder ($ owner );
366
+ $ nodes = $ storage ->getById ($ fileId );
367
+
368
+ foreach ($ nodes as $ node ) {
369
+ if ($ node ->getType () !== FileInfo::TYPE_FILE ) {
370
+ continue ;
371
+ }
372
+
373
+ /** @var File $node */
374
+ $ folder = $ node ->getParent ();
375
+ $ content = json_decode ($ node ->getContent (), true );
376
+ if ($ this ->get ('action ' , $ content ) === 'generate ' ) {
377
+ return $ this ->restoreService ->restoreMetadataFromFolder ($ folder , $ this ->get ('id ' , $ content ));
378
+ }
379
+ }
306
380
307
- return new DataResponse (
308
- ['message ' => 'The restoring point have been scheduled for a scan. (id: ' . $ point ->getId () . ') ' ]
309
- );
381
+ throw new RestoringPointException ();
310
382
}
311
383
312
384
0 commit comments