File: /var/www/heifetz/heifetz-app/kotsik
#!/usr/bin/env php
<?php
use Commands\CreateAdmin;
use Core\DbLib\DbDriver;
use Core\Models\Auth;
use Core\Models\RedisCache;
use Helpers\Output;
const VERSION = '1.0.0';
try {
define('ROOT', realpath(__DIR__) . '/');
date_default_timezone_set('Europe/Moscow');
require_once ROOT . '/vendor/autoload.php';
require_once(ROOT . '/config.php');
require_once(ROOT . '/core/exceptions.php');
require_once(ROOT . '/core/dblib/dblib.php');
/** @var object $_CONFIG */
$commands = [
'admin' => ['admin:create' => CreateAdmin::getDescription()],
'cache' => ['cache:clear' => 'Частично очищаем кэш Redis'],
'make' => ['make:migration' => 'Создаёт Миграцию'],
];
$devCommands = [
'admin' => [
'admin:reset' => 'Сбрасывает пароли',
'admin:save-live' => 'Сбрасывает критичные для Live сервера настройки',
],
];
if (IS_DEV || IS_TEST) {
foreach ($devCommands as $groupName => $innerCommands) {
foreach ($innerCommands as $command => $title) {
$commands[$groupName][$command] = $title;
}
}
}
$maxCommandSize = 0;
foreach ($commands as $groupName => $innerCommands) {
foreach ($innerCommands as $command => $title) {
$maxCommandSize = max($maxCommandSize, strlen($command));
}
}
$maxCommandSize += 2;
array_shift($argv);
if (empty($argv)) {
Output::print('Kotsik Framework ');
Output::green(VERSION);
Output::printLn(' (' . APPLICATION_ENV . ')');
Output::printLn();
Output::yellowLn('Использование:');
Output::printLn(' command [options] [arguments]');
Output::printLn();
Output::yellowLn('Доступные команды:');
foreach ($commands as $groupName => $innerCommands) {
Output::greenLn(' ' . $groupName);
foreach ($innerCommands as $command => $title) {
Output::yellow(' ' . $command);
echo str_pad($title, $maxCommandSize - strlen($command) + strlen($title), pad_type: STR_PAD_LEFT) . PHP_EOL;
}
}
return;
}
$command = array_shift($argv);
$command = explode(':', $command);
$group = array_shift($command);
if (empty($commands[$group])) {
Output::error('Команда "' . $group . '" не определена');
return 1;
}
if (empty($command)) {
$error = 'Команда "' . $group . '" не определена' . PHP_EOL . PHP_EOL;
$error .= 'Вы имели в виду одно из этого?' . PHP_EOL;
$suggestions = array_map(fn($command) => ' ' . $command, array_keys($commands[$group]));
$error .= join(PHP_EOL, $suggestions);
Output::error($error);
return 1;
}
$action = array_shift($command);
if (empty($commands[$group][$group . ':' . $action])) {
$error = 'Команда "' . $group . ':' . $action . '" не определена' . PHP_EOL . PHP_EOL;
$error .= 'Вы имели в виду одно из этого?' . PHP_EOL;
$suggestions = array_map(fn($command) => ' ' . $command, array_keys($commands[$group]));
$error .= join(PHP_EOL, $suggestions);
Output::error($error);
return 1;
}
switch ($group) {
case 'cache':
switch ($action) {
case 'clear':
RedisCache::create()->clear();
Output::greenLn('Очистка завершена');
break;
}
break;
case 'make':
switch ($action) {
case 'migration':
if (empty($argv)) {
Output::error('Необходимо указать название Миграции');
return 1;
}
$migrationName = array_shift($argv);
$migrationName = 'm' . date('Y_m_d_Hi_') . $migrationName;
$fileName = ROOT . 'migrations/' . $migrationName . '.php';
if (file_exists($fileName)) {
Output::error('Миграция с таким названием уже существует');
return 1;
}
$title = readline('Можете указать заголовок Миграции [оставить пустым]:' . PHP_EOL);
$data = file_get_contents(ROOT . 'migrations/migration.example');
$data = str_replace('{{NAME}}', $migrationName, $data);
$data = str_replace('{{TITLE}}', $title, $data);
file_put_contents($fileName, $data);
Output::greenLn('Миграция успешно создана');
break;
}
break;
case 'admin':
switch ($action) {
case 'create':
(new CreateAdmin())->run();
break;
case 'reset':
if (IS_PROD) {
Output::error('Для данного env нельзя сбрасывать пароли');
return 1;
}
if ($_CONFIG->debug) {
ini_set('display_errors', 1);
error_reporting(E_ALL);
}
$db = DbDriver::getInstance();
$newPass = Auth::getPasswordHash('1');
$db->query("UPDATE users SET password = '$newPass' WHERE id > 0;");
Output::success('Пароли пользователей сброшены');
break;
}
break;
}
} catch (Exception $exception) {
Output::error($exception->getMessage());
return 1;
}