mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/tickme.git
synced 2026-08-19 12:33:57 +00:00
294 lines
9.0 KiB
PHP
294 lines
9.0 KiB
PHP
<?php
|
|
|
|
namespace App\Classes\CodeGenerator\Common;
|
|
|
|
use App\Classes\CodeGenerator\Utils\GeneratorFieldsInputUtil;
|
|
use App\Classes\CodeGenerator\Utils\TableFieldsGenerator;
|
|
use Exception;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Str;
|
|
|
|
class CommandData
|
|
{
|
|
|
|
/** @var string */
|
|
public $modelName;
|
|
public $commandType;
|
|
|
|
/** @var GeneratorConfig */
|
|
public $config;
|
|
|
|
/** @var GeneratorField[] */
|
|
public $fields = [];
|
|
|
|
/** @var GeneratorFieldRelation[] */
|
|
public $relations = [];
|
|
|
|
/** @var Command */
|
|
public $commandObj;
|
|
|
|
/** @var TemplatesManager */
|
|
private $templateManager;
|
|
|
|
/** @var array */
|
|
public $dynamicVars = [];
|
|
public $fieldNamesMapping = [];
|
|
|
|
/** @var CommandData */
|
|
protected static $instance = null;
|
|
|
|
public static function getInstance()
|
|
{
|
|
return self::$instance;
|
|
}
|
|
|
|
public function getTemplatesManager()
|
|
{
|
|
return $this->templateManager;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param Command $commandObj
|
|
* @param $commandType
|
|
* @param TemplatesManager $templatesManager
|
|
*/
|
|
public function __construct(Command $commandObj, $commandType, TemplatesManager $templatesManager = null)
|
|
{
|
|
$this->commandObj = $commandObj;
|
|
|
|
if (is_null($templatesManager)) {
|
|
$this->templateManager = app(TemplatesManager::class);
|
|
} else {
|
|
$this->templateManager = $templatesManager;
|
|
}
|
|
|
|
$this->commandType = $commandType;
|
|
|
|
$this->fieldNamesMapping = [
|
|
'$FIELD_NAME_TITLE$' => 'fieldTitle',
|
|
'$FIELD_NAME$' => 'name',
|
|
];
|
|
|
|
$this->config = new GeneratorConfig();
|
|
}
|
|
|
|
public function commandError($error)
|
|
{
|
|
$this->commandObj->error($error);
|
|
}
|
|
|
|
public function commandComment($message)
|
|
{
|
|
$this->commandObj->comment($message);
|
|
}
|
|
|
|
public function commandWarn($warning)
|
|
{
|
|
$this->commandObj->warn($warning);
|
|
}
|
|
|
|
public function commandInfo($message)
|
|
{
|
|
$this->commandObj->info($message);
|
|
}
|
|
|
|
public function initCommandData()
|
|
{
|
|
$this->config->init($this);
|
|
}
|
|
|
|
public function getOption($option)
|
|
{
|
|
return $this->config->getOption($option);
|
|
}
|
|
|
|
public function getAddOn($option)
|
|
{
|
|
return $this->config->getAddOn($option);
|
|
}
|
|
|
|
public function setOption($option, $value)
|
|
{
|
|
$this->config->setOption($option, $value);
|
|
}
|
|
|
|
public function addDynamicVariable($name, $val)
|
|
{
|
|
$this->dynamicVars[$name] = $val;
|
|
}
|
|
|
|
public function getFields()
|
|
{
|
|
$this->fields = [];
|
|
|
|
if ($this->getOption('fieldsFile') or $this->getOption('jsonFromGUI')) {
|
|
$this->getInputFromFileOrJson();
|
|
} elseif ($this->getOption('fromTable')) {
|
|
$this->getInputFromTable();
|
|
} else {
|
|
$this->getInputFromConsole();
|
|
}
|
|
}
|
|
|
|
private function getInputFromConsole()
|
|
{
|
|
$this->commandInfo('Specify fields for the model (skip id & timestamp fields, we will add it automatically)');
|
|
$this->commandInfo('Read docs carefully to specify field inputs)');
|
|
$this->commandInfo('Enter "exit" to finish');
|
|
|
|
$this->addPrimaryKey();
|
|
|
|
while (true) {
|
|
$fieldInputStr = $this->commandObj->ask('Field: (name db_type html_type options)', '');
|
|
|
|
if (empty($fieldInputStr) || $fieldInputStr == false || $fieldInputStr == 'exit') {
|
|
break;
|
|
}
|
|
|
|
if (!GeneratorFieldsInputUtil::validateFieldInput($fieldInputStr)) {
|
|
$this->commandError('Invalid Input. Try again');
|
|
continue;
|
|
}
|
|
|
|
$validations = $this->commandObj->ask('Enter validations: ', false);
|
|
$validations = ($validations == false) ? '' : $validations;
|
|
|
|
if ($this->getOption('relations')) {
|
|
$relation = $this->commandObj->ask('Enter relationship (Leave Blank to skip):', false);
|
|
} else {
|
|
$relation = '';
|
|
}
|
|
|
|
$this->fields[] = GeneratorFieldsInputUtil::processFieldInput(
|
|
$fieldInputStr,
|
|
$validations
|
|
);
|
|
|
|
if (!empty($relation)) {
|
|
$this->relations[] = GeneratorFieldRelation::parseRelation($relation);
|
|
}
|
|
}
|
|
|
|
$this->addTimestamps();
|
|
}
|
|
|
|
private function addPrimaryKey()
|
|
{
|
|
$primaryKey = new GeneratorField();
|
|
if ($this->getOption('primary')) {
|
|
$primaryKey->name = $this->getOption('primary');
|
|
} else {
|
|
$primaryKey->name = 'id';
|
|
}
|
|
$primaryKey->parseDBType('increments');
|
|
$primaryKey->parseOptions('s,f,p,if,ii');
|
|
|
|
$this->fields[] = $primaryKey;
|
|
}
|
|
|
|
private function addTimestamps()
|
|
{
|
|
$createdAt = new GeneratorField();
|
|
$createdAt->name = 'created_at';
|
|
$createdAt->parseDBType('timestamp');
|
|
$createdAt->parseOptions('s,f,if,ii');
|
|
$this->fields[] = $createdAt;
|
|
|
|
$updatedAt = new GeneratorField();
|
|
$updatedAt->name = 'updated_at';
|
|
$updatedAt->parseDBType('timestamp');
|
|
$updatedAt->parseOptions('s,f,if,ii');
|
|
$this->fields[] = $updatedAt;
|
|
}
|
|
|
|
private function getInputFromFileOrJson()
|
|
{
|
|
// fieldsFile option will get high priority than json option if both options are passed
|
|
try {
|
|
if ($this->getOption('fieldsFile')) {
|
|
$fieldsFileValue = $this->getOption('fieldsFile');
|
|
if (file_exists($fieldsFileValue)) {
|
|
$filePath = $fieldsFileValue;
|
|
} elseif (file_exists(base_path($fieldsFileValue))) {
|
|
$filePath = base_path($fieldsFileValue);
|
|
} else {
|
|
$schemaFileDirector = app_path('Classes/CodeGenerator/Schemas/');
|
|
$filePath = $schemaFileDirector.$fieldsFileValue;
|
|
}
|
|
|
|
if (!file_exists($filePath)) {
|
|
$this->commandError('Fields file not found');
|
|
exit;
|
|
}
|
|
|
|
$fileContents = file_get_contents($filePath);
|
|
$jsonData = json_decode($fileContents, true);
|
|
$this->fields = [];
|
|
foreach ($jsonData as $field) {
|
|
if (isset($field['type']) && $field['relation']) {
|
|
$this->relations[] = GeneratorFieldRelation::parseRelation($field['relation']);
|
|
} else {
|
|
$this->fields[] = GeneratorField::parseFieldFromFile($field);
|
|
if (isset($field['relation'])) {
|
|
$this->relations[] = GeneratorFieldRelation::parseRelation($field['relation']);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$fileContents = $this->getOption('jsonFromGUI');
|
|
$jsonData = json_decode($fileContents, true);
|
|
|
|
// override config options from jsonFromGUI
|
|
$this->config->overrideOptionsFromJsonFile($jsonData);
|
|
|
|
// Manage custom table name option
|
|
if (isset($jsonData['tableName'])) {
|
|
$tableName = $jsonData['tableName'];
|
|
$this->config->tableName = $tableName;
|
|
$this->addDynamicVariable('$TABLE_NAME$', $tableName);
|
|
$this->addDynamicVariable('$TABLE_NAME_TITLE$', Str::studly($tableName));
|
|
}
|
|
|
|
// Manage migrate option
|
|
if (isset($jsonData['migrate']) && $jsonData['migrate'] == false) {
|
|
$this->config->options['skip'][] = 'migration';
|
|
}
|
|
|
|
foreach ($jsonData['fields'] as $field) {
|
|
if (isset($field['type']) && $field['relation']) {
|
|
$this->relations[] = GeneratorFieldRelation::parseRelation($field['relation']);
|
|
} else {
|
|
$this->fields[] = GeneratorField::parseFieldFromFile($field);
|
|
if (isset($field['relation'])) {
|
|
$this->relations[] = GeneratorFieldRelation::parseRelation($field['relation']);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception $e) {
|
|
$this->commandError($e->getMessage());
|
|
exit;
|
|
}
|
|
}
|
|
|
|
private function getInputFromTable()
|
|
{
|
|
$tableName = $this->dynamicVars['$TABLE_NAME$'];
|
|
|
|
$ignoredFields = $this->getOption('ignoreFields');
|
|
if (!empty($ignoredFields)) {
|
|
$ignoredFields = explode(',', trim($ignoredFields));
|
|
} else {
|
|
$ignoredFields = [];
|
|
}
|
|
|
|
$tableFieldsGenerator = new TableFieldsGenerator($tableName, $ignoredFields, $this->config->connection);
|
|
$tableFieldsGenerator->prepareFieldsFromTable();
|
|
$tableFieldsGenerator->prepareRelations();
|
|
|
|
$this->fields = $tableFieldsGenerator->fields;
|
|
$this->relations = $tableFieldsGenerator->relations;
|
|
}
|
|
|
|
} |