Skip to content

Commit c9cd6ad

Browse files
committed
refactor: simplify FileController and fix type annotations
- Remove duplicate fileName extraction logic in saveFiles - Let prepareFileForSaving handle all name extraction - Fix Psalm type annotations with fully qualified namespaces - Add inline @var annotation for parameter type Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent 81aeff9 commit c9cd6ad

File tree

1 file changed

+106
-82
lines changed

1 file changed

+106
-82
lines changed

lib/Controller/FileController.php

Lines changed: 106 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -417,15 +417,11 @@ public function save(
417417
array $files = [],
418418
): DataResponse {
419419
try {
420-
if ((empty($file) && empty($files)) || (!empty($files) && count($files) === 0)) {
421-
throw new LibresignException($this->l10n->t('File or files parameter is required'));
422-
}
420+
$this->validateHelper->canRequestSign($this->userSession->getUser());
423421

424-
if (!empty($files)) {
425-
return $this->saveMultipleFiles($files, $name, $settings);
426-
}
422+
$normalizedFiles = $this->prepareFilesForSaving($file, $files, $settings);
427423

428-
return $this->saveSingleFile($file, $name, $settings);
424+
return $this->saveFiles($normalizedFiles, $name, $settings);
429425
} catch (LibresignException $e) {
430426
return new DataResponse(
431427
[
@@ -437,87 +433,119 @@ public function save(
437433
}
438434

439435
/**
440-
* @return DataResponse<Http::STATUS_OK, LibresignNextcloudFile, array{}>
436+
* @return array{node: Node, name: string}
441437
*/
442-
private function saveSingleFile(array $file, string $name, array $settings): DataResponse {
438+
private function prepareFileForSaving(array $fileData, string $name, array $settings): array {
443439
if (empty($name)) {
444-
if (!empty($file['url'])) {
445-
$name = rawurldecode(pathinfo($file['url'], PATHINFO_FILENAME));
446-
}
440+
$name = $this->extractFileName($fileData);
447441
}
448442
if (empty($name)) {
449443
throw new LibresignException($this->l10n->t('Name is mandatory'));
450444
}
451445

452-
$this->validateHelper->validateNewFile([
453-
'file' => $file,
454-
'userManager' => $this->userSession->getUser(),
455-
]);
456-
$this->validateHelper->canRequestSign($this->userSession->getUser());
446+
if (isset($fileData['fileNode']) && $fileData['fileNode'] instanceof Node) {
447+
$node = $fileData['fileNode'];
448+
$name = $fileData['name'] ?? $name;
449+
} else {
450+
$this->validateHelper->validateNewFile([
451+
'file' => $fileData,
452+
'userManager' => $this->userSession->getUser(),
453+
]);
457454

458-
$node = $this->fileService->getNodeFromData([
459-
'userManager' => $this->userSession->getUser(),
460-
'name' => $name,
461-
'file' => $file,
462-
'settings' => $settings
463-
]);
455+
$node = $this->fileService->getNodeFromData([
456+
'userManager' => $this->userSession->getUser(),
457+
'name' => $name,
458+
'file' => $fileData,
459+
'settings' => $settings
460+
]);
461+
}
464462

465-
$data = [
466-
'file' => [
467-
'fileNode' => $node,
468-
],
463+
return [
464+
'node' => $node,
469465
'name' => $name,
470-
'userManager' => $this->userSession->getUser(),
471-
'status' => FileEntity::STATUS_DRAFT,
472466
];
473-
$savedFile = $this->requestSignatureService->save($data);
467+
}
474468

475-
return new DataResponse(
476-
[
477-
'message' => $this->l10n->t('Success'),
478-
'id' => $savedFile->getNodeId(),
479-
'uuid' => $savedFile->getUuid(),
480-
'name' => $savedFile->getName(),
481-
'status' => $savedFile->getStatus(),
482-
'statusText' => $this->fileMapper->getTextOfStatus($savedFile->getStatus()),
483-
'nodeType' => $savedFile->getNodeType(),
484-
'created_at' => $savedFile->getCreatedAt()->format(\DateTimeInterface::ATOM),
485-
'files' => [$this->formatFilesResponse([$savedFile])[0]],
486-
],
487-
Http::STATUS_OK
469+
/**
470+
* @return list<array{fileNode?: Node, name?: string}> Normalized files array
471+
*/
472+
private function prepareFilesForSaving(array $file, array $files, array $settings): array {
473+
$uploadedFiles = $this->request->getUploadedFile('files') ?: $this->request->getUploadedFile('file');
474+
475+
if ($uploadedFiles) {
476+
return $this->processUploadedFiles($uploadedFiles, $settings);
477+
}
478+
479+
if (!empty($files)) {
480+
/** @var list<array{fileNode?: Node, name?: string}> $files */
481+
return $files;
482+
}
483+
484+
if (!empty($file)) {
485+
return [$file];
486+
}
487+
488+
throw new LibresignException($this->l10n->t('File or files parameter is required'));
489+
}
490+
491+
/**
492+
* @return list<array{fileNode: Node, name: string}>
493+
*/
494+
private function processUploadedFiles(array $uploadedFiles, array $settings): array {
495+
$filesArray = [];
496+
497+
if (isset($uploadedFiles['tmp_name'])) {
498+
if (is_array($uploadedFiles['tmp_name'])) {
499+
$count = count($uploadedFiles['tmp_name']);
500+
for ($i = 0; $i < $count; $i++) {
501+
$filesArray[] = [
502+
'tmp_name' => $uploadedFiles['tmp_name'][$i],
503+
'name' => $uploadedFiles['name'][$i],
504+
'type' => $uploadedFiles['type'][$i],
505+
'size' => $uploadedFiles['size'][$i],
506+
'error' => $uploadedFiles['error'][$i],
507+
];
508+
}
509+
} else {
510+
$filesArray[] = $uploadedFiles;
511+
}
512+
}
513+
514+
if (empty($filesArray)) {
515+
throw new LibresignException($this->l10n->t('No files uploaded'));
516+
}
517+
518+
return $this->fileService->processUploadedFilesWithRollback(
519+
$filesArray,
520+
$this->userSession->getUser(),
521+
$settings
488522
);
489523
}
490524

491525
/**
492526
* @return DataResponse<Http::STATUS_OK, LibresignNextcloudFile, array{}>
493527
*/
494-
private function saveMultipleFiles(array $files, string $name, array $settings): DataResponse {
495-
if (!$this->appConfig->getValueBool(Application::APP_ID, 'envelope_enabled', true)) {
496-
throw new LibresignException($this->l10n->t('Envelope feature is disabled'));
528+
private function saveFiles(array $files, string $name, array $settings): DataResponse {
529+
if (empty($files)) {
530+
throw new LibresignException($this->l10n->t('File or files parameter is required'));
497531
}
498532

499-
$this->validateFilesArray($files);
500-
$this->validateHelper->canRequestSign($this->userSession->getUser());
501-
502533
$preparedFiles = [];
503534
foreach ($files as $fileData) {
504-
$this->validateHelper->validateNewFile([
505-
'file' => $fileData,
506-
'userManager' => $this->userSession->getUser(),
507-
]);
535+
$fileName = (count($files) === 1) ? $name : '';
536+
$preparedFiles[] = $this->prepareFileForSaving($fileData, $fileName, $settings);
537+
}
508538

509-
$fileName = $this->extractFileName($fileData);
510-
$node = $this->fileService->getNodeFromData([
539+
if (count($preparedFiles) === 1) {
540+
$prepared = $preparedFiles[0];
541+
$savedFile = $this->requestSignatureService->save([
542+
'file' => ['fileNode' => $prepared['node']],
543+
'name' => $prepared['name'],
511544
'userManager' => $this->userSession->getUser(),
512-
'name' => $fileName,
513-
'file' => $fileData,
514-
'settings' => $settings
545+
'status' => FileEntity::STATUS_DRAFT,
515546
]);
516547

517-
$preparedFiles[] = [
518-
'node' => $node,
519-
'name' => $fileName,
520-
];
548+
return $this->formatFileResponse($savedFile, [$savedFile]);
521549
}
522550

523551
$result = $this->requestSignatureService->saveEnvelope([
@@ -527,19 +555,26 @@ private function saveMultipleFiles(array $files, string $name, array $settings):
527555
'settings' => $settings,
528556
]);
529557

530-
$envelope = $result['envelope'];
558+
return $this->formatFileResponse($result['envelope'], $result['files']);
559+
}
531560

561+
/**
562+
* @param FileEntity $mainEntity The main entity (file or envelope)
563+
* @param FileEntity[] $childFiles Child files (for envelope) or same as mainEntity (for single file)
564+
* @return DataResponse<Http::STATUS_OK, LibresignNextcloudFile, array{}>
565+
*/
566+
private function formatFileResponse(FileEntity $mainEntity, array $childFiles): DataResponse {
532567
return new DataResponse(
533568
[
534569
'message' => $this->l10n->t('Success'),
535-
'id' => $envelope->getNodeId(),
536-
'uuid' => $envelope->getUuid(),
537-
'name' => $envelope->getName(),
538-
'status' => $envelope->getStatus(),
539-
'statusText' => $this->fileMapper->getTextOfStatus($envelope->getStatus()),
540-
'nodeType' => $envelope->getNodeType(),
541-
'created_at' => $envelope->getCreatedAt()->format(\DateTimeInterface::ATOM),
542-
'files' => $this->formatFilesResponse($result['files']),
570+
'id' => $mainEntity->getNodeId(),
571+
'uuid' => $mainEntity->getUuid(),
572+
'name' => $mainEntity->getName(),
573+
'status' => $mainEntity->getStatus(),
574+
'statusText' => $this->fileMapper->getTextOfStatus($mainEntity->getStatus()),
575+
'nodeType' => $mainEntity->getNodeType(),
576+
'created_at' => $mainEntity->getCreatedAt()->format(\DateTimeInterface::ATOM),
577+
'files' => $this->formatFilesResponse($childFiles),
543578
],
544579
Http::STATUS_OK
545580
);
@@ -555,17 +590,6 @@ private function extractFileName(array $fileData): string {
555590
return '';
556591
}
557592

558-
private function validateFilesArray(array $files): void {
559-
if (empty($files)) {
560-
throw new LibresignException($this->l10n->t('At least one file is required'));
561-
}
562-
563-
$maxFiles = $this->appConfig->getValueInt(Application::APP_ID, 'envelope_max_files', 50);
564-
if (count($files) > $maxFiles) {
565-
throw new LibresignException($this->l10n->t('Maximum of %d files per envelope', [$maxFiles]));
566-
}
567-
}
568-
569593
/**
570594
* @param FileEntity[] $files
571595
* @return list<array{id: int, uuid: string, name: string, status: int}>

0 commit comments

Comments
 (0)