ahwelp 5 år sedan
förälder
incheckning
df312bdc1b

+ 189 - 70
app/core/generator/GeneratorController.php

@@ -7,7 +7,7 @@ class GeneratorController {
     private $langBase = 
             <<<EOL
             <?php
-                \$lang['{{PLUGIN_NAME}}']['module_name'] = '{{PLUGIN_NAME_PRETTY}}';
+                \$lang["{{PLUGIN_NAME}}"]["module_name"] = "{{PLUGIN_NAME_PRETTY}}";
             EOL;
     
     private $migrationBase = 
@@ -17,35 +17,43 @@ class GeneratorController {
             use Schema\Wrapper as Wrapper;
 
             function {{PLUGIN_NAME}}_upgrade(\$pluginversion) {
-                if (\$pluginversion < '1.0.0') {
-                    \$table = Wrapper::get_table('{{PLUGIN_NAME}}');
-                    \$table->addColumn("name", 'string', Array('null' => false));
-                    \$table->addColumn("time", 'timestamp', Array('null' => true, 'default'=>null));
-                    \$table->addColumn("areaid", 'integer', Array('null' => false));
+                if (\$pluginversion < "0.0.1") {
+                    \$table = Wrapper::get_table("{{PLUGIN_NAME}}");
+                    \$table->addColumn("name", "string", Array("null" => false));
+                    \$table->addColumn("time", "timestamp", Array("null" => true, "default"=>null));
+                    \$table->addColumn("areaid", "integer", Array("null" => false));
                     \$table->addTimestamps();
                     \$table->addSoftDelete();
                     \$table->create();
         
-                    Migrator::getInstance()->update_plugin_version('{{PLUGIN_NAME}}', '1.0.0');
+                    Migrator::getInstance()->update_plugin_version("{{PLUGIN_NAME}}", "1.0.0");
                     return;
                 }
             
-                //if (\$pluginversion < '1.0.1') {
-                    //\$table = Wrapper::get_table('{{PLUGIN_NAME}}');
-                    //Migrator::getInstance()->update_plugin_version('{{PLUGIN_NAME}}', '1.0.1');
+                //if (\$pluginversion < "0.0.2") {
+                    //\$table = Wrapper::get_table("{{PLUGIN_NAME}}");
+                    //Migrator::getInstance()->update_plugin_version("{{PLUGIN_NAME}}", "1.0.1");
                     //return;
                 //}
             }
+            
+            function {{PLUGIN_NAME}}_rollback(\$pluginversion) {
+                if(\$pluginversion > "0.0.1"){
+                    \$table = Wrapper::get_table("{{PLUGIN_NAME}}");
+                    \$table->drop();
+                    return;
+                }
+            }
             EOL;
     
     private $versionBase = 
             <<<EOL
             <?php
 
-            \$plugin->name = '{{PLUGIN_NAME}}';
-            \$plugin->version = '0.0.1';
+            \$plugin->name = "{{PLUGIN_NAME}}";
+            \$plugin->version = "0.0.1";
             
-            //\$plugin->require = Array( ["name" => "plugin_name", "version" => 'x.x.x'] );
+            //\$plugin->require = Array( ["name" => "plugin_name", "version" => "x.x.x"] );
             EOL;
     
     private $controllerBase = 
@@ -55,38 +63,93 @@ class GeneratorController {
             namespace {{NAMESPACE}};
 
             use \{{NAMESPACE}}\Classes\{{OBJECT}} as {{OBJECT}};
-
-            class {{CONTROLLER}} {
+            use \App\Core\Template\Output as Output;
             
+            class {{CONTROLLER}} {
+                
+                /**
+                * Index 
+                *   Show the main {{OBJECT}} list
+                */
                 function index(){
-                    
+                    Output::setView('index');
+                    \$list = Array();
+
+                    for(\$i = 0; \$i <= 10; \$i++){
+                        \$obj = Array();
+                        \$obj['id'] = \$i;
+                        \$obj['value'] = md5(\$i);
+                        \$obj['description'] = sha1(\$i);
+                        \$list[] = \$obj;
+                    }
+                    Output::addValue('list', \$list );
+                    Output::render();
                 }
             
+                /**
+                * Create
+                *   Render the main {{OBJECT}} formular
+                */            
                 function create(){
-                     
+                    Output::setView('form', ['id' => 0]);
+                    Output::render();                     
                 }
             
-                function Store(){
+                /**
+                * Store 
+                *   Store the param on the database
+                * @param {{OBJECT}} \${{OBJECT_LOWER}}
+                */
+                function store({{OBJECT}} \${{OBJECT_LOWER}}){
                     
                 }
             
-                function show({{OBJECT}} \{{OBJECT_LOWER}}){
+                /**
+                * Show
+                *   Render one register
+                *
+                * @param {{OBJECT}} \${{OBJECT_LOWER}}
+                */
+                function show({{OBJECT}} \${{OBJECT_LOWER}}){
                     
                 }
             
-                function edit({{OBJECT}} \{{OBJECT_LOWER}}){
+                /**
+                * Edit
+                *   Render the formular for a database {{OBJECT}}
+                *
+                * @param {{OBJECT}} \${{OBJECT_LOWER}}
+                */
+                function edit({{OBJECT}} \${{OBJECT_LOWER}}){
                     
                 }
             
-                function update({{OBJECT}} \{{OBJECT_LOWER}}){
+                /**
+                * Update 
+                *   Store the changes of the param on the database
+                *
+                * @param {{OBJECT}} \${{OBJECT_LOWER}}
+                */            
+                function update({{OBJECT}} \${{OBJECT_LOWER}}){
                     
                 }
             
-                function destroy({{OBJECT}} \{{OBJECT_LOWER}}){
+                /**
+                * Destroy
+                *   If the object has soft delete. 
+                *
+                * @param {{OBJECT}} \${{OBJECT_LOWER}}
+                */
+                function destroy({{OBJECT}} \${{OBJECT_LOWER}}){
                     
                 }
-            
-                function purge({{OBJECT}} \{{OBJECT_LOWER}}){
+                /**
+                * Purge
+                *   Remove object even with soft delete.
+                *
+                * @param {{OBJECT}} \${{OBJECT_LOWER}}
+                */
+                function purge({{OBJECT}} \${{OBJECT_LOWER}}){
                     
                 }
             }
@@ -103,15 +166,15 @@ class GeneratorController {
 
             class {{OBJECT}} extends Entity {
                 
-                //const _idPolice = Array('type' => '', 'min' => 0, 'max' => 100000, 'step' => 2);
+                //const _idPolice = Array("type" => "", "min" => 0, "max" => 100000, "step" => 2);
                 
-                const _tableName = '{{TABLE_NAME}}';
-                //const _properties = Array('id', 'name');
+                const _tableName = "{{TABLE_NAME}}";
+                //const _properties = Array("id", "name");
             
                 //const _timestamps = true;
                 //const _softdelete = true;
             
-                //const _connectionName = '';
+                //const _connectionName = "";
             }
             EOL;
     
@@ -121,17 +184,64 @@ class GeneratorController {
 
             use Routes\RouteCollection as RouteCollection;
 
-            RouteCollection::group('/{{PLUGIN_NAME}}', function(){
-                RouteCollection::get   ('/',            '\{{NAMESPACE}}\{{CONTROLLER}}@index');
-                RouteCollection::get   ('/',            '\{{NAMESPACE}}\{{CONTROLLER}}@create');
-                RouteCollection::post  ('/',            '\{{NAMESPACE}}\{{CONTROLLER}}@store');
-                RouteCollection::get   ('/[i:id]',      '\{{NAMESPACE}}\{{CONTROLLER}}@show');
-                RouteCollection::get   ('/[i:id]/edit', '\{{NAMESPACE}}\{{CONTROLLER}}@edit');
-                RouteCollection::put   ('/[i:id]/edit', '\{{NAMESPACE}}\{{CONTROLLER}}@update');
-                RouteCollection::delete('/[i:id]',      '\{{NAMESPACE}}\{{CONTROLLER}}@destroy');
+            RouteCollection::group("/{{PLUGIN_NAME}}", function(){
+                RouteCollection::get   ("/",            "\{{NAMESPACE}}\{{CONTROLLER}}@index");
+                RouteCollection::get   ("/form",        "\{{NAMESPACE}}\{{CONTROLLER}}@create");
+                RouteCollection::post  ("/",            "\{{NAMESPACE}}\{{CONTROLLER}}@store");
+                RouteCollection::get   ("/[i:id]",      "\{{NAMESPACE}}\{{CONTROLLER}}@show");
+                RouteCollection::get   ("/[i:id]/edit", "\{{NAMESPACE}}\{{CONTROLLER}}@edit");
+                RouteCollection::put   ("/[i:id]/edit", "\{{NAMESPACE}}\{{CONTROLLER}}@update");
+                RouteCollection::delete("/[i:id]",      "\{{NAMESPACE}}\{{CONTROLLER}}@destroy");
             });
             EOL;
     
+    private $indexTemplate =
+            <<<EOL
+            <a href='{{ENDPOINT}}/form' >Adicionar </a>
+            <div class="table-responsive">
+                <table class='table'>
+
+                    <thead>
+                       <tr>
+                          <th>Id</th>
+                          <th>Value</th>
+                          <th>Description</th>
+                          <th>Actions</th>
+                       </tr>
+                    </thead>
+
+                    {{#list}}
+                       <tr class="table-dark" data-id='{{id}}'>
+                          <td>{{id}}</td>
+                          <td>{{value}}</td>
+                          <td>{{description}}</td>
+                          <td>
+                             <a href="{{ENDPOINT}}/edit"> <i class="fa fa-pencil"></i></a>
+                             <a href="{{ENDPOINT}}/purge"> <i class="fa fa-fire"></i></a>
+                             <a href="{{ENDPOINT}}/"> <i class="fa fa-plus"></i></a>
+                             <a href="{{ENDPOINT}}/destroy"> <i class="fa fa-trash-o"></i></a>
+                          </td>
+                       </tr>
+                    {{/list}}
+                </table>
+            </div>
+            EOL;
+    
+    private $formTemplate =
+            <<<EOL
+            {{@ if( {{id}} ): @}}
+            <form method="POST" action="{{ENDPOINT}}/{{id}}/edit">
+               <input type="hidden" name="id" value="{{id}}" />
+               <input type="hidden" name="_method" value="put" />
+            {{@ else: @}}
+            <form method="POST" action="{{ENDPOINT}}">
+               <input type="hidden" name="id" value="" />
+            {{@ endif; @}}
+
+            </form>
+            EOL;
+    
+    
     private $ctagsHeader = 
         <<<EOL
         !_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
@@ -146,63 +256,72 @@ class GeneratorController {
 
     function createPluginFromTemplate($subname, $name){
 
-        if (is_dir( DIR_APP.$subname . '/' . $name )){
-            echo 'Treco ja existe';
+        if (is_dir( DIR_APP.$subname . "/" . $name )){
+            echo "Treco ja existe";
             return;
         }else{
-            mkdir(DIR_APP.$subname . '/' . $name,              0755, true);
-            mkdir(DIR_APP.$subname . '/' . $name . '/lang',    0755, true);
-            mkdir(DIR_APP.$subname . '/' . $name . '/classes', 0755, true);
-            mkdir(DIR_APP.$subname . '/' . $name . '/db',      0755, true);
-            mkdir(DIR_APP.$subname . '/' . $name . '/views',   0755, true);            
+            mkdir(DIR_APP.$subname . "/" . $name,              0755, true);
+            mkdir(DIR_APP.$subname . "/" . $name . "/lang",    0755, true);
+            mkdir(DIR_APP.$subname . "/" . $name . "/classes", 0755, true);
+            mkdir(DIR_APP.$subname . "/" . $name . "/db",      0755, true);
+            mkdir(DIR_APP.$subname . "/" . $name . "/views",   0755, true);            
         }
 
         $plugin_name = $name;
-        $namespace = "App\\".ucfirst($subname).'\\'.ucfirst($name);
-        $plugin_name_pretty = ucwords(str_replace('_', ' ', $name));
+        $namespace = "App\\".ucfirst($subname)."\\".ucfirst($name);
+        $plugin_name_pretty = ucwords(str_replace("_", " ", $name));
         $object      = ucfirst( $name );
-        $controller  = $object.'Controller';
+        $controller  = $object."Controller";
         
         $this->langBase = str_replace("{{PLUGIN_NAME}}",        $plugin_name,        $this->langBase);
         $this->langBase = str_replace("{{PLUGIN_NAME_PRETTY}}", $plugin_name_pretty, $this->langBase);
-        file_put_contents(DIR_APP.$subname . '/' . $name . '/lang/en.php',           $this->langBase);
-        file_put_contents(DIR_APP.$subname . '/' . $name . '/lang/'.APP_LANG.'.php', $this->langBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/lang/en.php",           $this->langBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/lang/".APP_LANG.".php", $this->langBase);
         
         $this->migrationBase = str_replace("{{PLUGIN_NAME}}", $plugin_name,   $this->migrationBase);
-        file_put_contents(DIR_APP.$subname . '/' . $name . '/db/Migrate.php', $this->migrationBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/db/Migrate.php", $this->migrationBase);
         
         $this->routeBase = str_replace("{{NAMESPACE}}",   $namespace,     $this->routeBase);
         $this->routeBase = str_replace("{{PLUGIN_NAME}}", $plugin_name,   $this->routeBase);
         $this->routeBase = str_replace("{{CONTROLLER}}",  $controller,    $this->routeBase);
-        file_put_contents(DIR_APP.$subname . '/' . $name . '/Routes.php', $this->routeBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/Routes.php", $this->routeBase);
        
-        $this->objectBase = str_replace("{{NAMESPACE}}",   $namespace.'\Classes',   $this->objectBase);
+        $this->objectBase = str_replace("{{NAMESPACE}}",   $namespace."\Classes",   $this->objectBase);
         $this->objectBase = str_replace("{{OBJECT}}",      $object,                 $this->objectBase);
         $this->objectBase = str_replace("{{TABLE_NAME}}",  $name,                   $this->objectBase);
-        file_put_contents(DIR_APP.$subname . '/' . $name . "/classes/$object.php",  $this->objectBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/classes/$object.php",  $this->objectBase);
         
         $this->controllerBase = str_replace("{{NAMESPACE}}",   $namespace,            $this->controllerBase);
         $this->controllerBase = str_replace("{{OBJECT}}",      $object,               $this->controllerBase);
-        $this->controllerBase = str_replace("{{OBJECT_LOWER}}",strlower($object),     $this->controllerBase);
+        $this->controllerBase = str_replace("{{OBJECT_LOWER}}",strtolower($object),   $this->controllerBase);
         $this->controllerBase = str_replace("{{CONTROLLER}}",  $controller,           $this->controllerBase);
-        file_put_contents(DIR_APP.$subname . '/' . $name . "/$controller.php",        $this->controllerBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/$controller.php",        $this->controllerBase);
         
+        $this->versionBase = str_replace("{{PLUGIN_NAME}}", $subname."_".$plugin_name,   $this->versionBase);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/version.php", $this->versionBase);
+        
+        $this->indexTemplate = str_replace("{{ENDPOINT}}", $plugin_name, $this->indexTemplate);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/views/index.mustache", $this->indexTemplate);
+        
+        $this->formTemplate = str_replace("{{ENDPOINT}}", $plugin_name, $this->formTemplate);
+        file_put_contents(DIR_APP.$subname . "/" . $name . "/views/form.mustache", $this->formTemplate);
+                
     }
     
     function listRoutes(){
-        echo str_pad('VERB',     10, ' ', STR_PAD_BOTH) .  "||";
-        echo str_pad('URI' ,     35, ' ', STR_PAD_BOTH) .  "||";
-        echo str_pad('W',        5,  ' ', STR_PAD_BOTH) .  "||";
-        echo str_pad('FUNCTION', 60, ' ', STR_PAD_BOTH) .  "\n";
-        echo str_pad('', 120, '-') . "\n";
+        echo str_pad("VERB",     10, " ", STR_PAD_BOTH) .  "||";
+        echo str_pad("URI" ,     35, " ", STR_PAD_BOTH) .  "||";
+        echo str_pad("W",        5,  " ", STR_PAD_BOTH) .  "||";
+        echo str_pad("FUNCTION", 60, " ", STR_PAD_BOTH) .  "\n";
+        echo str_pad("", 120, "-") . "\n";
         foreach(\Routes\RouteCollection::returnRoutes() as $route){
-            echo str_pad(implode($route->_verb , ', '), 10, ' ', STR_PAD_BOTH) . "||";
-            echo str_pad($route->_uri, 35, ' ', STR_PAD_RIGHT) . "||";
-            echo str_pad($route->_weight, 5, ' ', STR_PAD_BOTH). "||";
-            if( gettype($route->_callback[0]) == 'object' ){
-                echo str_pad('Clousure', 60, ' ', STR_PAD_RIGHT);
+            echo str_pad(implode($route->_verb , ", "), 10, " ", STR_PAD_BOTH) . "||";
+            echo str_pad($route->_uri, 35, " ", STR_PAD_RIGHT) . "||";
+            echo str_pad($route->_weight, 5, " ", STR_PAD_BOTH). "||";
+            if( gettype($route->_callback[0]) == "object" ){
+                echo str_pad("Clousure", 60, " ", STR_PAD_RIGHT);
             }else{
-                echo str_pad($route->_callback[0], 30, ' ', STR_PAD_RIGHT);
+                echo str_pad($route->_callback[0], 30, " ", STR_PAD_RIGHT);
             }
             echo "\n";
         }
@@ -210,19 +329,19 @@ class GeneratorController {
 
     function createTags(){
         $outputs = shell_exec("grep -Rnsi '@ctag' . | sed s/\ //g | sed s/*@ctag/\ /g");
-        $outputs = preg_split('/\R/', $outputs);
+        $outputs = preg_split("/\R/", $outputs);
         $return  = $this->ctagsHeader . "\n";
         foreach($outputs as $output){
-            $line = explode(' ', str_replace('\\t', '', $output) );
-            @$line = $line[1] . "\t " . str_replace('./', '', explode(':', $line[0])[0]) . "\t ".$line[1] . "\n";
-            if( strpos($line, 'app/core/generator/GeneratorController.php') ){
+            $line = explode(" ", str_replace("\\t", "", $output) );
+            @$line = $line[1] . "\t " . str_replace("./", "", explode(":", $line[0])[0]) . "\t ".$line[1] . "\n";
+            if( strpos($line, "app/core/generator/GeneratorController.php") ){
                 continue;
             }
             $return .= $line;
             //echo "Generating: ".$line."\n";
         }
 
-        file_put_contents(DIR_ROOT.'tags', $return);
+        file_put_contents(DIR_ROOT."tags", $return);
     } 
     
 }

+ 198 - 0
app/core/sanity/MigratorController.php

@@ -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
app/core/sanity/Routes.php

@@ -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');

+ 0 - 183
app/core/sanity/classes/Migrator.class.php

@@ -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();
-    }
-
-}

+ 2 - 1
app/core/template/Output.class.php

@@ -47,7 +47,8 @@ class Output {
         self::getInstance()->setView($name, $values, $location)->render();
     }
 
-    public static function setView($name, $values = Array(), $location = null) {
+    public static function setView($name = '', $values = Array(), $location = null) {
+        if($name == ''){ return self::getInstance(); }
         $instance =  self::getInstance();
         $folder = '';
         if (!$location) {

+ 2 - 3
app/core/template/classes/dashboard/Dashboard.php

@@ -16,7 +16,7 @@ class Dashboard extends RenderableTemplate {
         global $DROPDOWN, $SIDEBAR;
         
         $head = '';
-        $head .=  '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
+        
         $head .=  '<script src="/plugins/jquery/jquery.min.js"></script>';
 
         $head .=  '<script src="/plugins/mousetrap/mousetrap.min.js"></script>';
@@ -31,7 +31,7 @@ class Dashboard extends RenderableTemplate {
         $head .=  '<link href="/plugins/normalize-css/normalize.css" rel="stylesheet">';
         $head .=  '<link href="/dist/style.css" rel="stylesheet">';
 
-        $head .=  '<link href="/dist/theme/black_and_white.css" rel="stylesheet">';
+        $head .=  '<link href="/dist/themes/black_and_white.css" rel="stylesheet">';
 
         $head .=  '<link href="/plugins/metisMenu/metisMenu.min.css" rel="stylesheet">';
         $head .=  '<script src="/plugins/metisMenu/metisMenu.min.js"></script>';
@@ -47,7 +47,6 @@ class Dashboard extends RenderableTemplate {
         
         $foot = '';
         $foot .= '<script src="/dist/script.js"></script>';
-        $foot .= '<script src="/dist/exercicio_form.js"></script>';
         
         $this->content = file_get_contents(__DIR__ . '/template.html');
 

+ 2 - 0
app/core/template/classes/dashboard/template.html

@@ -1,5 +1,7 @@
 <html>
     <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <meta charset="utf-8">
         {{head}}
     </head>
 

+ 40 - 0
config/database.php

@@ -0,0 +1,40 @@
+<?php
+
+use ORM\Connections as Connections;
+
+/*
+ * PostgreSQL
+ * 
+ * Connections::addConnection(Connection::open([
+            'driver' => 'pgsql',
+            'host' => 'localhost',
+            'prefix' => '_urfat',
+            'name' => 'urfat',
+            'user' => 'urfat',
+            'pass' => 'urfat'])
+        , "default");
+*/
+
+/*
+ * Mysql
+ * 
+ * Connections::addConnection(Connection::open([
+            'driver' => 'mysql',
+            'host' => 'localhost',
+            'prefix' => '_urfat',
+            'name' => 'urfat',
+            'user' => 'urfat',
+            'pass' => 'urfat'])
+        , "default");
+*/
+
+
+/*
+ * Sqlite
+ * 
+Connections::addConnection(Connection::open([
+            'driver' => 'sqlite',            
+            'prefix' => '_urfat',
+            'name'   => 'database.db'])
+        , "default"); 
+ */

+ 1 - 1
public/dist/script.js

@@ -19,7 +19,7 @@ function log(message, importance = 0) {
     }
     if (importance === 2) {
         alert("LOG:: |" + message + "|");
-}
+    }
 }
 
 function isDefined(data) {

+ 18 - 12
public/dist/style.css

@@ -1,15 +1,11 @@
 /*
-Devel
+*Devel
 */
 
 table tr .selected{
     background-color: #d9edf7;
 }
 
-.hidden{
-    display:none;
-}
-
 .no-scroll{
     overflow: hidden;
 }
@@ -40,6 +36,7 @@ body{
 */
 textarea{
     resize: vertical;
+    min-height: 200px
 }
 
 .data-table table{
@@ -175,12 +172,12 @@ textarea{
 }
 
 /*
-  _    _ ______          _____  ______ _____  
- | |  | |  ____|   /\   |  __ \|  ____|  __ \ 
- | |__| | |__     /  \  | |  | | |__  | |__) |
- |  __  |  __|   / /\ \ | |  | |  __| |  _  / 
- | |  | | |____ / ____ \| |__| | |____| | \ \ 
- |_|  |_|______/_/    \_\_____/|______|_|  \_\
+  _    _ ______     ^     _____  ______ _____  
+ | |  | |  ____|   / \   |  __ \|  ____|  __ \ 
+ | |__| | |__     /   \  | |  | | |__  | |__) |
+ |  __  |  __|   / /_\ \ | |  | |  __| |  _  / 
+ | |  | | |____ / _____ \| |__| | |____| | \ \ 
+ |_|  |_|______/_/     \_\_____/|______|_|  \_\
                                               
 */
 
@@ -204,4 +201,13 @@ textarea{
     border-radius: 0px !important;  
 }
 
-/*--*/
+/* HELPER ---------------------------- */
+
+.round-ball{
+    border-radius: 60px !important;
+    font-size: 1.5em;
+    position: fixed;
+    padding: 20px;
+    bottom: 20px;
+    right: 20px;
+}

+ 2 - 0
public/robots.txt

@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /