Untitled
unknown
php
2 years ago
8.5 kB
30
Indexable
<?php
namespace App\Http\Controllers;
use App\Http\Middleware\RedirectIfInstalled;
use App\Install\Requirement;
use App\Models\Role;
use App\Models\Setting;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
//use App\Models\BusinessSetting;
use App\Models\User;
use Jackiedo\DotenvEditor\Facades\DotenvEditor;
class InstallController extends Controller {
public function __construct() {
$this->middleware(RedirectIfInstalled::class);
}
public function index(){
return redirect()->route('install.init');
}
public function migrate(){
Artisan::call('migrate:fresh');
}
public function init() {
Artisan::call('key:generate');
$env = DotenvEditor::load();
$env->setKey('APP_URL', URL::to('/'));
$env->setKey('APP_ENV', 'local');
$env->setKey('DB_SETUP', 'false');
$env->setKey('APP_DEBUG', 'true');
$env->save();
return view('installation.init');
}
public function pre_installation(Requirement $requirement) {
return view('installation.pre_installation', compact('requirement'));
}
public function purchase_code() {
return view('installation.purchase_code');
}
public function database_setup() {
$purchaseCode = 'ok';
if($purchaseCode == 'ok'){
return view('installation.database_setup');
}
}
public function mail_setup() {
$db_setup = DotenvEditor::load()->getValue('DB_SETUP');
if($db_setup == 'true'){
return view('installation.mail_setup');
}else{
return redirect()->route('install.database_setup')->with('error','Please setup your database connection first!');
}
}
public function admin_setup() {
return view('installation.admin_setup');
}
public function purchaseCodeVerify() {
$purchaseCode = 'ok';
if($purchaseCode == 'ok'){
$env = DotenvEditor::load();
$env->setKey('APP_PCE', $purchaseCode);
$env->save();
return redirect()->route('install.database_setup');
}
}
private function getPurchaseCode($product_code) {
$url = "https://api.envato.com/v3/market/author/sale?code=" . $product_code;
$curl = curl_init($url);
$header = array();
$pate = decrypt(config('app.pate'));
$header[] = 'Authorization: Bearer ' . $pate;
$header[] = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0';
$header[] = 'timeout: 20';
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
$envatoRes = curl_exec($curl);
curl_close($curl);
$envatoRes = json_decode($envatoRes);
return true;
}
public function mailSetupStore(){
if(Request::input('skip_mailer') != 'on'){
$mailVariables = Request::validate([
'MAIL_HOST' => ['required'],
'MAIL_PORT' => ['required'],
'MAIL_USERNAME' => ['required'],
'MAIL_PASSWORD' => ['required'],
'MAIL_ENCRYPTION' => ['required'],
'MAIL_FROM_ADDRESS' => ['nullable', 'email'],
'MAIL_FROM_NAME' => ['nullable'],
]);
$this->setEnvVariables($mailVariables);
}
return redirect()->route('install.admin_setup');
}
private function setEnvVariables($data) {
$env = DotenvEditor::load();
foreach ($data as $data_key => $data_value){
$env->setKey($data_key, $data_value);
}
$env->save();
}
public function adminSetupSave(){
Artisan::call('migrate:fresh');
$this->import_sql();
$data = Request::validate([
'first_name' => ['required'],
'last_name' => ['required'],
'email' => ['required', 'email', 'unique:users'],
'password' => ['required'],
]);
$adminRole = Role::where('slug', 'admin')->first();
User::create([
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'email' => $data['email'],
'password' => $data['password'],
'role_id' => $adminRole ? $adminRole->id: null,
'title' => 'Engineer',
]);
$env = DotenvEditor::load();
$env->setKey('APP_INSTALLED', 'true');
$env->setKey('APP_ENV', 'production');
$env->setKey('APP_DEBUG', 'false');
$env->save();
$this->clearCache();
return view('installation.complete');
}
public function welcome(){
return view('installation.complete');
}
public function database_installation() {
$data = [
'host' => Request::input('DB_HOST'),
'port' => Request::input('DB_PORT'),
'database' => Request::input('DB_DATABASE'),
'username' => Request::input('DB_USERNAME'),
'password' => Request::input('DB_PASSWORD') ?? '',
];
$hasError = null;
try {
$this->checkDatabaseConnection($data);
}catch (\Throwable $e){
$hasError = $e;
}
if(!empty($hasError)){
if(in_array($data['host'], ['127.0.0.1', 'localhost'])){
$data['host'] = ($data['host'] == 'localhost') ? '127.0.0.1' : 'localhost';
try {
$this->checkDatabaseConnection($data);
}catch (\Throwable $e){
return redirect()->route('install.database_setup')->with('error', 'Please check your database credentials carefully.');
}
}else{
return redirect()->route('install.database_setup')->with('error', 'Please check your database credentials carefully.');
}
}
$this->setDatabaseVariables($data);
config([ 'database.setup' => true ]);
return redirect()->route('install.mail_setup');
}
private function checkDatabaseConnection($data) {
$this->setupDatabaseConnectionConfig($data);
DB::connection('mysql')->reconnect();
DB::connection('mysql')->getPdo();
}
private function setupDatabaseConnectionConfig($data) {
config([
'database.default' => 'mysql',
'database.connections.mysql.host' => $data['host'],
'database.connections.mysql.port' => $data['port'],
'database.connections.mysql.database' => $data['database'],
'database.connections.mysql.username' => $data['username'],
'database.connections.mysql.password' => $data['password'],
]);
}
private function setDatabaseVariables($data) {
$env = DotenvEditor::load();
$env->setKey('DB_HOST', $data['host']);
$env->setKey('DB_PORT', $data['port']);
$env->setKey('DB_DATABASE', $data['database']);
$env->setKey('DB_USERNAME', $data['username']);
$env->setKey('DB_PASSWORD', $data['password']);
$env->setKey('DB_SETUP', 'true');
$env->save();
Artisan::call('config:cache');
}
private function import_sql() {
$sql_path = base_path('database/install_helpdesk.sql');
DB::unprepared(file_get_contents($sql_path));
}
private function clearCache(){
Artisan::call('optimize');
Artisan::call('cache:clear');
Artisan::call('route:cache');
Artisan::call('view:clear');
Artisan::call('config:cache');
Artisan::call('clear-compiled');
}
private function truncateTables(){
Schema::disableForeignKeyConstraints();
$tableNames = Schema::getConnection()->getDoctrineSchemaManager()->listTableNames();
foreach ($tableNames as $name) {
//if you don't want to truncate migrations
if ($name == 'migrations') {
continue;
}
DB::table($name)->truncate();
}
Schema::enableForeignKeyConstraints();
}
}
Editor is loading...
Leave a Comment