Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
80.00% |
12 / 15 |
|
66.67% |
2 / 3 |
CRAP | |
0.00% |
0 / 1 |
| EnvelopeFileRelocator | |
80.00% |
12 / 15 |
|
66.67% |
2 / 3 |
7.39 | |
0.00% |
0 / 1 |
| __construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| ensureFileInEnvelopeFolder | |
76.92% |
10 / 13 |
|
0.00% |
0 / 1 |
5.31 | |||
| isNodeInsideFolder | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| 1 | <?php |
| 2 | |
| 3 | declare(strict_types=1); |
| 4 | /** |
| 5 | * SPDX-FileCopyrightText: 2025 LibreCode coop and contributors |
| 6 | * SPDX-License-Identifier: AGPL-3.0-or-later |
| 7 | */ |
| 8 | |
| 9 | namespace OCA\Libresign\Service\Envelope; |
| 10 | |
| 11 | use OCA\Libresign\Exception\LibresignException; |
| 12 | use OCA\Libresign\Service\FolderService; |
| 13 | use OCP\Files\Node; |
| 14 | use OCP\IUser; |
| 15 | |
| 16 | class EnvelopeFileRelocator { |
| 17 | public function __construct( |
| 18 | private FolderService $folderService, |
| 19 | ) { |
| 20 | } |
| 21 | |
| 22 | public function ensureFileInEnvelopeFolder(Node $sourceNode, int $envelopeFolderId, IUser $userManager): Node { |
| 23 | $envelopeFolder = $this->folderService->getCreatableFolderById($userManager->getUID(), $envelopeFolderId); |
| 24 | |
| 25 | if (!$envelopeFolder instanceof \OCP\Files\Folder) { |
| 26 | throw new LibresignException('Envelope folder not found'); |
| 27 | } |
| 28 | |
| 29 | if ($this->isNodeInsideFolder($sourceNode, $envelopeFolder)) { |
| 30 | return $sourceNode; |
| 31 | } |
| 32 | |
| 33 | if (!$sourceNode instanceof \OCP\Files\File) { |
| 34 | throw new LibresignException('Invalid file type for envelope'); |
| 35 | } |
| 36 | |
| 37 | $filename = $sourceNode->getName(); |
| 38 | |
| 39 | if ($envelopeFolder->nodeExists($filename)) { |
| 40 | $extension = $sourceNode->getExtension(); |
| 41 | $nameWithoutExt = substr($filename, 0, -strlen($extension) - 1); |
| 42 | $filename = $nameWithoutExt . '_' . time() . '.' . $extension; |
| 43 | } |
| 44 | |
| 45 | return $envelopeFolder->newFile($filename, $sourceNode->getContent()); |
| 46 | } |
| 47 | |
| 48 | private function isNodeInsideFolder(Node $node, \OCP\Files\Folder $folder): bool { |
| 49 | return str_starts_with($node->getPath(), $folder->getPath() . '/'); |
| 50 | } |
| 51 | } |