2023-05-12 11:52:04 -04:00
< ? php
declare ( strict_types = 1 );
/**
2024-05-28 10:42:42 -04:00
* SPDX - FileCopyrightText : 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2023-05-12 11:52:04 -04:00
*/
namespace OCA\Files\Command\Object ;
use OCP\Files\IMimeTypeDetector ;
use Symfony\Component\Console\Command\Command ;
use Symfony\Component\Console\Helper\QuestionHelper ;
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Output\OutputInterface ;
use Symfony\Component\Console\Question\ConfirmationQuestion ;
class Put extends Command {
2023-07-04 14:43:32 -04:00
public function __construct (
private ObjectUtil $objectUtils ,
private IMimeTypeDetector $mimeTypeDetector ,
) {
2023-05-12 11:52:04 -04:00
parent :: __construct ();
}
protected function configure () : void {
$this
-> setName ( 'files:object:put' )
-> setDescription ( 'Write a file to the object store' )
2024-08-23 09:10:27 -04:00
-> addArgument ( 'input' , InputArgument :: REQUIRED , 'Source local path, use - to read from STDIN' )
-> addArgument ( 'object' , InputArgument :: REQUIRED , 'Object to write' )
2023-11-23 04:22:34 -05:00
-> addOption ( 'bucket' , 'b' , InputOption :: VALUE_REQUIRED , " Bucket where to store the object, only required in cases where it can't be determined from the config " );
;
2023-05-12 11:52:04 -04:00
}
public function execute ( InputInterface $input , OutputInterface $output ) : int {
$object = $input -> getArgument ( 'object' );
$inputName = ( string ) $input -> getArgument ( 'input' );
2024-08-23 09:10:27 -04:00
$objectStore = $this -> objectUtils -> getObjectStore ( $input -> getOption ( 'bucket' ), $output );
2023-05-12 11:52:04 -04:00
if ( ! $objectStore ) {
return - 1 ;
}
if ( $fileId = $this -> objectUtils -> objectExistsInDb ( $object )) {
$output -> writeln ( " <error>Warning, object $object belongs to an existing file, overwriting the object contents can lead to unexpected behavior.</error> " );
$output -> writeln ( " You can use <info>occ files:put $inputName $fileId </info> to write to the file safely. " );
2024-08-23 09:10:27 -04:00
$output -> writeln ( '' );
2023-05-12 11:52:04 -04:00
/** @var QuestionHelper $helper */
$helper = $this -> getHelper ( 'question' );
2024-08-23 09:10:27 -04:00
$question = new ConfirmationQuestion ( 'Write to the object anyway? [y/N] ' , false );
2023-05-12 11:52:04 -04:00
if ( ! $helper -> ask ( $input , $output , $question )) {
return - 1 ;
}
}
$source = $inputName === '-' ? STDIN : fopen ( $inputName , 'r' );
if ( ! $source ) {
$output -> writeln ( " <error>Failed to open $inputName </error> " );
2023-07-04 14:43:32 -04:00
return self :: FAILURE ;
2023-05-12 11:52:04 -04:00
}
$objectStore -> writeObject ( $object , $source , $this -> mimeTypeDetector -> detectPath ( $inputName ));
2023-07-04 14:43:32 -04:00
return self :: SUCCESS ;
2023-05-12 11:52:04 -04:00
}
}