add: full multi-tenancy control
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Installer\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use DispatchesJobs, ValidatesRequests;
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Installer\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Response as IlluminateResponse;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class ImageCacheController
|
||||
{
|
||||
/**
|
||||
* Cache template
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $template;
|
||||
|
||||
/**
|
||||
* Logo
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const KRAYIN_LOGO = 'https://updates.krayincrm.com/krayin.png';
|
||||
|
||||
/**
|
||||
* Get HTTP response of template applied image file
|
||||
*
|
||||
* @param string $filename
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
public function getImage($filename)
|
||||
{
|
||||
try {
|
||||
$content = Cache::remember('krayin-logo', 10080, function () {
|
||||
return $this->getImageFromUrl(self::KRAYIN_LOGO);
|
||||
});
|
||||
} catch (\Exception $e) {
|
||||
$content = '';
|
||||
}
|
||||
|
||||
return $this->buildResponse($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Init from given URL
|
||||
*
|
||||
* @param string $url
|
||||
* @return \Intervention\Image\Image
|
||||
*/
|
||||
public function getImageFromUrl($url)
|
||||
{
|
||||
$domain = config('app.url');
|
||||
|
||||
$options = [
|
||||
'http' => [
|
||||
'method' => 'GET',
|
||||
'protocol_version' => 1.1, // force use HTTP 1.1 for service mesh environment with envoy
|
||||
'header' => "Accept-language: en\r\n".
|
||||
"Domain: $domain\r\n".
|
||||
"User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36\r\n",
|
||||
],
|
||||
];
|
||||
|
||||
$context = stream_context_create($options);
|
||||
|
||||
if ($data = @file_get_contents($url, false, $context)) {
|
||||
return $data;
|
||||
}
|
||||
|
||||
throw new \Exception(
|
||||
'Unable to init from given url ('.$url.').'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds HTTP response from given image data
|
||||
*
|
||||
* @param string $content
|
||||
* @return Illuminate\Http\Response
|
||||
*/
|
||||
protected function buildResponse($content)
|
||||
{
|
||||
/**
|
||||
* Define mime type
|
||||
*/
|
||||
$mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $content);
|
||||
|
||||
/**
|
||||
* Respond with 304 not modified if browser has the image cached
|
||||
*/
|
||||
$eTag = md5($content);
|
||||
|
||||
$notModified = isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $eTag;
|
||||
|
||||
$content = $notModified ? null : $content;
|
||||
|
||||
$statusCode = $notModified ? 304 : 200;
|
||||
|
||||
/**
|
||||
* Return http response
|
||||
*/
|
||||
return new IlluminateResponse($content, $statusCode, [
|
||||
'Content-Type' => $mime,
|
||||
'Cache-Control' => 'max-age=10080, public',
|
||||
'Content-Length' => strlen($content),
|
||||
'Etag' => $eTag,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Installer\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Webkul\Installer\Helpers\DatabaseManager;
|
||||
use Webkul\Installer\Helpers\EnvironmentManager;
|
||||
use Webkul\Installer\Helpers\ServerRequirements;
|
||||
|
||||
class InstallerController extends Controller
|
||||
{
|
||||
/**
|
||||
* Const Variable For Min PHP Version
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const MIN_PHP_VERSION = '8.1.0';
|
||||
|
||||
/**
|
||||
* Const Variable for Static Customer Id
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const USER_ID = 1;
|
||||
|
||||
/**
|
||||
* Create a new controller instance
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(
|
||||
protected ServerRequirements $serverRequirements,
|
||||
protected EnvironmentManager $environmentManager,
|
||||
protected DatabaseManager $databaseManager
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Installer View Root Page
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$phpVersion = $this->serverRequirements->checkPHPversion(self::MIN_PHP_VERSION);
|
||||
|
||||
$requirements = $this->serverRequirements->validate();
|
||||
|
||||
if (request()->has('locale')) {
|
||||
return redirect()->route('installer.index');
|
||||
}
|
||||
|
||||
return view('installer::installer.index', compact('requirements', 'phpVersion'));
|
||||
}
|
||||
|
||||
/**
|
||||
* ENV File Setup
|
||||
*/
|
||||
public function envFileSetup(Request $request): JsonResponse
|
||||
{
|
||||
$message = $this->environmentManager->generateEnv($request);
|
||||
|
||||
return new JsonResponse(['data' => $message]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run Migration
|
||||
*/
|
||||
public function runMigration(): mixed
|
||||
{
|
||||
return $this->databaseManager->migration();
|
||||
}
|
||||
|
||||
/**
|
||||
* Run Seeder.
|
||||
*
|
||||
* @return void|string
|
||||
*/
|
||||
public function runSeeder()
|
||||
{
|
||||
$allParameters = request()->allParameters;
|
||||
|
||||
$parameter = [
|
||||
'parameter' => [
|
||||
'default_locales' => $allParameters['app_locale'] ?? null,
|
||||
'default_currency' => $allParameters['app_currency'] ?? null,
|
||||
],
|
||||
];
|
||||
|
||||
$response = $this->environmentManager->setEnvConfiguration($allParameters);
|
||||
|
||||
if ($response) {
|
||||
$seeder = $this->databaseManager->seeder($parameter);
|
||||
|
||||
return $seeder;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Admin Configuration Setup.
|
||||
*/
|
||||
public function adminConfigSetup(): bool
|
||||
{
|
||||
$password = password_hash(request()->input('password'), PASSWORD_BCRYPT, ['cost' => 10]);
|
||||
|
||||
try {
|
||||
DB::table('users')->updateOrInsert(
|
||||
[
|
||||
'id' => self::USER_ID,
|
||||
], [
|
||||
'name' => request()->input('admin'),
|
||||
'email' => request()->input('email'),
|
||||
'password' => $password,
|
||||
'role_id' => 1,
|
||||
'status' => 1,
|
||||
]
|
||||
);
|
||||
|
||||
$this->smtpConfigSetup();
|
||||
|
||||
return true;
|
||||
} catch (\Throwable $th) {
|
||||
report($th);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SMTP connection setup for Mail
|
||||
*/
|
||||
private function smtpConfigSetup()
|
||||
{
|
||||
$filePath = storage_path('installed');
|
||||
|
||||
File::put($filePath, 'Your Krayin App is Successfully Installed');
|
||||
|
||||
Event::dispatch('krayin.installed');
|
||||
|
||||
return $filePath;
|
||||
}
|
||||
}
|
||||
50
packages/Webkul/Installer/src/Http/Middleware/CanInstall.php
Normal file
50
packages/Webkul/Installer/src/Http/Middleware/CanInstall.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Installer\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Str;
|
||||
use Webkul\Installer\Helpers\DatabaseManager;
|
||||
|
||||
class CanInstall
|
||||
{
|
||||
/**
|
||||
* Handles Requests if application is already installed then redirect to dashboard else to installer.
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): mixed
|
||||
{
|
||||
if (Str::contains($request->getPathInfo(), '/install')) {
|
||||
if ($this->isAlreadyInstalled() && ! $request->ajax()) {
|
||||
return redirect()->route('admin.dashboard.index');
|
||||
}
|
||||
} else {
|
||||
if (! $this->isAlreadyInstalled()) {
|
||||
return redirect()->route('installer.index');
|
||||
}
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if application is already installed.
|
||||
*/
|
||||
public function isAlreadyInstalled(): bool
|
||||
{
|
||||
if (file_exists(storage_path('installed'))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (app(DatabaseManager::class)->isInstalled()) {
|
||||
touch(storage_path('installed'));
|
||||
|
||||
Event::dispatch('krayin.installed');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
27
packages/Webkul/Installer/src/Http/Middleware/Locale.php
Normal file
27
packages/Webkul/Installer/src/Http/Middleware/Locale.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Installer\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
|
||||
class Locale
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if ($localeCode = $request->query('locale')) {
|
||||
app()->setLocale($localeCode);
|
||||
|
||||
session()->put('installer_locale', $localeCode);
|
||||
} else {
|
||||
app()->setLocale(session()->get('installer_locale') ?? config('app.locale'));
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user