403Webshell
Server IP : 54.94.228.101  /  Your IP : 172.28.1.13
Web Server : Apache
System : Linux ip-172-28-29-189 6.5.0-1014-aws #14~22.04.1-Ubuntu SMP Thu Feb 15 15:27:06 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.2.34-43+ubuntu22.04.1+deb.sury.org+1
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/vinumday2_0/app/Http/Controllers/Admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/vinumday2_0/app/Http/Controllers/Admin/GeradorController.php
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use DB;
use App\Http\Requests;
use App\Permission;
use App\Http\Controllers\BaseController;
use App\Gerador;
use Sentinel;
use File;
use App\CampoModulo;
use App\CampoOption;
use App\FkModulo;
use Illuminate\Database\Schema\Blueprint;

class GeradorController extends BaseController
{
	public function __construct(){
		parent::__construct();
		$this->middleware('auth');
	}

	public function index(){
		$data['modulos'] = \App\Gerador::get();
		return view('admin/gerador',$data);
	}

	public function add(){
		$data = array();
		$data['tipos'] = \App\TipoModulo::get();
		return view('admin/form-gerador', $data);
	}

	public function edit($id){
		$data['modulo'] = \App\Gerador::find($id);
		$data['tipos'] = \App\TipoModulo::get();
		$data['campos'] = \App\CampoModulo::where('id_modulo', $data['modulo']->id)->get();
		$data['fks'] = \App\FkModulo::where('id_modulo', $data['modulo']->id)->get();
		$data['modulos'] = \App\Gerador::where('id', '!=', $data['modulo']->id)->get();
		return view('admin/form-gerador',$data);
	}

	public function save(Request $request){
		try{
			$post = $request->input();
			if($request->input('id')){
				$modulo = \App\Gerador::find($request->input('id'));
				\App\Gerador::editar($post, $request->input('id'));

				$this->updateTable($request->input(), $modulo);
			}else{
				if(!(\Schema::hasTable($post['nome_tabela']))){
					if(!(\App\Gerador::where('nome', $post['nome'])->count())){
						$id_modulo = \App\Gerador::criar($post);
						$modulo = \App\Gerador::find($id_modulo);
						$this->createTable($request->input(), $modulo);
						$this->generateFiles($modulo);
						$this->createPermissionsAdmin($modulo);
					}else{
						die('Já existe um módulo com esse nome, seu infeliz !');
					}
				}else{
					die('Já existe uma tabela com esse nome, seu infeliz !');
				}
			}
			\Session::flash('type', 'success');
			\Session::flash('message', "Alteracoes salvas com sucesso!");
			return redirect('admin/gerador');
		}catch(\Illuminate\Database\QueryException $e){
			\Session::flash('type', 'danger');
			\Session::flash('message', $e->getMessage());
			return redirect()->back();
		}


	}

	public function delete($id){
		try{
			$modulo = \App\Gerador::find($id);

			\App\Gerador::deletar($id);


			/* Apaga a pasta do módulo recursivamente */
			$this->rrmdir('../app/Modules/'.$modulo->nome);
			$this->rrmdir('../public/uploads/'.$modulo->rota);

			/* Remove do config/module.php */
			$modules = config("module.modules");
			$str = "<?php
			# config/module.php
			return  [
				'modules' => [
					";
					while (list(,$module) = each($modules)) {
						if($module != $modulo->nome){
							$str .= "'$module',
							";
						}
					}
					$str .= "
				]
			];";
			file_put_contents('../config/module.php',$str);

			\App\CampoModulo::where('id_modulo',$modulo->id)->delete();
			\App\FkModulo::where('id_modulo',$modulo->id)->delete();

			DB::statement('SET foreign_key_checks = 0');

			DB::statement('DROP TABLE IF EXISTS '.$modulo->nome_tabela);
			DB::statement('DROP TABLE IF EXISTS '.$modulo->nome_tabela.'_imagens');
			DB::statement('DROP TABLE IF EXISTS '.$modulo->nome_tabela.'_descricao');

			DB::statement('SET foreign_key_checks = 1');

			\Session::flash('type', 'success');
			\Session::flash('message', "Registro removido com sucesso!");
			return redirect('admin/gerador');
		}catch(Exception $e){
			\Session::flash('type', 'error');
			\Session::flash('message', "Nao foi possível remover o registro!");
			return redirect()->back();
		}


	}

