• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LibreSign / libresign / 20621495436

31 Dec 2025 02:59PM UTC coverage: 44.647%. First build
20621495436

Pull #6256

github

web-flow
Merge 4343635f1 into 27812ed76
Pull Request #6256: feat: add dashboard pending signatures widget

57 of 239 new or added lines in 16 files covered. (23.85%)

6618 of 14823 relevant lines covered (44.65%)

5.05 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

11.69
/lib/Service/SignerElementsService.php
1
<?php
2

3
declare(strict_types=1);
4
/**
5
 * SPDX-FileCopyrightText: 2020-2024 LibreCode coop and contributors
6
 * SPDX-License-Identifier: AGPL-3.0-or-later
7
 */
8

9
namespace OCA\Libresign\Service;
10

11
use OCA\Libresign\Db\UserElement;
12
use OCA\Libresign\Db\UserElementMapper;
13
use OCA\Libresign\ResponseDefinitions;
14
use OCP\Files\Folder;
15
use OCP\Files\NotFoundException;
16
use OCP\IURLGenerator;
17

18
/**
19
 * @psalm-import-type LibresignUserElement from ResponseDefinitions
20
 */
21
class SignerElementsService {
22
        public const RENDER_MODE_DESCRIPTION_ONLY = 'DESCRIPTION_ONLY';
23
        public const RENDER_MODE_SIGNAME_AND_DESCRIPTION = 'SIGNAME_AND_DESCRIPTION';
24
        public const RENDER_MODE_GRAPHIC_AND_DESCRIPTION = 'GRAPHIC_AND_DESCRIPTION';
25
        public const RENDER_MODE_DEFAULT = 'GRAPHIC_AND_DESCRIPTION';
26
        public function __construct(
27
                private FolderService $folderService,
28
                private SessionService $sessionService,
29
                private IURLGenerator $urlGenerator,
30
                private UserElementMapper $userElementMapper,
31
                private SignatureBackgroundService $signatureBackgroundService,
32
                private SignatureTextService $signatureTextService,
33
        ) {
34
        }
51✔
35

36
        /**
37
         * @return LibresignUserElement
38
         */
39
        public function getUserElementByNodeId(string $userId, int $nodeId): array {
NEW
40
                $element = $this->userElementMapper->findOne(['node_id' => $nodeId, 'user_id' => $userId]);
×
41
                $exists = $this->signatureFileExists($element);
×
42
                if (!$exists) {
×
43
                        throw new NotFoundException();
×
44
                }
45
                return [
×
46
                        'id' => $element->getId(),
×
47
                        'type' => $element->getType(),
×
48
                        'file' => [
×
49
                                'url' => $this->urlGenerator->linkToRoute('ocs.libresign.SignatureElements.getSignatureElementPreview', [
×
50
                                        'apiVersion' => 'v1',
×
NEW
51
                                        'nodeId' => $element->getNodeId(),
×
52
                                ]),
×
NEW
53
                                'nodeId' => $element->getNodeId()
×
54
                        ],
×
55
                        'userId' => $element->getUserId(),
×
56
                        'starred' => $element->getStarred() ? 1 : 0,
×
57
                        'createdAt' => $element->getCreatedAt()->format('Y-m-d H:i:s'),
×
58
                ];
×
59
        }
60

61
        /**
62
         * @return LibresignUserElement[]
63
         */
64
        public function getUserElements(string $userId): array {
65
                $elements = $this->userElementMapper->findMany(['user_id' => $userId]);
×
66
                $return = [];
×
67
                foreach ($elements as $element) {
×
68
                        $exists = $this->signatureFileExists($element);
×
69
                        if (!$exists) {
×
70
                                continue;
×
71
                        }
72
                        $return[] = [
×
73
                                'id' => $element->getId(),
×
74
                                'type' => $element->getType(),
×
75
                                'file' => [
×
76
                                        'url' => $this->urlGenerator->linkToRoute('ocs.libresign.SignatureElements.getSignatureElementPreview', [
×
77
                                                'apiVersion' => 'v1',
×
NEW
78
                                                'nodeId' => $element->getNodeId(),
×
79
                                        ]),
×
NEW
80
                                        'nodeId' => $element->getNodeId()
×
81
                                ],
×
82
                                'starred' => $element->getStarred() ? 1 : 0,
×
83
                                'userId' => $element->getUserId(),
×
84
                                'createdAt' => $element->getCreatedAt()->format('Y-m-d H:i:s'),
×
85
                        ];
×
86
                }
87
                return $return;
×
88
        }
89

90
        private function signatureFileExists(UserElement $userElement): bool {
91
                try {
NEW
92
                        $this->folderService->getFileByNodeId($userElement->getNodeId());
×
93
                } catch (\Exception) {
×
94
                        $this->userElementMapper->delete($userElement);
×
95
                        return false;
×
96
                }
97
                return true;
×
98
        }
99

100
        public function getElementsFromSession(): array {
101
                $folder = $this->folderService->getFolder();
×
102
                try {
103
                        /** @var Folder $signerFolder */
104
                        $signerFolder = $folder->get($this->sessionService->getSessionId());
×
105
                } catch (NotFoundException) {
×
106
                        return [];
×
107
                }
108
                $fileList = $signerFolder->getDirectoryListing();
×
109
                return $fileList;
×
110
        }
111

112
        /**
113
         * @return LibresignUserElement[]
114
         */
115
        public function getElementsFromSessionAsArray(): array {
116
                $return = [];
×
117
                $fileList = $this->getElementsFromSession();
×
118
                foreach ($fileList as $fileElement) {
×
119
                        [$type, $timestamp] = explode('_', pathinfo((string)$fileElement->getName(), PATHINFO_FILENAME));
×
120
                        $return[] = [
×
121
                                'type' => $type,
×
122
                                'file' => [
×
123
                                        'url' => $this->urlGenerator->linkToRoute('ocs.libresign.SignatureElements.getSignatureElementPreview', [
×
124
                                                'apiVersion' => 'v1',
×
125
                                                'nodeId' => $fileElement->getId(),
×
126
                                                'mtime' => $fileElement->getMTime(),
×
127
                                        ]),
×
128
                                        'nodeId' => $fileElement->getId(),
×
129
                                ],
×
130
                                'starred' => 0,
×
131
                                'createdAt' => (new \DateTime())->setTimestamp((int)$timestamp)->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s'),
×
132
                        ];
×
133
                }
134
                return $return;
×
135
        }
136

137
        public function isSignElementsAvailable(): bool {
138
                return $this->signatureBackgroundService->isEnabled() || $this->signatureTextService->isEnabled();
4✔
139
        }
140

141
        public function canCreateSignature(): bool {
142
                return !in_array(
2✔
143
                        $this->signatureTextService->getRenderMode(),
2✔
144
                        [
2✔
145
                                self::RENDER_MODE_DESCRIPTION_ONLY,
2✔
146
                                self::RENDER_MODE_SIGNAME_AND_DESCRIPTION,
2✔
147
                        ]
2✔
148
                );
2✔
149
        }
150
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc