<?php namespace App\Http\Controllers; use App\Models\SystemSetting; use App\Services\CachingService; use App\Services\ResponseService; use Illuminate\Http\Request; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use Throwable; use ZipArchive; class SystemUpdateController extends Controller { private string $destinationPath; private CachingService $cache; public function __construct(CachingService $cachingService) { $this->destinationPath = base_path() . '/update/tmp/'; $this->cache = $cachingService; } public function index() { if (!Auth::user()->hasRole('Super Admin')) { $response = array( 'message' => trans('no_permission_message') ); return redirect(route('home'))->withErrors($response); } $system_version = SystemSetting::where('name', 'system_version')->first(); return view('system-update.index', compact('system_version')); } public function update(Request $request) { if (!Auth::user()->hasRole('Super Admin')) { $response = array( 'error' => true, 'message' => trans('no_permission_message') ); return response()->json($response); } $validator = Validator::make($request->all(), [ 'file' => 'required|file|mimes:zip', ]); if ($validator->fails()) { ResponseService::validationError($validator->errors()->first()); } try { $current_version = SystemSetting::where('name', 'system_version')->first()['data']; if (!is_dir($this->destinationPath) && !mkdir($concurrentDirectory = $this->destinationPath, 0777, TRUE) && !is_dir($concurrentDirectory)) { //sprintf('Directory "%s" was not created', $concurrentDirectory) ResponseService::errorResponse("Permission Error while crating Temp Directory"); } // zip upload $zipfile = $request->file('file'); $fileName = $zipfile->getClientOriginalName(); $zipfile->move($this->destinationPath, $fileName); //This will add public in path //$target_path = getcwd() . DIRECTORY_SEPARATOR; $target_path = base_path() . DIRECTORY_SEPARATOR; $zip = new ZipArchive(); $filePath = $this->destinationPath . '/' . $fileName; $zipStatus = $zip->open($filePath); if ($zipStatus !== TRUE) { ResponseService::errorResponse('something_wrong_try_again'); } $zip->extractTo($this->destinationPath); $zip->close(); unlink($filePath); $ver_file = $this->destinationPath . 'version_info.php'; $source_path = $this->destinationPath . 'source_code.zip'; if (!file_exists($ver_file) && !file_exists($source_path)) { ResponseService::errorResponse('Zip File is not Uploaded to Correct Path'); } $ver_file1 = $target_path . 'version_info.php'; $source_path1 = $target_path . 'source_code.zip'; // MOVE File if (!rename($ver_file, $ver_file1) || !rename($source_path, $source_path1)) { ResponseService::errorResponse('Error Occurred while moving a Zip File'); } $version_file = require($ver_file1); if ($current_version != $version_file['update_version']) { // unlink($ver_file1); // unlink($source_path1); // ResponseService::errorResponse('System is already upto date'); if ($current_version != $version_file['current_version']) { unlink($ver_file1); unlink($source_path1); ResponseService::errorResponse($current_version . ' ' . trans('Please update nearest version first')); } } $zip1 = new ZipArchive(); $zipFile1 = $zip1->open($source_path1); if ($zipFile1 !== TRUE) { unlink($ver_file1); unlink($source_path1); ResponseService::errorResponse('Source Code Zip Extraction Failed'); } $zip1->extractTo($target_path); $zip1->close(); Artisan::call('migrate'); Artisan::call('db:seed --class=InstallationSeeder'); unlink($source_path1); unlink($ver_file1); SystemSetting::where('name', 'system_version')->update([ 'data' => $version_file['update_version'] ]); $wizardSettings = [ [ 'name' => 'wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'system_settings_wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'notification_settings_wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'email_settings_wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'verify_email_wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'email_template_settings_wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'payment_settings_wizard_checkMark', 'data' => 1, 'type' => 'integer' ], [ 'name' => 'third_party_api_settings_wizard_checkMark', 'data' => 1, 'type' => 'integer' ] ]; SystemSetting::upsert($wizardSettings, ["name"], ["data", "type"]); $this->cache->removeSystemCache(config('constants.CACHE.SYSTEM.SETTINGS')); ResponseService::successResponse('System Updated Successfully'); } catch (Throwable $e) { ResponseService::logErrorResponse($e); ResponseService::errorResponse(); } } }