Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
80.00% covered (warning)
80.00%
12 / 15
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
EnvelopeFileRelocator
80.00% covered (warning)
80.00%
12 / 15
66.67% covered (warning)
66.67%
2 / 3
7.39
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 ensureFileInEnvelopeFolder
76.92% covered (warning)
76.92%
10 / 13
0.00% covered (danger)
0.00%
0 / 1
5.31
 isNodeInsideFolder
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4/**
5 * SPDX-FileCopyrightText: 2025 LibreCode coop and contributors
6 * SPDX-License-Identifier: AGPL-3.0-or-later
7 */
8
9namespace OCA\Libresign\Service\Envelope;
10
11use OCA\Libresign\Exception\LibresignException;
12use OCA\Libresign\Service\FolderService;
13use OCP\Files\Node;
14use OCP\IUser;
15
16class 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}