databasePath); $app = AppFactory::create(); $app->addBodyParsingMiddleware(); $app->addRoutingMiddleware(); $errorMiddleware = $app->addErrorMiddleware($config->displayErrors, true, true); $errorMiddleware->setDefaultErrorHandler( new JsonErrorHandler($app->getResponseFactory(), $config->displayErrors) ); // --- Wiring ----------------------------------------------------------------- $users = new UserRepository($database->pdo()); $projects = new ProjectRepository($database->pdo()); $cards = new CardRepository($database->pdo()); $verificationTokens = new EmailVerificationRepository($database->pdo()); $jwt = new JwtService($config->jwtSecret, $config->jwtTtl); $session = new SessionPayload($jwt, $verificationTokens); /** @var Mailer $mailer */ $mailer = $config->mail->transport === 'log' ? new LogMailer($config->mail->logPath) : new PhpMailerMailer($config->mail); $verifier = new EmailVerifier($verificationTokens, $users, $mailer, $config->appUrl); $authController = new AuthController($users, $session, $verifier); $emailController = new EmailVerificationController($users, $verificationTokens, $verifier, $session); $projectController = new ProjectController($projects); $cardController = new CardController($projects, $cards); $authMiddleware = new AuthMiddleware($jwt, $users); // --- Routes --------------------------------------------------------------- $app->group('/api', function (RouteCollectorProxy $group) use ( $authController, $emailController, $projectController, $cardController, $authMiddleware, ) { $group->get('/health', function (Request $request, Response $response): Response { $response->getBody()->write((string) json_encode(['status' => 'ok'])); return $response->withHeader('Content-Type', 'application/json'); }); $group->post('/auth/register', [$authController, 'register']); $group->post('/auth/login', [$authController, 'login']); $group->post('/auth/magic-link', [$authController, 'requestLoginLink']); $group->post('/auth/verify-email', [$emailController, 'verify']); $group->get('/me', [$authController, 'me'])->add($authMiddleware); $group->post('/email/verification', [$emailController, 'resend'])->add($authMiddleware); $group->post('/email/change', [$emailController, 'requestChange'])->add($authMiddleware); $group->group('/projects', function (RouteCollectorProxy $projects) use ($projectController, $cardController) { $projects->get('', [$projectController, 'index']); $projects->post('', [$projectController, 'store']); $projects->get('/{projectId:[0-9]+}', [$projectController, 'show']); $projects->patch('/{projectId:[0-9]+}', [$projectController, 'update']); $projects->delete('/{projectId:[0-9]+}', [$projectController, 'destroy']); $projects->get('/{projectId:[0-9]+}/cards', [$cardController, 'index']); $projects->post('/{projectId:[0-9]+}/cards', [$cardController, 'store']); $projects->put('/{projectId:[0-9]+}/cards/order', [$cardController, 'reorder']); $projects->get('/{projectId:[0-9]+}/cards/{cardId:[0-9]+}', [$cardController, 'show']); $projects->patch('/{projectId:[0-9]+}/cards/{cardId:[0-9]+}', [$cardController, 'update']); $projects->delete('/{projectId:[0-9]+}/cards/{cardId:[0-9]+}', [$cardController, 'destroy']); })->add($authMiddleware); }); return $app;