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

LibreSign / libresign / 25521310733

07 May 2026 08:49PM UTC coverage: 56.843%. First build
25521310733

Pull #7668

github

web-flow
Merge 97a720789 into eb2d0b4fe
Pull Request #7668: fix: align OpenAPI contract and frontend to string-only signatureFlow

16 of 29 new or added lines in 9 files covered. (55.17%)

10741 of 18896 relevant lines covered (56.84%)

6.97 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_GRAPHIC_ONLY = 'GRAPHIC_ONLY';
26
        public const RENDER_MODE_DEFAULT = 'GRAPHIC_AND_DESCRIPTION';
27
        public function __construct(
28
                private FolderService $folderService,
29
                private SessionService $sessionService,
30
                private IURLGenerator $urlGenerator,
31
                private UserElementMapper $userElementMapper,
32
                private SignatureBackgroundService $signatureBackgroundService,
33
                private SignatureTextService $signatureTextService,
34
        ) {
35
        }
63✔
36

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

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

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

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

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

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

142
        public function canCreateSignature(): bool {
143
                return !in_array(
2✔
144
                        $this->signatureTextService->getRenderMode(),
2✔
145
                        [
2✔
146
                                self::RENDER_MODE_DESCRIPTION_ONLY,
2✔
147
                                self::RENDER_MODE_SIGNAME_AND_DESCRIPTION,
2✔
148
                        ]
2✔
149
                );
2✔
150
        }
151
}
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