	private function generateFiles($modulo){
		$tipo_modulo = \App\TipoModulo::find($modulo->id_tipo_modulo);
		$replaces = array('<NOME_MODULO>','<ID_MODULO>','<ROTA_MODULO>','<ITEM_MODULO>','<ITEMS_MODULO>','<NOME_TABELA>','<LABEL_MODULO>');
		$by = array($modulo->nome,$modulo->id,$modulo->rota,$modulo->item_modulo,$modulo->items_modulo,$modulo->nome_tabela,$modulo->label);

		if(file_exists('../app/Modules/'.$modulo->nome)){
			die('Ja existe um módulo com esse nome, seu idiota !');
		}

		/* Cria as pastas */
		mkdir('../app/Modules/'.$modulo->nome, 0777, true);
		mkdir('../app/Modules/'.$modulo->nome.'/Models', 0777, true);
		if($tipo_modulo->id != 3){
			mkdir('../app/Modules/'.$modulo->nome.'/Views', 0777, true);
			mkdir('../app/Modules/'.$modulo->nome.'/Views/admin', 0777, true);
			mkdir('../app/Modules/'.$modulo->nome.'/Controllers', 0777, true);
			mkdir('../app/Modules/'.$modulo->nome.'/Controllers/Admin', 0777, true);
		}


		/* Gera o Model */
		$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/".$tipo_modulo->model));
		file_put_contents('../app/Modules/'.$modulo->nome.'/Models/'.$modulo->nome.'.php',$text);

		if($tipo_modulo->id != 3){
			if($tipo_modulo->id != 4){
				/* Gera o Model Descrição */
				$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/model_descricao_translatable.php"));
				file_put_contents('../app/Modules/'.$modulo->nome.'/Models/'.$modulo->nome.'Descricao.php',$text);
			}
			
			
			/* Gera o Controller */
			$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/".$tipo_modulo->controller_admin));
			file_put_contents('../app/Modules/'.$modulo->nome.'/Controllers/Admin/Admin'.$modulo->nome.'Controller.php',$text);

			/* Gera o Controller do Site */
			$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/controller_basico.php"));
			file_put_contents('../app/Modules/'.$modulo->nome.'/Controllers/'.$modulo->nome.'Controller.php',$text);

			/* Gera a View Index */
			$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/".$tipo_modulo->view_admin_index));
			file_put_contents('../app/Modules/'.$modulo->nome.'/Views/admin/'.$modulo->rota.'.blade.php',$text);

			if($tipo_modulo->id == 1 || $tipo_modulo->id == 4){ // Com Detalhe
				/* Gera a View Form */
				$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/".$tipo_modulo->view_admin_form));
				file_put_contents('../app/Modules/'.$modulo->nome.'/Views/admin/form-'.$modulo->rota.'.blade.php',$text);
			}

			/* Gera a view index do site */
			file_put_contents('../app/Modules/'.$modulo->nome.'/Views/'.$modulo->rota.'.blade.php','');

			/* Gera as rotas */
			$text = str_replace($replaces,$by,file_get_contents("../resources/views/templates_tipo_modulo/".$tipo_modulo->rotas));
			file_put_contents('../app/Modules/'.$modulo->nome.'/routes.php',$text);
		}

		/* Adiciona o módulo ao config/module.php */
		$modules = config("module.modules");

		$str = "<?php
		# config/module.php

		return  [
			'modules' => [
				";
				foreach ($modules as $module) {
					$str .= "'$module',
					";
				}
				$str .= "'$modulo->nome'
				";
				$str .= "
			]
		];";
		$modules[] = $modulo->nome;
		config(['module.modules' => $modules]);

		file_put_contents('../config/module.php',$str);

		return true;
	}

