pdm = new PersistentDataManager(); $this->userRepository = new UserRepository(); $this->userConfirmationRepository = new UserConfirmationRepository(); $this->userPasswordResetterRepository = new UserPasswordResetterRepository(); $this->multiRoomRepository = new MultiRoomRepository(); } public function configure(): void { $this->setName('db:maintain') ->setDescription('Maintain database.'); } public function execute(InputInterface $input, OutputInterface $output): int { try { $this->deleteInactiveExpiredUsers(); $this->deleteExpiredPasswordResetters(); $this->deleteExpiredRooms(); $this->deleteExpiredSessions(); } catch (\Exception $e) { $output->writeln('Maintenance failed!'); $output->writeln(''); $output->writeln((string) $e); $output->writeln(''); return 1; } $output->writeln('Maintenance was successful!'); $output->writeln(''); return 0; } private function deleteInactiveExpiredUsers(): void { \Container::$dbConnection->startTransaction(); foreach ($this->userRepository->getAllInactiveExpired() as $user) { //TODO: these can be in some wrapper class $userConfirmation = $this->userConfirmationRepository->getByUser($user); if ($userConfirmation !== null) { $this->pdm->deleteFromDb($userConfirmation); } $userPasswordResetter = $this->userPasswordResetterRepository->getByUser($user); if ($userPasswordResetter !== null) { $this->pdm->deleteFromDb($userPasswordResetter); } $this->pdm->deleteFromDb($user); } \Container::$dbConnection->commit(); } private function deleteExpiredPasswordResetters(): void { foreach ($this->userPasswordResetterRepository->getAllExpired() as $passwordResetter) { $this->pdm->deleteFromDb($passwordResetter); } } private function deleteExpiredRooms(): void { foreach ($this->multiRoomRepository->getAllExpired() as $multiRoom) { $this->pdm->deleteFromDb($multiRoom); } } private function deleteExpiredSessions(): void { //TODO: model may be used for sessions too $select = new Select(\Container::$dbConnection, 'sessions'); $select->columns(['id']); $select->where('updated', '<', (new DateTime('-7 days'))->format('Y-m-d H:i:s')); $result = $select->execute(); while ($session = $result->fetch(IResultSet::FETCH_ASSOC)) { $modify = new Modify(\Container::$dbConnection, 'sessions'); $modify->setId($session['id']); $modify->delete(); } } }