-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathResponseError.php
More file actions
105 lines (89 loc) · 2.53 KB
/
ResponseError.php
File metadata and controls
105 lines (89 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
declare(strict_types=1);
namespace Core\Response;
use Core\Response\Types\ErrorType;
class ResponseError
{
/**
* @var array<string,ErrorType>
*/
private $errors;
private $useApiResponse = false;
private $mapErrorTypes = false;
private $nullOn404 = false;
/**
* Adds an error to the errors array with the errorCode and ErrorType provided.
*/
public function addError(string $errorCode, ErrorType $error): void
{
$this->errors[$errorCode] = $error;
}
/**
* Sets the useApiResponse flag.
*/
public function returnApiResponse(): void
{
$this->useApiResponse = true;
}
/**
* Sets the mapErrorTypes flag.
*/
public function mapErrorTypesInApiResponse()
{
$this->mapErrorTypes = true;
}
/**
* Sets the nullOn404 flag.
*/
public function nullOn404(): void
{
$this->nullOn404 = true;
}
/**
* Returns calculated result on failure or throws an exception.
*/
public function getResult(Context $context)
{
if ($this->useApiResponse) {
return $this->getApiResponse($context);
}
$statusCode = $context->getResponse()->getStatusCode();
if ($this->shouldReturnNull($statusCode)) {
return null;
}
$errorType = $this->getErrorType($statusCode);
if (empty($errorType)) {
throw $context->toApiException('HTTP Response Not OK');
}
throw $errorType->throwable($context);
}
private function getApiResponse(Context $context)
{
$statusCode = $context->getResponse()->getStatusCode();
if ($this->shouldReturnNull($statusCode)) {
return $context->toApiResponse(null);
}
$errorType = $this->getErrorType($statusCode);
if (!$this->mapErrorTypes || empty($errorType)) {
return $context->toApiResponse($context->getResponseBody());
}
return $context->toApiResponseWithMappedType($errorType->getClassName());
}
private function getErrorType(int $statusCode): ?ErrorType
{
if (isset($this->errors[strval($statusCode)])) {
return $this->errors[strval($statusCode)];
}
if (isset($this->errors[strval(0)])) {
return $this->errors[strval(0)];
}
return null;
}
private function shouldReturnNull(int $statusCode): bool
{
if (!$this->nullOn404) {
return false;
}
return $statusCode === 404;
}
}