Skip to content

Commit 1833c75

Browse files
authored
Merge pull request #178 from edrichhans/feat/list-requests-sorting
fix: list request sorting
2 parents 28e4a30 + af93ba4 commit 1833c75

File tree

4 files changed

+64
-7
lines changed

4 files changed

+64
-7
lines changed

app/Http/Controllers/RequestController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,10 @@ private function guardOverQuota($token)
100100
public function all(HttpRequest $httpRequest, $tokenId)
101101
{
102102
$token = $this->tokens->find($tokenId);
103+
$sorting = $httpRequest->get('sorting', 'oldest');
103104
$page = (int)$httpRequest->get('page', 1);
104105
$perPage = (int)$httpRequest->get('per_page', 50);
105-
$requests = $this->requests->all($token, $page, $perPage);
106+
$requests = $this->requests->all($token, $page, $perPage, $sorting);
106107
$total = $this->tokens->countRequests($token);
107108

108109
return new JsonResponse([

app/Storage/Redis/RequestStore.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,33 @@ public function find(Token $token, $requestId)
4747
* @param Token $token
4848
* @param int $page
4949
* @param int $perPage
50+
* @param string $sort
5051
* @return Collection|static
5152
*/
52-
public function all(Token $token, $page = 1, $perPage = 50)
53+
public function all(Token $token, $page = 1, $perPage = 50, $sorting = 'oldest')
5354
{
54-
return collect(
55+
$requests = collect(
5556
$this->redis->hgetall(Request::getIdentifier($token->uuid))
5657
)
5758
->filter()
5859
->map(
5960
function ($request) {
6061
return json_decode($request);
6162
}
62-
)->sortBy(
63+
);
64+
65+
$requests = $requests->sortBy(
6366
function ($request) {
6467
return Carbon::createFromFormat(
6568
'Y-m-d H:i:s',
6669
$request->created_at
6770
)->getTimestamp();
6871
},
69-
SORT_DESC
70-
)->forPage(
72+
SORT_REGULAR,
73+
$sorting === 'newest'
74+
);
75+
76+
return $requests->forPage(
7177
$page,
7278
$perPage
7379
)->values();

app/Storage/RequestStore.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ public function find(Token $token, $requestId);
1717
* @param Token $token
1818
* @param int $page
1919
* @param int $perPage
20+
* @param string $sorting
2021
* @return Collection
2122
*/
22-
public function all(Token $token, $page = 1, $perPage = 50);
23+
public function all(Token $token, $page = 1, $perPage = 50, $sorting = 'oldest');
2324

2425
/**
2526
* @param Token $token

tests/RequestControllerTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,53 @@ public function testPagination()
6565
'to' => 175,
6666
]);
6767
}
68+
69+
public function testSorting() {
70+
// Prevent throttling
71+
$this->withoutMiddleware();
72+
73+
$number = 175;
74+
75+
$tokenId = $this->json('POST', 'token')->json()['uuid'];
76+
77+
for ($i = 0; $i < $number; $i++) {
78+
$this->call('GET', $tokenId);
79+
}
80+
81+
// Test newest
82+
$requests = $this->json('GET', "token/$tokenId/requests?sorting=newest");
83+
84+
$requests->assertJson([
85+
'total' => $number,
86+
'per_page' => 50,
87+
'current_page' => 1,
88+
'is_last_page' => false,
89+
'from' => 1,
90+
'to' => 50,
91+
]);
92+
93+
$data = $requests->json()['data'];
94+
$timestamps = array_column($data, 'created_at');
95+
$sortedDescTimestamps = $timestamps;
96+
rsort($sortedDescTimestamps);
97+
$this->assertSame($sortedDescTimestamps, $timestamps, "The 'created_at' field is not sorted in descending order.");
98+
99+
// Test oldest
100+
$requests = $this->json('GET', "token/$tokenId/requests?sorting=oldest");
101+
102+
$requests->assertJson([
103+
'total' => $number,
104+
'per_page' => 50,
105+
'current_page' => 1,
106+
'is_last_page' => false,
107+
'from' => 1,
108+
'to' => 50,
109+
]);
110+
111+
$data = $requests->json()['data'];
112+
$timestamps = array_column($data, 'created_at');
113+
$sortedAscTimestamps = $timestamps;
114+
sort($sortedAscTimestamps);
115+
$this->assertSame($sortedAscTimestamps, $timestamps,'The "created_at" field is not sorted in ascending order.');
116+
}
68117
}

0 commit comments

Comments
 (0)