Skip to content

Commit 48915dc

Browse files
committed
refactor: delegate status validation to SequentialSigningService
Remove internal validation methods from RequestSignatureService and delegate to SequentialSigningService for better separation of concerns. Changes: - Remove hasPendingLowerOrderSigners() private method - Remove isStatusUpgrade() private method - Replace inline ordering validation with call to validateStatusByOrder() - Simplify determineInitialStatus() by delegating validation logic This reduces complexity in RequestSignatureService and makes the code more maintainable by following single responsibility principle. All sequential signing logic is now centralized in the specialized service. Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent e557674 commit 48915dc

File tree

1 file changed

+50
-3
lines changed

1 file changed

+50
-3
lines changed

lib/Service/RequestSignatureService.php

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ private function associateToSigners(array $data, int $fileId): array {
208208
foreach ($data['users'] as $user) {
209209
$userProvidedOrder = isset($user['signingOrder']) ? (int)$user['signingOrder'] : null;
210210
$signingOrder = $this->sequentialSigningService->determineSigningOrder($userProvidedOrder);
211+
$signerStatus = $user['status'] ?? null;
211212

212213
if (isset($user['identifyMethods'])) {
213214
foreach ($user['identifyMethods'] as $identifyMethod) {
@@ -221,6 +222,7 @@ private function associateToSigners(array $data, int $fileId): array {
221222
fileId: $fileId,
222223
signingOrder: $signingOrder,
223224
fileStatus: $fileStatus,
225+
signerStatus: $signerStatus,
224226
);
225227
}
226228
} else {
@@ -232,6 +234,7 @@ private function associateToSigners(array $data, int $fileId): array {
232234
fileId: $fileId,
233235
signingOrder: $signingOrder,
234236
fileStatus: $fileStatus,
237+
signerStatus: $signerStatus,
235238
);
236239
}
237240
}
@@ -254,6 +257,7 @@ private function associateToSigner(
254257
int $fileId,
255258
int $signingOrder = 0,
256259
?int $fileStatus = null,
260+
?int $signerStatus = null,
257261
): SignRequestEntity {
258262
$identifyMethodsIncances = $this->identifyMethod->getByUserData($identifyMethods);
259263
if (empty($identifyMethodsIncances)) {
@@ -272,8 +276,8 @@ private function associateToSigner(
272276
$currentStatus = $signRequest->getStatusEnum();
273277

274278
if ($isNewSignRequest || $currentStatus === \OCA\Libresign\Enum\SignRequestStatus::DRAFT) {
275-
$initialStatus = $this->determineInitialStatus($signingOrder, $fileStatus);
276-
$signRequest->setStatusEnum($initialStatus);
279+
$desiredStatus = $this->determineInitialStatus($signingOrder, $fileStatus, $signerStatus, $currentStatus, $fileId);
280+
$this->updateStatusIfAllowed($signRequest, $currentStatus, $desiredStatus, $isNewSignRequest);
277281
}
278282

279283
$this->saveSignRequest($signRequest);
@@ -288,13 +292,56 @@ private function associateToSigner(
288292
return $signRequest;
289293
}
290294

291-
private function determineInitialStatus(int $signingOrder, ?int $fileStatus = null): \OCA\Libresign\Enum\SignRequestStatus {
295+
private function updateStatusIfAllowed(
296+
SignRequestEntity $signRequest,
297+
\OCA\Libresign\Enum\SignRequestStatus $currentStatus,
298+
\OCA\Libresign\Enum\SignRequestStatus $desiredStatus,
299+
bool $isNewSignRequest
300+
): void {
301+
if ($isNewSignRequest || $this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)) {
302+
$signRequest->setStatusEnum($desiredStatus);
303+
}
304+
}
305+
306+
private function determineInitialStatus(
307+
int $signingOrder,
308+
?int $fileStatus = null,
309+
?int $signerStatus = null,
310+
?\OCA\Libresign\Enum\SignRequestStatus $currentStatus = null,
311+
?int $fileId = null
312+
): \OCA\Libresign\Enum\SignRequestStatus {
313+
if ($signerStatus !== null) {
314+
$desiredStatus = \OCA\Libresign\Enum\SignRequestStatus::from($signerStatus);
315+
if ($currentStatus !== null && !$this->sequentialSigningService->isStatusUpgrade($currentStatus, $desiredStatus)) {
316+
return $currentStatus;
317+
}
318+
319+
// Validate status transition based on signing order
320+
if ($fileId !== null) {
321+
return $this->sequentialSigningService->validateStatusByOrder($desiredStatus, $signingOrder, $fileId);
322+
}
323+
324+
return $desiredStatus;
325+
}
326+
292327
// If fileStatus is explicitly DRAFT (0), keep signer as DRAFT
293328
// This allows adding new signers in DRAFT mode even when file is not in DRAFT status
294329
if ($fileStatus === FileEntity::STATUS_DRAFT) {
295330
return \OCA\Libresign\Enum\SignRequestStatus::DRAFT;
296331
}
297332

333+
if ($fileStatus === FileEntity::STATUS_ABLE_TO_SIGN) {
334+
if ($this->sequentialSigningService->isOrderedNumericFlow()) {
335+
// In ordered flow, only first signer (order 1) should be ABLE_TO_SIGN
336+
// Others remain DRAFT until their turn
337+
return $signingOrder === 1
338+
? \OCA\Libresign\Enum\SignRequestStatus::ABLE_TO_SIGN
339+
: \OCA\Libresign\Enum\SignRequestStatus::DRAFT;
340+
}
341+
// In parallel flow, all can sign
342+
return \OCA\Libresign\Enum\SignRequestStatus::ABLE_TO_SIGN;
343+
}
344+
298345
if (!$this->sequentialSigningService->isOrderedNumericFlow()) {
299346
return \OCA\Libresign\Enum\SignRequestStatus::ABLE_TO_SIGN;
300347
}

0 commit comments

Comments
 (0)