From deacd0dfc195bca41af631114804d29937337cd8 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 17 Jan 2024 02:11:31 +0900 Subject: . --- services/app/src/AlbCtl.php | 116 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 services/app/src/AlbCtl.php (limited to 'services/app/src/AlbCtl.php') diff --git a/services/app/src/AlbCtl.php b/services/app/src/AlbCtl.php new file mode 100644 index 0000000..fb08aba --- /dev/null +++ b/services/app/src/AlbCtl.php @@ -0,0 +1,116 @@ +conn = new Connection( + driver: 'pgsql', + host: $config->dbHost, + port: $config->dbPort, + name: $config->dbName, + user: $config->dbUser, + password: $config->dbPassword, + max_tries: 10, + sleep_sec: 3, + ); + } + + /** + * @param list $argv + */ + public function run(array $argv): void + { + match ($argv[1] ?? 'help') { + 'migrate' => $this->runMigrate(), + 'promote' => $this->runPromote(), + 'deluser' => $this->runDeleteUser(), + 'delquiz' => $this->runDeleteQuiz(), + default => $this->runHelp(), + }; + } + + private function runMigrate(): void + { + $migration_manager = new MigrationManager($this->conn); + $migration_manager->execute(); + } + + private function runPromote(): void + { + echo "Username: "; + $username = trim((string)fgets(STDIN)); + + $user_repo = new UserRepository($this->conn); + $user = $user_repo->findByUsername($username); + if ($user === null) { + echo "User '$username' not found.\n"; + return; + } + $user_repo->update( + user_id: $user->user_id, + is_admin: true, + ); + } + + private function runDeleteUser(): void + { + echo "Username: "; + $username = trim((string)fgets(STDIN)); + + $user_repo = new UserRepository($this->conn); + $answer_repo = new AnswerRepository($this->conn); + + $this->conn->transaction(function () use ($user_repo, $answer_repo, $username) { + $user = $user_repo->findByUsername($username); + if ($user === null) { + echo "User '$username' not found.\n"; + return; + } + $answer_repo->deleteAllByUserId($user->user_id); + $user_repo->delete($user->user_id); + }); + // It is unnecessary to destroy existing sessions here because + // CurrentUserMiddleware will check whether the user exists or not. + } + + private function runDeleteQuiz(): void + { + echo "Quiz ID: "; + $quiz_id = (int)trim((string)fgets(STDIN)); + + $answer_repo = new AnswerRepository($this->conn); + $quiz_repo = new QuizRepository($this->conn); + + $this->conn->transaction(function () use ($answer_repo, $quiz_repo, $quiz_id) { + $answer_repo->deleteAllByQuizId($quiz_id); + $quiz_repo->delete($quiz_id); + }); + } + + private function runHelp(): void + { + echo << + + Commands: + migrate Run database migrations. + promote Promote a user to administrator. + deluser Delete a user. + delquiz Delete a quiz. + EOS; + } +} -- cgit v1.2.3-70-g09d2