add: full multi-tenancy control
This commit is contained in:
107
packages/Webkul/Installer/src/Helpers/DatabaseManager.php
Normal file
107
packages/Webkul/Installer/src/Helpers/DatabaseManager.php
Normal 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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
94
packages/Webkul/Installer/src/Helpers/EnvironmentManager.php
Normal file
94
packages/Webkul/Installer/src/Helpers/EnvironmentManager.php
Normal 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;
|
||||
}
|
||||
}
|
||||
96
packages/Webkul/Installer/src/Helpers/ServerRequirements.php
Normal file
96
packages/Webkul/Installer/src/Helpers/ServerRequirements.php
Normal 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,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user