Files
API-KTA/app/Commands/DhivaCommand.php
2026-04-25 04:41:23 +07:00

455 lines
17 KiB
PHP

<?php
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
use Dhiva\Core\DhivaAES;
use CodeIgniter\Database\Config;
class DhivaCommand extends BaseCommand
{
/**
* The Command's Group
*
* @var string
*/
protected $group = 'Prodev';
/**
* The Command's Name
*
* @var string
*/
protected $name = 'sebat';
/**
* The Command's Description
*
* @var string
*/
protected $description = 'Dhiva Command';
/**
* The Command's Usage
*
* @var string
*/
protected $usage = 'command:name [arguments] [options]';
/**
* The Command's Arguments
*
* @var array
*/
protected $arguments = ['kuy'];
/**
* The Command's Options
*
* @var array
*/
protected $options = [];
/**
* Actually execute a command.
*
* @param array $params
*/
public function run(array $params)
{
if (isset($params[0])) {
if (!file_exists(APPPATH . '/Config/Database.php')) {
if ($this->initDb()) {
$db = \Config\Database::connect();
CLI::write('Init ' . $db->getPlatform());
if ($db->getPlatform() == 'Postgre') {
$this->initTbPostgre();
echo command('db:seed superuserseeder');
echo command('db:seed supergroupseeder');
echo command('db:seed endpointseeder');
} else {
CLI::write('Versi MySql belum ada');
}
CLI::write("Installasi core berhasil ya baginda", 'green');
}
} else {
CLI::write("Sudah di config wahai yang mulia baginda", 'green');
}
} else {
CLI::write('Buah duku di pohon kaktus' . PHP_EOL . 'Tidak bisa diambil karena berduri' . PHP_EOL . 'Pinjamkanlah dulu aku sembilan ratus' . PHP_EOL . 'Biar aku bisa wara-wiri' . PHP_EOL);
$command = CLI::promptByKey(
'Perintahmu ya Baginda?',
[
'Ubah environment ke ' . $this->checkEnv(),
'Buatkan APP ID',
'Buatkan CRUD',
'Ubah durasi JWT Token',
'Buatkan Kopi',
'Belum kepikiran ntar dulu'
]
);
switch ($command) {
case 0:
$this->changeEnv();
break;
case 1:
$this->createAppId();
break;
case 2:
$this->createComponent();
break;
case 3:
$this->changeJWTtimeout();
break;
case 4:
CLI::write("Silahkan bikin sendiri wahai banginda");
break;
case 5:
CLI::write("Mikir mulu!");
break;
default:
CLI::write("Perintahnya tidak ada wahai baginda");
}
}
}
private function changeJWTtimeout()
{
if (JWT_BY == 'JAM') {
CLI::write("Durasi Sekarang : " . JWT_TIMEOUT / HOUR . " " . JWT_BY);
} elseif (JWT_BY == 'HARI') {
CLI::write("Durasi Sekarang : " . JWT_TIMEOUT / DAY . " " . JWT_BY);
}
CLI::newLine(1);
$pd = CLI::promptByKey('Pilih Durasi ', ['JAM', 'HARI']);
if ($pd == 0) {
$dr = CLI::prompt("Berapa jam?", null, ['required']);
if (preg_match("/^\\d+$/", $dr)) {
$str = file_get_contents(APPPATH . '/Config/Constants.php');
$new = HOUR * $dr;
$str = str_replace(['define("JWT_TIMEOUT", ' . JWT_TIMEOUT . ');', 'define("JWT_BY", "' . JWT_BY . '");'], ['define("JWT_TIMEOUT", ' . $new . ');', 'define("JWT_BY", "JAM");'], $str);
file_put_contents(APPPATH . '/Config/Constants.php', $str);
CLI::write("Durasi Sekarang : " . $dr . " Jam");
}
} elseif ($pd == 1) {
$dr = CLI::prompt("Berapa hari?", null, ['required']);
if (preg_match("/^\\d+$/", $dr)) {
$str = file_get_contents(APPPATH . '/Config/Constants.php');
$new = DAY * $dr;
$str = str_replace(['define("JWT_TIMEOUT", ' . JWT_TIMEOUT . ');', 'define("JWT_BY", "' . JWT_BY . '");'], ['define("JWT_TIMEOUT", ' . $new . ');', 'define("JWT_BY", "HARI");'], $str);
}
file_put_contents(APPPATH . '/Config/Constants.php', $str);
CLI::write("Durasi Sekarang : " . $dr . " Hari");
}
}
private function initDb()
{
$schema = '';
$DBDriver = CLI::promptByKey('Database Driver ', ['MySQLi', 'Postgre']);
$username = CLI::prompt("Username Database", null, ['required']);
$password = CLI::prompt("Password Database", null, ['required']);
$tabel = CLI::prompt("Nama Database", null, ['required']);
if ($DBDriver == 0) {
$DBDriver = 'MySQLi';
} else if ($DBDriver == 1) {
$DBDriver = 'Postgre';
$schema = CLI::prompt("Schema Database", null, ['required']);
if ($this->checkConnectionDB($DBDriver, $username, $password, $tabel, $schema)) {
$str = file_get_contents(APPPATH . '/Libraries/DhivaComponent/DatabaseClient.txt');
$str = str_replace(['{{DBDriver}}', '{{username}}', '{{password}}', '{{tabel}}', '{{schema}}'], [$DBDriver, $username, $password, $tabel, $schema], $str);
file_put_contents(APPPATH . '/Config/Database.php', $str);
return true;
} else {
CLI::write("Koneksi ke database gagal!", 'red');
return false;
}
}
}
private function checkConnectionDB($DBDriver, $username, $password, $tabel, $schema)
{
$dbSelect = [
'DSN' => '',
'hostname' => 'localhost',
'username' => $username,
'password' => $password,
'database' => $tabel,
'schema' => $schema,
'DBDriver' => $DBDriver,
'DBPrefix' => '',
'pConnect' => true,
'DBDebug' => true,
'charset' => 'utf8',
'DBCollat' => 'utf8_bin',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'numberNative' => false,
];
try {
$db = Database::connect($dbSelect, false);
$db->error();
CLI::write(json_encode($db->error()['message']));
} catch (\Throwable $e) {
CLI::write('Username atau Password DB salah');
}
if (!$db->simpleQuery('CREATE TABLE testtable();')) {
return false;
} else {
$db->query('DROP TABLE testtable;');
return true;
}
}
private function createComponent()
{
$component = CLI::prompt("Nama Component", null, ['required']);
$routes = CLI::prompt("Nama Routing", null, ['required']);
$tabel = CLI::prompt("Tabel Database", null, ['required']);
$str1 = file_get_contents(APPPATH . '/Libraries/DhivaComponent/Controller.txt');
$str1 = str_replace(['{{controller}}', '{{model}}', '{{tabel}}'], [ucfirst($component), ucfirst($component), $tabel], $str1);
file_put_contents(APPPATH . "/Controllers/" . ucfirst($component) . 'Controller.php', $str1);
$str2 = file_get_contents(APPPATH . '/Libraries/DhivaComponent/Model.txt');
$str2 = str_replace(['{{model}}', '{{tabel}}'], [ucfirst($component), $tabel], $str2);
file_put_contents(APPPATH . "/Models/SqlModel/" . ucfirst($component) . 'ModelSql.php', $str2);
$str3 = file_get_contents(APPPATH . '/Libraries/DhivaComponent/Routes.txt');
$str3 = str_replace(['{{routes}}', '{{controller}}'], [$routes, ucfirst($component)], $str3);
file_put_contents(APPPATH . "/Config/Routes.php", $str3, FILE_APPEND);
$str4 = file_get_contents(APPPATH . '/Models/SqlModel/BaseModelSql.php');
$s = explode('];', explode('protected $providers = [', $str4)[1]);
$r = $s[0] . ' "' . $tabel . '" => ' . ucfirst($component) . 'ModelSql::class,' . PHP_EOL;
$done = str_replace($s[0], $r, $str4);
file_put_contents(APPPATH . '/Models/SqlModel/BaseModelSql.php', $done);
$this->createComponentDb($tabel);
CLI::write("Component berhasil ditambahkan ya baginda", 'green');
}
/**
* Masih ada bug buat primary key di Postgre
* jadi belum bisa dipake
* @link https://codeigniter4.github.io/userguide/dbmgmt/forge.html#forge-addprimarykey
*/
private function createComponentDb($tabel, $buat = false)
{
if ($buat) {
$forge = Database::forge();
$forge->addField([
$tabel . '_id' => [
'type' => 'VARCHAR',
'constraint' => 200,
'primary' => true
],
$tabel . '_unique' => [
'type' => 'INT',
'constraint' => 255,
'auto_increment' => true,
'unique' => true,
],
'created_at timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP'
]);
$forge->createTable($tabel);
$db = \Config\Database::connect();
$db->query('ALTER TABLE ' . $tabel . ' ADD CONSTRAINT ' . $tabel . '_pk PRIMARY KEY (' . $tabel . '_id)');
} else {
$forge = \Config\Database::forge();
$forge->addField([
$tabel . '_id' => [
'type' => 'VARCHAR',
'constraint' => 200,
],
$tabel . '_unique' => [
'type' => 'INT',
'constraint' => 255,
'auto_increment' => true,
'unique' => true,
],
'created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP'
]);
$forge->addKey($tabel . '_id', true);
$forge->createTable($tabel);
}
}
private function checkEnv()
{
return (ENVIRONMENT != 'development') ? 'development' : 'production';
}
private function createAppId()
{
$str = file_get_contents(APPPATH . '/Config/Constants.php');
if (!str_contains($str, 'SSL_KEY')) {
// Jangan di dirapihin/format document!, memang kek gini rule nya
$text =
'define("SSL_KEY", array(
"password" => "' . DhivaAES::randomStr(16) . '",
"salt" => "' . DhivaAES::randomStr(16) . '",
"iv" => "' . DhivaAES::randomStr(16) . '",
"iterations" => 2,
"keyLength" => 2,
"route" => "' . DhivaAES::randomStr(16) . '"
));
define("JWT_KEY", "' . DhivaAES::randomStr(20) . '");
';
file_put_contents(APPPATH . '/Config/Constants.php', $text, FILE_APPEND);
CLI::write('Berhasil ditambahkan APP ID ya baginda', 'green');
} else {
CLI::write('APP ID Sudah ada ya banginda, tidak perlu di generate lagi', 'green');
}
}
private function changeEnv()
{
if (!file_exists(ROOTPATH . ".env")) {
if (!file_exists(ROOTPATH . "env")) {
$str = file_get_contents(APPPATH . '/Libraries/DhivaComponent/env.txt');
file_put_contents(ROOTPATH . ".env", $str);
} else {
copy(ROOTPATH . "env", ROOTPATH . ".env");
}
}
$str = file_get_contents(ROOTPATH . ".env");
if (str_contains($str, '# CI_ENVIRONMENT')) {
$search = '# CI_ENVIRONMENT';
} else {
$search = 'CI_ENVIRONMENT';
}
if (ENVIRONMENT == 'development') {
$str = str_replace($search . ' = development', $search . ' = production', $str);
$rr = 'production';
} else {
$str = str_replace($search . ' = production', $search . ' = development', $str);
$rr = 'development';
}
file_put_contents(ROOTPATH . ".env", $str);
CLI::write('Berhasil dirubah ke ' . $rr . ' ya baginda', 'green');
}
private function initTbPostgre()
{
$db = \Config\Database::connect();
$forge = \Config\Database::forge();
$forge->addField([
'super_user_id' => [
'type' => 'VARCHAR',
'constraint' => 200,
],
'super_user_unique' => [
'type' => 'INT',
'constraint' => 255,
'auto_increment' => true,
'unique' => true,
],
'super_group_id' => [
'type' => 'INT',
'constraint' => 5,
],
'domain_id' => [
'type' => 'INT',
'constraint' => 5,
],
'name' => [
'type' => 'VARCHAR',
'constraint' => 200,
],
'email' => [
'type' => 'VARCHAR',
'constraint' => 200,
'null' => true,
],
'username' => [
'type' => 'VARCHAR',
'constraint' => 200,
],
'password' => [
'type' => 'VARCHAR',
'constraint' => 200,
],
'avatar' => [
'type' => 'VARCHAR',
'constraint' => 200,
'null' => true,
],
'status' => [
'type' => 'INT',
'constraint' => 1,
'null' => true,
],
'token' => [
'type' => 'VARCHAR',
'constraint' => 200,
'null' => true,
],
'created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP',
'login_date TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP',
'access_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP'
]);
$forge->createTable('super_user');
$db->query('ALTER TABLE ' . 'super_user ADD CONSTRAINT super_user_pk PRIMARY KEY (super_user_id)');
$forge->addField([
'super_group_id' => [
'type' => 'INT',
'constraint' => 255,
'auto_increment' => true,
],
'super_group_unique' => [
'type' => 'INT',
'constraint' => 255,
'auto_increment' => true,
'unique' => true,
],
'domain_id' => [
'type' => 'INT',
'constraint' => 255,
],
'group_name' => [
'type' => 'VARCHAR',
'constraint' => 200,
'null' => true,
],
'status' => [
'type' => 'INT',
'constraint' => 1,
'null' => true,
],
'created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP',
]);
$forge->createTable('super_group');
$db->query("CREATE TYPE endpoint_type" . " AS enum ('frontend', 'backend')");
$db->query("CREATE TYPE endpoint_method" . " AS enum ('POST', 'GET', 'PUT', 'DELETE')");
$db->query("CREATE TYPE endpoint_bypass" . " AS enum ('0', '1')");
$forge->addField([
'endpoint_id' => [
'type' => 'INT',
'constraint' => 255,
'auto_increment' => true,
],
'value' => [
'type' => 'VARCHAR',
'constraint' => 200,
],
'description' => [
'type' => 'VARCHAR',
'constraint' => 200,
'null' => true,
],
'created_by' => [
'type' => 'VARCHAR',
'constraint' => 200,
'null' => true,
],
'created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP',
]);
$forge->createTable('endpoint');
$db->query('ALTER TABLE endpoint ADD CONSTRAINT endpoint_id_pk PRIMARY KEY (endpoint_id)');
$db->query("ALTER TABLE endpoint ADD method endpoint_method NOT NULL;");
$db->query("ALTER TABLE endpoint ADD type endpoint_type NOT NULL;");
$db->query("ALTER TABLE endpoint ADD bypass endpoint_bypass NOT NULL;");
}
}
class Database extends Config
{
}