@@ -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