Skip to content

Commit bf579b8

Browse files
Valentin Clavreulshavounet
Valentin Clavreul
authored andcommitted
Added a few utils task to list and remove files from a filesystem
1 parent 91d1c18 commit bf579b8

File tree

3 files changed

+228
-0
lines changed

3 files changed

+228
-0
lines changed

Task/FilesystemOptionTrait.php

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php declare(strict_types=1);
2+
/**
3+
* This file is part of the CleverAge/FlysystemProcessBundle package.
4+
*
5+
* Copyright (C) 2017-2019 Clever-Age
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace CleverAge\FlysystemProcessBundle\Task;
12+
13+
use CleverAge\ProcessBundle\Model\ProcessState;
14+
use League\Flysystem\FilesystemInterface;
15+
use League\Flysystem\MountManager;
16+
use Symfony\Component\OptionsResolver\Options;
17+
use Symfony\Component\OptionsResolver\OptionsResolver;
18+
19+
/**
20+
* Tools to use filesystem inside task configurations
21+
*/
22+
trait FilesystemOptionTrait
23+
{
24+
protected function configureFilesystemOption(OptionsResolver $resolver, $optionName)
25+
{
26+
$resolver->setRequired($optionName);
27+
$resolver->setAllowedTypes($optionName, 'string');
28+
$resolver->setNormalizer($optionName, function (Options $options, $value) {
29+
return $this->getMountManager()->getFilesystem($value);
30+
});
31+
}
32+
33+
protected function getFilesystem(ProcessState $state, $optionName): FilesystemInterface
34+
{
35+
return $this->getOption($state, $optionName);
36+
}
37+
38+
abstract protected function getMountManager(): MountManager;
39+
40+
/**
41+
* @see \CleverAge\ProcessBundle\Model\AbstractConfigurableTask::getOption
42+
*
43+
* @param ProcessState $state
44+
* @param string $code
45+
*
46+
* @return mixed
47+
*/
48+
abstract protected function getOption(ProcessState $state, $code);
49+
}

Task/ListContentTask.php

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<?php declare(strict_types=1);
2+
/**
3+
* This file is part of the CleverAge/FlysystemProcessBundle package.
4+
*
5+
* Copyright (C) 2017-2019 Clever-Age
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace CleverAge\FlysystemProcessBundle\Task;
12+
13+
use CleverAge\ProcessBundle\Model\AbstractConfigurableTask;
14+
use CleverAge\ProcessBundle\Model\IterableTaskInterface;
15+
use CleverAge\ProcessBundle\Model\ProcessState;
16+
use League\Flysystem\FilesystemInterface;
17+
use League\Flysystem\MountManager;
18+
use Symfony\Component\OptionsResolver\OptionsResolver;
19+
20+
/**
21+
* Iterate over the content of a filesystem
22+
*/
23+
class ListContentTask extends AbstractConfigurableTask implements IterableTaskInterface
24+
{
25+
use FilesystemOptionTrait;
26+
27+
/** @var MountManager */
28+
protected $mountManager;
29+
30+
/** @var array|null */
31+
protected $fsContent = null;
32+
33+
/**
34+
* ListContentTask constructor.
35+
*
36+
* @param MountManager $mountManager
37+
*/
38+
public function __construct(MountManager $mountManager)
39+
{
40+
$this->mountManager = $mountManager;
41+
}
42+
43+
protected function configureOptions(OptionsResolver $resolver)
44+
{
45+
$this->configureFilesystemOption($resolver, 'filesystem');
46+
47+
$resolver->setDefault('file_pattern', null);
48+
$resolver->setAllowedTypes('file_pattern', ['null', 'string']);
49+
}
50+
51+
/**
52+
* @param ProcessState $state
53+
*
54+
* @throws \Symfony\Component\OptionsResolver\Exception\ExceptionInterface
55+
*/
56+
public function execute(ProcessState $state)
57+
{
58+
if ($this->fsContent === null || key($this->fsContent) === null) {
59+
$filesystem = $this->getFilesystem($state, 'filesystem');
60+
$pattern = $this->getOption($state, 'file_pattern');
61+
62+
$this->fsContent = $this->getFilteredFilesystemContents($filesystem, $pattern);
63+
}
64+
65+
if (key($this->fsContent) === null) {
66+
$state->setSkipped(true);
67+
$this->fsContent = null;
68+
} else {
69+
$state->setOutput(current($this->fsContent));
70+
}
71+
}
72+
73+
public function next(ProcessState $state)
74+
{
75+
if (!is_array($this->fsContent)) {
76+
return false;
77+
}
78+
79+
next($this->fsContent);
80+
81+
return key($this->fsContent) !== null;
82+
}
83+
84+
85+
/**
86+
* @param FilesystemInterface $filesystem
87+
* @param string|null $pattern
88+
*
89+
* @return array
90+
*/
91+
protected function getFilteredFilesystemContents(FilesystemInterface $filesystem, $pattern = null): array
92+
{
93+
$results = [];
94+
foreach ($filesystem->listContents() as $item) {
95+
if ($pattern === null || \preg_match($pattern, $item['path'])) {
96+
$results[] = $item;
97+
}
98+
}
99+
100+
return $results;
101+
}
102+
103+
/**
104+
* @return MountManager
105+
*/
106+
protected function getMountManager(): MountManager
107+
{
108+
return $this->mountManager;
109+
}
110+
111+
}

Task/RemoveFileTask.php

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php declare(strict_types=1);
2+
/**
3+
* This file is part of the CleverAge/FlysystemProcessBundle package.
4+
*
5+
* Copyright (C) 2017-2019 Clever-Age
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace CleverAge\FlysystemProcessBundle\Task;
12+
13+
use CleverAge\ProcessBundle\Model\AbstractConfigurableTask;
14+
use CleverAge\ProcessBundle\Model\ProcessState;
15+
use League\Flysystem\MountManager;
16+
use Psr\Log\LoggerInterface;
17+
use Symfony\Component\OptionsResolver\OptionsResolver;
18+
19+
/**
20+
* Remove a file from a filesystem
21+
*/
22+
class RemoveFileTask extends AbstractConfigurableTask
23+
{
24+
use FilesystemOptionTrait;
25+
26+
/** @var MountManager */
27+
protected $mountManager;
28+
29+
/** @var LoggerInterface */
30+
protected $logger;
31+
32+
/**
33+
* RemoveFileTask constructor.
34+
*
35+
* @param MountManager $mountManager
36+
* @param LoggerInterface $logger
37+
*/
38+
public function __construct(MountManager $mountManager, LoggerInterface $logger)
39+
{
40+
$this->mountManager = $mountManager;
41+
$this->logger = $logger;
42+
}
43+
44+
protected function configureOptions(OptionsResolver $resolver)
45+
{
46+
$this->configureFilesystemOption($resolver, 'filesystem');
47+
}
48+
49+
public function execute(ProcessState $state)
50+
{
51+
$filesystem = $this->getFilesystem($state, 'filesystem');
52+
$filePath = $state->getInput();
53+
54+
$success = $filesystem->delete($filePath);
55+
56+
if ($success) {
57+
$this->logger->info('Deleted input file', ['file' => $filePath]);
58+
} else {
59+
$this->logger->warning('Failed to deleted input file', ['file' => $filePath]);
60+
}
61+
}
62+
63+
protected function getMountManager(): MountManager
64+
{
65+
return $this->mountManager;
66+
}
67+
68+
}

0 commit comments

Comments
 (0)