Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*.sh text eol=lf
*.js text eol=lf
*.css text eol=lf
*.tpl text eol=lf

# Export ignore - exclude development and test files
tests/ export-ignore
Expand All @@ -26,4 +27,4 @@ phpunit.xml export-ignore
rector.php export-ignore
.scrutinizer.yml export-ignore
composer.lock export-ignore
_config.yml export-ignore
_config.yml export-ignore
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
"rector:check": "vendor/bin/rector process --dry-run",
"rector:fix": "vendor/bin/rector process",
"phpstan": "vendor/bin/phpstan analyse --memory-limit=-1 --error-format=github",
"test": "vendor/bin/phpunit --stderr --testdox --coverage-clover coverage.xml"
"test": "vendor/bin/phpunit --stderr --coverage-clover coverage.xml"
},
"minimum-stability": "stable",
"prefer-stable": true,
Expand Down
3 changes: 2 additions & 1 deletion src/App/Adapters/ConsoleAppAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
use Quantum\App\Stages\LoadAppConfigStage;
use Quantum\App\Stages\LoadHelpersStage;
use Quantum\App\Traits\ConsoleAppTrait;
use Quantum\App\Enums\ExitCode;
use Quantum\App\BootPipeline;
use Quantum\App\AppContext;
use Exception;
Expand Down Expand Up @@ -94,7 +95,7 @@ public function start(): ?int

stop(null, $exitCode);
} catch (StopExecutionException $exception) {
return $exception->getCode();
return $exception->getCode() ?: ExitCode::SUCCESS;
}
}
}
45 changes: 24 additions & 21 deletions src/App/Adapters/WebAppAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
namespace Quantum\App\Adapters;

use Quantum\Middleware\Exceptions\MiddlewareException;
use Quantum\App\Exceptions\StopExecutionException;
use Quantum\Loader\Exceptions\LoaderException;
use Quantum\Module\Exceptions\ModuleException;
use Quantum\Config\Exceptions\ConfigException;
Expand All @@ -31,10 +30,12 @@
use Quantum\App\Stages\InitDebuggerStage;
use Quantum\Middleware\MiddlewareManager;
use Quantum\App\Stages\LoadHelpersStage;
use Quantum\App\Stages\InitHttpStage;
use Quantum\Di\Exceptions\DiException;
use Quantum\App\Stages\InitHttpStage;
use Quantum\App\Traits\WebAppTrait;
use Quantum\Router\RouteDispatcher;
use Quantum\Http\Enums\StatusCode;
use Quantum\App\Enums\ExitCode;
use Quantum\App\BootPipeline;
use Quantum\App\AppContext;
use ReflectionException;
Expand Down Expand Up @@ -69,32 +70,34 @@ public function __construct(AppContext $context)
*/
public function start(): ?int
{
try {
if (request()->isMethod('OPTIONS')) {
stop();
}
if (request()->isMethod('OPTIONS')) {
$this->sendResponse(response()->setStatusCode(StatusCode::NO_CONTENT));
return ExitCode::SUCCESS;
}

$this->loadModules();

$this->loadModules();
$matchedRoute = $this->resolveRoute();

$matchedRoute = $this->resolveRoute();
if ($matchedRoute === null) {
$this->sendResponse(page_not_found_response());

$this->loadLanguage();
return ExitCode::SUCCESS;
}

$this->logDebugInfo();
$this->loadLanguage();

$response = (new MiddlewareManager($matchedRoute))->applyMiddlewares(request(), response());
$request = request();
$this->logDebugInfo();

if ($this->setupViewCache()->serveCachedView(request()->getUri() ?? '', $response)) {
stop();
}
$viewCache = $this->setupViewCache();

(new RouteDispatcher())->dispatch($matchedRoute, $request);
stop();
} catch (StopExecutionException $exception) {
$this->sendResponse();
$terminal = fn ($request) => $viewCache->getCachedResponse($request->getUri() ?? '')
?? (new RouteDispatcher())->dispatch($matchedRoute, $request);

return $exception->getCode();
}
$response = (new MiddlewareManager($matchedRoute))->applyMiddlewares(request(), $terminal);

$this->sendResponse($response);

return ExitCode::SUCCESS;
}
}
14 changes: 14 additions & 0 deletions src/App/Enums/ExitCode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

declare(strict_types=1);
Comment thread
armanist marked this conversation as resolved.

namespace Quantum\App\Enums;

final class ExitCode
{
public const SUCCESS = 0;

public const FAILURE = 1;

public const INVALID = 2;
}
15 changes: 6 additions & 9 deletions src/App/Traits/WebAppTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

namespace Quantum\App\Traits;

use Quantum\App\Exceptions\StopExecutionException;
use Quantum\Module\Exceptions\ModuleException;
use Quantum\Config\Exceptions\ConfigException;
use Quantum\Loader\Exceptions\LoaderException;
Expand Down Expand Up @@ -64,18 +63,16 @@ private function loadModules(): void
}

/**
* @return MatchedRoute
* @throws RouteException|StopExecutionException|ConfigException|BaseException|DiException|ReflectionException
* @throws RouteException|BaseException|DiException|ReflectionException
*/
private function resolveRoute(): MatchedRoute
private function resolveRoute(): ?MatchedRoute
{
$routeFinder = new RouteFinder(Di::get(RouteCollection::class));

$matchedRoute = $routeFinder->find(request());

if ($matchedRoute === null) {
page_not_found();
stop();
return null;
}

request()->setMatchedRoute($matchedRoute);
Expand Down Expand Up @@ -142,9 +139,9 @@ private function handleCors(Response $response): void
/**
* @throws ConfigException|LoaderException|DiException|ReflectionException|Exception
*/
private function sendResponse(): void
private function sendResponse(Response $response): void
{
$this->handleCors(response());
response()->send();
$this->handleCors($response);
$response->send();
}
}
16 changes: 8 additions & 8 deletions src/Http/Helpers/http.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,21 +123,21 @@ function get_referrer(): ?string
* Handles page not found
* @throws ConfigException|DiException|BaseException|ReflectionException
*/
function page_not_found(): void
function page_not_found_response(): Response
{
$acceptHeader = response()->getHeader('Accept');
$acceptHeader = request()->getHeader('Accept');

$isJson = $acceptHeader === ContentType::JSON;
Comment thread
armanist marked this conversation as resolved.

if ($isJson) {
response()->json(
return response()->json(
['status' => 'error', 'message' => 'Page not found',],
StatusCode::NOT_FOUND
);
} else {
response()->html(
partial('errors' . DS . StatusCode::NOT_FOUND),
StatusCode::NOT_FOUND
);
}

return response()->html(
partial('errors' . DS . StatusCode::NOT_FOUND),
StatusCode::NOT_FOUND
);
}
19 changes: 9 additions & 10 deletions src/Middleware/MiddlewareManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Quantum\Http\Response;
use Quantum\Http\Request;
use ReflectionException;
use Closure;

/**
* Class MiddlewareManager
Expand Down Expand Up @@ -49,42 +50,40 @@ public function __construct(MatchedRoute $matchedRoute)
}

/**
* Apply Middlewares
* @return Response
* Apply Middlewares.
* @throws MiddlewareException|BaseException|ReflectionException
*/
public function applyMiddlewares(Request $request, Response $response): Response
public function applyMiddlewares(Request $request, Closure $terminal): Response
{
if (!current($this->middlewares)) {
return $response;
return $terminal($request);
}

$currentMiddleware = $this->getMiddleware($request, $response);
$currentMiddleware = $this->getMiddleware($request);
next($this->middlewares);

return $currentMiddleware->apply($request, $response, function (Request $request, Response $response): Response {
return $this->applyMiddlewares($request, $response);
});
return $currentMiddleware->apply($request, fn (Request $request): Response => $this->applyMiddlewares($request, $terminal));
}

/**
* Loads and gets the current middleware instance
* @throws MiddlewareException|BaseException|ReflectionException
*/
private function getMiddleware(Request $request, Response $response): QtMiddleware
private function getMiddleware(Request $request): QtMiddleware
{
$middlewareClass = request()->getModuleBaseNamespace() . '\\' . $this->module . '\\Middlewares\\' . current($this->middlewares);

if (!class_exists($middlewareClass)) {
throw MiddlewareException::middlewareNotFound($middlewareClass);
}

$middleware = new $middlewareClass($request, $response);
$middleware = new $middlewareClass($request);

if (!$middleware instanceof QtMiddleware) {
throw MiddlewareException::notInstanceOf($middlewareClass, QtMiddleware::class);
}

return $middleware;
}

}
4 changes: 2 additions & 2 deletions src/Middleware/QtMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

namespace Quantum\Middleware;

use Quantum\Http\Request;
use Quantum\Http\Response;
use Quantum\Http\Request;
use Closure;

/**
Expand All @@ -29,6 +29,6 @@ abstract class QtMiddleware
/**
* Applies the middleware
*/
abstract public function apply(Request $request, Response $response, Closure $next): Response;
abstract public function apply(Request $request, Closure $next): Response;
Comment thread
armanist marked this conversation as resolved.

}
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ class MainController
'message' => '{{MODULE_NAME}} module.'
]);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ namespace {{MODULE_NAMESPACE}}\Controllers\OpenApi;
abstract class OpenApiController
{

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,4 @@ abstract class OpenApiMainController extends OpenApiController
*/
abstract public function index(Response $response);

}
}
2 changes: 1 addition & 1 deletion src/Module/Templates/DefaultApi/src/config/cors.php.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ return [
'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization, refresh_token',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Credentials' => true,
];
];
2 changes: 1 addition & 1 deletion src/Module/Templates/DefaultApi/src/routes/routes.php.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

return function ($route) {
$route->get('/', 'MainController', 'index');
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,4 @@ class MainController

return $response->html($view->render('index'));
}
}
}
2 changes: 1 addition & 1 deletion src/Module/Templates/DefaultWeb/src/Views/index.php.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
</div>
</div>
</div>
<?php echo partial('partials/bubbles') ?>
<?php echo partial('partials/bubbles') ?>
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@

<?php assets("js") ?>
</body>
</html>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@
<li></li>
<li></li>
<li></li>
</ul>
</ul>
2 changes: 1 addition & 1 deletion src/Module/Templates/DefaultWeb/src/routes/routes.php.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

return function ($route) {
$route->get('/', 'MainController', 'index');
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,4 @@ class AccountController extends BaseController
]);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -196,4 +196,4 @@ class AuthController extends BaseController
], StatusCode::UNAUTHORIZED);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,4 @@ abstract class BaseController
* @var bool
*/
public bool $csrfVerification = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -395,4 +395,4 @@ abstract class OpenApiAuthController extends OpenApiController
* @param Response $response
*/
abstract public function resend(Response $response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ namespace {{MODULE_NAMESPACE}}\Controllers\OpenApi;
abstract class OpenApiController
{

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -329,4 +329,4 @@ abstract class OpenApiPostController extends OpenApiController
*/
abstract public function deleteImage(Response $response, ?string $lang, string $postId);

}
}
Loading
Loading