Added some hints to setup wizard, new validation rules and readme update

This commit is contained in:
carodej
2020-07-22 09:28:13 +02:00
parent 5c86f4dbb3
commit 35e1262676
6 changed files with 128 additions and 191 deletions
+5
View File
@@ -201,6 +201,11 @@ Just log in to your stripe dashboard, and you will find taxes under `Dashboard /
## For Developers ## For Developers
Installation process on your localhost is the same. But, there are some good hints. Installation process on your localhost is the same. But, there are some good hints.
When you download repository from GitHub, you have to rename your `.env.example` file to `.env`. Then run this command in your terminal to install vendors:
```
composer install
```
After successfully installation with setup wizard, you have to set your `APP_ENV` to local mode, in default, it's in production mode. After successfully installation with setup wizard, you have to set your `APP_ENV` to local mode, in default, it's in production mode.
``` ```
APP_ENV=local APP_ENV=local
@@ -24,6 +24,7 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
use Schema; use Schema;
use Stripe; use Stripe;
use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\Exception\HttpException;
@@ -86,38 +87,15 @@ class SetupWizardController extends Controller
throw new HttpException(500, $e->getMessage()); throw new HttpException(500, $e->getMessage());
} }
$database_credentials = collect([ setEnvironmentValue([
[ 'DB_CONNECTION' => $request->connection,
'name' => 'DB_CONNECTION', 'DB_HOST' => $request->host,
'value' => $request->connection, 'DB_PORT' => $request->port,
], 'DB_DATABASE' => $request->name,
[ 'DB_USERNAME' => $request->username,
'name' => 'DB_HOST', 'DB_PASSWORD' => $request->password,
'value' => $request->host,
],
[
'name' => 'DB_PORT',
'value' => $request->port,
],
[
'name' => 'DB_DATABASE',
'value' => $request->name,
],
[
'name' => 'DB_USERNAME',
'value' => $request->username,
],
[
'name' => 'DB_PASSWORD',
'value' => $request->password,
],
]); ]);
// Store database credentials
$database_credentials->each(function ($col) {
setEnvironmentValue($col['name'], $col['value']);
});
// Clear cache // Clear cache
Artisan::call('config:cache'); Artisan::call('config:cache');
@@ -176,10 +154,12 @@ class SetupWizardController extends Controller
}); });
// Set stripe credentials to .env // Set stripe credentials to .env
setEnvironmentValue('CASHIER_CURRENCY', $request->currency); setEnvironmentValue([
setEnvironmentValue('STRIPE_KEY', $request->key); 'CASHIER_CURRENCY' => $request->currency,
setEnvironmentValue('STRIPE_SECRET', $request->secret); 'STRIPE_KEY' => $request->key,
setEnvironmentValue('STRIPE_WEBHOOK_SECRET', $request->webhookSecret); 'STRIPE_SECRET' => $request->secret,
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
]);
// Clear cache // Clear cache
Artisan::call('config:cache'); Artisan::call('config:cache');
@@ -275,172 +255,67 @@ class SetupWizardController extends Controller
if ($storage_driver === 'local') { if ($storage_driver === 'local') {
$storage = collect([ setEnvironmentValue([
[ 'FILESYSTEM_DRIVER' => 'local',
'name' => 'FILESYSTEM_DRIVER',
'value' => 'local',
],
]); ]);
} }
if ($storage_driver === 's3') { if ($storage_driver === 's3') {
$storage = collect([ setEnvironmentValue([
[ 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'name' => 'FILESYSTEM_DRIVER', 'AWS_ACCESS_KEY_ID' => $request->input('storage.key'),
'value' => $request->input('storage.driver'), 'AWS_SECRET_ACCESS_KEY' => $request->input('storage.secret'),
], 'AWS_DEFAULT_REGION' => $request->input('storage.region'),
[ 'AWS_BUCKET' => $request->input('storage.bucket'),
'name' => 'AWS_ACCESS_KEY_ID',
'value' => $request->input('storage.key'),
],
[
'name' => 'AWS_SECRET_ACCESS_KEY',
'value' => $request->input('storage.secret'),
],
[
'name' => 'AWS_DEFAULT_REGION',
'value' => $request->input('storage.region'),
],
[
'name' => 'AWS_BUCKET',
'value' => $request->input('storage.bucket'),
],
]); ]);
} }
if ($storage_driver === 'spaces') { if ($storage_driver === 'spaces') {
$storage = collect([ setEnvironmentValue([
[ 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'name' => 'FILESYSTEM_DRIVER', 'DO_SPACES_KEY' => $request->input('storage.key'),
'value' => $request->input('storage.driver'), 'DO_SPACES_SECRET' => $request->input('storage.secret'),
], 'DO_SPACES_ENDPOINT' => $request->input('storage.endpoint'),
[ 'DO_SPACES_REGION' => $request->input('storage.region'),
'name' => 'DO_SPACES_KEY', 'DO_SPACES_BUCKET' => $request->input('storage.bucket'),
'value' => $request->input('storage.key'),
],
[
'name' => 'DO_SPACES_SECRET',
'value' => $request->input('storage.secret'),
],
[
'name' => 'DO_SPACES_ENDPOINT',
'value' => $request->input('storage.endpoint'),
],
[
'name' => 'DO_SPACES_REGION',
'value' => $request->input('storage.region'),
],
[
'name' => 'DO_SPACES_BUCKET',
'value' => $request->input('storage.bucket'),
],
]); ]);
} }
if ($storage_driver === 'wasabi') { if ($storage_driver === 'wasabi') {
$storage = collect([ setEnvironmentValue([
[ 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'name' => 'FILESYSTEM_DRIVER', 'WASABI_KEY' => $request->input('storage.key'),
'value' => $request->input('storage.driver'), 'WASABI_SECRET' => $request->input('storage.secret'),
], 'WASABI_ENDPOINT' => $request->input('storage.endpoint'),
[ 'WASABI_REGION' => $request->input('storage.region'),
'name' => 'WASABI_KEY', 'WASABI_BUCKET' => $request->input('storage.bucket'),
'value' => $request->input('storage.key'),
],
[
'name' => 'WASABI_SECRET',
'value' => $request->input('storage.secret'),
],
[
'name' => 'WASABI_ENDPOINT',
'value' => $request->input('storage.endpoint'),
],
[
'name' => 'WASABI_REGION',
'value' => $request->input('storage.region'),
],
[
'name' => 'WASABI_BUCKET',
'value' => $request->input('storage.bucket'),
],
]); ]);
} }
if ($storage_driver === 'backblaze') { if ($storage_driver === 'backblaze') {
$storage = collect([ setEnvironmentValue([
[ 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
'name' => 'FILESYSTEM_DRIVER', 'BACKBLAZE_KEY' => $request->input('storage.key'),
'value' => $request->input('storage.driver'), 'BACKBLAZE_SECRET' => $request->input('storage.secret'),
], 'BACKBLAZE_ENDPOINT' => $request->input('storage.endpoint'),
[ 'BACKBLAZE_REGION' => $request->input('storage.region'),
'name' => 'BACKBLAZE_KEY', 'BACKBLAZE_BUCKET' => $request->input('storage.bucket'),
'value' => $request->input('storage.key'),
],
[
'name' => 'BACKBLAZE_SECRET',
'value' => $request->input('storage.secret'),
],
[
'name' => 'BACKBLAZE_ENDPOINT',
'value' => $request->input('storage.endpoint'),
],
[
'name' => 'BACKBLAZE_REGION',
'value' => $request->input('storage.region'),
],
[
'name' => 'BACKBLAZE_BUCKET',
'value' => $request->input('storage.bucket'),
],
]); ]);
} }
// Store storage options setEnvironmentValue([
$storage->each(function ($col) { 'MAIL_DRIVER' => $request->input('mail.driver'),
setEnvironmentValue($col['name'], $col['value']); 'MAIL_HOST' => $request->input('mail.host'),
}); 'MAIL_PORT' => $request->input('mail.port'),
'MAIL_USERNAME' => $request->input('mail.username'),
// Get options 'MAIL_PASSWORD' => $request->input('mail.password'),
$mail = collect([ 'MAIL_ENCRYPTION' => $request->input('mail.encryption'),
[
'name' => 'MAIL_DRIVER',
'value' => $request->input('mail.driver'),
],
[
'name' => 'MAIL_HOST',
'value' => $request->input('mail.host'),
],
[
'name' => 'MAIL_PORT',
'value' => $request->input('mail.port'),
],
[
'name' => 'MAIL_USERNAME',
'value' => $request->input('mail.username'),
],
[
'name' => 'MAIL_PASSWORD',
'value' => $request->input('mail.password'),
],
[
'name' => 'MAIL_ENCRYPTION',
'value' => $request->input('mail.encryption'),
],
]); ]);
// Store mail options
$mail->each(function ($col) {
setEnvironmentValue($col['name'], $col['value']);
});
// Clear cache // Clear cache
Artisan::call('config:cache'); Artisan::call('config:cache');
@@ -521,6 +396,10 @@ class SetupWizardController extends Controller
Setting::updateOrCreate(['name' => $col['name']], $col); Setting::updateOrCreate(['name' => $col['name']], $col);
}); });
setEnvironmentValue([
'APP_NAME' => Str::camel($request->title),
]);
return response('Done', 200); return response('Done', 200);
} }
@@ -651,8 +530,10 @@ class SetupWizardController extends Controller
$client = \DB::table('oauth_clients')->where('name', '=', 'vuefilemanager')->first(); $client = \DB::table('oauth_clients')->where('name', '=', 'vuefilemanager')->first();
// Set passport client to .env // Set passport client to .env
setEnvironmentValue('PASSPORT_CLIENT_ID', $client->id); setEnvironmentValue([
setEnvironmentValue('PASSPORT_CLIENT_SECRET', $client->secret); 'PASSPORT_CLIENT_ID' => $client->id,
'PASSPORT_CLIENT_SECRET' => $client->secret,
]);
} }
/** /**
+20 -8
View File
@@ -89,18 +89,30 @@ function add_paragraphs($str)
* *
* @param $key * @param $key
* @param $value * @param $value
* @return bool
*/ */
function setEnvironmentValue($key, $value) function setEnvironmentValue(array $values)
{ {
$env_path = app()->environmentFilePath(); $envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
$escaped = preg_quote('=' . env($key), '/'); if (count($values) > 0) {
foreach ($values as $envKey => $envValue) {
$str .= "\n"; // In case the searched variable is in the last line without \n
$keyPosition = strpos($str, "{$envKey}=");
$endOfLinePosition = strpos($str, "\n", $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
// If key does not exist, add it
$str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
}
}
$str = substr($str, 0, -1);
if (!file_put_contents($envFile, $str)) return false;
return true;
file_put_contents($env_path, preg_replace(
"/^{$key}{$escaped}/m",
$key . '=' . $value,
file_get_contents($env_path)
));
} }
/** /**
+1 -1
View File
File diff suppressed because one or more lines are too long
@@ -37,7 +37,7 @@
<div class="block-wrapper"> <div class="block-wrapper">
<label>Password:</label> <label>Password:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Password" rules="required" v-slot="{ errors }"> <ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Password" rules="required|confirmed:confirmation" v-slot="{ errors }">
<input v-model="admin.password" placeholder="Type your password" type="password" :class="{'is-error': errors[0]}" /> <input v-model="admin.password" placeholder="Type your password" type="password" :class="{'is-error': errors[0]}" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span> <span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider> </ValidationProvider>
@@ -45,7 +45,7 @@
<div class="block-wrapper"> <div class="block-wrapper">
<label>Password Confirmation:</label> <label>Password Confirmation:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Password confirmation" rules="required" v-slot="{ errors }"> <ValidationProvider tag="div" class="input-wrapper" name="confirmation" rules="required" vid="confirmation" v-slot="{ errors }">
<input v-model="admin.password_confirmation" placeholder="Confirm your password" type="password" :class="{'is-error': errors[0]}" /> <input v-model="admin.password_confirmation" placeholder="Confirm your password" type="password" :class="{'is-error': errors[0]}" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span> <span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider> </ValidationProvider>
@@ -41,10 +41,13 @@
</ValidationProvider> </ValidationProvider>
</div> </div>
<div class="block-wrapper" v-if="storage.driver !== 's3'"> <div class="block-wrapper" v-if="storage.driver !== 's3'">
<label>Endpoint:</label> <label>Endpoint URL:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Endpoint" rules="required" v-slot="{ errors }"> <ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Endpoint" :rules="{ required: true, regex: /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ }" v-slot="{ errors }">
<input v-model="storage.endpoint" placeholder="Type your endpoint" type="text" :class="{'is-error': errors[0]}" /> <input v-model="storage.endpoint" placeholder="Type your endpoint" type="text" :class="{'is-error': errors[0]}" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span> <span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
<small class="input-help">
Provide full URIs of your storage endpoint, for example 'https://ams3.digitaloceanspaces.com'.
</small>
</ValidationProvider> </ValidationProvider>
</div> </div>
<div class="block-wrapper"> <div class="block-wrapper">
@@ -52,6 +55,9 @@
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Region" rules="required" v-slot="{ errors }"> <ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Region" rules="required" v-slot="{ errors }">
<input v-model="storage.region" placeholder="Type your region" type="text" :class="{'is-error': errors[0]}" /> <input v-model="storage.region" placeholder="Type your region" type="text" :class="{'is-error': errors[0]}" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span> <span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
<small class="input-help">
Provide your region, for example 'ams3', 'fra1', 'nyc1'...
</small>
</ValidationProvider> </ValidationProvider>
</div> </div>
<div class="block-wrapper"> <div class="block-wrapper">
@@ -59,6 +65,9 @@
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Bucket" rules="required" v-slot="{ errors }"> <ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Bucket" rules="required" v-slot="{ errors }">
<input v-model="storage.bucket" placeholder="Type your bucket name" type="text" :class="{'is-error': errors[0]}" /> <input v-model="storage.bucket" placeholder="Type your bucket name" type="text" :class="{'is-error': errors[0]}" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span> <span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
<small class="input-help">
Provide your created unique bucket name
</small>
</ValidationProvider> </ValidationProvider>
</div> </div>
@@ -72,7 +81,7 @@
<div class="block-wrapper"> <div class="block-wrapper">
<label>Mail Driver:</label> <label>Mail Driver:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Mail Driver" rules="required" v-slot="{ errors }"> <ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Mail Driver" rules="required" v-slot="{ errors }">
<input v-model="mail.driver" placeholder="Type your mail driver" type="text" :class="{'is-error': errors[0]}" /> <SelectInput v-model="mail.driver" :options="mailDriverList" default="smtp" placeholder="Select your mail driver" :isError="errors[0]"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span> <span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider> </ValidationProvider>
</div> </div>
@@ -188,6 +197,36 @@
value: 'ssl', value: 'ssl',
}, },
], ],
mailDriverList: [
{
label: 'smtp',
value: 'smtp',
},
{
label: 'sendmail',
value: 'sendmail',
},
{
label: 'mailgun',
value: 'mailgun',
},
{
label: 'ses',
value: 'ses',
},
{
label: 'postmark',
value: 'postmark',
},
{
label: 'log',
value: 'log',
},
{
label: 'array',
value: 'array',
},
],
storage: { storage: {
driver: 'local', driver: 'local',
key: '', key: '',