Skip to content

Commit 8968ed3

Browse files
committed
Change processor output format to include AWS/Result metadata in the model
1 parent 2b6d8d0 commit 8968ed3

File tree

5 files changed

+125
-30
lines changed

5 files changed

+125
-30
lines changed

src/Kitar/Dynamodb/Model/AuthUserProvider.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ public function retrieveById($identifier)
2727

2828
$this->model->$identifierName = $identifier;
2929

30-
$response = $this->model->getItem(
30+
$user = $this->model->getItem(
3131
$this->model->getKey()
3232
);
3333

34-
return $response['Item'];
34+
return $user;
3535
}
3636

3737
/**
@@ -45,7 +45,7 @@ public function retrieveByToken($identifier, $token)
4545
{
4646
$user = $this->retrieveById($identifier);
4747

48-
if ($user->getRememberToken() == $token) {
48+
if ($user && $user->getRememberToken() == $token) {
4949
return $user;
5050
}
5151
}

src/Kitar/Dynamodb/Model/Model.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ class Model extends BaseModel
3232
*/
3333
protected $sortKeyDefault;
3434

35+
/**
36+
* The @metadata attribute of AWS\Result response.
37+
* @var mixed
38+
*/
39+
protected $meta;
40+
3541
/**
3642
* @inheritdoc
3743
*/
@@ -250,12 +256,25 @@ public function delete()
250256
return true;
251257
}
252258

259+
public function meta()
260+
{
261+
return $this->meta;
262+
}
263+
264+
public function setMeta(array $meta)
265+
{
266+
$this->meta = $meta;
267+
}
268+
253269
/**
254270
* @inheritdoc
255271
*/
256272
public function __call($method, $parameters)
257273
{
258274
$allowedBuilderMethods = [
275+
"select",
276+
"take",
277+
"limit",
259278
"index",
260279
"key",
261280
"exclusiveStartKey",

src/Kitar/Dynamodb/Query/Processor.php

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,59 @@ public function __construct()
1515
$this->marshaler = new Marshaler;
1616
}
1717

18-
public function processSingleItem(Result $res, $model_class)
18+
protected function unmarshal(Result $res)
1919
{
2020
$responseArray = $res->toArray();
2121

2222
if (! empty($responseArray['Item'])) {
23-
$item = $this->marshaler->unmarshalItem($responseArray['Item']);
23+
$responseArray['Item'] = $this->marshaler->unmarshalItem($responseArray['Item']);
24+
}
2425

25-
if ($model_class) {
26-
$item = (new $model_class)->newFromBuilder($item);
26+
if (! empty($responseArray['Items'])) {
27+
foreach ($responseArray['Items'] as &$item) {
28+
$item = $this->marshaler->unmarshalItem($item);
2729
}
28-
29-
$responseArray['Item'] = $item;
3030
}
3131

3232
return $responseArray;
3333
}
3434

35-
public function processMultipleItems(Result $res, $model_class)
35+
public function processSingleItem(Result $awsResponse, $modelClass = null)
3636
{
37-
$responseArray = $res->toArray();
37+
$response = $this->unmarshal($awsResponse);
3838

39-
foreach ($responseArray['Items'] as &$item) {
40-
$item = $this->marshaler->unmarshalItem($item);
39+
if (empty($modelClass)) {
40+
return $response;
41+
}
4142

42-
if ($model_class) {
43-
$item = (new $model_class)->newFromBuilder($item);
44-
}
43+
if (! empty($response['Item'])) {
44+
$item = (new $modelClass)->newFromBuilder($response['Item']);
45+
unset($response['Item']);
46+
$item->setMeta($response ?? null);
47+
return $item;
4548
}
49+
}
4650

47-
return $responseArray;
51+
public function processMultipleItems(Result $awsResponse, $modelClass = null)
52+
{
53+
$response = $this->unmarshal($awsResponse);
54+
55+
if (empty($modelClass)) {
56+
return $response;
57+
}
58+
59+
$items = collect();
60+
61+
foreach ($response['Items'] as $item) {
62+
$item = (new $modelClass)->newFromBuilder($item);
63+
$items->push($item);
64+
}
65+
66+
unset($response['Items']);
67+
68+
return $items->map(function ($item) use ($response) {
69+
$item->setMeta($response);
70+
return $item;
71+
});
4872
}
4973
}

tests/Model/AuthUserProviderTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ protected function sampleAwsResult()
5656
]);
5757
}
5858

59+
protected function sampleAwsResultEmpty()
60+
{
61+
return new Result([
62+
'@metadata' => [
63+
'statuscode' => 200
64+
]
65+
]);
66+
}
67+
5968
/** @test */
6069
public function it_can_retrieve_by_id()
6170
{
@@ -114,6 +123,28 @@ public function it_cannot_retrieve_by_id_without_default_sort_key()
114123
$provider->retrieveById('[email protected]');
115124
}
116125

