add: full multi-tenancy control

This commit is contained in:
Cauê Faleiros
2026-02-02 15:31:15 -03:00
commit c6ec92802b
1711 changed files with 258106 additions and 0 deletions

View File

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

View File

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

View File

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

View 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;
}
}

View 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);
}
}