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.
147 lines
7.8 KiB
147 lines
7.8 KiB
<?php
|
|
|
|
require "../vendor/autoload.php";
|
|
require "../config.php";
|
|
require "../sql/database.php";
|
|
require "../src/App/react-display.php";
|
|
|
|
use IQBall\App\App;
|
|
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\App\Controller\TacticController;
|
|
use IQBall\App\Session\MutableSessionHandle;
|
|
use IQBall\App\Session\PhpSessionHandle;
|
|
use IQBall\App\Session\SessionHandle;
|
|
use IQBall\App\ViewHttpResponse;
|
|
use IQBall\Core\Action;
|
|
use IQBall\Core\Connection;
|
|
use IQBall\Core\Data\CourtType;
|
|
use IQBall\Core\Gateway\AccountGateway;
|
|
use IQBall\Core\Gateway\MemberGateway;
|
|
use IQBall\Core\Gateway\TacticInfoGateway;
|
|
use IQBall\Core\Gateway\TeamGateway;
|
|
use IQBall\Core\Http\HttpCodes;
|
|
use IQBall\Core\Http\HttpResponse;
|
|
use IQBall\Core\Model\AuthModel;
|
|
use IQBall\Core\Model\TacticModel;
|
|
use IQBall\Core\Model\TeamModel;
|
|
use IQBall\Core\Validation\ValidationFail;
|
|
use Twig\Environment;
|
|
use Twig\Loader\FilesystemLoader;
|
|
use Twig\TwigFunction;
|
|
|
|
function getConnection(): Connection {
|
|
return new Connection(get_database());
|
|
}
|
|
|
|
function getUserController(): UserController {
|
|
return new UserController(new TacticModel(new TacticInfoGateway(getConnection()), new AccountGateway(getConnection())), new TeamModel(new TeamGateway(getConnection()), new MemberGateway(getConnection()), new AccountGateway(getConnection())));
|
|
}
|
|
|
|
function getVisualizerController(): VisualizerController {
|
|
return new VisualizerController(new TacticModel(new TacticInfoGateway(getConnection()), new AccountGateway(getConnection())));
|
|
}
|
|
|
|
function getEditorController(): EditorController {
|
|
return new EditorController(new TacticModel(new TacticInfoGateway(getConnection()), new AccountGateway(getConnection())));
|
|
}
|
|
|
|
function getTeamController(): TeamController {
|
|
$con = getConnection();
|
|
return new TeamController(new TeamModel(new TeamGateway($con), new MemberGateway($con), new AccountGateway($con)));
|
|
}
|
|
|
|
function getTacticController(): TacticController {
|
|
return new TacticController(new TacticModel(new TacticInfoGateway(getConnection()), new AccountGateway(getConnection())), new TeamModel(new TeamGateway(getConnection()), new MemberGateway(getConnection()), new AccountGateway(getConnection())));
|
|
}
|
|
|
|
|
|
function getAuthController(): AuthController {
|
|
return new AuthController(new AuthModel(new AccountGateway(getConnection())));
|
|
}
|
|
|
|
function getTwig(): Environment {
|
|
global $basePath;
|
|
$fl = new FilesystemLoader("../src/App/Views");
|
|
$twig = new Environment($fl);
|
|
|
|
$twig->addFunction(new TwigFunction('path', fn(string $str) => "$basePath$str"));
|
|
|
|
return $twig;
|
|
}
|
|
|
|
function getRoutes(): AltoRouter {
|
|
global $basePath;
|
|
|
|
$ar = new AltoRouter();
|
|
$ar->setBasePath($basePath);
|
|
|
|
//authentication
|
|
$ar->map("GET", "/login", Action::noAuth(fn() => getAuthController()->displayLogin()));
|
|
$ar->map("GET", "/register", Action::noAuth(fn() => getAuthController()->displayRegister()));
|
|
$ar->map("POST", "/login", Action::noAuth(fn(SessionHandle $s) => getAuthController()->login($_POST, $s)));
|
|
$ar->map("POST", "/register", Action::noAuth(fn(SessionHandle $s) => getAuthController()->register($_POST, $s)));
|
|
|
|
//user-related
|
|
$ar->map("GET", "/", Action::auth(fn(SessionHandle $s) => getUserController()->home($s)));
|
|
$ar->map("GET", "/home", Action::auth(fn(SessionHandle $s) => getUserController()->home($s)));
|
|
$ar->map("GET", "/settings", Action::auth(fn(SessionHandle $s) => getUserController()->settings($s)));
|
|
$ar->map("GET", "/disconnect", Action::auth(fn(MutableSessionHandle $s) => getUserController()->disconnect($s)));
|
|
|
|
|
|
$ar->map("GET", "/shareTactic", Action::auth(fn(SessionHandle $s) => getTacticController()->displayTactic(true, $s)));
|
|
$ar->map("GET", "/shareTactic/[i:id]", Action::auth(fn(int $id, SessionHandle $s) => getTacticController()->displayTeamAndAccount(true, $id, $s)));
|
|
$ar->map("GET", "/shareTactic/[i:id]/team/[i:idTeam]", Action::auth(fn(int $tacticId, int $teamId, SessionHandle $s) => getTacticController()->displayShareConfirmation($tacticId, $teamId, $s)));
|
|
$ar->map("POST", "/shareTactic/[i:id]/team/[i:idTeam]", Action::auth(fn(int $tacticId, int $teamId, SessionHandle $s) => getTacticController()->shareTacticToTeam($_POST, $tacticId, $teamId, $s)));
|
|
$ar->map("POST", "/shareTactic/[i:id]/account", Action::auth(fn(int $tacticId, SessionHandle $s) => getTacticController()->shareTacticToAccount($_POST, $tacticId, $s)));
|
|
|
|
$ar->map("GET", "/unshareTactic", Action::auth(fn(SessionHandle $s) => getTacticController()->displayTactic(false, $s)));
|
|
$ar->map("GET", "/unshareTactic/[i:id]", Action::auth(fn(int $id, SessionHandle $s) => getTacticController()->displayTeamAndAccount(false, $id, $s)));
|
|
$ar->map("POST", "/unshareTactic/[i:id]", Action::auth(fn(int $id, SessionHandle $s) => getTacticController()->unshareTactic($id, $s)));
|
|
|
|
|
|
//tactic-related
|
|
$ar->map("GET", "/tactic/[i:id]/view", Action::auth(fn(int $id, SessionHandle $s) => getVisualizerController()->openVisualizer($id, $s)));
|
|
$ar->map("GET", "/tactic/[i:id]/edit", Action::auth(fn(int $id, SessionHandle $s) => getEditorController()->openEditor($id, $s)));
|
|
// don't require an authentication to run this action.
|
|
// If the user is not connected, the tactic will never save.
|
|
$ar->map("GET", "/tactic/new", Action::noAuth(fn() => getEditorController()->createNew()));
|
|
$ar->map("GET", "/tactic/new/plain", Action::noAuth(fn(SessionHandle $s) => getEditorController()->createNewOfKind(CourtType::plain(), $s)));
|
|
$ar->map("GET", "/tactic/new/half", Action::noAuth(fn(SessionHandle $s) => getEditorController()->createNewOfKind(CourtType::half(), $s)));
|
|
|
|
|
|
//team-related
|
|
$ar->map("GET", "/team/new", Action::auth(fn(SessionHandle $s) => getTeamController()->displayCreateTeam($s)));
|
|
$ar->map("POST", "/team/new", Action::auth(fn(SessionHandle $s) => getTeamController()->submitTeam($_POST, $s)));
|
|
$ar->map("GET", "/team/search", Action::auth(fn(SessionHandle $s) => getTeamController()->displayListTeamByName($s)));
|
|
$ar->map("POST", "/team/search", Action::auth(fn(SessionHandle $s) => getTeamController()->listTeamByName($_POST, $s)));
|
|
$ar->map("GET", "/team/[i:id]", Action::auth(fn(int $id, SessionHandle $s) => getTeamController()->displayTeam($id, $s)));
|
|
$ar->map("GET", "/team/[i:id]/delete", Action::auth(fn(int $id, SessionHandle $s) => getTeamController()->deleteTeamById($id, $s)));
|
|
$ar->map("GET", "/team/[i:id]/addMember", Action::auth(fn(int $id, SessionHandle $s) => getTeamController()->displayAddMember($id, $s)));
|
|
$ar->map("POST", "/team/[i:id]/addMember", Action::auth(fn(int $id, SessionHandle $s) => getTeamController()->addMember($id, $_POST, $s)));
|
|
$ar->map("GET", "/team/[i:idTeam]/remove/[i:idMember]", Action::auth(fn(int $idTeam, int $idMember, SessionHandle $s) => getTeamController()->deleteMember($idTeam, $idMember, $s)));
|
|
$ar->map("GET", "/team/[i:id]/edit", Action::auth(fn(int $idTeam, SessionHandle $s) => getTeamController()->displayEditTeam($idTeam, $s)));
|
|
$ar->map("POST", "/team/[i:id]/edit", Action::auth(fn(int $idTeam, SessionHandle $s) => getTeamController()->editTeam($idTeam, $_POST, $s)));
|
|
|
|
return $ar;
|
|
}
|
|
|
|
function runMatch($match, MutableSessionHandle $session): HttpResponse {
|
|
global $basePath;
|
|
if (!$match) {
|
|
return ViewHttpResponse::twig("error.html.twig", [
|
|
'failures' => [ValidationFail::notFound("Could not find page {$_SERVER['REQUEST_URI']}.")],
|
|
], HttpCodes::NOT_FOUND);
|
|
}
|
|
|
|
return App::runAction($basePath . '/login', $match['target'], $match['params'], $session);
|
|
}
|
|
|
|
//this is a global variable
|
|
$basePath = get_base_path();
|
|
|
|
App::render(runMatch(getRoutes()->match(), PhpSessionHandle::init()), fn() => getTwig());
|