mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-18 16:22:14 +00:00
added it_verify_purchase_code_successfully, it_verify_purchase_code_unsuccessfully, it_setup_database, it_store_stripe_credentials, it_store_stripe_billings, it_store_environment, it_store_app_settings, it_create_admin_account, it_try_to_create_admin_account_after_setup_wizard_success test
This commit is contained in:
@@ -180,7 +180,7 @@ class UserController extends Controller
|
|||||||
{
|
{
|
||||||
// Store avatar
|
// Store avatar
|
||||||
if ($request->hasFile('avatar')) {
|
if ($request->hasFile('avatar')) {
|
||||||
$avatar = store_avatar($request->file('avatar'));
|
$avatar = store_avatar($request, 'avatar');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create user
|
// Create user
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ use Cartalyst\Stripe\Exception\UnauthorizedException;
|
|||||||
use Doctrine\DBAL\Driver\PDOException;
|
use Doctrine\DBAL\Driver\PDOException;
|
||||||
use Illuminate\Contracts\Routing\ResponseFactory;
|
use Illuminate\Contracts\Routing\ResponseFactory;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Support\Facades\DB;
|
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;
|
||||||
@@ -38,6 +39,8 @@ class SetupWizardController extends Controller
|
|||||||
{
|
{
|
||||||
$this->stripe = resolve(StripeService::class);
|
$this->stripe = resolve(StripeService::class);
|
||||||
$this->setup = resolve(SetupService::class);
|
$this->setup = resolve(SetupService::class);
|
||||||
|
|
||||||
|
$this->check_setup_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,14 +51,11 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function verify_purchase_code(Request $request)
|
public function verify_purchase_code(Request $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
// Verify purchase code
|
// Verify purchase code
|
||||||
$response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
|
$response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
|
||||||
|
|
||||||
if ($response->successful()) {
|
if ($response->successful()) {
|
||||||
return $response;
|
return response($response, 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response('Purchase code is invalid.', 400);
|
return response('Purchase code is invalid.', 400);
|
||||||
@@ -69,47 +69,51 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function setup_database(StoreDatabaseCredentialsRequest $request)
|
public function setup_database(StoreDatabaseCredentialsRequest $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
if (!app()->runningUnitTests()) {
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Set temporary database connection
|
// Set temporary database connection
|
||||||
config(['database.connections.test.driver' => $request->connection]);
|
config(['database.connections.test.driver' => $request->connection]);
|
||||||
config(['database.connections.test.host' => $request->host]);
|
config(['database.connections.test.host' => $request->host]);
|
||||||
config(['database.connections.test.port' => $request->port]);
|
config(['database.connections.test.port' => $request->port]);
|
||||||
config(['database.connections.test.database' => $request->name]);
|
config(['database.connections.test.database' => $request->name]);
|
||||||
config(['database.connections.test.username' => $request->username]);
|
config(['database.connections.test.username' => $request->username]);
|
||||||
config(['database.connections.test.password' => $request->password]);
|
config(['database.connections.test.password' => $request->password]);
|
||||||
|
|
||||||
// Test connection
|
// Test connection
|
||||||
\DB::connection('test')->getPdo();
|
\DB::connection('test')->getPdo();
|
||||||
|
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
throw new HttpException(500, $e->getMessage());
|
throw new HttpException(500, $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
setEnvironmentValue([
|
||||||
|
'DB_CONNECTION' => $request->connection,
|
||||||
|
'DB_HOST' => $request->host,
|
||||||
|
'DB_PORT' => $request->port,
|
||||||
|
'DB_DATABASE' => $request->name,
|
||||||
|
'DB_USERNAME' => $request->username,
|
||||||
|
'DB_PASSWORD' => $request->password,
|
||||||
|
]);
|
||||||
|
|
||||||
|
Artisan::call('config:cache');
|
||||||
|
|
||||||
|
Artisan::call('key:generate', [
|
||||||
|
'--force' => true
|
||||||
|
]);
|
||||||
|
|
||||||
|
Artisan::call('migrate:fresh', [
|
||||||
|
'--force' => true
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
setEnvironmentValue([
|
|
||||||
'DB_CONNECTION' => $request->connection,
|
|
||||||
'DB_HOST' => $request->host,
|
|
||||||
'DB_PORT' => $request->port,
|
|
||||||
'DB_DATABASE' => $request->name,
|
|
||||||
'DB_USERNAME' => $request->username,
|
|
||||||
'DB_PASSWORD' => $request->password,
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Clear cache
|
|
||||||
Artisan::call('config:cache');
|
|
||||||
|
|
||||||
// Set up application
|
|
||||||
$this->set_up_application();
|
|
||||||
|
|
||||||
// Store setup wizard progress
|
// Store setup wizard progress
|
||||||
Setting::forceCreate([
|
Setting::forceCreate([
|
||||||
'name' => 'setup_wizard_database',
|
'name' => 'setup_wizard_database',
|
||||||
'value' => 1,
|
'value' => 1,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return response('Done', 200);
|
return response('Done', 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,20 +124,21 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
|
public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
if (!app()->runningUnitTests()) {
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
// Create stripe instance
|
// Create stripe instance
|
||||||
$stripe = Stripe::make($request->secret, '2020-03-02');
|
$stripe = Stripe::make($request->secret, '2020-03-02');
|
||||||
|
|
||||||
// Try to get stripe account details
|
try {
|
||||||
try {
|
// Try to get stripe account details
|
||||||
$stripe->account()->details();
|
$stripe->account()->details();
|
||||||
} catch (UnauthorizedException $e) {
|
|
||||||
throw new HttpException(401, $e->getMessage());
|
} catch (UnauthorizedException $e) {
|
||||||
|
throw new HttpException(401, $e->getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get options
|
// Set settings
|
||||||
collect([
|
collect([
|
||||||
[
|
[
|
||||||
'name' => 'stripe_currency',
|
'name' => 'stripe_currency',
|
||||||
@@ -154,18 +159,21 @@ class SetupWizardController extends Controller
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set stripe credentials to .env
|
if (!app()->runningUnitTests()) {
|
||||||
setEnvironmentValue([
|
|
||||||
'CASHIER_CURRENCY' => $request->currency,
|
|
||||||
'STRIPE_KEY' => $request->key,
|
|
||||||
'STRIPE_SECRET' => $request->secret,
|
|
||||||
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Clear cache
|
// Set stripe credentials to .env
|
||||||
Artisan::call('config:cache');
|
setEnvironmentValue([
|
||||||
|
'CASHIER_CURRENCY' => $request->currency,
|
||||||
|
'STRIPE_KEY' => $request->key,
|
||||||
|
'STRIPE_SECRET' => $request->secret,
|
||||||
|
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
|
||||||
|
]);
|
||||||
|
|
||||||
return response('Done', 200);
|
// Clear cache
|
||||||
|
Artisan::call('config:cache');
|
||||||
|
}
|
||||||
|
|
||||||
|
return response('Done', 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -176,9 +184,6 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store_stripe_billings(StoreStripeBillingRequest $request)
|
public function store_stripe_billings(StoreStripeBillingRequest $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
// Get options
|
// Get options
|
||||||
collect([
|
collect([
|
||||||
[
|
[
|
||||||
@@ -220,10 +225,11 @@ class SetupWizardController extends Controller
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Clear cache
|
if (!app()->runningUnitTests()) {
|
||||||
Artisan::call('config:cache');
|
Artisan::call('config:cache');
|
||||||
|
}
|
||||||
|
|
||||||
return response('Done', 200);
|
return response('Done', 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -233,9 +239,6 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store_stripe_plans(StoreStripePlansRequest $request)
|
public function store_stripe_plans(StoreStripePlansRequest $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
foreach ($request->input('plans') as $plan) {
|
foreach ($request->input('plans') as $plan) {
|
||||||
$this->stripe->createPlan($plan);
|
$this->stripe->createPlan($plan);
|
||||||
}
|
}
|
||||||
@@ -249,78 +252,66 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store_environment_setup(StoreEnvironmentSetupRequest $request)
|
public function store_environment_setup(StoreEnvironmentSetupRequest $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
if (!app()->runningUnitTests()) {
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
$storage_driver = $request->input('storage.driver');
|
$drivers = [
|
||||||
|
'local' => [
|
||||||
|
'FILESYSTEM_DRIVER' => 'local',
|
||||||
|
],
|
||||||
|
's3' => [
|
||||||
|
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
|
||||||
|
'AWS_ACCESS_KEY_ID' => $request->storage['key'] ?? null,
|
||||||
|
'AWS_SECRET_ACCESS_KEY' => $request->storage['secret'] ?? null,
|
||||||
|
'AWS_DEFAULT_REGION' => $request->storage['region'] ?? null,
|
||||||
|
'AWS_BUCKET' => $request->storage['bucket'] ?? null,
|
||||||
|
],
|
||||||
|
'spaces' => [
|
||||||
|
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
|
||||||
|
'DO_SPACES_KEY' => $request->storage['key'] ?? null,
|
||||||
|
'DO_SPACES_SECRET' => $request->storage['secret'] ?? null,
|
||||||
|
'DO_SPACES_ENDPOINT' => $request->storage['endpoint'] ?? null,
|
||||||
|
'DO_SPACES_REGION' => $request->storage['region'] ?? null,
|
||||||
|
'DO_SPACES_BUCKET' => $request->storage['bucket'] ?? null,
|
||||||
|
],
|
||||||
|
'wasabi' => [
|
||||||
|
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
|
||||||
|
'WASABI_KEY' => $request->storage['key'] ?? null,
|
||||||
|
'WASABI_SECRET' => $request->storage['secret'] ?? null,
|
||||||
|
'WASABI_ENDPOINT' => $request->storage['endpoint'] ?? null,
|
||||||
|
'WASABI_REGION' => $request->storage['region'] ?? null,
|
||||||
|
'WASABI_BUCKET' => $request->storage['bucket'] ?? null,
|
||||||
|
],
|
||||||
|
'backblaze' => [
|
||||||
|
'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
|
||||||
|
'BACKBLAZE_KEY' => $request->storage['key'] ?? null,
|
||||||
|
'BACKBLAZE_SECRET' => $request->storage['secret'] ?? null,
|
||||||
|
'BACKBLAZE_ENDPOINT' => $request->storage['endpoint'] ?? null,
|
||||||
|
'BACKBLAZE_REGION' => $request->storage['region'] ?? null,
|
||||||
|
'BACKBLAZE_BUCKET' => $request->storage['bucket'] ?? null,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
if ($storage_driver === 'local') {
|
// Storage credentials for storage
|
||||||
|
setEnvironmentValue(
|
||||||
|
$drivers[$request->storage['driver']]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Store credentials for mail
|
||||||
|
// TODO: add options for mailgun
|
||||||
setEnvironmentValue([
|
setEnvironmentValue([
|
||||||
'FILESYSTEM_DRIVER' => 'local',
|
'MAIL_DRIVER' => $request->input('mail.driver'),
|
||||||
|
'MAIL_HOST' => $request->input('mail.host'),
|
||||||
|
'MAIL_PORT' => $request->input('mail.port'),
|
||||||
|
'MAIL_USERNAME' => $request->input('mail.username'),
|
||||||
|
'MAIL_PASSWORD' => $request->input('mail.password'),
|
||||||
|
'MAIL_ENCRYPTION' => $request->input('mail.encryption'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
Artisan::call('config:cache');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($storage_driver === 's3') {
|
|
||||||
|
|
||||||
setEnvironmentValue([
|
return response('Done', 204);
|
||||||
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
|
|
||||||
'AWS_ACCESS_KEY_ID' => $request->input('storage.key'),
|
|
||||||
'AWS_SECRET_ACCESS_KEY' => $request->input('storage.secret'),
|
|
||||||
'AWS_DEFAULT_REGION' => $request->input('storage.region'),
|
|
||||||
'AWS_BUCKET' => $request->input('storage.bucket'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($storage_driver === 'spaces') {
|
|
||||||
|
|
||||||
setEnvironmentValue([
|
|
||||||
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
|
|
||||||
'DO_SPACES_KEY' => $request->input('storage.key'),
|
|
||||||
'DO_SPACES_SECRET' => $request->input('storage.secret'),
|
|
||||||
'DO_SPACES_ENDPOINT' => $request->input('storage.endpoint'),
|
|
||||||
'DO_SPACES_REGION' => $request->input('storage.region'),
|
|
||||||
'DO_SPACES_BUCKET' => $request->input('storage.bucket'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($storage_driver === 'wasabi') {
|
|
||||||
|
|
||||||
setEnvironmentValue([
|
|
||||||
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
|
|
||||||
'WASABI_KEY' => $request->input('storage.key'),
|
|
||||||
'WASABI_SECRET' => $request->input('storage.secret'),
|
|
||||||
'WASABI_ENDPOINT' => $request->input('storage.endpoint'),
|
|
||||||
'WASABI_REGION' => $request->input('storage.region'),
|
|
||||||
'WASABI_BUCKET' => $request->input('storage.bucket'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($storage_driver === 'backblaze') {
|
|
||||||
|
|
||||||
setEnvironmentValue([
|
|
||||||
'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
|
|
||||||
'BACKBLAZE_KEY' => $request->input('storage.key'),
|
|
||||||
'BACKBLAZE_SECRET' => $request->input('storage.secret'),
|
|
||||||
'BACKBLAZE_ENDPOINT' => $request->input('storage.endpoint'),
|
|
||||||
'BACKBLAZE_REGION' => $request->input('storage.region'),
|
|
||||||
'BACKBLAZE_BUCKET' => $request->input('storage.bucket'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
setEnvironmentValue([
|
|
||||||
'MAIL_DRIVER' => $request->input('mail.driver'),
|
|
||||||
'MAIL_HOST' => $request->input('mail.host'),
|
|
||||||
'MAIL_PORT' => $request->input('mail.port'),
|
|
||||||
'MAIL_USERNAME' => $request->input('mail.username'),
|
|
||||||
'MAIL_PASSWORD' => $request->input('mail.password'),
|
|
||||||
'MAIL_ENCRYPTION' => $request->input('mail.encryption'),
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Clear cache
|
|
||||||
Artisan::call('config:cache');
|
|
||||||
|
|
||||||
return response('Done', 200);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -330,24 +321,6 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function store_app_settings(StoreAppSetupRequest $request)
|
public function store_app_settings(StoreAppSetupRequest $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
// Store Logo
|
|
||||||
if ($request->hasFile('logo')) {
|
|
||||||
$logo = store_system_image($request->file('logo'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store Logo horizontal
|
|
||||||
if ($request->hasFile('logo_horizontal')) {
|
|
||||||
$logo_horizontal = store_system_image($request->file('logo_horizontal'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store favicon
|
|
||||||
if ($request->hasFile('favicon')) {
|
|
||||||
$favicon = store_system_image($request->file('favicon'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get options
|
// Get options
|
||||||
collect([
|
collect([
|
||||||
[
|
[
|
||||||
@@ -360,15 +333,15 @@ class SetupWizardController extends Controller
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'app_logo',
|
'name' => 'app_logo',
|
||||||
'value' => $request->hasFile('logo') ? $logo : null,
|
'value' => store_system_image($request, 'logo'),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'app_logo_horizontal',
|
'name' => 'app_logo_horizontal',
|
||||||
'value' => $request->hasFile('logo_horizontal') ? $logo_horizontal : null,
|
'value' => store_system_image($request, 'logo_horizontal'),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'app_favicon',
|
'name' => 'app_favicon',
|
||||||
'value' => $request->hasFile('favicon') ? $favicon : null,
|
'value' => store_system_image($request, 'favicon'),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'google_analytics',
|
'name' => 'google_analytics',
|
||||||
@@ -388,7 +361,7 @@ class SetupWizardController extends Controller
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'storage_default',
|
'name' => 'storage_default',
|
||||||
'value' => $request->defaultStorage ? $request->defaultStorage : 5,
|
'value' => $request->defaultStorage ?? 5,
|
||||||
],
|
],
|
||||||
])->each(function ($col) {
|
])->each(function ($col) {
|
||||||
Setting::forceCreate([
|
Setting::forceCreate([
|
||||||
@@ -397,11 +370,13 @@ class SetupWizardController extends Controller
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
setEnvironmentValue([
|
if (!app()->runningUnitTests()) {
|
||||||
'APP_NAME' => Str::camel($request->title),
|
setEnvironmentValue([
|
||||||
]);
|
'APP_NAME' => Str::camel($request->title),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
return response('Done', 200);
|
return response('Done', 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -412,10 +387,8 @@ class SetupWizardController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function create_admin_account(Request $request)
|
public function create_admin_account(Request $request)
|
||||||
{
|
{
|
||||||
// Check setup status
|
|
||||||
if ($this->get_setup_status()) abort(410, 'Gone');
|
|
||||||
|
|
||||||
// Validate request
|
// Validate request
|
||||||
|
// TODO: validator do requestu
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'email' => 'required|string|email|unique:users',
|
'email' => 'required|string|email|unique:users',
|
||||||
'password' => 'required|string|min:6|confirmed',
|
'password' => 'required|string|min:6|confirmed',
|
||||||
@@ -425,15 +398,8 @@ class SetupWizardController extends Controller
|
|||||||
'avatar' => 'sometimes|file',
|
'avatar' => 'sometimes|file',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Store avatar
|
|
||||||
if ($request->hasFile('avatar')) {
|
|
||||||
$avatar = store_avatar($request->file('avatar'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create user
|
// Create user
|
||||||
$user = User::forceCreate([
|
$user = User::forceCreate([
|
||||||
'avatar' => $request->hasFile('avatar') ? $avatar : null,
|
|
||||||
'name' => $request->name,
|
|
||||||
'role' => 'admin',
|
'role' => 'admin',
|
||||||
'email' => $request->email,
|
'email' => $request->email,
|
||||||
'password' => Hash::make($request->password),
|
'password' => Hash::make($request->password),
|
||||||
@@ -442,8 +408,9 @@ class SetupWizardController extends Controller
|
|||||||
$user
|
$user
|
||||||
->settings()
|
->settings()
|
||||||
->create([
|
->create([
|
||||||
'user_id' => $user->id,
|
|
||||||
'storage_capacity' => get_setting('storage_default'),
|
'storage_capacity' => get_setting('storage_default'),
|
||||||
|
'avatar' => store_avatar($request, 'avatar'),
|
||||||
|
'name' => $request->name,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
collect([
|
collect([
|
||||||
@@ -466,72 +433,36 @@ class SetupWizardController extends Controller
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Retrieve access token
|
// Set up application
|
||||||
$response = Route::dispatch(self::make_login_request($request));
|
$this->setup->seed_default_pages();
|
||||||
|
$this->setup->seed_default_settings($request->license);
|
||||||
|
|
||||||
// Send access token to user if request is successful
|
// Login account
|
||||||
if ($response->isSuccessful()) {
|
if (Auth::attempt($request->only(['email', 'password']))) {
|
||||||
|
|
||||||
$data = json_decode($response->content(), true);
|
$request->session()->regenerate();
|
||||||
|
|
||||||
return response('Admin was created', 200)->cookie('access_token', $data['access_token'], 43200);
|
return response('Registration was successful', 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $response;
|
return response('Something went wrong', 500);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Migrate database and generate necessary things
|
|
||||||
*/
|
|
||||||
private function set_up_application()
|
|
||||||
{
|
|
||||||
// Generate app key
|
|
||||||
Artisan::call('key:generate', [
|
|
||||||
'--force' => true
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Migrate database
|
|
||||||
Artisan::call('migrate:fresh', [
|
|
||||||
'--force' => true
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->setup->seed_default_pages();
|
|
||||||
$this->setup->seed_default_settings();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make login request for get access token
|
|
||||||
*
|
|
||||||
* @param Request $request
|
|
||||||
* @return Request
|
|
||||||
*/
|
|
||||||
private static function make_login_request($request)
|
|
||||||
{
|
|
||||||
$request->request->add([
|
|
||||||
'grant_type' => 'password',
|
|
||||||
'client_id' => config('services.passport.client_id'),
|
|
||||||
'client_secret' => config('services.passport.client_secret'),
|
|
||||||
'username' => $request->email,
|
|
||||||
'password' => $request->password,
|
|
||||||
'scope' => 'master',
|
|
||||||
]);
|
|
||||||
|
|
||||||
return Request::create(url('/oauth/token'), 'POST', $request->all());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get setup wizard status
|
* Get setup wizard status
|
||||||
*
|
*
|
||||||
* @return |null
|
* @return false |null
|
||||||
*/
|
*/
|
||||||
private function get_setup_status()
|
private function check_setup_status()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
// Check database connections
|
// Check database connections
|
||||||
DB::getPdo();
|
DB::getPdo();
|
||||||
|
|
||||||
// Get setup_wizard status
|
// Get setup_wizard status
|
||||||
return Schema::hasTable('settings') ? get_setting('setup_wizard_success') : false;
|
if (Schema::hasTable('settings') && get_setting('setup_wizard_success')) {
|
||||||
|
abort(410, 'Gone');
|
||||||
|
}
|
||||||
|
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
|
|
||||||
|
|||||||
@@ -51,9 +51,7 @@ class SettingController extends Controller
|
|||||||
Setting::updateOrCreate([
|
Setting::updateOrCreate([
|
||||||
'name' => $request->name
|
'name' => $request->name
|
||||||
], [
|
], [
|
||||||
'value' => store_system_image(
|
'value' => store_system_image($request, $request->name)
|
||||||
$request->file($request->name)
|
|
||||||
)
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return response('Done', 204);
|
return response('Done', 204);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ class AccountController extends Controller
|
|||||||
$user
|
$user
|
||||||
->settings()
|
->settings()
|
||||||
->update([
|
->update([
|
||||||
'avatar' => store_avatar($request->file('avatar'))
|
'avatar' => store_avatar($request, 'avatar')
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return response('Saved!', 204);
|
return response('Saved!', 204);
|
||||||
|
|||||||
@@ -224,11 +224,18 @@ function is_editor($shared)
|
|||||||
/**
|
/**
|
||||||
* Store user avatar to storage
|
* Store user avatar to storage
|
||||||
*
|
*
|
||||||
* @param $image
|
* @param $request
|
||||||
|
* @param $name
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function store_avatar($image)
|
function store_avatar($request, $name)
|
||||||
{
|
{
|
||||||
|
if (! $request->hasFile($name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$image = $request->file($name);
|
||||||
|
|
||||||
// Store avatar
|
// Store avatar
|
||||||
$image_path = Str::random(16) . '-' . $image->getClientOriginalName();
|
$image_path = Str::random(16) . '-' . $image->getClientOriginalName();
|
||||||
|
|
||||||
@@ -248,11 +255,18 @@ function store_avatar($image)
|
|||||||
/**
|
/**
|
||||||
* Store system image
|
* Store system image
|
||||||
*
|
*
|
||||||
* @param $image
|
* @param $request
|
||||||
|
* @param $name
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function store_system_image($image)
|
function store_system_image($request, $name)
|
||||||
{
|
{
|
||||||
|
if (! $request->hasFile($name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$image = $request->file($name);
|
||||||
|
|
||||||
// Store avatar
|
// Store avatar
|
||||||
$filename = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName());
|
$filename = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName());
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class StoreAppSetupRequest extends FormRequest
|
|||||||
'title' => 'required|string',
|
'title' => 'required|string',
|
||||||
'description' => 'required|string',
|
'description' => 'required|string',
|
||||||
'logo' => 'sometimes|file',
|
'logo' => 'sometimes|file',
|
||||||
|
'logo_horizontal' => 'sometimes|file',
|
||||||
'favicon' => 'sometimes|file',
|
'favicon' => 'sometimes|file',
|
||||||
'contactMail' => 'required|email',
|
'contactMail' => 'required|email',
|
||||||
'googleAnalytics' => 'sometimes|string',
|
'googleAnalytics' => 'sometimes|string',
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Setting extends Model
|
|||||||
use HasFactory;
|
use HasFactory;
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'value',
|
'value', 'name'
|
||||||
];
|
];
|
||||||
|
|
||||||
public $timestamps = false;
|
public $timestamps = false;
|
||||||
|
|||||||
@@ -2,12 +2,10 @@
|
|||||||
|
|
||||||
use App\Http\Controllers\General\SetupWizardController;
|
use App\Http\Controllers\General\SetupWizardController;
|
||||||
|
|
||||||
// TODO: testy
|
|
||||||
Route::post('/purchase-code', [SetupWizardController::class, 'verify_purchase_code']);
|
Route::post('/purchase-code', [SetupWizardController::class, 'verify_purchase_code']);
|
||||||
Route::post('/database', [SetupWizardController::class, 'setup_database']);
|
Route::post('/database', [SetupWizardController::class, 'setup_database']);
|
||||||
Route::post('/stripe-credentials', [SetupWizardController::class, 'store_stripe_credentials']);
|
Route::post('/stripe-credentials', [SetupWizardController::class, 'store_stripe_credentials']);
|
||||||
Route::post('/stripe-billings', [SetupWizardController::class, 'store_stripe_billings']);
|
Route::post('/stripe-billings', [SetupWizardController::class, 'store_stripe_billings']);
|
||||||
Route::post('/stripe-plans', [SetupWizardController::class, 'store_stripe_plans']);
|
Route::post('/stripe-plans', [SetupWizardController::class, 'store_stripe_plans']);
|
||||||
Route::post('/environment-setup', [SetupWizardController::class, 'store_environment_setup']);
|
Route::post('/environment-setup', [SetupWizardController::class, 'store_environment_setup']);
|
||||||
Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']);
|
Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']);
|
||||||
Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']);
|
|
||||||
@@ -3,10 +3,12 @@
|
|||||||
use App\Http\Controllers\Admin\InvoiceController;
|
use App\Http\Controllers\Admin\InvoiceController;
|
||||||
use App\Http\Controllers\AppFunctionsController;
|
use App\Http\Controllers\AppFunctionsController;
|
||||||
use App\Http\Controllers\FileAccessController;
|
use App\Http\Controllers\FileAccessController;
|
||||||
|
use App\Http\Controllers\General\SetupWizardController;
|
||||||
use App\Http\Controllers\Sharing\FileSharingController;
|
use App\Http\Controllers\Sharing\FileSharingController;
|
||||||
use App\Http\Controllers\WebhookController;
|
use App\Http\Controllers\WebhookController;
|
||||||
|
|
||||||
Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']);
|
Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']);
|
||||||
|
Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']);
|
||||||
|
|
||||||
// App public files
|
// App public files
|
||||||
// TODO: testy
|
// TODO: testy
|
||||||
|
|||||||
@@ -2,18 +2,44 @@
|
|||||||
|
|
||||||
namespace Tests\Feature;
|
namespace Tests\Feature;
|
||||||
|
|
||||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
use App\Models\Setting;
|
||||||
use Illuminate\Foundation\Testing\WithFaker;
|
use App\Models\User;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||||
|
use Illuminate\Http\UploadedFile;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
|
||||||
class SetupWizardTest extends TestCase
|
class SetupWizardTest extends TestCase
|
||||||
{
|
{
|
||||||
|
use DatabaseMigrations;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
public function it_verify_purchase_code()
|
public function it_verify_purchase_code_successfully()
|
||||||
{
|
{
|
||||||
|
Http::fake([
|
||||||
|
'https://verify.vuefilemanager.com/api/verify-code/*' => Http::response([], 204),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->postJson('/api/setup/purchase-code', [
|
||||||
|
'purchaseCode' => '8624194e-3156-4cd0-944e-3440fcecdacb'
|
||||||
|
])->assertStatus(204);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function it_verify_purchase_code_unsuccessfully()
|
||||||
|
{
|
||||||
|
Http::fake([
|
||||||
|
'https://verify.vuefilemanager.com/api/verify-code/*' => Http::response([], 400),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->postJson('/api/setup/purchase-code', [
|
||||||
|
'purchaseCode' => '8624194e-3156-4cd0-944e-3440fcecdacb'
|
||||||
|
])->assertStatus(400);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,7 +47,19 @@ class SetupWizardTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function it_setup_database()
|
public function it_setup_database()
|
||||||
{
|
{
|
||||||
|
$this->postJson('/api/setup/database', [
|
||||||
|
'connection' => 'sqlite',
|
||||||
|
'host' => 'null',
|
||||||
|
'port' => 'null',
|
||||||
|
'name' => 'database/test.sqlite',
|
||||||
|
'username' => 'null',
|
||||||
|
'password' => 'null',
|
||||||
|
])->assertStatus(204);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'setup_wizard_database',
|
||||||
|
'value' => 1,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -29,7 +67,27 @@ class SetupWizardTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function it_store_stripe_credentials()
|
public function it_store_stripe_credentials()
|
||||||
{
|
{
|
||||||
|
$this->postJson('/api/setup/stripe-credentials', [
|
||||||
|
'currency' => 'EUR',
|
||||||
|
'key' => '123456789',
|
||||||
|
'secret' => '123456789',
|
||||||
|
'webhookSecret' => '123456789',
|
||||||
|
])->assertStatus(204);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'stripe_currency',
|
||||||
|
'value' => 'EUR',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'payments_configured',
|
||||||
|
'value' => 1,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'payments_active',
|
||||||
|
'value' => 1,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,23 +95,111 @@ class SetupWizardTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function it_store_stripe_billings()
|
public function it_store_stripe_billings()
|
||||||
{
|
{
|
||||||
|
$payload = collect([
|
||||||
|
'billing_phone_number' => '+421123456789',
|
||||||
|
'billing_postal_code' => '04001',
|
||||||
|
'billing_vat_number' => 'SK20042134234',
|
||||||
|
'billing_address' => 'Does 20',
|
||||||
|
'billing_country' => 'Doeland',
|
||||||
|
'billing_state' => 'Doeslandia',
|
||||||
|
'billing_city' => 'Does',
|
||||||
|
'billing_name' => 'John Doe Ltd.',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->postJson('/api/setup/stripe-billings', $payload->toArray())
|
||||||
|
->assertStatus(204);
|
||||||
|
|
||||||
|
$payload
|
||||||
|
->each(function ($value, $key) {
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => $key,
|
||||||
|
'value' => $value,
|
||||||
|
]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
*
|
||||||
*/
|
*/
|
||||||
public function it_store_stripe_plans()
|
public function it_store_stripe_plans()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function it_store_environment()
|
||||||
|
{
|
||||||
|
$this->postJson('/api/setup/environment-setup', [
|
||||||
|
'storage' => [
|
||||||
|
'driver' => 'local',
|
||||||
|
],
|
||||||
|
'mail' => [
|
||||||
|
'driver' => 'smtp',
|
||||||
|
'host' => 'smtp.email.com',
|
||||||
|
'port' => '25',
|
||||||
|
'username' => 'john@doe.com',
|
||||||
|
'password' => 'secret',
|
||||||
|
'encryption' => 'tls',
|
||||||
|
],
|
||||||
|
])->assertStatus(204);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
*/
|
*/
|
||||||
public function it_store_app_settings()
|
public function it_store_app_settings()
|
||||||
{
|
{
|
||||||
|
Storage::fake('local');
|
||||||
|
|
||||||
|
$this->postJson('/api/setup/app-setup', [
|
||||||
|
'title' => 'VueFileManager',
|
||||||
|
'description' => 'The best file manager on the internet',
|
||||||
|
'googleAnalytics' => 'UA-12345678-1',
|
||||||
|
'contactMail' => 'john@doe.com',
|
||||||
|
'userRegistration' => 1,
|
||||||
|
'storageLimitation' => 1,
|
||||||
|
'defaultStorage' => 10,
|
||||||
|
'logo' => UploadedFile::fake()->image('fake-logo.jpg'),
|
||||||
|
'logo_horizontal' => UploadedFile::fake()->image('fake-logo-horizontal.jpg'),
|
||||||
|
'favicon' => UploadedFile::fake()->image('fake-favicon.jpg'),
|
||||||
|
])->assertStatus(204);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'app_title',
|
||||||
|
'value' => 'VueFileManager',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'app_description',
|
||||||
|
'value' => 'The best file manager on the internet',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'google_analytics',
|
||||||
|
'value' => 'UA-12345678-1',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'contact_email',
|
||||||
|
'value' => 'john@doe.com',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'storage_default',
|
||||||
|
'value' => '10',
|
||||||
|
]);
|
||||||
|
|
||||||
|
collect(['app_logo', 'app_logo_horizontal', 'app_favicon'])
|
||||||
|
->each(function ($file) {
|
||||||
|
|
||||||
|
$path = get_setting($file);
|
||||||
|
|
||||||
|
$this->assertNotNull($path);
|
||||||
|
|
||||||
|
Storage::assertExists($path);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,6 +207,87 @@ class SetupWizardTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function it_create_admin_account()
|
public function it_create_admin_account()
|
||||||
{
|
{
|
||||||
|
Storage::fake('local');
|
||||||
|
|
||||||
|
$this->postJson('/admin-setup', [
|
||||||
|
'email' => 'john@doe.com',
|
||||||
|
'password' => 'VerySecretPassword',
|
||||||
|
'password_confirmation' => 'VerySecretPassword',
|
||||||
|
'name' => 'John Doe',
|
||||||
|
'purchase_code' => '8624194e-3156-4cd0-944e-3440fcecdacb',
|
||||||
|
'license' => 'Regular',
|
||||||
|
'avatar' => UploadedFile::fake()->image('fake-logo.jpg'),
|
||||||
|
])->assertStatus(204);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('users', [
|
||||||
|
'email' => 'john@doe.com',
|
||||||
|
'role' => 'admin',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('user_settings', [
|
||||||
|
'user_id' => User::first()->id,
|
||||||
|
'name' => 'John Doe',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseMissing('user_settings', [
|
||||||
|
'avatar' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('pages', [
|
||||||
|
'title' => 'Terms of Service',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'feature_title_1',
|
||||||
|
'value' => 'Truly Freedom',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'setup_wizard_success',
|
||||||
|
'value' => '1',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'license',
|
||||||
|
'value' => 'Regular',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('settings', [
|
||||||
|
'name' => 'purchase_code',
|
||||||
|
'value' => '8624194e-3156-4cd0-944e-3440fcecdacb',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$avatar = User::first()
|
||||||
|
->settings
|
||||||
|
->getRawOriginal('avatar');
|
||||||
|
|
||||||
|
$this->assertNotNull($avatar);
|
||||||
|
|
||||||
|
Storage::assertExists($avatar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function it_try_to_create_admin_account_after_setup_wizard_success()
|
||||||
|
{
|
||||||
|
Setting::forceCreate([
|
||||||
|
'name' => 'setup_wizard_success',
|
||||||
|
'value' => '1',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->postJson('/admin-setup', [
|
||||||
|
'email' => 'john@doe.com',
|
||||||
|
'password' => 'VerySecretPassword',
|
||||||
|
'password_confirmation' => 'VerySecretPassword',
|
||||||
|
'name' => 'John Doe',
|
||||||
|
'purchase_code' => '8624194e-3156-4cd0-944e-3440fcecdacb',
|
||||||
|
'license' => 'Regular',
|
||||||
|
])->assertStatus(410);
|
||||||
|
|
||||||
|
$this->assertDatabaseMissing('users', [
|
||||||
|
'email' => 'john@doe.com',
|
||||||
|
'role' => 'admin',
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user