More changes

This commit is contained in:
ahwelp
2020-07-22 03:34:33 -03:00
parent 5840d1338b
commit df312bdc1b
11 changed files with 461 additions and 286 deletions
+198
View File
@@ -0,0 +1,198 @@
<?php
namespace App\Core\Sanity;
class MigratorController {
private static $instance;
private $instaled;
private $phisical;
private $uninstall = Array();
private $downgrade = Array();
private $upgrade = Array();
private $install = Array();
private function __construct() {
$this->load_installed_plugins();
$this->load_physical_plugins();
}
private static function newObj() {
if (!isset(self::$instance)) {
self::$instance = new MigratorController();
}
return self::$instance;
}
public static function getInstance() {
if (!isset(self::$instance)) {
return self::newObj();
}
return self::$instance;
}
public function sentinel() {
global $ROUTE;
if (!is_file(DIR_CONFIG . 'modules.ini')) {
if (INSTALL_REQUIRE) {
$ROUTE->doBlock()->setHttpError(500);
}
file_put_contents(DIR_CONFIG . 'modules.ini', '');
}
}
private function save() {
$out = '';
foreach ($this->instaled as $instaled) {
$out .= "[$instaled->name]\n";
$out .= "name=$instaled->name\n";
$out .= "version=$instaled->version\n\n";
}
file_put_contents(DIR_CONFIG . '/modules.ini', $out);
}
private function is_satisfy($name, $version) {
if (!isset($this->instaled[$name])) {
return false;
}
if ($this->instaled[$name]->version >= $version) {
return true;
}
return false;
}
private function is_satisfy_array($array) {
foreach ($array as $item) {
if (!self::is_satisfy($item->name, $item->version)) {
return false;
}
}
return true;
}
public function update_plugin_version($name, $version) {
echo "Atualizando $name para versão $version\n";
if (isset($this->instaled[$name])) {
$this->instaled[$name]->version = $version;
return;
}
$this->instaled[$name] = new \stdClass();
$this->instaled[$name]->name = $name;
$this->instaled[$name]->version = $version;
}
private function load_installed_plugins() {
$installed = parse_ini_file(DIR_CONFIG . 'modules.ini', true);
foreach ($installed as $key => $item) {
$installed[$key] = (object) $item;
}
return $this->instaled = $installed;
}
private function load_physical_plugins() {
$module_configs = Array();
$plugins = Array();
$rdi = new \RecursiveDirectoryIterator(DIR_APP);
foreach (new \RecursiveIteratorIterator($rdi) as $file) {
if (strpos($file, 'version.php')) {
$module_configs[] = str_replace('version.php', '', $file);
}
}
foreach ($module_configs as $module_config) {
$plugin = new \stdClass();
include $module_config . 'version.php';
$plugins[$plugin->name] = $plugin;
if (is_file($module_config . 'db/Migrate.php')) {
include $module_config . 'db/Migrate.php';
}
}
$this->phisical = $plugins;
}
public function physical_list() {
return $this->phisical;
}
public function installed_list() {
return $this->instaled;
}
public function instal_list() {
return $this->install;
}
public function uninstal_list() {
return $this->uninstall;
}
public function sort_plugins() {
foreach ($this->phisical as $key => $plugin) {
if (!isset($this->instaled[$key])) {
$this->install[] = $plugin;
continue;
}
if ($this->instaled[$key]->version < $plugin->version) {
$this->upgrade[] = $plugin;
continue;
}
if ($this->instaled[$key]->version > $plugin->version) {
$this->downgrade[] = $plugin;
continue;
}
$this->uninstall[] = $plugin;
}
}
public function execute_plan() {
$status = false;
while (!$status) {
$this->sort_plugins();
$status = true;
foreach ($this->install as $key => $item) {
if (isset($item->require)) {
if (!self::is_satisfy_array($item->require)) {
$status = false;
continue;
}
}
if (!self::is_satisfy($item->name, $item->version)) {
if (!function_exists($item->name . '_upgrade')) {
$this->update_plugin_version($item->name, $item->version);
$this->upgrade[] = $item;
unset($this->install[$key]);
continue;
}
call_user_func($item->name . '_upgrade', 0);
$this->upgrade[] = $this->instaled[$item->name];
unset($this->install[$key]);
$status = false;
}
}
foreach ($this->upgrade as $item) {
if (isset($item->require)) {
if (!self::is_satisfy_array($item->require)) {
$status = false;
continue;
}
}
if (!self::is_satisfy($item->name, $item->version)) {
if (!function_exists($item->name . '_upgrade')) {
$this->update_plugin_version($item->name, $item->version);
continue;
}
call_user_func($item->name . '_upgrade', $this->instaled[$item->name]->version);
$status = false;
}
}
}
$this->save();
}
}
+7 -16
View File
@@ -1,27 +1,18 @@
<?php
use Routes\RouteCollection as RouteCollection;
use DDLWrapper\Wrapper as Wrapper;
use ORM\Connections as Connections;
use Schema\Wrapper as Wrapper;
RouteCollection::cli('sanity/install', function() {
include_once 'classes/Migrator.class.php';
global $DB;
Wrapper::set_driver($DB);
Migrator::getInstance()->execute_plan();
Wrapper::set_driver(Connections::getConnection());
App\Core\Sanity\MigratorController::getInstance()->execute_plan();
Wrapper::commit();
})->middlewareIgnore('auth');
RouteCollection::add('*', '*', function() {
global $ROUTE;
if(INSTALL_REQUIRE){
//App need to be installed
if (!is_file(DIR_CONFIG . 'modules.ini')) {
$ROUTE->doBlock()->setHttpError(500);
}
}
App\Core\Sanity\MigratorController::getInstance()->sentinel();
}, -19)->doIgnore()->middlewareIgnore('auth');
-183
View File
@@ -1,183 +0,0 @@
<?php
class Migrator{
private static $instance;
private $instaled;
private $phisical;
private $uninstall = Array();
private $downgrade = Array();
private $upgrade = Array();
private $install = Array();
private function __construct(){
$this->load_installed_plugins();
$this->load_physical_plugins();
}
private static function newObj(){
if (!isset( self::$instance )) {
self::$instance = new Migrator();
}
return self::$instance;
}
public static function getInstance(){
if (!isset(self::$instance)) {
return self::newObj();
}
return self::$instance;
}
private function save(){
$out = '';
foreach ($this->instaled as $instaled){
$out .= "[$instaled->name]\n";
$out .= "name=$instaled->name\n";
$out .= "version=$instaled->version\n\n";
}
file_put_contents(DIR_CONFIG.'/modules.ini', $out);
}
private function is_satisfy($name, $version){
if(!isset($this->instaled[$name])){
return false;
}
if($this->instaled[$name]->version >= $version){
return true;
}
return false;
}
private function is_satisfy_array($array){
foreach ($array as $item){
if( !self::is_satisfy($item->name, $item->version) ){
return false;
}
}
return true;
}
public function update_plugin_version($name, $version){
echo "Atualizando $name para versão $version\n";
if( isset($this->instaled[$name]) ){
$this->instaled[$name]->version = $version;
return;
}
$this->instaled[$name] = new stdClass();
$this->instaled[$name]->name = $name;
$this->instaled[$name]->version = $version;
}
private function load_installed_plugins(){
$installed = parse_ini_file(DIR_CONFIG.'/modules.ini', true);
foreach ($installed as $key => $item) {
$installed[$key] = (object) $item;
}
return $this->instaled = $installed;
}
private function load_physical_plugins(){
$module_configs = Array();
$plugins = Array();
$rdi = new RecursiveDirectoryIterator(DIR_APP);
foreach(new RecursiveIteratorIterator($rdi) as $file){
if( strpos($file, 'version.php') ){
$module_configs[] = str_replace('version.php','', $file);
}
}
foreach ($module_configs as $module_config) {
$plugin = new stdClass();
include $module_config . 'version.php';
$plugins[$plugin->name] = $plugin;
if(is_file( $module_config . 'db/Migrate.php') ){
//echo 'aaaaaaaaaaaa';
include $module_config . 'db/Migrate.php';
}
}
$this->phisical = $plugins;
}
public function physical_list(){
return $this->phisical;
}
public function installed_list(){
return $this->instaled;
}
public function instal_list(){
return $this->install;
}
public function uninstal_list(){
return $this->uninstall;
}
public function sort_plugins(){
foreach ($this->phisical as $key => $plugin){
if( !isset($this->instaled[$key]) ){
$this->install[] = $plugin;
continue;
}
if( $this->instaled[$key]->version < $plugin->version){
$this->upgrade[] = $plugin;
continue;
}
if( $this->instaled[$key]->version > $plugin->version){
$this->downgrade[] = $plugin;
continue;
}
$this->uninstall[] = $plugin;
}
}
public function execute_plan(){
$status = false;
while(! $status ){
$this->sort_plugins();
$status = true;
foreach ($this->install as $key => $item) {
if( isset($item->require) ){
if( !self::is_satisfy_array($item->require) ){ $status = false; continue; }
}
if(!self::is_satisfy($item->name, $item->version) ){
if(!function_exists($item->name.'_upgrade')){
$this->update_plugin_version($item->name, $item->version);
$this->upgrade[] = $item;
unset($this->install[$key]);
continue;
}
call_user_func($item->name.'_upgrade', 0);
$this->upgrade[] = $this->instaled[$item->name];
unset($this->install[$key]);
$status = false;
}
}
foreach ($this->upgrade as $item) {
if( isset($item->require) ){
if( !self::is_satisfy_array($item->require) ){ $status = false; continue; }
}
if(!self::is_satisfy($item->name, $item->version) ){
if(!function_exists($item->name.'_upgrade')){
$this->update_plugin_version($item->name, $item->version);
continue;
}
call_user_func($item->name.'_upgrade', $this->instaled[$item->name]->version);
$status = false;
}
}
}
$this->save();
}
}