Skip to content

Commit 02b60ef

Browse files
authored
refine delete objects api
1 parent 4a321d6 commit 02b60ef

File tree

6 files changed

+234
-19
lines changed

6 files changed

+234
-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: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,20 @@ 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.
5461
* @param array|null $options
5562
*/
5663
public function __construct(
@@ -59,14 +66,16 @@ public function __construct(
5966
?string $encodingType = null,
6067
?bool $quiet = null,
6168
?string $requestPayer = null,
62-
?array $options = null
69+
?array $options = null,
70+
?Delete $delete = null
6371
)
6472
{
6573
$this->bucket = $bucket;
6674
$this->objects = $objects;
6775
$this->encodingType = $encodingType;
6876
$this->quiet = $quiet;
6977
$this->requestPayer = $requestPayer;
78+
$this->delete = $delete;
7079
parent::__construct($options);
7180
}
7281
}

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: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,12 @@ 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->body)) {
647+
throw new \InvalidArgumentException('objects and body cannot be set simultaneously');
648+
}
649+
if (!isset($request->objects) && !isset($request->delete)) {
650+
throw new \InvalidArgumentException('objects and delete must have one set');
651+
}
647652
$input = new OperationInput(
648653
'DeleteMultipleObjects',
649654
'POST',
@@ -659,25 +664,55 @@ static function (Models\DeleteMultipleObjectsRequest $request, OperationInput $i
659664
if (isset($request->encodingType)) {
660665
$input->setParameter('encoding-type', $request->encodingType);
661666
}
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';
666-
$xmlStr .= "<Quiet>$val</Quiet>\n";
667+
if (isset($request->objects) && isset($request->body)) {
668+
throw new \InvalidArgumentException('objects and body cannot be set simultaneously');
667669
}
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";
670+
if (isset($request->objects)) {
671+
$xmlStr = '<?xml version="1.0" encoding="UTF-8"?>';
672+
$xmlStr .= "\n<Delete>\n";
673+
if (isset($request->quiet)) {
674+
$val = $request->quiet === true ? 'true' : 'false';
675+
$xmlStr .= "<Quiet>$val</Quiet>\n";
676+
}
677+
foreach ($request->objects as $obj) {
678+
$xmlStr .= "<Object>\n";
679+
if (isset($obj->key)) {
680+
$key = Utils::escapeXml($obj->key);
681+
$xmlStr .= "<Key>$key</Key>\n";
682+
}
683+
if (isset($obj->versionId)) {
684+
$xmlStr .= "<VersionId>$obj->versionId</VersionId>\n";
685+
}
686+
$xmlStr .= "</Object>\n";
673687
}
674-
if (isset($obj->versionId)) {
675-
$xmlStr .= "<VersionId>$obj->versionId</VersionId>\n";
688+
$xmlStr .= '</Delete>';
689+
$input->setBody(Utils::streamFor($xmlStr));
690+
} else {
691+
/**
692+
* @var Models\Delete
693+
*/
694+
$delete = $request->delete;
695+
$xmlStr = '<?xml version="1.0" encoding="UTF-8"?>';
696+
$xmlStr .= "\n<Delete>\n";
697+
$val = 'false';
698+
if (isset($delete->quiet)) {
699+
$val = $delete->quiet === true ? 'true' : 'false';
700+
}
701+
$xmlStr .= "<Quiet>$val</Quiet>\n";
702+
foreach ($delete->objects as $obj) {
703+
$xmlStr .= "<Object>\n";
704+
if (isset($obj->key)) {
705+
$key = Utils::escapeXml($obj->key);
706+
$xmlStr .= "<Key>$key</Key>\n";
707+
}
708+
if (isset($obj->versionId)) {
709+
$xmlStr .= "<VersionId>$obj->versionId</VersionId>\n";
710+
}
711+
$xmlStr .= "</Object>\n";
676712
}
677-
$xmlStr .= "</Object>\n";
713+
$xmlStr .= '</Delete>';
714+
$input->setBody(Utils::streamFor($xmlStr));
678715
}
679-
$xmlStr .= '</Delete>';
680-
$input->setBody(Utils::streamFor($xmlStr));
681716
},
682717
[Functions::class, 'addContentMd5']
683718
];

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: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,22 @@ 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("InvalidArgumentException: objects and delete must have one set", (string)$e);
30+
}
31+
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: objects and body cannot be set simultaneously", (string)$e);
3045
}
3146

3247
// bucket only
@@ -68,6 +83,10 @@ public function testFromDeleteMultipleObjects()
6883

6984

7085
// all settings
86+
$xmlStr = <<<BBB
87+
<?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>
88+
BBB;
89+
7190
$request = new Models\DeleteMultipleObjectsRequest(
7291
'bucket-123',
7392
[
@@ -86,6 +105,7 @@ public function testFromDeleteMultipleObjects()
86105
$this->assertEquals('url1', $input->getParameters()['encoding-type']);
87106

88107
$str = $input->getBody()->getContents();
108+
$this->assertEquals($xmlStr, $this->cleanXml($str));
89109
$this->assertStringContainsString('<Delete>', $str);
90110
$xml = \simplexml_load_string($str);
91111
$this->assertEquals(3, $xml->count());
@@ -106,14 +126,30 @@ public function testFromDeleteMultipleObjects()
106126
[
107127
'headers' => ['x-oss-test' => 'test-123'],
108128
'parameters' => ['x-oss-param' => 'param-123']
109-
]
129+
],
130+
null,
110131
);
111132
$input = ObjectBasic::fromDeleteMultipleObjects($request);
112133
$this->assertEquals('bucket-123', $input->getBucket());
113134
$this->assertEquals('application/xml', $input->getHeaders()['content-type']);
114135
$this->assertEquals('D0iFyCSGo62Kd/zfca7aPg==', $input->getHeaders()['content-md5']);
115136
$this->assertEquals('test-123', $input->getHeaders()['x-oss-test']);
116137
$this->assertEquals('param-123', $input->getParameters()['x-oss-param']);
138+
139+
$request = new Models\DeleteMultipleObjectsRequest(
140+
'bucket-123',
141+
);
142+
$request->delete = new Models\Delete(
143+
[
144+
new Models\ObjectIdentifier('key1'),
145+
new Models\ObjectIdentifier('key2', 'version-id-2'),
146+
], true
147+
);
148+
$input = ObjectBasic::fromDeleteMultipleObjects($request);
149+
$this->assertEquals('bucket-123', $input->getBucket());
150+
$this->assertEquals('application/xml', $input->getHeaders()['content-type']);
151+
$this->assertEquals('BesWzihB4UGzEXQLrXWg0w==', $input->getHeaders()['content-md5']);
152+
$this->assertEquals($xmlStr, $this->cleanXml($input->getBody()->getContents()));
117153
}
118154

119155
public function testToDeleteMultipleObjects()

0 commit comments

Comments
 (0)