	private function createTable($input, $modulo){

		if($modulo->id_tipo_modulo != 3){
			$sqlColumns = '( id INT NOT NULL AUTO_INCREMENT, thumbnail_principal VARCHAR(255) DEFAULT NULL';
			if($modulo->id_tipo_modulo != 4){
				$sqlDescricaoColumns = '( id INT NOT NULL AUTO_INCREMENT, '.$modulo->nome_tabela.'_id INT (11) NOT NULL, locale VARCHAR (10) NOT NULL';
			}
		}else{
			$sqlColumns = '( id INT NOT NULL AUTO_INCREMENT';
		}

		if($modulo->id_tipo_modulo == 1 || $modulo->id_tipo_modulo == 4){
			$sqlColumns .= ', meta_keywords TEXT DEFAULT NULL, meta_descricao TEXT DEFAULT NULL, slug VARCHAR(255) NOT NULL';
		}
		if(isset($input['campo-nome']) && count($input['campo-nome'])){
			foreach ($input['campo-nome'] as $key => $nome_campo) {
				
				switch ($input['campo-tipo-campo'][$key]) {
					case 'INT':
					$tipo = 'INT';
					$valor_tipo = '(11)';
					break;
					case 'I':
					$tipo = 'VARCHAR';
					$valor_tipo = '(255)';
					break;
					case 'N':
					$tipo = 'DECIMAL';
					$valor_tipo = '(15,2)';
					break;
					case 'T':
					$tipo = 'TEXT';
					$valor_tipo = '';
					break;
					case 'D':
					$tipo = 'DATE';
					$valor_tipo = '';
					break;
					case 'DT':
					$tipo = 'DATETIME';
					$valor_tipo = '';
					break;
					case 'TIME':
					$tipo = 'TIME';
					$valor_tipo = '';
					break;
					case 'S':
					$tipo = 'TINYINT';
					$valor_tipo = '';
					break;
					case 'SI':
					$tipo = 'VARCHAR';
					$valor_tipo = '(255)';
					break;
					case 'E':
					$tipo = 'ENUM';
					$valor_tipo = '(';
					if (isset($input['key-enum'][$key])) {
						foreach ($input['key-enum'][$key] as $keyEnum => $chave) {
							if($keyEnum)
							$valor_tipo .= ',';
							$valor_tipo .= "'".$chave."'";
						}
					}
					$valor_tipo .= ')';
					break;
				}
				if(!$input['campo-translatable'][$key]){
					$sqlColumns .= ', '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL';
				}elseif($modulo->id_tipo_modulo != 3 && $modulo->id_tipo_modulo != 4){
					$sqlDescricaoColumns .= ', '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL';
				}
				

				$campoInfo = array(
					'nome' => $nome_campo,
					'valor_padrao' => $input['campo-valor-padrao'][$key],
					'listagem' => $input['campo-listagem'][$key],
					'required' => $input['campo-required'][$key],
					'label' => $input['campo-label'][$key],
					'required' => $input['campo-required'][$key],
					'tipo_campo' => $input['campo-tipo-campo'][$key],
					'translatable' => $input['campo-translatable'][$key],
					'ordem' => $input['campo-ordem'][$key],
					'id_modulo' => $modulo->id,
				);
				$id_campo_modulo = \App\CampoModulo::criar($campoInfo);

				if($input['campo-tipo-campo'][$key] == 'E'){
					if(isset($input['key-enum'][$key])){
						foreach ($input['key-enum'][$key] as $keyEnum => $chave) {
							$campoOption = new CampoOption();
							$campoOption->id_campo_modulo = $id_campo_modulo;
							$campoOption->chave = $chave;
							$campoOption->valor = $input['value-enum'][$key][$keyEnum];
							$campoOption->save();
						}
					}
				}
			}
		}


		if(isset($input['fk-nome']) && count($input['fk-nome'])){
			foreach ($input['fk-nome'] as $key => $nome_fk) {
				$sqlColumns .= ', ';

				$sqlColumns .= $nome_fk.' INT (11) DEFAULT NULL';

				$fkModulo = new FkModulo();
				$fkModulo->nome = $nome_fk;
				$fkModulo->label = $input['fk-label'][$key];
				$fkModulo->id_modulo = $modulo->id;
				$fkModulo->id_modulo_relacionado = $input['fk-modulo'][$key];
				$fkModulo->id_campo_modulo_relacionado = $input['fk-campo-label'][$key];
				$fkModulo->ordem = $input['fk-ordem'][$key];
				$fkModulo->listagem = $input['fk-listagem'][$key];
				$fkModulo->save();
			}
		}


		$sqlColumns .= ', PRIMARY KEY (id)';

		$fks = FkModulo::where('id_modulo', $modulo->id)->get();
		foreach ($fks as $fk) {
			$sqlColumns .= ', FOREIGN KEY ('.$fk->nome.') REFERENCES '.$fk->moduloRelacionado->nome_tabela.'(id)';
		}

		$sqlColumns .= ')';

		DB::statement('SET foreign_key_checks = 0');

		DB::statement('CREATE TABLE '.$input['nome_tabela'].' '.$sqlColumns);

		
		if($modulo->id_tipo_modulo != 3){
			if($modulo->id_tipo_modulo != 4){
				$sqlDescricaoColumns .= ', PRIMARY KEY (id), FOREIGN KEY ('.$modulo->nome_tabela.'_id) REFERENCES '.$modulo->nome_tabela.' (id) ON DELETE CASCADE';
				$sqlDescricaoColumns .= ')';
				DB::statement('CREATE TABLE '.$input['nome_tabela'].'_descricao '.$sqlDescricaoColumns);
			}
			DB::statement('CREATE TABLE '.$input['nome_tabela'].'_imagens (id INT NOT NULL AUTO_INCREMENT, thumbnail_principal VARCHAR (255) DEFAULT NULL, id_'.$modulo->item_modulo.' INT(11) NOT NULL, PRIMARY KEY (id))');
		}

		if($modulo->id_tipo_modulo == 2){
			DB::statement('INSERT INTO '.$input['nome_tabela'].' (id) VALUES (1)');
		}

		DB::statement('SET foreign_key_checks = 1');

		return true;
	}

