Skip to content

Commit 335846a

Browse files
yangzong18huiguangjun
authored andcommitted
refine delete objects api
1 parent 4a321d6 commit 335846a

File tree

6 files changed

+244
-19
lines changed

6 files changed

+244
-19
lines changed

src/Models/Delete.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AlibabaCloud\Oss\V2\Models;
6+
7+
use AlibabaCloud\Oss\V2\Types\RequestModel;
8+
9+
/**
10+
* Class Delete
11+
* @package AlibabaCloud\Oss\V2\Models
12+
*/
13+
final class Delete extends RequestModel
14+
{
15+
/**
16+
* The container that stores information about you want to delete objects.
17+
* @var array<ObjectIdentifier>|null
18+
*/
19+
public ?array $objects;
20+
21+
/**
22+
* Specifies whether to enable the Quiet return mode.
23+
* The DeleteMultipleObjects operation provides the following return modes: Valid value: true,false
24+
* @var bool|null
25+
*/
26+
public ?bool $quiet;
27+
28+
/**
29+
* DeleteMultipleObjectsRequest constructor.
30+
* @param array<ObjectIdentifier>|null $objects The container that stores information about you want to delete objects.
31+
* @param bool|null $quiet Specifies whether to enable the Quiet return mode.
32+
* @param array|null $options
33+
*/
34+
public function __construct(
35+
?array $objects = null,
36+
?bool $quiet = null,
37+
?array $options = null
38+
)
39+
{
40+
$this->objects = $objects;
41+
$this->quiet = $quiet;
42+
parent::__construct($options);
43+
}
44+
}

src/Models/DeleteMultipleObjectsRequest.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,22 @@ final class DeleteMultipleObjectsRequest extends RequestModel
4444
*/
4545
public ?string $requestPayer;
4646

47+
/**
48+
* The container that stores information about you want to delete objects.
49+
* @var Delete|null
50+
*/
51+
public ?Delete $delete;
52+
4753
/**
4854
* DeleteMultipleObjectsRequest constructor.
4955
* @param string|null $bucket The name of the bucket.
5056
* @param array<DeleteObject>|null $objects The container that stores information about you want to delete objects.
5157
* @param string|null $encodingType The encoding type of the object names in the response. Valid value: url
5258
* @param bool|null $quiet Specifies whether to enable the Quiet return mode.
5359
* @param string|null $requestPayer To indicate that the requester is aware that the request and data download will incur costs.
60+
* @param Delete|null $delete The container that stores information about you want to delete objects.
61+
* The delete parameter is functionally equivalent to specifying objects and quiet parameters separately.
62+
* It is recommended to use the delete parameter for unified configuration.
5463
* @param array|null $options
5564
*/
5665
public function __construct(
@@ -59,14 +68,16 @@ public function __construct(
5968
?string $encodingType = null,
6069
?bool $quiet = null,
6170
?string $requestPayer = null,
62-
?array $options = null
71+
?array $options = null,
72+
?Delete $delete = null
6373
)
6474
{
6575
$this->bucket = $bucket;
6676
$this->objects = $objects;
6777
$this->encodingType = $encodingType;
6878
$this->quiet = $quiet;
6979
$this->requestPayer = $requestPayer;
80+
$this->delete = $delete;
7081
parent::__construct($options);
7182
}
7283
}

