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

LibreSign / libresign / 21367578599

26 Jan 2026 05:36PM UTC coverage: 46.283%. First build
21367578599

Pull #6587

github

web-flow
Merge 4e1a4c315 into 507d36d8b
Pull Request #6587: feat: improve async signing error handling

260 of 308 new or added lines in 10 files covered. (84.42%)

7757 of 16760 relevant lines covered (46.28%)

4.99 hits per line

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

95.83
/lib/Service/SignRequest/StatusService.php
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\SignRequest;
10

11
use OCA\Libresign\Db\File as FileEntity;
12
use OCA\Libresign\Db\SignRequest as SignRequestEntity;
13
use OCA\Libresign\Enum\FileStatus;
14
use OCA\Libresign\Enum\SignRequestStatus;
15
use OCA\Libresign\Service\FileStatusService;
16
use OCA\Libresign\Service\SequentialSigningService;
17

18
class StatusService {
19
        public function __construct(
20
                private SequentialSigningService $sequentialSigningService,
21
                private FileStatusService $fileStatusService,
22
                private StatusCacheService $statusCacheService,
23
        ) {
24
        }
102✔
25

26
        public function shouldNotifySignRequest(SignRequestStatus $signRequestStatus, ?int $fileStatus): bool {
27
                return $this->fileStatusService->canNotifySigners($fileStatus)
19✔
28
                        && $this->canNotifySignRequest($signRequestStatus);
19✔
29
        }
30

31
        public function canNotifySignRequest(SignRequestStatus $status): bool {
32
                return $status === SignRequestStatus::ABLE_TO_SIGN;
19✔
33
        }
34

35
        public function cacheFileStatus(FileEntity $file, int $ttl = StatusCacheService::DEFAULT_TTL): void {
NEW
36
                $this->statusCacheService->setStatus($file->getUuid(), $file->getStatus(), $ttl);
×
37
        }
38

39
        public function updateStatusIfAllowed(
40
                SignRequestEntity $signRequest,
41
                SignRequestStatus $currentStatus,
42
                SignRequestStatus $desiredStatus,
43
                bool $isNewSignRequest,
44
        ): void {
45
                if ($isNewSignRequest || $this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)) {
24✔
46
                        $signRequest->setStatusEnum($desiredStatus);
19✔
47
                }
48
        }
49

50
        public function determineInitialStatus(
51
                int $signingOrder,
52
                int $fileId,
53
                ?int $fileStatus = null,
54
                ?int $signerStatus = null,
55
                ?SignRequestStatus $currentStatus = null,
56
        ): SignRequestStatus {
57
                if ($fileStatus === FileStatus::DRAFT->value) {
48✔
58
                        return SignRequestStatus::DRAFT;
6✔
59
                }
60

61
                if ($fileStatus === FileStatus::ABLE_TO_SIGN->value) {
42✔
62
                        return $this->determineStatusForAbleToSignFile($signingOrder);
26✔
63
                }
64

65
                if ($signerStatus !== null) {
16✔
66
                        return $this->handleExplicitSignerStatus($signerStatus, $signingOrder, $fileId, $currentStatus);
9✔
67
                }
68

69
                return $this->getDefaultStatusByFlow($signingOrder);
7✔
70
        }
71

72
        private function determineStatusForAbleToSignFile(int $signingOrder): SignRequestStatus {
73
                if ($this->sequentialSigningService->isOrderedNumericFlow()) {
26✔
74
                        return $signingOrder === 1 ? SignRequestStatus::ABLE_TO_SIGN : SignRequestStatus::DRAFT;
7✔
75
                }
76
                return SignRequestStatus::ABLE_TO_SIGN;
19✔
77
        }
78

79
        private function handleExplicitSignerStatus(
80
                int $signerStatus,
81
                int $signingOrder,
82
                int $fileId,
83
                ?SignRequestStatus $currentStatus,
84
        ): SignRequestStatus {
85
                $desiredStatus = SignRequestStatus::from($signerStatus);
9✔
86

87
                if ($currentStatus !== null && !$this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)) {
9✔
88
                        return $currentStatus;
2✔
89
                }
90

91
                return $this->sequentialSigningService->validateStatusByOrder($desiredStatus, $signingOrder, $fileId);
7✔
92
        }
93

94
        private function getDefaultStatusByFlow(int $signingOrder): SignRequestStatus {
95
                if (!$this->sequentialSigningService->isOrderedNumericFlow()) {
7✔
96
                        return SignRequestStatus::ABLE_TO_SIGN;
3✔
97
                }
98

99
                return $signingOrder === 1 ? SignRequestStatus::ABLE_TO_SIGN : SignRequestStatus::DRAFT;
4✔
100
        }
101
}
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