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,107 @@
<?php
namespace Webkul\Installer\Helpers;
use Exception;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Webkul\Installer\Database\Seeders\DatabaseSeeder as KrayinDatabaseSeeder;
class DatabaseManager
{
/**
* Check Database Connection.
*/
public function isInstalled()
{
if (! file_exists(base_path('.env'))) {
return false;
}
try {
DB::connection()->getPDO();
$isConnected = (bool) DB::connection()->getDatabaseName();
if (! $isConnected) {
return false;
}
$hasUserTable = Schema::hasTable('users');
if (! $hasUserTable) {
return false;
}
$userCount = DB::table('users')->count();
if (! $userCount) {
return false;
}
return true;
} catch (Exception $e) {
return false;
}
}
/**
* Drop all the tables and migrate in the database
*
* @return void|string
*/
public function migration()
{
try {
Artisan::call('migrate:fresh');
return response()->json([
'success' => true,
'message' => 'Tables is migrated successfully.',
]);
} catch (Exception $e) {
return response()->json([
'error' => $e->getMessage(),
], 500);
}
}
/**
* Seed the database.
*
* @return void|string
*/
public function seeder($data)
{
try {
app(KrayinDatabaseSeeder::class)->run([
'default_locale' => $data['parameter']['default_locales'],
'default_currency' => $data['parameter']['default_currency'],
]);
$this->storageLink();
} catch (Exception $e) {
return $e->getMessage();
}
}
/**
* Storage Link.
*/
private function storageLink()
{
Artisan::call('storage:link');
}
/**
* Generate New Application Key
*/
public function generateKey()
{
try {
Artisan::call('key:generate');
} catch (Exception $e) {
}
}
}

View File

@@ -0,0 +1,94 @@
<?php
namespace Webkul\Installer\Helpers;
use Exception;
class EnvironmentManager
{
/**
* Create a helper instance.
*
* @return void
*/
public function __construct(protected DatabaseManager $databaseManager) {}
/**
* Generate ENV File and Installation.
*
* @param [object] $request
*/
public function generateEnv($request)
{
$envExamplePath = base_path('.env.example');
$envPath = base_path('.env');
if (! file_exists($envPath)) {
if (file_exists($envExamplePath)) {
copy($envExamplePath, $envPath);
} else {
touch($envPath);
}
}
try {
$response = $this->setEnvConfiguration($request->all());
$this->databaseManager->generateKey();
return $response;
} catch (Exception $e) {
return $e;
}
}
/**
* Set the ENV file configuration.
*
* @return string
*/
public function setEnvConfiguration(array $request)
{
$envDBParams = [];
/**
* Update params with form-data.
*/
if (isset($request['db_hostname'])) {
$envDBParams['DB_HOST'] = $request['db_hostname'];
$envDBParams['DB_DATABASE'] = $request['db_name'];
$envDBParams['DB_PREFIX'] = $request['db_prefix'] ?? '';
$envDBParams['DB_USERNAME'] = $request['db_username'];
$envDBParams['DB_PASSWORD'] = $request['db_password'];
$envDBParams['DB_CONNECTION'] = $request['db_connection'];
$envDBParams['DB_PORT'] = (int) $request['db_port'];
}
if (isset($request['app_name'])) {
$envDBParams['APP_NAME'] = $request['app_name'] ?? null;
$envDBParams['APP_URL'] = $request['app_url'];
$envDBParams['APP_LOCALE'] = $request['app_locale'];
$envDBParams['APP_TIMEZONE'] = $request['app_timezone'];
$envDBParams['APP_CURRENCY'] = $request['app_currency'];
}
$data = file_get_contents(base_path('.env'));
foreach ($envDBParams as $key => $value) {
if (preg_match('/\s/', $value)) {
$value = '"'.$value.'"';
}
$data = preg_replace("/$key=(.*)/", "$key=$value", $data);
}
try {
file_put_contents(base_path('.env'), $data);
} catch (Exception $e) {
return false;
}
return true;
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace Webkul\Installer\Helpers;
class ServerRequirements
{
/**
* Minimum PHP Version Supported (Override is in installer.php config file).
*
* @var string
*/
private $minPhpVersion = '8.1.0';
/**
* Check for the server requirements.
*/
public function validate(): array
{
// Server Requirements
$requirements = [
'php' => [
'calendar',
'ctype',
'curl',
'dom',
'fileinfo',
'filter',
'gd',
'hash',
'intl',
'json',
'mbstring',
'openssl',
'pcre',
'pdo',
'session',
'tokenizer',
'xml',
],
];
$results = [];
foreach ($requirements as $type => $requirement) {
foreach ($requirement as $item) {
$results['requirements'][$type][$item] = true;
if (! extension_loaded($item)) {
$results['requirements'][$type][$item] = false;
$results['errors'] = true;
}
}
}
return $results;
}
/**
* Check PHP version requirement.
*
* @return array
*/
public function checkPHPversion(?string $minPhpVersion = null)
{
$minVersionPhp = $minPhpVersion ?? $this->minPhpVersion;
$currentPhpVersion = $this->getPhpVersionInfo();
$supported = version_compare($currentPhpVersion['version'], $minVersionPhp) >= 0;
return [
'full' => $currentPhpVersion['full'],
'current' => $currentPhpVersion['version'],
'minimum' => $minVersionPhp,
'supported' => $supported,
];
}
/**
* Get current Php version information.
*
* @return array
*/
private static function getPhpVersionInfo()
{
$currentVersionFull = PHP_VERSION;
preg_match("#^\d+(\.\d+)*#", $currentVersionFull, $filtered);
return [
'full' => $currentVersionFull,
'version' => $filtered[0] ?? $currentVersionFull,
];
}
}