src/Models/ObjectIdentifier.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AlibabaCloud\Oss\V2\Models;
6+
7+
use AlibabaCloud\Oss\V2\Types\Model;
8+
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
9+
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
10+
11+
/**
12+
* Class ObjectIdentifier
13+
* @package AlibabaCloud\Oss\V2\Models
14+
*/
15+
#[XmlRoot(name: 'Object')]
16+
final class ObjectIdentifier extends Model
17+
{
18+
/**
19+
* The name of the object that you want to delete.
20+
* @var string|null
21+
*/
22+
#[XmlElement(rename: 'Key', type: 'string')]
23+
public ?string $key;
24+
25+
/**
26+
* The version ID of the object that you want to delete.
27+
* @var string|null
28+
*/
29+
#[XmlElement(rename: 'VersionId', type: 'string')]
30+
public ?string $versionId;
31+
32+
/**
33+
* DeleteMultipleObjectsRequest constructor.
34+
* @param string|null $key The name of the object that you want to delete.
35+
* @param string|null $versionId The version ID of the object that you want to delete.
36+
*/
37+
public function __construct(
38+
?string $key = null,
39+
?string $versionId = null
40+
)
41+
{
42+
$this->key = $key;
43+
$this->versionId = $versionId;
44+
}
45+
}

src/Transform/ObjectBasic.php

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,9 @@ static function (Models\DeleteObjectResult $result, OperationOutput $output) {
643643
public static function fromDeleteMultipleObjects(Models\DeleteMultipleObjectsRequest $request): OperationInput
644644
{
645645
Functions::assertFieldRequired('bucket', $request->bucket);
646-
Functions::assertFieldRequired('objects', $request->objects);
646+
if (isset($request->objects) && isset($request->delete)) {
647+
throw new \InvalidArgumentException('The objects and delete parameters cannot be set simultaneously');
648+
}
647649
$input = new OperationInput(
648650
'DeleteMultipleObjects',
649651
'POST',
@@ -659,25 +661,56 @@ static function (Models\DeleteMultipleObjectsRequest $request, OperationInput $i
659661
if (isset($request->encodingType)) {
660662
$input->setParameter('encoding-type', $request->encodingType);
661663
}
662-
$xmlStr = '<?xml version="1.0" encoding="UTF-8"?>';
663-
$xmlStr .= "\n<Delete>\n";
664-
if (isset($request->quiet)) {
665-
$val = $request->quiet === true ? 'true' : 'false';
664+
665+
if (isset($request->delete)) {
666+
/**
667+
* @var Models\Delete
668+
*/
669+
$delete = $request->delete;
670+
Functions::assertFieldRequired('delete.objects', $delete->objects);
671+
$xmlStr = '<?xml version="1.0" encoding="UTF-8"?>';
672+
$xmlStr .= "\n<Delete>\n";
673+
$val = 'false';
674+
if (isset($delete->quiet)) {
675+
$val = $delete->quiet === true ? 'true' : 'false';
676+
}
666677
$xmlStr .= "<Quiet>$val</Quiet>\n";
667-
}
668-
foreach ($request->objects as $obj) {
669-
$xmlStr .= "<Object>\n";
670-
if (isset($obj->key)) {
671-
$key = Utils::escapeXml($obj->key);
672-
$xmlStr .= "<Key>$key</Key>\n";
678+
foreach ($delete->objects as $obj) {
679+
$xmlStr .= "<Object>\n";
680+
if (isset($obj->key)) {
681+
$key = Utils::escapeXml($obj->key);
682+
$xmlStr .= "<Key>$key</Key>\n";
683+
}
684+
if (isset($obj->versionId)) {
685+
$xmlStr .= "<VersionId>$obj->versionId</VersionId>\n";
686+
}
687+
$xmlStr .= "</Object>\n";
673688
}
674-
if (isset($obj->versionId)) {
675-
$xmlStr .= "<VersionId>$obj->versionId</VersionId>\n";
689+
$xmlStr .= '</Delete>';
690+
$input->setBody(Utils::streamFor($xmlStr));
691+
692+
} else {
693+
Functions::assertFieldRequired('objects', $request->objects);
694+
$xmlStr = '<?xml version="1.0" encoding="UTF-8"?>';
695+
$xmlStr .= "\n<Delete>\n";
696+
if (isset($request->quiet)) {
697+
$val = $request->quiet === true ? 'true' : 'false';
698+
$xmlStr .= "<Quiet>$val</Quiet>\n";
699+
}
700+
foreach ($request->objects as $obj) {
701+
$xmlStr .= "<Object>\n";
702+
if (isset($obj->key)) {
703+
$key = Utils::escapeXml($obj->key);
704+
$xmlStr .= "<Key>$key</Key>\n";
705+
}
706+
if (isset($obj->versionId)) {
707+
$xmlStr .= "<VersionId>$obj->versionId</VersionId>\n";
708+
}
709+
$xmlStr .= "</Object>\n";
676710
}
677-
$xmlStr .= "</Object>\n";
711+
$xmlStr .= '</Delete>';
712+
$input->setBody(Utils::streamFor($xmlStr));
678713
}
679-
$xmlStr .= '</Delete>';
680-
$input->setBody(Utils::streamFor($xmlStr));
681714
},
682715
[Functions::class, 'addContentMd5']
683716
];

tests/IntegrationTests/ClientObjectBasicTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,30 @@ public function testObjectBasic()
135135
$this->assertEquals('No Content', $result->status);
136136
$this->assertEquals(True, count($result->headers) > 0);
137137
$this->assertEquals(24, strlen($result->requestId));
138+
139+
// delete objects
140+
$delObjsRequest = new Oss\Models\DeleteMultipleObjectsRequest(
141+
$bucketName,
142+
);
143+
$delArray = [];
144+
for ($i = 1; $i <= 10; $i++) {
145+
// put object
146+
$putObjRequest = new Oss\Models\PutObjectRequest(
147+
$bucketName,
148+
$key . $i,
149+
);
150+
$delArray[] = new Oss\Models\ObjectIdentifier($key . $i);
151+
$body = 'hi oss';
152+
$putObjRequest->body = Oss\Utils::streamFor($body);
153+
$result = $client->putObject($putObjRequest);
154+
$this->assertEquals(200, $result->statusCode);
155+
}
156+
$delObjsRequest->delete = new Oss\Models\Delete($delArray);
157+
$result = $client->deleteMultipleObjects($delObjsRequest);
158+
$this->assertEquals(200, $result->statusCode);
159+
$this->assertEquals('OK', $result->status);
160+
$this->assertEquals(True, count($result->headers) > 0);
161+
$this->assertEquals(24, strlen($result->requestId));
138162
}
139163

140164
public function testObjectBasicFail()
@@ -293,6 +317,28 @@ public function testObjectBasicFail()
293317
$this->assertEquals(403, $se->getStatusCode());
294318
}
295319
}
320+
321+
// delete objects
322+
try {
323+
$delObjRequest = new Oss\Models\DeleteMultipleObjectsRequest(
324+
$bucketName,
325+
);
326+
$delObjRequest->delete = new Oss\Models\Delete(
327+
[
328+
new Oss\Models\ObjectIdentifier('key1'),
329+
new Oss\Models\ObjectIdentifier('key2', 'version-id-2'),
330+
], true
331+
);
332+
$result = $client->deleteMultipleObjects($delObjRequest);
333+
} catch (Oss\Exception\OperationException $e) {
334+
$this->assertStringContainsString('Operation error DeleteMultipleObjects', $e);
335+
$se = $e->getPrevious();
336+
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
337+
if ($se instanceof Oss\Exception\ServiceException) {
338+
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
339+
$this->assertEquals(403, $se->getStatusCode());
340+
}
341+
}
296342
}
297343

298344
public function testObjectAcl()

tests/UnitTests/Transform/ObjectBasicTest.php

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,34 @@ public function testFromDeleteMultipleObjects()
2626
$request = new Models\DeleteMultipleObjectsRequest('bucket-123');
2727
$input = ObjectBasic::fromDeleteMultipleObjects($request);
2828
} catch (\InvalidArgumentException $e) {
29-
$this->assertStringContainsString("missing required field, objects", (string)$e);
29+
$this->assertStringContainsString("missing required field, objects", (string)$e);
3030
}
3131

32+
try {
33+
$request = new Models\DeleteMultipleObjectsRequest('bucket-123');
34+
$request->objects = [
35+
new Models\DeleteObject('key1'),
36+
new Models\DeleteObject('key2', 'version-id-2'),
37+
];
38+
$request->delete = new Models\Delete([
39+
new Models\ObjectIdentifier('key1'),
40+
new Models\ObjectIdentifier('key2', 'version-id-2'),
41+
], true);
42+
$input = ObjectBasic::fromDeleteMultipleObjects($request);
43+
} catch (\InvalidArgumentException $e) {
44+
$this->assertStringContainsString("InvalidArgumentException: The objects and delete parameters cannot be set simultaneously", (string)$e);
45+
}
46+
47+
try {
48+
$request = new Models\DeleteMultipleObjectsRequest('bucket-123');
49+
$request->delete = new Models\Delete();
50+
$request->delete->quiet = true;
51+
$input = ObjectBasic::fromDeleteMultipleObjects($request);
52+
} catch (\InvalidArgumentException $e) {
53+
$this->assertStringContainsString("missing required field, delete.objects", (string)$e);
54+
}
55+
56+
3257
// bucket only
3358
$request = new Models\DeleteMultipleObjectsRequest('bucket-123', []);
3459
$input = ObjectBasic::fromDeleteMultipleObjects($request);
@@ -68,6 +93,10 @@ public function testFromDeleteMultipleObjects()
6893

6994

7095
// all settings
96+
$xmlStr = <<<BBB
97+
<?xml version="1.0" encoding="UTF-8"?><Delete><Quiet>true</Quiet><Object><Key>key1</Key></Object><Object><Key>key2</Key><VersionId>version-id-2</VersionId></Object></Delete>
98+
BBB;
99+
71100
$request = new Models\DeleteMultipleObjectsRequest(
72101
'bucket-123',
73102
[
@@ -86,6 +115,7 @@ public function testFromDeleteMultipleObjects()
86115
$this->assertEquals('url1', $input->getParameters()['encoding-type']);
87116

88117
$str = $input->getBody()->getContents();
118+
$this->assertEquals($xmlStr, $this->cleanXml($str));
89119
$this->assertStringContainsString('<Delete>', $str);
90120
$xml = \simplexml_load_string($str);
91121
$this->assertEquals(3, $xml->count());
@@ -106,14 +136,30 @@ public function testFromDeleteMultipleObjects()
106136
[
107137
'headers' => ['x-oss-test' => 'test-123'],
108138
'parameters' => ['x-oss-param' => 'param-123']
109-
]
139+
],
140+
null,
110141
);
111142
$input = ObjectBasic::fromDeleteMultipleObjects($request);
112143
$this->assertEquals('bucket-123', $input->getBucket());
113144
$this->assertEquals('application/xml', $input->getHeaders()['content-type']);
114145
$this->assertEquals('D0iFyCSGo62Kd/zfca7aPg==', $input->getHeaders()['content-md5']);
115146
$this->assertEquals('test-123', $input->getHeaders()['x-oss-test']);
116147
$this->assertEquals('param-123', $input->getParameters()['x-oss-param']);
148+
149+
$request = new Models\DeleteMultipleObjectsRequest(
150+
'bucket-123',
151+
);
152+
$request->delete = new Models\Delete(
153+
[
154+
new Models\ObjectIdentifier('key1'),
155+
new Models\ObjectIdentifier('key2', 'version-id-2'),
156+
], true
157+
);
158+
$input = ObjectBasic::fromDeleteMultipleObjects($request);
159+
$this->assertEquals('bucket-123', $input->getBucket());
160+
$this->assertEquals('application/xml', $input->getHeaders()['content-type']);
161+
$this->assertEquals('BesWzihB4UGzEXQLrXWg0w==', $input->getHeaders()['content-md5']);
162+
$this->assertEquals($xmlStr, $this->cleanXml($input->getBody()->getContents()));
117163
}
118164

119165
public function testToDeleteMultipleObjects()

0 commit comments

Comments
 (0)