	private function updateTable($input, $modulo){
		DB::statement('SET foreign_key_checks = 0');
		if(isset($input['edit-campo-nome'])){
			foreach ($input['edit-campo-nome'] as $key => $nome_campo) {
				if($input['old-campo-nome'][$key] != $nome_campo){
					$new_name = $nome_campo;
				}else{
					$new_name = '';
				}
				switch ($input['edit-campo-tipo-campo'][$key]) {
					case 'INT':
					$tipo = 'INT';
					$valor_tipo = '(11)';
					break;
					case 'I':
					$tipo = 'VARCHAR';
					$valor_tipo = '(255)';
					break;
					case 'N':
					$tipo = 'DECIMAL';
					$valor_tipo = '(15,2)';
					break;
					case 'T':
					$tipo = 'TEXT';
					$valor_tipo = '';
					break;
					case 'D':
					$tipo = 'DATE';
					$valor_tipo = '';
					break;
					case 'DT':
					$tipo = 'DATETIME';
					$valor_tipo = '';
					break;
					case 'TIME':
					$tipo = 'TIME';
					$valor_tipo = '';
					break;
					case 'S':
					$tipo = 'TINYINT';
					$valor_tipo = '';
					break;
					case 'SI':
					$tipo = 'VARCHAR';
					$valor_tipo = '(255)';
					break;
					case 'E':
					$tipo = 'ENUM';
					$valor_tipo = '(';
					if (isset($input['edit-key-enum'][$key])) {
						foreach ($input['edit-key-enum'][$key] as $keyEnum => $chave) {
							if($keyEnum)
							$valor_tipo .= ',';
							$valor_tipo .= "'".$chave."'";
						}
					}
					$valor_tipo .= ')';

					break;
				}
				$campoObject = \App\CampoModulo::find($input['edit-campo-id'][$key]);

				if($campoObject->translatable && !$input['edit-campo-translatable'][$key]){
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.'_descricao DROP COLUMN '.$campoObject->nome);
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.' ADD COLUMN '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL');
				}elseif(!$campoObject->translatable && $input['edit-campo-translatable'][$key]){
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.' DROP COLUMN '.$campoObject->nome);
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.'_descricao ADD COLUMN '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL');
				}elseif($campoObject->translatable && $input['edit-campo-translatable'][$key]){
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.'_descricao CHANGE COLUMN '.$input['old-campo-nome'][$key].' '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL');
				}elseif(!$campoObject->translatable && !$input['edit-campo-translatable'][$key]){
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.' CHANGE COLUMN '.$input['old-campo-nome'][$key].' '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL');
				}

			

				$campoInfo = array(
					'nome' => $nome_campo,
					'valor_padrao' => $input['edit-campo-valor-padrao'][$key],
					'listagem' => $input['edit-campo-listagem'][$key],
					'required' => $input['edit-campo-required'][$key],
					'label' => $input['edit-campo-label'][$key],
					'tipo_campo' => $input['edit-campo-tipo-campo'][$key],
					'ordem' => $input['edit-campo-ordem'][$key],
					'translatable' => $input['edit-campo-translatable'][$key],
					'id_modulo' => $modulo->id,
				);
				\App\CampoModulo::editar($campoInfo, $campoObject->id);

				if($campoObject->tipo_campo == 'E'){
					foreach ($campoObject->options as $option) {
						$option->delete();
					}
					if(isset($input['edit-key-enum'][$key])){
						foreach ($input['edit-key-enum'][$key] as $keyEnum => $chave) {
							$campoOption = new CampoOption();
							$campoOption->id_campo_modulo = $campoObject->id;
							$campoOption->chave = $chave;
							$campoOption->valor = $input['edit-value-enum'][$key][$keyEnum];
							$campoOption->save();
						}
					}

				}
			}

		}

		if(isset($input['edit-fk-nome']) && count($input['edit-fk-nome'])){
			foreach ($input['edit-fk-nome'] as $key => $nome_fk) {

				DB::statement('ALTER TABLE '.$modulo->nome_tabela.' CHANGE COLUMN '.$input['old-fk-nome'][$key].' '.$input['edit-fk-nome'][$key].' INT (11) DEFAULT NULL');

				$fkModulo = FkModulo::find($input['edit-fk-id'][$key]);
				$fkModulo->nome = $nome_fk;
				$fkModulo->label = $input['edit-fk-label'][$key];
				$fkModulo->id_modulo_relacionado = $input['edit-fk-modulo'][$key];
				$fkModulo->id_campo_modulo_relacionado = $input['edit-fk-campo-label'][$key];
				$fkModulo->ordem = $input['edit-fk-ordem'][$key];
				$fkModulo->listagem = $input['edit-fk-listagem'][$key];
				$fkModulo->save();
			}
		}

		if(isset($input['campo-nome'])){
			foreach ($input['campo-nome'] as $key => $nome_campo) {
				switch ($input['campo-tipo-campo'][$key]) {
					case 'INT':
					$tipo = 'INT';
					$valor_tipo = '(11)';
					break;
					case 'I':
					$tipo = 'VARCHAR';
					$valor_tipo = '(255)';
					break;
					case 'N':
					$tipo = 'DECIMAL';
					$valor_tipo = '(15,2)';
					break;
					case 'T':
					$tipo = 'TEXT';
					$valor_tipo = '';
					break;
					case 'D':
					$tipo = 'DATE';
					$valor_tipo = '';
					break;
					case 'DT':
					$tipo = 'DATETIME';
					$valor_tipo = '';
					break;
					case 'TIME':
					$tipo = 'TIME';
					$valor_tipo = '';
					break;
					case 'S':
					$tipo = 'TINYINT';
					$valor_tipo = '';
					break;
					case 'SI':
					$tipo = 'VARCHAR';
					$valor_tipo = '(255)';
					break;
					case 'E':
					$tipo = 'ENUM';
					$valor_tipo = '(';
					if (isset($input['key-enum'][$key])) {
						foreach ($input['key-enum'][$key] as $keyEnum => $chave) {
							if($keyEnum)
							$valor_tipo .= ',';
							$valor_tipo .= "'".$chave."'";
						}
					}

					$valor_tipo .= ')';
					break;

				}
				if($input['campo-translatable'][$key]){
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.'_descricao ADD '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL');
				}else{
					DB::statement('ALTER TABLE '.$modulo->nome_tabela.' ADD '.$nome_campo.' '.$tipo.' '.$valor_tipo.' DEFAULT NULL');
				}
				

				$campoInfo = array(
					'nome' => $nome_campo,
					'valor_padrao' => $input['campo-valor-padrao'][$key],
					'listagem' => $input['campo-listagem'][$key],
					'required' => $input['campo-required'][$key],
					'label' => $input['campo-label'][$key],
					'tipo_campo' => $input['campo-tipo-campo'][$key],
					'translatable' => $input['campo-translatable'][$key],
					'ordem' => $input['campo-ordem'][$key],
					'id_modulo' => $modulo->id,
				);
				$id_campo_modulo = \App\CampoModulo::criar($campoInfo);

				if($input['campo-tipo-campo'][$key] == 'E'){
					if(isset($input['key-enum'][$key])){
						foreach ($input['key-enum'][$key] as $keyEnum => $chave) {
							$campoOption = new CampoOption();
							$campoOption->id_campo_modulo = $id_campo_modulo;
							$campoOption->chave = $chave;
							$campoOption->valor = $input['value-enum'][$key][$keyEnum];
							$campoOption->save();
						}
					}
				}
			}
		}

		if(isset($input['fk-nome']) && count($input['fk-nome'])){
			foreach ($input['fk-nome'] as $key => $nome_fk) {

				DB::statement('ALTER TABLE '.$modulo->nome_tabela.' ADD '.$nome_fk.' INT (11) DEFAULT NULL');

				$fkModulo = new FkModulo();
				$fkModulo->nome = $nome_fk;
				$fkModulo->label = $input['fk-label'][$key];
				$fkModulo->id_modulo = $modulo->id;
				$fkModulo->id_modulo_relacionado = $input['fk-modulo'][$key];
				$fkModulo->listagem = $input['fk-listagem'][$key];
				$fkModulo->id_campo_modulo_relacionado = $input['fk-campo-label'][$key];
				$fkModulo->ordem = $input['fk-ordem'][$key];
				$fkModulo->save();
			}
		}

		DB::statement('SET foreign_key_checks = 1');

		return true;

	}

	public function createPermissionsAdmin($modulo){
		$role = Sentinel::findRoleBySlug('admins');
		$newPermissions = array(
			$modulo->nome_tabela.'.view' => true,
			$modulo->nome_tabela.'.create' => true,
			$modulo->nome_tabela.'.update' => true,
			$modulo->nome_tabela.'.delete' => true,
		);
		$role->permissions = array_merge($role->permissions, $newPermissions);
		$role->save();
		return true;
	}

	public function rrmdir($dir) {
		if (is_dir($dir)) {
			$objects = scandir($dir);
			foreach ($objects as $object) {
				if ($object != "." && $object != "..") {
					if (is_dir($dir."/".$object))
					$this->rrmdir($dir."/".$object);
					else
					unlink($dir."/".$object);
				}
			}
			rmdir($dir);
		}
	}

	public function importSql(Request $request){

		/* Upload and exec file */
		$file = $request->file('sql');
		$tmpFilePath = '/uploads/sql/';
		$tmpFileName = time() . '-' . $file->getClientOriginalName();
		$file = $file->move(public_path() . $tmpFilePath, $tmpFileName);
		$path = $tmpFilePath . $tmpFileName;

		DB::beginTransaction();
		try {

			DB::unprepared(DB::raw(File::get(substr($path,1))));

			DB::commit();
		} catch (\Exception $e) {
			DB::rollBack();
			\Session::flash('type', 'danger');
			\Session::flash('message', $e->getMessage());
			return redirect()->back();
		}


		$tables = DB::select('SHOW TABLES');
		foreach ($tables as $table) {
			$nomeField = 'Tables_in_'.env('DB_DATABASE');
			$table->name = $table->$nomeField;
			$table->columns = DB::select('SHOW COLUMNS FROM '.$table->$nomeField);

			/* Verifica todas tabelas que não sao do sistema */
			if(substr($table->name,0,4) != 'sis_'){
				/* Não cria o módulo para as tabelas de descrição, apenas gera os campos para o modulo principal */
				if(strpos($table->name, '_descricao') === false){
					//DB::statement('ALTER TABLE '.$table->name.' ADD COLUMN slug VARCHAR (120) NOT NULL');
					$arrayNome = explode('_',$table->name);
					$nomeModulo = '';
					$labelModulo = '';
					$rotaModulo = '';
					foreach ($arrayNome as $key => $piece) {
						$nomeModulo .= ucfirst($piece);
						if($key){
							$labelModulo .= ' ';
							$rotaModulo .= '-';
						}
						$labelModulo .= ucfirst($piece);
						$rotaModulo .= $piece;
					}

					$modulo = new Gerador();
					$modulo->rota = $rotaModulo;
					$modulo->nome_tabela = $table->name;
					if(strpos($table->name, '_has_') === false){
						if($request->input('linguas') == 1){
							$modulo->id_tipo_modulo = 1;
						}else{
							$modulo->id_tipo_modulo = 4;
						}
					}else{
						$modulo->id_tipo_modulo = 3;
					}
					$modulo->menu = 1;
					$modulo->icone = 'fa-circle-o';
					$modulo->ordem = 0;
					$modulo->nome = $nomeModulo;
					$modulo->label = $labelModulo;
					$modulo->item_modulo = $table->name;
					$modulo->items_modulo = $table->name.'s';
					$modulo->save();

					$this->generateFiles($modulo);
					$this->createPermissionsAdmin($modulo);

					/* Os campos não são traduzíveis */
					$translatable = 0;
				}else{
					DB::statement('ALTER TABLE '.$table->name.' ADD COLUMN locale VARCHAR (10) NOT NULL');
					$modulo = Gerador::where('nome_tabela', str_replace('_descricao','',$table->name))->first();

					/* Os campos são traduzíveis */
					$translatable = 1;
				}
				
				foreach ($table->columns as $column) {
					/* Não gera os campos Auto Increment */
					if($column->Extra != 'auto_increment'){
						/* Não gera os campos que são FKS */
						if($column->Key != 'MUL'){
							$arrayTipo = explode("(",$column->Type);

							switch ($arrayTipo[0]) {
								case "int": $tipo = 'INT'; break;
								case "varchar": $tipo = 'I'; break;
								case "text": $tipo = 'T'; break;
								case "date": $tipo = 'D'; break;
								case "datetime": $tipo = 'DT'; break;
								case "time": $tipo = 'TIME'; break;
								case "decimal": $tipo = 'N'; break;
								case "enum": $tipo = 'E'; break;
								default: $tipo = 'I'; break;
							}
							$arrayNome = explode('_',$column->Field);
							$labelCampo = '';
							foreach ($arrayNome as $key => $piece) {
								if($key){
									$labelCampo .= ' ';
								}
								$labelCampo .= ucfirst($piece);
							}
							$campoModulo = new CampoModulo();
							$campoModulo->tipo_campo = $tipo;
							$campoModulo->nome = $column->Field;
							$campoModulo->label = $labelCampo;
							$campoModulo->valor_padrao = $column->Default;
							$campoModulo->required = ($column->Null == "YES") ? 1 : 0;
							$campoModulo->listagem = 1;
							$campoModulo->translatable = $translatable;
							$campoModulo->id_modulo = $modulo->id;

							$campoModulo->save();

							if($campoModulo->tipo_campo == 'E'){
								$optionsString = explode(')',$arrayTipo[1])[0];
								$optionsArray = explode(',', $optionsString);
								foreach ($optionsArray as $option) {
									$campoOption = new CampoOption();
									$campoOption->id_campo_modulo = $campoModulo->id;
									$campoOption->chave = substr($option,1,-1);
									$campoOption->valor = substr($option,1,-1);
									$campoOption->save();
								}
							}
						}

					}

				}

			}

		}
		/* Gera as FKS somente depois de gerar todos modulos (pois senão tenta procurar modulos ainda não criados) */
		$fks = DB::select("SELECT
		TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
		FROM
		INFORMATION_SCHEMA.KEY_COLUMN_USAGE
		WHERE
		REFERENCED_TABLE_SCHEMA = '".env("DB_DATABASE")."'");

		foreach ($fks as $fk) {
			/* Não cria FKS para as tabelas de descrição */
			if(strpos($fk->TABLE_NAME, '_descricao') === false && strpos($fk->TABLE_NAME, 'sis_') === false){
				$modulo = Gerador::where('nome_tabela', $fk->TABLE_NAME)->first();
				if(!$modulo){
					print_r('Módulo da FK não encontrado ');print_r($fk);die();
				}
				$moduloRelacionado = Gerador::where('nome_tabela', $fk->REFERENCED_TABLE_NAME)->first();
				$fkModulo = new FkModulo();
				$fkModulo->id_modulo = $modulo->id;
				$fkModulo->nome = $fk->COLUMN_NAME;
				$fkModulo->label = ucfirst(str_replace('_', ' ',str_replace('_id', '',str_replace('id_', '',$fk->COLUMN_NAME))));
				$fkModulo->listagem = 0;
				$fkModulo->id_modulo_relacionado = ($moduloRelacionado) ? $moduloRelacionado->id : null;
				$fkModulo->id_campo_modulo_relacionado = ($moduloRelacionado && count($moduloRelacionado->campos)) ? $moduloRelacionado->campos[0]->id : null;
				$fkModulo->save();
			}

		}
		return redirect('admin/gerador');
	}

	public function import(){
		$data = [];

		return view('admin/import-gerador', $data);
	}

	public function addForeignKey(Request $request){
		$post = $request->input();
		if(isset($post['id_modulo'])){
			$data['modulos'] = Gerador::where('id', '!=', $post['id_modulo'])->get();
		}else{
			$data['modulos'] = Gerador::get();
		}

		$data['count'] = $post['count'];
		return view('admin/add-foreign-key', $data);
	}

	public function removeForeignKey(Request $request){
		try{
			$post = $request->input();
			$fk = FkModulo::find($post['id_fk']);

			DB::statement('ALTER TABLE '.$fk->modulo->nome_tabela.' DROP COLUMN '.$fk->nome);

			$fk->delete();

			echo json_encode(array(
				'status' => true,
				'message' => 'Registro removido com sucesso!'
			));
			exit;
		}catch(Exception $e){
			echo json_encode(array(
				'status' => false,
				'message' => 'Não foi possível remover o registro.'
			));
			exit;
		}

	}

	public function deletarModulos(){
		$modulos = Gerador::get();

		/* Remove do config/module.php */
		$str = "<?php
		# config/module.php
		return  [
			'modules' => [
			]
		];";
		file_put_contents('../config/module.php',$str);

		foreach ($modulos as $modulo) {

			/* Apaga a pasta do módulo recursivamente */
			$this->rrmdir('../app/Modules/'.$modulo->nome);
			$this->rrmdir('../public/uploads/'.$modulo->rota);

			\App\CampoOption::join('sis_campo_modulo', 'sis_campo_modulo.id', '=', 'sis_campo_options.id_campo_modulo')->where('sis_campo_modulo.id_modulo',$modulo->id)->delete();
			\App\CampoModulo::where('id_modulo',$modulo->id)->delete();
			\App\FkModulo::where('id_modulo',$modulo->id)->delete();

			DB::statement('SET foreign_key_checks = 0');

			DB::statement('DROP TABLE IF EXISTS '.$modulo->nome_tabela);
			DB::statement('DROP TABLE IF EXISTS '.$modulo->nome_tabela.'_imagens');
			DB::statement('DROP TABLE IF EXISTS '.$modulo->nome_tabela.'_descricao');
			DB::statement('SET foreign_key_checks = 1');

			\App\Gerador::deletar($modulo->id);
		}

		return redirect('admin/gerador');
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit