You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
6.4 KiB
161 lines
6.4 KiB
<?php
|
|
|
|
|
|
require "../vendor/autoload.php";
|
|
require "../config.php";
|
|
require "../sql/database.php";
|
|
require "../src/utils.php";
|
|
require "../src/App/react-display.php";
|
|
|
|
use IQBall\App\AppAction;
|
|
use IQBall\App\Controller\AuthController;
|
|
use IQBall\App\Controller\EditorController;
|
|
use IQBall\App\Controller\TeamController;
|
|
use IQBall\App\Controller\UserController;
|
|
use IQBall\App\Controller\VisualizerController;
|
|
use IQBall\Core\Connection;
|
|
use IQBall\Core\Gateway\AccountGateway;
|
|
use IQBall\Core\Gateway\TacticInfoGateway;
|
|
use IQBall\Core\Gateway\TeamGateway;
|
|
use IQBall\Core\Http\HttpCodes;
|
|
use IQBall\Core\Http\HttpResponse;
|
|
use IQBall\Core\Http\JsonHttpResponse;
|
|
use IQBall\Core\Http\ViewHttpResponse;
|
|
use IQBall\Core\Model\AuthModel;
|
|
use IQBall\Core\Model\TacticModel;
|
|
use IQBall\Core\Model\TeamModel;
|
|
use IQBall\Core\Session\MutableSessionHandle;
|
|
use IQBall\Core\Session\PhpSessionHandle;
|
|
use IQBall\Core\Session\SessionHandle;
|
|
use IQBall\Core\Validation\ValidationFail;
|
|
use Twig\Environment;
|
|
use Twig\Error\LoaderError;
|
|
use Twig\Error\RuntimeError;
|
|
use Twig\Error\SyntaxError;
|
|
use Twig\Loader\FilesystemLoader;
|
|
|
|
function getConnection(): Connection {
|
|
return new Connection(get_database());
|
|
}
|
|
|
|
function getUserController(): UserController {
|
|
return new UserController(new TacticModel(new TacticInfoGateway(getConnection())));
|
|
}
|
|
|
|
function getVisualizerController(): VisualizerController {
|
|
return new VisualizerController(new TacticModel(new TacticInfoGateway(getConnection())));
|
|
}
|
|
|
|
function getEditorController(): EditorController {
|
|
return new EditorController(new TacticModel(new TacticInfoGateway(getConnection())));
|
|
}
|
|
|
|
function getTeamController(): TeamController {
|
|
return new TeamController(new TeamModel(new TeamGateway(getConnection())));
|
|
}
|
|
|
|
function getAuthController(): AuthController {
|
|
return new AuthController(new AuthModel(new AccountGateway(getConnection())));
|
|
}
|
|
|
|
function getRoutes(): AltoRouter {
|
|
global $basePath;
|
|
|
|
$ar = new AltoRouter();
|
|
$ar->setBasePath($basePath);
|
|
|
|
//authentication
|
|
$ar->map("GET", "/login", AppAction::noAuth(fn() => getAuthController()->displayLogin()));
|
|
$ar->map("GET", "/register", AppAction::noAuth(fn() => getAuthController()->displayRegister()));
|
|
$ar->map("POST", "/login", AppAction::noAuth(fn(SessionHandle $s) => getAuthController()->confirmLogin($_POST, $s)));
|
|
$ar->map("POST", "/register", AppAction::noAuth(fn(SessionHandle $s) => getAuthController()->confirmRegister($_POST, $s)));
|
|
|
|
//user-related
|
|
$ar->map("GET", "/home", AppAction::auth(fn(SessionHandle $s) => getUserController()->home($s)));
|
|
$ar->map("GET", "/settings", AppAction::auth(fn(SessionHandle $s) => getUserController()->settings($s)));
|
|
|
|
//tactic-related
|
|
$ar->map("GET", "/tactic/[i:id]/view", AppAction::auth(fn(int $id, SessionHandle $s) => getVisualizerController()->visualize($id, $s)));
|
|
$ar->map("GET", "/tactic/[i:id]/edit", AppAction::auth(fn(int $id, SessionHandle $s) => getEditorController()->edit($id, $s)));
|
|
$ar->map("GET", "/tactic/new", AppAction::auth(fn(SessionHandle $s) => getEditorController()->createNew($s)));
|
|
|
|
//team-related
|
|
$ar->map("GET", "/team/new", AppAction::auth(fn(SessionHandle $s) => getTeamController()->displayCreateTeam($s)));
|
|
$ar->map("POST", "/team/new", AppAction::auth(fn(SessionHandle $s) => getTeamController()->submitTeam($_POST, $s)));
|
|
$ar->map("GET", "/team/search", AppAction::auth(fn(SessionHandle $s) => getTeamController()->displayListTeamByName($s)));
|
|
$ar->map("POST", "/team/search", AppAction::auth(fn(SessionHandle $s) => getTeamController()->listTeamByName($_POST, $s)));
|
|
$ar->map("GET", "/team/[i:id]", AppAction::auth(fn(int $id, SessionHandle $s) => getTeamController()->displayTeam($id, $s)));
|
|
$ar->map("GET", "/team/members/add", AppAction::auth(fn(SessionHandle $s) => getTeamController()->displayAddMember($s)));
|
|
$ar->map("POST", "/team/members/add", AppAction::auth(fn(SessionHandle $s) => getTeamController()->addMember($_POST, $s)));
|
|
$ar->map("GET", "/team/members/remove", AppAction::auth(fn(SessionHandle $s) => getTeamController()->displayDeleteMember($s)));
|
|
$ar->map("POST", "/team/members/remove", AppAction::auth(fn(SessionHandle $s) => getTeamController()->deleteMember($_POST, $s)));
|
|
|
|
return $ar;
|
|
}
|
|
|
|
function render(HttpResponse $response): void {
|
|
http_response_code($response->getCode());
|
|
|
|
foreach ($response->getHeaders() as $header => $value) {
|
|
header("$header: $value");
|
|
}
|
|
|
|
if ($response instanceof ViewHttpResponse) {
|
|
renderView($response);
|
|
} elseif ($response instanceof JsonHttpResponse) {
|
|
header('Content-type: application/json');
|
|
echo $response->getJson();
|
|
}
|
|
}
|
|
|
|
function renderView(ViewHttpResponse $response): void {
|
|
$file = $response->getFile();
|
|
$args = $response->getArguments();
|
|
|
|
switch ($response->getViewKind()) {
|
|
case ViewHttpResponse::REACT_VIEW:
|
|
send_react_front($file, $args);
|
|
break;
|
|
case ViewHttpResponse::TWIG_VIEW:
|
|
try {
|
|
$loader = new FilesystemLoader('../src/Views/');
|
|
$twig = new Environment($loader);
|
|
$twig->display($file, $args);
|
|
} catch (RuntimeError | SyntaxError | LoaderError $e) {
|
|
http_response_code(500);
|
|
echo "There was an error rendering your view, please refer to an administrator.\nlogs date: " . date("YYYD, d M Y H:i:s");
|
|
throw $e;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function runAction(AppAction $action, array $params, MutableSessionHandle $session): HttpResponse {
|
|
global $basePath;
|
|
if ($action->isAuthRequired()) {
|
|
$account = $session->getAccount();
|
|
if ($account == null) {
|
|
// put in the session the initial url the user wanted to get
|
|
$session->setInitialTarget($_SERVER['REQUEST_URI']);
|
|
return HttpResponse::redirect($basePath . "/login");
|
|
}
|
|
}
|
|
|
|
return $action->run($params, $session);
|
|
}
|
|
|
|
function runMatch(array $match, MutableSessionHandle $session): HttpResponse {
|
|
if (!$match) {
|
|
return ViewHttpResponse::twig("error.html.twig", [
|
|
'failures' => [ValidationFail::notFound("Could not find page ${_SERVER['REQUEST_URI']}.")],
|
|
], HttpCodes::NOT_FOUND);
|
|
}
|
|
|
|
return runAction($match['target'], $match['params'], $session);
|
|
}
|
|
|
|
//this is a global variable
|
|
$basePath = get_public_path();
|
|
|
|
render(runMatch(getRoutes()->match(), PhpSessionHandle::init()));
|