Merge pull request #28 from InvoiceShelf/installer-improvements-phase1

Installer improvements
This commit is contained in:
Darko Gjorgjijoski
2024-02-11 20:25:32 +01:00
committed by GitHub
4 changed files with 252 additions and 389 deletions

View File

@@ -11,11 +11,13 @@ class FinishController extends Controller
/** /**
* Handle the incoming request. * Handle the incoming request.
* *
* @return \Illuminate\Http\Response * @return \Illuminate\Http\JsonResponse
*/ */
public function __invoke(Request $request) public function __invoke(Request $request)
{ {
InstallUtils::createDbMarker(); if (! InstallUtils::createDbMarker()) {
\Log::error('Install: Unable to create db marker.');
}
return response()->json(['success' => true]); return response()->json(['success' => true]);
} }

View File

@@ -17,10 +17,6 @@ class InstallationMiddleware
public function handle($request, Closure $next) public function handle($request, Closure $next)
{ {
if (! InstallUtils::isDbCreated() || Setting::getSetting('profile_complete') !== 'COMPLETED') { if (! InstallUtils::isDbCreated() || Setting::getSetting('profile_complete') !== 'COMPLETED') {
if (InstallUtils::dbMarkerExists()) {
InstallUtils::deleteDbMarker();
}
return redirect('/installation'); return redirect('/installation');
} }

View File

@@ -3,7 +3,6 @@
namespace InvoiceShelf\Space; namespace InvoiceShelf\Space;
use Exception; use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use InvoiceShelf\Http\Requests\DatabaseEnvironmentRequest; use InvoiceShelf\Http\Requests\DatabaseEnvironmentRequest;
use InvoiceShelf\Http\Requests\DiskEnvironmentRequest; use InvoiceShelf\Http\Requests\DiskEnvironmentRequest;
@@ -17,6 +16,11 @@ class EnvironmentManager
*/ */
private $envPath; private $envPath;
/**
* @var string
*/
private $delimiter = "\n";
/** /**
* Set the .env and .env.example paths. * Set the .env and .env.example paths.
*/ */
@@ -25,6 +29,75 @@ class EnvironmentManager
$this->envPath = base_path('.env'); $this->envPath = base_path('.env');
} }
/**
* Returns the .env contents
*
* @return false|string
*/
private function getEnvContents()
{
return file_get_contents($this->envPath);
}
/**
* Updates .env file - inspired by Akaunting
*
* @return bool
*/
public function updateEnv(array $data)
{
if (empty($data) || ! is_array($data) || ! is_file($this->envPath)) {
return false;
}
$env = $this->getEnvContents();
$env = explode($this->delimiter, $env);
foreach ($data as $data_key => $data_value) {
$updated = false;
foreach ($env as $env_key => $env_value) {
$entry = explode('=', $env_value, 2);
// Check if new or old key
if ($entry[0] == $data_key) {
$env[$env_key] = $data_key.'='.$this->encode($data_value);
$updated = true;
} else {
$env[$env_key] = $this->encode($env_value);
}
}
// Lets create if not available
if (! $updated) {
$env[] = $data_key.'='.$this->encode($data_value);
}
}
$env = implode($this->delimiter, $env);
file_put_contents(base_path('.env'), $env);
return true;
}
/**
* Encodes value for .env
*
* @return mixed|string
*/
private function encode($str)
{
if (strpos($str, ' ') !== false || preg_match('/'.preg_quote('^\'£$%^&*()}{@#~?><,@|-=-_+-¬', '/').'/', $str)) {
$str = '"'.$str.'"';
}
return $str;
}
/** /**
* Save the database content to the .env file. * Save the database content to the .env file.
* *
@@ -32,59 +105,27 @@ class EnvironmentManager
*/ */
public function saveDatabaseVariables(DatabaseEnvironmentRequest $request) public function saveDatabaseVariables(DatabaseEnvironmentRequest $request)
{ {
$oldDatabaseData =
'DB_CONNECTION='.config('database.default')."\n";
$newDatabaseData = $dbEnv = [
'DB_CONNECTION='.$request->database_connection."\n"; 'APP_URL' => $request->get('app_url'),
'DB_CONNECTION' => $request->get('database_connection'),
'SANCTUM_STATEFUL_DOMAINS' => $request->get('app_domain'),
'SESSION_DOMAIN' => explode(':', $request->get('app_domain'))[0],
];
if ($request->has('database_username') && $request->has('database_password')) { if ($request->has('database_username') && $request->has('database_password')) {
if (env('DB_USERNAME') && env('DB_HOST')) { $dbEnv['DB_HOST'] = $request->get('database_hostname');
$oldDatabaseData = $oldDatabaseData. $dbEnv['DB_PORT'] = $request->get('database_port');
'DB_HOST='.config('database.connections.'.config('database.default').'.host')."\n". $dbEnv['DB_DATABASE'] = $request->get('database_name');
'DB_PORT='.config('database.connections.'.config('database.default').'.port')."\n". $dbEnv['DB_USERNAME'] = $request->get('database_username');
'DB_DATABASE='.config('database.connections.'.config('database.default').'.database')."\n". $dbEnv['DB_PASSWORD'] = $request->get('database_password');
'DB_USERNAME='.config('database.connections.'.config('database.default').'.username')."\n".
'DB_PASSWORD="'.config('database.connections.'.config('database.default').'.password')."\"\n\n";
} else {
$oldDatabaseData = $oldDatabaseData.
'DB_DATABASE='.config('database.connections.'.config('database.default').'.database')."\n\n";
}
$newDatabaseData = $newDatabaseData.
'DB_HOST='.$request->database_hostname."\n".
'DB_PORT='.$request->database_port."\n".
'DB_DATABASE='.$request->database_name."\n".
'DB_USERNAME='.$request->database_username."\n".
'DB_PASSWORD="'.$request->database_password."\"\n\n";
} else { } else {
if (env('DB_USERNAME') && env('DB_HOST')) { $dbEnv['DB_DATABASE'] = $request->get('database_name');
$oldDatabaseData = $oldDatabaseData.
'DB_HOST='.config('database.connections.'.config('database.default').'.host')."\n".
'DB_PORT='.config('database.connections.'.config('database.default').'.port')."\n".
'DB_DATABASE='.config('database.connections.'.config('database.default').'.database')."\n".
'DB_USERNAME='.config('database.connections.'.config('database.default').'.username')."\n".
'DB_PASSWORD="'.config('database.connections.'.config('database.default').'.password')."\"\n\n";
} else {
$oldDatabaseData = $oldDatabaseData.
'DB_DATABASE='.config('database.connections.'.config('database.default').'.database')."\n\n";
}
$newDatabaseData = $newDatabaseData.
'DB_DATABASE='.$request->database_name."\n\n";
} }
try { try {
$conn = $this->checkDatabaseConnection($request); $this->checkDatabaseConnection($request);
// $requirement = $this->checkVersionRequirements($request, $conn);
// if ($requirement) {
// return [
// 'error' => 'minimum_version_requirement',
// 'requirement' => $requirement,
// ];
// }
if (\Schema::hasTable('users')) { if (\Schema::hasTable('users')) {
return [ return [
@@ -98,29 +139,7 @@ class EnvironmentManager
} }
try { try {
file_put_contents($this->envPath, str_replace( $this->updateEnv($dbEnv);
$oldDatabaseData,
$newDatabaseData,
file_get_contents($this->envPath)
));
file_put_contents($this->envPath, str_replace(
'APP_URL='.config('app.url'),
'APP_URL='.$request->app_url,
file_get_contents($this->envPath)
));
file_put_contents($this->envPath, str_replace(
'SANCTUM_STATEFUL_DOMAINS='.env('SANCTUM_STATEFUL_DOMAINS'),
'SANCTUM_STATEFUL_DOMAINS='.$request->app_domain,
file_get_contents($this->envPath)
));
file_put_contents($this->envPath, str_replace(
'SESSION_DOMAIN='.config('session.domain'),
'SESSION_DOMAIN='.explode(':', $request->app_domain)[0],
file_get_contents($this->envPath)
));
} catch (Exception $e) { } catch (Exception $e) {
return [ return [
'error' => 'database_variables_save_error', 'error' => 'database_variables_save_error',
@@ -133,26 +152,27 @@ class EnvironmentManager
} }
/** /**
* @return bool * Returns PDO object if all ok.
*
* @return \Closure|\PDO
*/ */
private function checkDatabaseConnection(DatabaseEnvironmentRequest $request) private function checkDatabaseConnection(DatabaseEnvironmentRequest $request)
{ {
$connection = $request->database_connection; $connection = $request->get('database_connection');
$settings = config("database.connections.$connection");
$settings = config("database.connections.$connection"); $settings = config("database.connections.$connection");
$connectionArray = array_merge($settings, [ $connectionArray = array_merge($settings, [
'driver' => $connection, 'driver' => $connection,
'database' => $request->database_name, 'database' => $request->get('database_name'),
]); ]);
if ($request->has('database_username') && $request->has('database_password')) { if ($request->has('database_username') && $request->has('database_password')) {
$connectionArray = array_merge($connectionArray, [ $connectionArray = array_merge($connectionArray, [
'username' => $request->database_username, 'username' => $request->get('database_username'),
'password' => $request->database_password, 'password' => $request->get('database_password'),
'host' => $request->database_hostname, 'host' => $request->get('database_hostname'),
'port' => $request->database_port, 'port' => $request->get('database_port'),
]); ]);
} }
@@ -167,86 +187,19 @@ class EnvironmentManager
return DB::connection()->getPdo(); return DB::connection()->getPdo();
} }
/**
* @return bool
*/
private function checkVersionRequirements(DatabaseEnvironmentRequest $request, $conn)
{
$connection = $request->database_connection;
$checker = new RequirementsChecker();
$phpSupportInfo = $checker->checkPHPVersion(
config('invoiceshelf.min_php_version')
);
if (! $phpSupportInfo['supported']) {
return $phpSupportInfo;
}
$dbSupportInfo = [];
switch ($connection) {
case 'mysql':
$dbSupportInfo = $checker->checkMysqlVersion($conn);
break;
case 'pgsql':
$conn = pg_connect("host={$request->database_hostname} port={$request->database_port} dbname={$request->database_name} user={$request->database_username} password={$request->database_password}");
$dbSupportInfo = $checker->checkPgsqlVersion(
$conn,
config('invoiceshelf.min_pgsql_version')
);
break;
case 'sqlite':
$dbSupportInfo = $checker->checkSqliteVersion(
config('invoiceshelf.min_sqlite_version')
);
break;
}
if (! $dbSupportInfo['supported']) {
return $dbSupportInfo;
}
return false;
}
/** /**
* Save the mail content to the .env file. * Save the mail content to the .env file.
* *
* @param Request $request
* @return array * @return array
*/ */
public function saveMailVariables(MailEnvironmentRequest $request) public function saveMailVariables(MailEnvironmentRequest $request)
{ {
$mailData = $this->getMailData($request); $mailEnv = $this->getMailConfiguration($request);
try { try {
file_put_contents($this->envPath, str_replace(
$mailData['old_mail_data'],
$mailData['new_mail_data'],
file_get_contents($this->envPath)
));
if ($mailData['extra_old_mail_data']) { $this->updateEnv($mailEnv);
file_put_contents($this->envPath, str_replace(
$mailData['extra_old_mail_data'],
$mailData['extra_mail_data'],
file_get_contents($this->envPath)
));
} else {
file_put_contents(
$this->envPath,
"\n".$mailData['extra_mail_data'],
FILE_APPEND
);
}
} catch (Exception $e) { } catch (Exception $e) {
return [ return [
'error' => 'mail_variables_save_error', 'error' => 'mail_variables_save_error',
@@ -258,193 +211,103 @@ class EnvironmentManager
]; ];
} }
private function getMailData($request) /**
* Returns the mail configuration
*
* @param MailEnvironmentRequest $request
* @return array
*/
private function getMailConfiguration($request)
{ {
$mailFromCredential = ''; $mailEnv = [];
$extraMailData = '';
$extraOldMailData = '';
$oldMailData = '';
$newMailData = '';
if (env('MAIL_FROM_ADDRESS') !== null && env('MAIL_FROM_NAME') !== null) { $driver = $request->get('mail_driver');
$mailFromCredential =
'MAIL_FROM_ADDRESS='.config('mail.from.address')."\n".
'MAIL_FROM_NAME="'.config('mail.from.name')."\"\n\n";
}
switch ($request->mail_driver) { switch ($driver) {
case 'smtp': case 'smtp':
$oldMailData = $mailEnv = [
'MAIL_DRIVER='.config('mail.driver')."\n". 'MAIL_DRIVER' => $request->get('mail_driver'),
'MAIL_HOST='.config('mail.host')."\n". 'MAIL_HOST' => $request->get('mail_host'),
'MAIL_PORT='.config('mail.port')."\n". 'MAIL_PORT' => $request->get('mail_port'),
'MAIL_USERNAME='.config('mail.username')."\n". 'MAIL_USERNAME' => $request->get('mail_username'),
'MAIL_PASSWORD='.config('mail.password')."\n". 'MAIL_PASSWORD' => $request->get('mail_password'),
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n". 'MAIL_ENCRYPTION' => $request->get('mail_encryption'),
$mailFromCredential; 'MAIL_FROM_ADDRESS' => $request->get('from_mail'),
'MAIL_FROM_NAME' => $request->get('from_name'),
$newMailData = ];
'MAIL_DRIVER='.$request->mail_driver."\n".
'MAIL_HOST='.$request->mail_host."\n".
'MAIL_PORT='.$request->mail_port."\n".
'MAIL_USERNAME='.$request->mail_username."\n".
'MAIL_PASSWORD='.$request->mail_password."\n".
'MAIL_ENCRYPTION='.$request->mail_encryption."\n\n".
'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
break; break;
case 'mailgun': case 'mailgun':
$oldMailData =
'MAIL_DRIVER='.config('mail.driver')."\n".
'MAIL_HOST='.config('mail.host')."\n".
'MAIL_PORT='.config('mail.port')."\n".
'MAIL_USERNAME='.config('mail.username')."\n".
'MAIL_PASSWORD='.config('mail.password')."\n".
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
$mailFromCredential;
$newMailData = $mailEnv = [
'MAIL_DRIVER='.$request->mail_driver."\n". 'MAIL_DRIVER' => $request->get('mail_driver'),
'MAIL_HOST='.$request->mail_host."\n". 'MAIL_HOST' => $request->get('mail_host'),
'MAIL_PORT='.$request->mail_port."\n". 'MAIL_PORT' => $request->get('mail_port'),
'MAIL_USERNAME='.config('mail.username')."\n". 'MAIL_USERNAME' => config('mail.username'),
'MAIL_PASSWORD='.config('mail.password')."\n". 'MAIL_PASSWORD' => config('mail.password'),
'MAIL_ENCRYPTION='.$request->mail_encryption."\n\n". 'MAIL_ENCRYPTION' => $request->get('mail_encryption'),
'MAIL_FROM_ADDRESS='.$request->from_mail."\n". 'MAIL_FROM_ADDRESS' => $request->get('from_mail'),
'MAIL_FROM_NAME="'.$request->from_name."\"\n\n"; 'MAIL_FROM_NAME' => $request->get('from_name'),
'MAILGUN_DOMAIN' => $request->get('mail_mailgun_domain'),
$extraMailData = 'MAILGUN_SECRET' => $request->get('mail_mailgun_secret'),
'MAILGUN_DOMAIN='.$request->mail_mailgun_domain."\n". 'MAILGUN_ENDPOINT' => $request->get('mail_mailgun_endpoint'),
'MAILGUN_SECRET='.$request->mail_mailgun_secret."\n". ];
'MAILGUN_ENDPOINT='.$request->mail_mailgun_endpoint."\n";
if (env('MAILGUN_DOMAIN') !== null && env('MAILGUN_SECRET') !== null && env('MAILGUN_ENDPOINT') !== null) {
$extraOldMailData =
'MAILGUN_DOMAIN='.config('services.mailgun.domain')."\n".
'MAILGUN_SECRET='.config('services.mailgun.secret')."\n".
'MAILGUN_ENDPOINT='.config('services.mailgun.endpoint')."\n";
}
break; break;
case 'ses': case 'ses':
$oldMailData =
'MAIL_DRIVER='.config('mail.driver')."\n".
'MAIL_HOST='.config('mail.host')."\n".
'MAIL_PORT='.config('mail.port')."\n".
'MAIL_USERNAME='.config('mail.username')."\n".
'MAIL_PASSWORD='.config('mail.password')."\n".
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
$mailFromCredential;
$newMailData = $mailEnv = [
'MAIL_DRIVER='.$request->mail_driver."\n". 'MAIL_DRIVER' => $request->get('mail_driver'),
'MAIL_HOST='.$request->mail_host."\n". 'MAIL_HOST' => $request->get('mail_host'),
'MAIL_PORT='.$request->mail_port."\n". 'MAIL_PORT' => $request->get('mail_port'),
'MAIL_USERNAME='.config('mail.username')."\n". 'MAIL_USERNAME' => config('mail.username'),
'MAIL_PASSWORD='.config('mail.password')."\n". 'MAIL_PASSWORD' => config('mail.password'),
'MAIL_ENCRYPTION='.$request->mail_encryption."\n\n". 'MAIL_ENCRYPTION' => $request->get('mail_encryption'),
'MAIL_FROM_ADDRESS='.$request->from_mail."\n". 'MAIL_FROM_ADDRESS' => $request->get('from_mail'),
'MAIL_FROM_NAME="'.$request->from_name."\"\n\n"; 'MAIL_FROM_NAME' => $request->get('from_mail'),
'SES_KEY' => $request->get('from_mail'),
$extraMailData = 'SES_SECRET' => $request->get('from_name'),
'SES_KEY='.$request->mail_ses_key."\n". ];
'SES_SECRET='.$request->mail_ses_secret."\n";
if (env('SES_KEY') !== null && env('SES_SECRET') !== null) {
$extraOldMailData =
'SES_KEY='.config('services.ses.key')."\n".
'SES_SECRET='.config('services.ses.secret')."\n";
}
break;
case 'mail':
$oldMailData =
'MAIL_DRIVER='.config('mail.driver')."\n".
'MAIL_HOST='.config('mail.host')."\n".
'MAIL_PORT='.config('mail.port')."\n".
'MAIL_USERNAME='.config('mail.username')."\n".
'MAIL_PASSWORD='.config('mail.password')."\n".
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
$mailFromCredential;
$newMailData =
'MAIL_DRIVER='.$request->mail_driver."\n".
'MAIL_HOST='.config('mail.host')."\n".
'MAIL_PORT='.config('mail.port')."\n".
'MAIL_USERNAME='.config('mail.username')."\n".
'MAIL_PASSWORD='.config('mail.password')."\n".
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
'MAIL_FROM_ADDRESS='.$request->from_mail."\n".
'MAIL_FROM_NAME="'.$request->from_name."\"\n\n";
break; break;
case 'sendmail': case 'sendmail':
$oldMailData = case 'mail':
'MAIL_DRIVER='.config('mail.driver')."\n".
'MAIL_HOST='.config('mail.host')."\n".
'MAIL_PORT='.config('mail.port')."\n".
'MAIL_USERNAME='.config('mail.username')."\n".
'MAIL_PASSWORD='.config('mail.password')."\n".
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n".
$mailFromCredential;
$newMailData = $mailEnv = [
'MAIL_DRIVER='.$request->mail_driver."\n". 'MAIL_DRIVER' => $request->get('mail_driver'),
'MAIL_HOST='.config('mail.host')."\n". 'MAIL_HOST' => config('mail.host'),
'MAIL_PORT='.config('mail.port')."\n". 'MAIL_PORT' => config('mail.port'),
'MAIL_USERNAME='.config('mail.username')."\n". 'MAIL_USERNAME' => config('mail.username'),
'MAIL_PASSWORD='.config('mail.password')."\n". 'MAIL_PASSWORD' => config('mail.password'),
'MAIL_ENCRYPTION='.config('mail.encryption')."\n\n". 'MAIL_ENCRYPTION' => config('mail.encryption'),
'MAIL_FROM_ADDRESS='.$request->from_mail."\n". 'MAIL_FROM_ADDRESS' => $request->get('from_mail'),
'MAIL_FROM_NAME="'.$request->from_name."\"\n\n"; 'MAIL_FROM_NAME' => $request->get('from_name'),
];
break; break;
} }
return [ return $mailEnv;
'old_mail_data' => $oldMailData,
'new_mail_data' => $newMailData,
'extra_mail_data' => $extraMailData,
'extra_old_mail_data' => $extraOldMailData,
];
} }
/** /**
* Save the disk content to the .env file. * Save the disk content to the .env file.
* *
* @param Request $request
* @return array * @return array
*/ */
public function saveDiskVariables(DiskEnvironmentRequest $request) public function saveDiskVariables(DiskEnvironmentRequest $request)
{ {
$diskData = $this->getDiskData($request); $diskEnv = $this->getDiskConfiguration($request);
try { try {
if (! $diskData['old_default_driver']) {
file_put_contents($this->envPath, $diskData['default_driver'], FILE_APPEND);
} else {
file_put_contents($this->envPath, str_replace(
$diskData['old_default_driver'],
$diskData['default_driver'],
file_get_contents($this->envPath)
));
}
if (! $diskData['old_disk_data']) { $this->updateEnv($diskEnv);
file_put_contents($this->envPath, $diskData['new_disk_data'], FILE_APPEND);
} else {
file_put_contents($this->envPath, str_replace(
$diskData['old_disk_data'],
$diskData['new_disk_data'],
file_get_contents($this->envPath)
));
}
} catch (Exception $e) { } catch (Exception $e) {
return [ return [
'error' => 'disk_variables_save_error', 'error' => 'disk_variables_save_error',
@@ -456,113 +319,75 @@ class EnvironmentManager
]; ];
} }
private function getDiskData($request) /**
* Returns the disk configuration
*
* @return array
*/
private function getDiskConfiguration(DiskEnvironmentRequest $request)
{ {
$oldDefaultDriver = ''; $diskEnv = [];
$defaultDriver = '';
$oldDiskData = '';
$newDiskData = '';
if ($request->default_driver) { $driver = $request->get('app_domain');
if (env('FILESYSTEM_DRIVER') !== null) {
$defaultDriver = "\n".'FILESYSTEM_DRIVER='.$request->default_driver."\n";
$oldDefaultDriver = if ($driver) {
"\n".'FILESYSTEM_DRIVER='.config('filesystems.default')."\n"; $diskEnv['FILESYSTEM_DRIVER'] = $driver;
} else {
$defaultDriver =
"\n".'FILESYSTEM_DRIVER='.$request->default_driver."\n";
}
} }
switch ($request->selected_driver) { switch ($request->get('selected_driver')) {
case 's3': case 's3':
if (env('AWS_KEY') !== null) {
$oldDiskData = "\n".
'AWS_KEY='.config('filesystems.disks.s3.key')."\n".
'AWS_SECRET="'.config('filesystems.disks.s3.secret')."\"\n".
'AWS_REGION='.config('filesystems.disks.s3.region')."\n".
'AWS_BUCKET='.config('filesystems.disks.s3.bucket')."\n".
'AWS_ROOT='.config('filesystems.disks.s3.root')."\n";
}
$newDiskData = "\n". $diskEnv = [
'AWS_KEY='.$request->aws_key."\n". 'AWS_KEY' => $request->get('aws_key'),
'AWS_SECRET="'.$request->aws_secret."\"\n". 'AWS_SECRET' => $request->get('aws_secret'),
'AWS_REGION='.$request->aws_region."\n". 'AWS_REGION' => $request->get('aws_region'),
'AWS_BUCKET='.$request->aws_bucket."\n". 'AWS_BUCKET' => $request->get('aws_bucket'),
'AWS_ROOT='.$request->aws_root."\n"; 'AWS_ROOT' => $request->get('aws_root'),
];
break; break;
case 'doSpaces': case 'doSpaces':
if (env('DO_SPACES_KEY') !== null) {
$oldDiskData = "\n".
'DO_SPACES_KEY='.config('filesystems.disks.doSpaces.key')."\n".
'DO_SPACES_SECRET="'.config('filesystems.disks.doSpaces.secret')."\"\n".
'DO_SPACES_REGION='.config('filesystems.disks.doSpaces.region')."\n".
'DO_SPACES_BUCKET='.config('filesystems.disks.doSpaces.bucket')."\n".
'DO_SPACES_ENDPOINT='.config('filesystems.disks.doSpaces.endpoint')."\n";
'DO_SPACES_ROOT='.config('filesystems.disks.doSpaces.root')."\n";
}
$newDiskData = "\n". $diskEnv = [
'DO_SPACES_KEY='.$request->do_spaces_key."\n". 'DO_SPACES_KEY' => $request->get('do_spaces_key'),
'DO_SPACES_SECRET="'.$request->do_spaces_secret."\"\n". 'DO_SPACES_SECRET' => $request->get('do_spaces_secret'),
'DO_SPACES_REGION='.$request->do_spaces_region."\n". 'DO_SPACES_REGION' => $request->get('do_spaces_region'),
'DO_SPACES_BUCKET='.$request->do_spaces_bucket."\n". 'DO_SPACES_BUCKET' => $request->get('do_spaces_bucket'),
'DO_SPACES_ENDPOINT='.$request->do_spaces_endpoint."\n"; 'DO_SPACES_ENDPOINT' => $request->get('do_spaces_endpoint'),
'DO_SPACES_ROOT='.$request->do_spaces_root."\n\n"; 'DO_SPACES_ROOT' => $request->get('do_spaces_root'),
];
break; break;
case 'dropbox': case 'dropbox':
if (env('DROPBOX_TOKEN') !== null) {
$oldDiskData = "\n".
'DROPBOX_TOKEN='.config('filesystems.disks.dropbox.token')."\n".
'DROPBOX_KEY='.config('filesystems.disks.dropbox.key')."\n".
'DROPBOX_SECRET="'.config('filesystems.disks.dropbox.secret')."\"\n".
'DROPBOX_APP='.config('filesystems.disks.dropbox.app')."\n".
'DROPBOX_ROOT='.config('filesystems.disks.dropbox.root')."\n";
}
$newDiskData = "\n". $diskEnv = [
'DROPBOX_TOKEN='.$request->dropbox_token."\n". 'DROPBOX_TOKEN' => $request->get('dropbox_token'),
'DROPBOX_KEY='.$request->dropbox_key."\n". 'DROPBOX_KEY' => $request->get('dropbox_key'),
'DROPBOX_SECRET="'.$request->dropbox_secret."\"\n". 'DROPBOX_SECRET' => $request->get('dropbox_secret'),
'DROPBOX_APP='.$request->dropbox_app."\n". 'DROPBOX_APP' => $request->get('dropbox_app'),
'DROPBOX_ROOT='.$request->dropbox_root."\n"; 'DROPBOX_ROOT' => $request->get('dropbox_root'),
];
break; break;
} }
return [ return $diskEnv;
'old_disk_data' => $oldDiskData,
'new_disk_data' => $newDiskData,
'default_driver' => $defaultDriver,
'old_default_driver' => $oldDefaultDriver,
];
} }
/** /**
* Save sanctum statful domain to the .env file. * Save sanctum stateful domain to the .env file.
* *
* @return array * @return array
*/ */
public function saveDomainVariables(DomainEnvironmentRequest $request) public function saveDomainVariables(DomainEnvironmentRequest $request)
{ {
try { try {
file_put_contents($this->envPath, str_replace( $this->updateEnv([
'SANCTUM_STATEFUL_DOMAINS='.env('SANCTUM_STATEFUL_DOMAINS'), 'SANCTUM_STATEFUL_DOMAINS' => $request->get('app_domain'),
'SANCTUM_STATEFUL_DOMAINS='.$request->app_domain, 'SESSION_DOMAIN' => explode(':', $request->get('app_domain'))[0],
file_get_contents($this->envPath) ]);
));
file_put_contents($this->envPath, str_replace(
'SESSION_DOMAIN='.config('session.domain'),
'SESSION_DOMAIN='.explode(':', $request->app_domain)[0],
file_get_contents($this->envPath)
));
} catch (Exception $e) { } catch (Exception $e) {
return [ return [
'error' => 'domain_verification_failed', 'error' => 'domain_verification_failed',
@@ -573,4 +398,34 @@ class EnvironmentManager
'success' => 'domain_variable_save_successfully', 'success' => 'domain_variable_save_successfully',
]; ];
} }
/**
* Order the env contents
*
* @return void
*/
public function reoderEnv()
{
$contents = $this->getEnvContents();
$contents = explode($this->delimiter, $contents);
if (empty($contents)) {
return;
}
natsort($contents);
$formatted = '';
$previous = '';
foreach ($contents as $current) {
$parts_line = explode('_', $current);
$parts_last = explode('_', $previous);
if ($parts_line[0] != $parts_last[0]) {
$formatted .= $this->delimiter;
}
$formatted .= $current.$this->delimiter;
$previous = $current;
}
file_put_contents($this->envPath, trim($formatted));
}
} }

View File

@@ -3,6 +3,7 @@
namespace InvoiceShelf\Space; namespace InvoiceShelf\Space;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log;
use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemException;
class InstallUtils class InstallUtils
@@ -10,7 +11,7 @@ class InstallUtils
/** /**
* Check if database is created * Check if database is created
* *
* @return bool|int|string * @return bool
*/ */
public static function isDbCreated() public static function isDbCreated()
{ {
@@ -49,34 +50,43 @@ class InstallUtils
public static function dbMarkerExists() public static function dbMarkerExists()
{ {
try { try {
$flag = \Storage::disk('local')->has('database_created'); return \Storage::disk('local')->has('database_created');
} catch (FilesystemException $e) { } catch (FilesystemException $e) {
$flag = false; Log::error('Unable to verify db marker: '.$e->getMessage());
} }
return $flag; return false;
} }
/** /**
* Creates the database marker * Creates the database marker
* *
* @return void * @return bool
*/ */
public static function createDbMarker() public static function createDbMarker()
{ {
\Storage::disk('local')->put('database_created', time()); try {
return \Storage::disk('local')->put('database_created', time());
} catch (\Exception $e) {
Log::error('Unable to create db marker: '.$e->getMessage());
}
return false;
} }
/** /**
* Deletes the database marker * Deletes the database marker
* *
* @return void * @return bool
*/ */
public static function deleteDbMarker() public static function deleteDbMarker()
{ {
try { try {
\Storage::disk('local')->delete('database_created'); return \Storage::disk('local')->delete('database_created');
} catch (\Exception $e) { } catch (\Exception $e) {
Log::error('Unable to delete db marker: '.$e->getMessage());
} }
return false;
} }
} }