-
Notifications
You must be signed in to change notification settings - Fork 119
Expand file tree
/
Copy pathCleanupUploadedFilesJob.php
More file actions
107 lines (86 loc) · 3.07 KB
/
Copy pathCleanupUploadedFilesJob.php
File metadata and controls
107 lines (86 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Forms\BackgroundJob;
use OCA\Forms\Constants;
use OCA\Forms\Db\FormMapper;
use OCA\Forms\Db\UploadedFileMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\TimedJob;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use Psr\Log\LoggerInterface;
class CleanupUploadedFilesJob extends TimedJob {
private const FILE_LIFETIME = '-1 hour';
public function __construct(
private readonly IRootFolder $rootFolder,
private readonly FormMapper $formMapper,
private readonly UploadedFileMapper $uploadedFileMapper,
private readonly LoggerInterface $logger,
ITimeFactory $time,
) {
parent::__construct($time);
$this->setInterval(60 * 60);
}
/**
* @param array $argument
*/
public function run($argument): void {
$dateTime = new \DateTimeImmutable(self::FILE_LIFETIME);
$this->logger->info('Deleting files that were uploaded before {before} and still not submitted.', [
'before' => $dateTime->format(\DateTimeImmutable::ATOM),
]);
$uploadedFiles = $this->uploadedFileMapper->findUploadedEarlierThan($dateTime);
$deleted = 0;
$usersToCleanup = [];
foreach ($uploadedFiles as $uploadedFile) {
$this->logger->info('Deleting uploaded file "{originalFileName}" for form {formId}.', [
'originalFileName' => $uploadedFile->getOriginalFileName(),
'formId' => $uploadedFile->getFormId(),
]);
try {
$form = $this->formMapper->findById($uploadedFile->getFormId());
} catch (DoesNotExistException) {
$this->logger->warning('Could not find form {formId} for uploaded file deletion.', [
'formId' => $uploadedFile->getFormId(),
]);
$this->uploadedFileMapper->delete($uploadedFile);
continue;
}
$usersToCleanup[$form->getOwnerId()] = true;
$userFolder = $this->rootFolder->getUserFolder($form->getOwnerId());
$nodes = $userFolder->getById($uploadedFile->getFileId());
if (!empty($nodes)) {
$node = $nodes[0];
$node->delete();
} else {
$this->logger->warning('Could not find uploaded file "{fileId}" for deletion.', [
'fileId' => $uploadedFile->getFileId(),
]);
}
$this->uploadedFileMapper->delete($uploadedFile);
$deleted++;
}
$this->logger->info('Deleted {deleted} uploaded files.', ['deleted' => $deleted]);
// now delete empty folders in user folders
$deleted = 0;
foreach (array_keys($usersToCleanup) as $userId) {
$this->logger->info('Cleaning up empty folders for user {userId}.', ['userId' => $userId]);
$userFolder = $this->rootFolder->getUserFolder($userId);
$unsubmittedFilesFolder = $userFolder->get(Constants::UNSUBMITTED_FILES_FOLDER);
if (!$unsubmittedFilesFolder instanceof Folder) {
continue;
}
foreach ($unsubmittedFilesFolder->getDirectoryListing() as $node) {
if ($node->getName() < $dateTime->getTimestamp()) {
$node->delete();
$deleted++;
}
}
}
$this->logger->info('Deleted {deleted} folders.', ['deleted' => $deleted]);
}
}