Skip to content

Commit

Permalink
Managing object tags (GetObjectTagging/PutObjectTagging/DeleteObjectT…
Browse files Browse the repository at this point in the history
…agging) (#1453)

* Support Put/Delete/Get ObjectTagging

* added documentation

* fixed tests

* updated from master
  • Loading branch information
melya authored Jun 23, 2023
1 parent 69c7bff commit 72cca34
Show file tree
Hide file tree
Showing 17 changed files with 1,411 additions and 0 deletions.
38 changes: 38 additions & 0 deletions docs/clients/s3.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,44 @@ $client->putBucketTagging(
);
```

### Managing object tags

You can associate multiple key-value pairs (tags) with each of your S3 objects, with the ability to change them at any time.
The tags can be used to manage and control access, set up lifecycle rules, customize S3 Storage Class Analysis, and filter CloudWatch metrics.

Learn more at [Simplify your data lifecycle by using object tags with Amazon S3 Lifecycle](https://aws.amazon.com/blogs/storage/simplify-your-data-lifecycle-by-using-object-tags-with-amazon-s3-lifecycle/)

```php
$client->putObjectTagging(
new PutObjectTaggingRequest([
'Bucket' => 'examplebucket',
'Key' => 'baz/HappyFace.jpg',
'Tagging' => new Tagging([
'TagSet' => [
new Tag([
'Key' => 'expire-after-30-days',
'Value' => '1',
])
],
]),
])
);

$client->getObjectTagging(
new GetObjectTaggingRequest([
'Bucket' => 'examplebucket',
'Key' => 'baz/HappyFace.jpg',
])
);

$client->deleteObjectTagging(
new DeleteObjectTaggingRequest([
'Bucket' => 'examplebucket',
'Key' => 'baz/HappyFace.jpg',
])
);
```

## Virtual Hosted-Style Requests

When calling AWS endpoints, AsyncAws uses [Virtual Hosted-Style Requests](https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html):
Expand Down
3 changes: 3 additions & 0 deletions manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -540,11 +540,13 @@
"DeleteBucket",
"DeleteBucketCors",
"DeleteObject",
"DeleteObjectTagging",
"DeleteObjects",
"GetBucketCors",
"GetBucketEncryption",
"GetObject",
"GetObjectAcl",
"GetObjectTagging",
"HeadObject",
"ListBuckets",
"ListMultipartUploads",
Expand All @@ -557,6 +559,7 @@
"PutBucketTagging",
"PutObject",
"PutObjectAcl",
"PutObjectTagging",
"UploadPart"
]
},
Expand Down
165 changes: 165 additions & 0 deletions src/Service/S3/src/Input/DeleteObjectTaggingRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
<?php

namespace AsyncAws\S3\Input;

use AsyncAws\Core\Exception\InvalidArgument;
use AsyncAws\Core\Input;
use AsyncAws\Core\Request;
use AsyncAws\Core\Stream\StreamFactory;

final class DeleteObjectTaggingRequest extends Input
{
/**
* The bucket name containing the objects from which to remove the tags.
*
* When using this action with an access point, you must direct requests to the access point hostname. The access point
* hostname takes the form *AccessPointName*-*AccountId*.s3-accesspoint.*Region*.amazonaws.com. When using this action
* with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket
* name. For more information about access point ARNs, see Using access points [^1] in the *Amazon S3 User Guide*.
*
* When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3
* on Outposts hostname takes the form `*AccessPointName*-*AccountId*.*outpostID*.s3-outposts.*Region*.amazonaws.com`.
* When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access
* point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts
* [^2] in the *Amazon S3 User Guide*.
*
* [^1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html
* [^2]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html
*
* @required
*
* @var string|null
*/
private $bucket;

/**
* The key that identifies the object in the bucket from which to remove all tags.
*
* @required
*
* @var string|null
*/
private $key;

/**
* The versionId of the object that the tag-set will be removed from.
*
* @var string|null
*/
private $versionId;

/**
* The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with
* the HTTP status code `403 Forbidden` (access denied).
*
* @var string|null
*/
private $expectedBucketOwner;

/**
* @param array{
* Bucket?: string,
* Key?: string,
* VersionId?: string,
* ExpectedBucketOwner?: string,
* '@region'?: string|null,
* } $input
*/
public function __construct(array $input = [])
{
$this->bucket = $input['Bucket'] ?? null;
$this->key = $input['Key'] ?? null;
$this->versionId = $input['VersionId'] ?? null;
$this->expectedBucketOwner = $input['ExpectedBucketOwner'] ?? null;
parent::__construct($input);
}

public static function create($input): self
{
return $input instanceof self ? $input : new self($input);
}

public function getBucket(): ?string
{
return $this->bucket;
}

public function getExpectedBucketOwner(): ?string
{
return $this->expectedBucketOwner;
}

public function getKey(): ?string
{
return $this->key;
}

public function getVersionId(): ?string
{
return $this->versionId;
}

/**
* @internal
*/
public function request(): Request
{
// Prepare headers
$headers = ['content-type' => 'application/xml'];
if (null !== $this->expectedBucketOwner) {
$headers['x-amz-expected-bucket-owner'] = $this->expectedBucketOwner;
}

// Prepare query
$query = [];
if (null !== $this->versionId) {
$query['versionId'] = $this->versionId;
}

// Prepare URI
$uri = [];
if (null === $v = $this->bucket) {
throw new InvalidArgument(sprintf('Missing parameter "Bucket" for "%s". The value cannot be null.', __CLASS__));
}
$uri['Bucket'] = $v;
if (null === $v = $this->key) {
throw new InvalidArgument(sprintf('Missing parameter "Key" for "%s". The value cannot be null.', __CLASS__));
}
$uri['Key'] = $v;
$uriString = '/' . rawurlencode($uri['Bucket']) . '/' . str_replace('%2F', '/', rawurlencode($uri['Key'])) . '?tagging';

// Prepare Body
$body = '';

// Return the Request
return new Request('DELETE', $uriString, $query, $headers, StreamFactory::create($body));
}

public function setBucket(?string $value): self
{
$this->bucket = $value;

return $this;
}

public function setExpectedBucketOwner(?string $value): self
{
$this->expectedBucketOwner = $value;

return $this;
}

public function setKey(?string $value): self
{
$this->key = $value;

return $this;
}

public function setVersionId(?string $value): self
{
$this->versionId = $value;

return $this;
}
}
Loading

0 comments on commit 72cca34

Please sign in to comment.