accountHandler = $accountHandler; $this->accountRepository = $accountRepository; $this->aliasRepository = $aliasRepository; } // -- /accounts - List all accounts public function showAccounts(Request $request, Response $response): Response { // Parse query parameters for filters $queryParams = $request->getQueryParams(); $filterByDomain = $queryParams['domain'] ?? ''; $renderData = $this->accountHandler->listAccounts($filterByDomain); return $this->view->render($response, 'accounts.html.twig', $renderData); } // -- /accounts/{id} - Show account details public function showAccountDetails(Request $request, Response $response, array $args): Response { // Parse URL arguments $accountId = (int)$args['id']; $renderData = $this->accountHandler->getAccountDetails($accountId); return $this->view->render($response, 'account_details.html.twig', $renderData); } // -- /accounts/new - Create new account public function showAccountCreate(Request $request, Response $response): Response { // TODO: just a placeholder return $this->showAccounts($request, $response); } // -- /accounts/{id}/edit - Edit account public function showAccountEdit(Request $request, Response $response, array $args): Response { // Parse URL arguments $accountId = (int)$args['id']; // Get account data from database // TODO use account handler $account = $this->accountRepository->fetchAccountById($accountId); $renderData = [ 'id' => $account->getId(), 'accountUsername' => $account->getUsername(), 'account' => $account, ]; $lastActionResult = $this->sessionHelper->getLastActionResult(); if ($lastActionResult !== null) { $resultData = $lastActionResult->isSuccess() ? ['success' => $lastActionResult->getMessage()] : ['error' => $lastActionResult->getMessage()]; $resultData['editData'] = $lastActionResult->getInputData(); $renderData = array_merge($renderData, $resultData); } return $this->view->render($response, 'account_edit.html.twig', $renderData); } public function editAccount(Request $request, Response $response, array $args): Response { // Parse URL arguments $accountId = (int)$args['id']; // Parse form data $editData = $request->getParsedBody(); $errorMessage = null; try { // Validate input $validatedEditData = AccountEditData::createFromArray($editData); $this->accountHandler->editAccountData($accountId, $validatedEditData); } catch (InputValidationError $e) { $errorMessage = $e->getMessage(); } if (empty($errorMessage)) { $this->sessionHelper->setLastActionResult(ActionResult::createSuccessResult('Account data was saved.')); } else { $this->sessionHelper->setLastActionResult(ActionResult::createErrorResult($errorMessage, $editData)); } // Redirect to edit form page via GET (PRG) return $response->withHeader('Location', '/accounts/' . $accountId . '/edit')->withStatus(303); } // -- /accounts/{id}/delete - Delete account public function showAccountDelete(Request $request, Response $response, array $args): Response { // Parse URL arguments $accountId = (int)$args['id']; // Get account data and list of aliases from database $account = $this->accountRepository->fetchAccountById($accountId); $aliases = $this->aliasRepository->fetchAliasesForUserId($accountId); $renderData = [ 'id' => $accountId, 'accountUsername' => $account->getUsername(), 'aliases' => $aliases, ]; return $this->view->render($response, 'account_delete.html.twig', $renderData); } public function deleteAccount(Request $request, Response $response, array $args): Response { // TODO: just a placeholder $this->view->getEnvironment()->addGlobal('error', 'Not implemented yet!'); return $this->showAccountDelete($request, $response, $args); } } /* * TODO: * ACCOUNTS: * - "edit account" page * --> maybe show page == edit page? (maybe '/accounts/{id}[/edit]' route) * - "delete account" page * - add/edit/delete aliases for accounts * - list page: checkboxes for mass editing/deleting? (maybe only deleting, mass editing sounds like pita) * - list page: checkbox similar to 'show detail columns' -> 'show aliases'? * - "create account" page * - edit/create: random password generator * * ALIASES: * - list of aliases (filter by domain, filter by account) * - edit aliases...? maybe just link to the account edit page */