Spaces:
No application file
No application file
namespace MauticPlugin\MauticCloudStorageBundle\Integration; | |
use Aws\S3\S3Client; | |
use Gaufrette\Adapter\AwsS3; | |
use Gaufrette\Extras\Resolvable\ResolvableFilesystem; | |
use Gaufrette\Extras\Resolvable\Resolver\AwsS3PublicUrlResolver; | |
use Gaufrette\Filesystem; | |
use MauticPlugin\MauticCloudStorageBundle\Exception\NoFormNeededException; | |
use Symfony\Component\Form\Extension\Core\Type\TextType; | |
use Symfony\Component\Form\Form; | |
use Symfony\Component\Form\FormBuilder; | |
class AmazonS3Integration extends CloudStorageIntegration | |
{ | |
private ?ResolvableFilesystem $fileSystem = null; | |
public function getName(): string | |
{ | |
return 'AmazonS3'; | |
} | |
public function getDisplayName(): string | |
{ | |
return 'Amazon S3'; | |
} | |
/** | |
* Get the array key for clientId. | |
*/ | |
public function getClientIdKey(): string | |
{ | |
return 'client_id'; | |
} | |
/** | |
* Get the array key for client secret. | |
*/ | |
public function getClientSecretKey(): string | |
{ | |
return 'client_secret'; | |
} | |
/** | |
* @return array<string, string> | |
*/ | |
public function getRequiredKeyFields(): array | |
{ | |
return [ | |
'client_id' => 'mautic.integration.keyfield.clientid', | |
'client_secret' => 'mautic.integration.keyfield.clientsecret', | |
'bucket' => 'mautic.integration.keyfield.amazons3.bucket', | |
]; | |
} | |
/** | |
* @param Form|FormBuilder $builder | |
* @param array $data | |
* @param string $formArea | |
*/ | |
public function appendToForm(&$builder, $data, $formArea): void | |
{ | |
if ('keys' === $formArea) { | |
$builder->add( | |
'region', | |
TextType::class, | |
[ | |
'label' => 'mautic.integration.Amazon.region', | |
'attr' => ['class' => 'form-control'], | |
'data' => empty($data['region']) ? 'us-east-1' : $data['region'], | |
'required' => false, | |
] | |
); | |
$builder->add( | |
'endpoint', | |
TextType::class, | |
[ | |
'label' => 'mautic.integration.Amazon.endpoint', | |
'attr' => ['class' => 'form-control'], | |
'data' => empty($data['endpoint']) ? null : $data['endpoint'], | |
'required' => false, | |
] | |
); | |
} | |
} | |
/** | |
* @return AwsS3 | |
*/ | |
public function getAdapter() | |
{ | |
if (!$this->adapter || !$this->fileSystem) { | |
$keys = $this->getDecryptedApiKeys(); | |
$s3Args = [ | |
'version' => 'latest', | |
'region' => (empty($keys['region'])) ? 'us-east-1' : $keys['region'], | |
'credentials' => [ | |
'key' => $keys['client_id'], | |
'secret' => $keys['client_secret'], | |
], | |
]; | |
if (!empty($keys['endpoint'])) { | |
$s3Args['endpoint'] = $keys['endpoint']; | |
} | |
$service = new S3Client($s3Args); | |
$this->adapter = new AwsS3($service, $keys['bucket']); | |
$decorated = new Filesystem($this->adapter); | |
$this->fileSystem = new ResolvableFilesystem( | |
$decorated, | |
new AwsS3PublicUrlResolver($service, $keys['bucket']) | |
); | |
} | |
return $this->adapter; | |
} | |
public function getForm(): string | |
{ | |
throw new NoFormNeededException(); | |
} | |
public function getPublicUrl($key) | |
{ | |
$this->getAdapter(); | |
return $this->fileSystem->resolve($key); | |
} | |
} | |