Skip to content

Commit b6284f4

Browse files
committed
feat: authorize mehtod added for request
1 parent c7b7126 commit b6284f4

File tree

1 file changed

+51
-9
lines changed

1 file changed

+51
-9
lines changed

src/Http/Router/RouteRegister.php

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public function handleMiddleware()
173173

174174
if (
175175
($middlewareObj = $router->getRegisteredMiddleware($middleware))
176-
&& ($response = $this->invokeAsReflection($middlewareObj, 'handle')) !== true
176+
&& ($response = $this->invokeAsReflection($middlewareObj, 'handle', $params)) !== true
177177
) {
178178
$this->setResponse($response);
179179
$this->sendResponse();
@@ -216,7 +216,8 @@ public function getRouteParamValue($name)
216216

217217
public function getParamValue(ReflectionParameter $param)
218218
{
219-
$value = $param->isOptional() && $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
219+
$value = !$param->isOptional() && $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
220+
220221
$paramName = $param->getName();
221222
if ($isRouteParam = $this->getRouteParamValue($paramName)) {
222223
$value = $isRouteParam;
@@ -328,6 +329,31 @@ private function setRequest($request = null)
328329
$this->_request->setApiRequest($this->_restRequest);
329330
}
330331

332+
$this->authorize();
333+
$this->validate();
334+
335+
return $this->_request;
336+
}
337+
338+
private function authorize()
339+
{
340+
if (method_exists($this->_request, 'authorize') && $this->_request->authorize()) {
341+
$message = 'You are not authorized to access this endpoint';
342+
if (method_exists($this->_request, 'failedAuthorizationMessage')) {
343+
$message = $this->_request->failedAuthorizationMessage();
344+
}
345+
346+
$this->setResponse(
347+
Response::error([])
348+
->code('NOT_AUTHORIZED')
349+
->message($message)
350+
);
351+
$this->sendResponse();
352+
}
353+
}
354+
355+
private function validate()
356+
{
331357
if (method_exists($this->_request, 'rules')) {
332358
$messages = [];
333359
$attributes = [];
@@ -340,15 +366,18 @@ private function setRequest($request = null)
340366
$attributes = $this->_request->attributes();
341367
}
342368

343-
$validation = $this->_request->make($this->_request->all(), $this->_request->rules(), $messages, $attributes);
369+
$validation = $this->_request->make(
370+
$this->_request->all(),
371+
$this->_request->rules(),
372+
$messages,
373+
$attributes
374+
);
344375

345376
if ($validation->fails()) {
346377
$this->setResponse(Response::error($validation->errors())->code('VALIDATION'));
347378
$this->sendResponse();
348379
}
349380
}
350-
351-
return $this->_request;
352381
}
353382

354383
private function register($method, $path, $action)
@@ -394,14 +423,27 @@ private function handleAction()
394423
}
395424
}
396425

397-
private function invokeAsReflection($class, $method)
426+
private function invokeAsReflection($class, $method, $params = [])
398427
{
399428
$reflectionMethod = new ReflectionMethod($class, $method);
400-
$params = [];
401-
foreach ($reflectionMethod->getParameters() as $id => $param) {
402-
$params[] = $this->getParamValue($param);
429+
$reflectionParams = $reflectionMethod->getParameters();
430+
431+
/**
432+
* If the ReflectionMethod is a method of a Middleware then we will set the first parameter.
433+
* First parameter will be Request object
434+
* Rest of params will be from Middleware ex: 'role:admin'
435+
*
436+
* If params count is 0 then the method is handle of Middleware and called from handleMiddleware
437+
*/
438+
$reflectionParams = \count($params) === 0 ? $reflectionParams : [$reflectionParams[0]];
439+
440+
$requestParams = [];
441+
foreach ($reflectionParams as $param) {
442+
$requestParams[] = $this->getParamValue($param);
403443
}
404444

445+
$params = array_merge($requestParams, $params);
446+
405447
return $reflectionMethod->invoke($reflectionMethod->isStatic() ? null : new $class(), ...$params);
406448
}
407449

0 commit comments

Comments
 (0)