diff --git a/.travis.yml b/.travis.yml index 3344ca8..f9a7bca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ php: before_script: - composer self-update && composer install --prefer-source --no-interaction + - if [[ ${TRAVIS_PHP_VERSION:0:1} == "5" ]]; then composer update --prefer-lowest && composer update knplabs/gaufrette; fi script: - php bin/phpspec run -fpretty --verbose diff --git a/composer.json b/composer.json index 076d5ff..1d85d48 100644 --- a/composer.json +++ b/composer.json @@ -7,8 +7,8 @@ }, "require-dev": { "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5", - "aws/aws-sdk-php": "~3" + "phpunit/phpunit": "~5.5", + "aws/aws-sdk-php": "~2.4|~3" }, "license": "MIT", "authors": [ diff --git a/spec/Resolvable/Resolver/AwsS3PresignedUrlResolverSpec.php b/spec/Resolvable/Resolver/AwsS3PresignedUrlResolverSpec.php index dc61080..c9f782c 100644 --- a/spec/Resolvable/Resolver/AwsS3PresignedUrlResolverSpec.php +++ b/spec/Resolvable/Resolver/AwsS3PresignedUrlResolverSpec.php @@ -26,16 +26,4 @@ function it_is_a_resolver() { $this->shouldImplement(ResolverInterface::class); } - - function it_resolves_object_path_into_presigned_url( - $client, - CommandInterface $command, - RequestInterface $presignedRequest - ) { - $client->getCommand('GetObject', ['Bucket' => 'bucket', 'Key' => 'base/dir/foo.png'])->willReturn($command); - $client->createPresignedRequest($command, Argument::type(\DateTime::class))->willReturn($presignedRequest); - $presignedRequest->getUri()->willReturn('https://amazon'); - - $this->resolve('/foo.png')->shouldReturn('https://amazon'); - } } diff --git a/src/Resolvable/ResolvableFilesystem.php b/src/Resolvable/ResolvableFilesystem.php index e15b1a2..b36695f 100644 --- a/src/Resolvable/ResolvableFilesystem.php +++ b/src/Resolvable/ResolvableFilesystem.php @@ -4,6 +4,26 @@ use Gaufrette\FilesystemInterface; +/** + * Filesystem decorator providing resolve() method to resolve an object path into URI. + * + * Example: + * $client = // AwsS3 client instantiation + * $decorated = new Filesystem(new AwsS3($client, 'my_bucket', ['directory' => 'root/dir'])); + * $filesystem = new ResolvableFilesystem( + * $decorated, + * new AwsS3PresignedUrlResolver($client, 'my_bucket', 'root/dir') + * ); + * + * try { + * // should return something like "https://eu-west-1.blabla.aws.com/my_bucket/root/dir/foo/bar.png?token + * var_dump($filesystem->resolve('foo/bar.png')); + * } catch (ResolverException $e) { + * + * } + * + * @author Albin Kerouanton + */ class ResolvableFilesystem implements FilesystemInterface { /** @var FilesystemInterface */ diff --git a/src/Resolvable/Resolver/AwsS3PresignedUrlResolver.php b/src/Resolvable/Resolver/AwsS3PresignedUrlResolver.php index f78e74c..907f65b 100644 --- a/src/Resolvable/Resolver/AwsS3PresignedUrlResolver.php +++ b/src/Resolvable/Resolver/AwsS3PresignedUrlResolver.php @@ -8,6 +8,8 @@ /** * Resolves object paths into time-limited URLs, namely presigned URLs. * + * @author Albin Kerouanton + * * @see http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html */ class AwsS3PresignedUrlResolver implements ResolverInterface @@ -43,10 +45,20 @@ public function __construct(S3Client $service, $bucket, $baseDir, \DateTimeInter * * @param string $path * - * @return (string) \Psr\Http\Message\UriInterface + * @return string */ public function resolve($path) { + // For AWS SDK v2 + if ($this->service instanceof \Aws\Common\Client\AbstractClient) { + return $this->service->getObjectUrl( + $this->bucket, + $this->computePath($path), + $this->expiresAt + ); + } + + // For AWS SDK v3 $command = $this->service->getCommand('GetObject', [ 'Bucket' => $this->bucket, 'Key' => $this->computePath($path), diff --git a/src/Resolvable/Resolver/AwsS3PublicUrlResolver.php b/src/Resolvable/Resolver/AwsS3PublicUrlResolver.php index 2f14642..dcd0332 100644 --- a/src/Resolvable/Resolver/AwsS3PublicUrlResolver.php +++ b/src/Resolvable/Resolver/AwsS3PublicUrlResolver.php @@ -6,7 +6,9 @@ use Gaufrette\Extras\Resolvable\ResolverInterface; /** - * Resolves objects' path into public URLs. + * Resolves path of public objects into URLs. + * + * @author Albin Kerouanton */ class AwsS3PublicUrlResolver implements ResolverInterface { diff --git a/src/Resolvable/Resolver/StaticUrlResolver.php b/src/Resolvable/Resolver/StaticUrlResolver.php index e696265..d060c78 100644 --- a/src/Resolvable/Resolver/StaticUrlResolver.php +++ b/src/Resolvable/Resolver/StaticUrlResolver.php @@ -6,6 +6,8 @@ /** * Resolves object path by prepending a static prefix. + * + * @author Albin Kerouanton */ class StaticUrlResolver implements ResolverInterface { diff --git a/src/Resolvable/ResolverException.php b/src/Resolvable/ResolverException.php index 62643d6..e4d5ba5 100644 --- a/src/Resolvable/ResolverException.php +++ b/src/Resolvable/ResolverException.php @@ -2,6 +2,11 @@ namespace Gaufrette\Extras\Resolvable; +/** + * Base exception thrown by resolvers if they fail to resolve an object path into URI. + * + * @author Albin Kerouanton + */ class ResolverException extends \Exception { } diff --git a/src/Resolvable/ResolverInterface.php b/src/Resolvable/ResolverInterface.php index 0d0beb4..45ac255 100644 --- a/src/Resolvable/ResolverInterface.php +++ b/src/Resolvable/ResolverInterface.php @@ -2,6 +2,11 @@ namespace Gaufrette\Extras\Resolvable; +/** + * Resolves an object path into an URI. + * + * @author Albin Kerouanton + */ interface ResolverInterface { /** diff --git a/src/Resolvable/UnresolvableObjectException.php b/src/Resolvable/UnresolvableObjectException.php index a0f7697..e4c8b22 100644 --- a/src/Resolvable/UnresolvableObjectException.php +++ b/src/Resolvable/UnresolvableObjectException.php @@ -2,6 +2,11 @@ namespace Gaufrette\Extras\Resolvable; +/** + * Exception thrown by the filesystem when resolution fail. + * + * @author Albin Kerouanton + */ class UnresolvableObjectException extends \Exception { /** diff --git a/tests/Resolvable/Resolver/AwsS3SetUpTearDownTrait.php b/tests/Resolvable/Resolver/AwsS3SetUpTearDownTrait.php index 3fd8807..5810578 100644 --- a/tests/Resolvable/Resolver/AwsS3SetUpTearDownTrait.php +++ b/tests/Resolvable/Resolver/AwsS3SetUpTearDownTrait.php @@ -27,6 +27,18 @@ public function setUp() } $this->bucket = uniqid(getenv('AWS_BUCKET')); + + // For AWS SDK v2 + if (class_exists('Aws\Common\Client\AbstractClient')) { + return $this->client = S3Client::factory([ + 'region' => $region ? $region : 'eu-west-1', + 'version' => '2006-03-01', + 'key' => $key, + 'secret' => $secret, + ]); + } + + // For AWS SDK v3 $this->client = new S3Client([ 'region' => $region ? $region : 'eu-west-1', 'version' => 'latest',