126+
/** @test */
127+
public function it_cannot_retrieve_by_id_if_not_exists()
128+
{
129+
$connection = $this->newConnectionMock();
130+
$connection->shouldReceive('getItem')->with([
131+
'TableName' => 'User',
132+
'Key' => [
133+
'partition' => [
134+
135+
]
136+
]
137+
])->andReturn($this->sampleAwsResultEmpty());
138+
$this->setConnectionResolver($connection);
139+
140+
$provider = new AuthUserProvider(new UserA);
141+
142+
$res = $provider->retrieveById('[email protected]');
143+
144+
$this->assertNull($res);
145+
146+
}
147+
117148
/** @test */
118149
public function it_can_retrieve_by_token()
119150
{
@@ -135,6 +166,27 @@ public function it_can_retrieve_by_token()
135166
$this->assertInstanceOf(UserA::class, $res);
136167
}
137168

169+
/** @test */
170+
public function it_cannot_retrieve_by_token_if_not_exists()
171+
{
172+
$connection = $this->newConnectionMock();
173+
$connection->shouldReceive('getItem')->with([
174+
'TableName' => 'User',
175+
'Key' => [
176+
'partition' => [
177+
178+
]
179+
]
180+
])->andReturn($this->sampleAwsResultEmpty());
181+
$this->setConnectionResolver($connection);
182+
183+
$provider = new AuthUserProvider(new UserA);
184+
185+
$res = $provider->retrieveByToken('[email protected]', 'valid_token');
186+
187+
$this->assertNull($res);
188+
}
189+
138190
/** @test */
139191
public function it_cannot_retrieve_by_token_with_invalid_token()
140192
{

tests/Query/ProcessorTest.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ public function it_can_process_single_item_result()
3838

3939
$awsResult = new Result(json_decode($this->mocks['single_item_result'], true));
4040

41-
$result = $this->processor->processSingleItem($awsResult, null);
41+
$item = $this->processor->processSingleItem($awsResult, null);
4242

43-
$this->assertEquals($expected, $result);
43+
$this->assertEquals($expected, $item);
4444
}
4545

4646
/** @test */
@@ -50,9 +50,9 @@ public function it_can_process_single_item_empty_result()
5050

5151
$awsResult = new Result(json_decode($this->mocks['single_item_empty_result'], true));
5252

53-
$result = $this->processor->processSingleItem($awsResult, null);
53+
$item = $this->processor->processSingleItem($awsResult, null);
5454

55-
$this->assertEquals($expected, $result);
55+
$this->assertEquals($expected, $item);
5656
}
5757

5858
/** @test */
@@ -62,9 +62,9 @@ public function it_can_process_multiple_items_result()
6262

6363
$awsResult = new Result(json_decode($this->mocks['multiple_items_result'], true));
6464

65-
$result = $this->processor->processMultipleItems($awsResult, null);
65+
$items = $this->processor->processMultipleItems($awsResult, null);
6666

67-
$this->assertEquals($expected, $result);
67+
$this->assertEquals($expected, $items);
6868
}
6969

7070
/** @test */
@@ -74,19 +74,17 @@ public function it_can_process_multiple_items_empty_result()
7474

7575
$awsResult = new Result(json_decode($this->mocks['multiple_items_empty_result'], true));
7676

77-
$result = $this->processor->processMultipleItems($awsResult, null);
77+
$items = $this->processor->processMultipleItems($awsResult, null);
7878

79-
$this->assertEquals($expected, $result);
79+
$this->assertEquals($expected, $items);
8080
}
8181

8282
/** @test */
8383
public function it_can_convert_single_result_to_model_instance()
8484
{
8585
$awsResult = new Result(json_decode($this->mocks['single_item_result'], true));
8686

87-
$result = $this->processor->processSingleItem($awsResult, User::class);
88-
89-
$item = $result['Item'];
87+
$item = $this->processor->processSingleItem($awsResult, User::class);
9088

9189
$this->assertEquals(User::class, get_class($item));
9290
$this->assertEquals([
@@ -96,21 +94,23 @@ public function it_can_convert_single_result_to_model_instance()
9694
'Views' => 1000,
9795
'Name' => 'Amazon DynamoDB'
9896
], $item->toArray());
97+
$this->assertEquals(200, $item->meta()['@metadata']['statusCode']);
9998
}
10099

101100
/** @test */
102101
public function it_can_convert_multiple_results_to_model_instance()
103102
{
104103
$awsResult = new Result(json_decode($this->mocks['multiple_items_result'], true));
105104

106-
$result = $this->processor->processMultipleItems($awsResult, User::class);
105+
$items = $this->processor->processMultipleItems($awsResult, User::class);
107106

108-
$item = $result['Items'][0];
107+
$item = $items->first();
109108

110109
$this->assertEquals(User::class, get_class($item));
111110
$this->assertEquals([
112111
'Category' => 'Amazon Web Services',
113112
'Name' => 'Amazon S3'
114113
], $item->toArray());
114+
$this->assertEquals(200, $item->meta()['@metadata']['statusCode']);
115115
}
116116
}

0 commit comments

Comments
 (0)