Compare commits
149 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da322d7b1e | ||
|
|
bbff8a5403 | ||
|
|
c1ad600042 | ||
|
|
5fc32759fd | ||
|
|
59cfd8d71b | ||
|
|
51d5b89df7 | ||
|
|
7c0dcbeb88 | ||
|
|
b4467f8d5b | ||
|
|
363f4ed801 | ||
|
|
1b6b950fb5 | ||
|
|
90988f1538 | ||
|
|
139ba793d0 | ||
|
|
c505dd0924 | ||
|
|
ca5ee33978 | ||
|
|
c2fd5e3fa9 | ||
|
|
b04176ce48 | ||
|
|
5136a4b9f8 | ||
|
|
dcee703aa1 | ||
|
|
7c504339d9 | ||
|
|
5ea0761fe9 | ||
|
|
c9125c3be8 | ||
|
|
84503c19db | ||
|
|
cfd9eba5d7 | ||
|
|
10689d3d12 | ||
|
|
e190fb7805 | ||
|
|
c1351f7d28 | ||
|
|
01f5469e86 | ||
|
|
8c5c86eb6a | ||
|
|
995ada46aa | ||
|
|
2e79381872 | ||
|
|
d1c7b9a418 | ||
|
|
34da2f563d | ||
|
|
5cf77fde1c | ||
|
|
aabf6f27ac | ||
|
|
fbcaee3bdc | ||
|
|
3082c10cdb | ||
|
|
a4d90f0017 | ||
|
|
8adfc9837e | ||
|
|
aa20c8a42b | ||
|
|
0f100d6159 | ||
|
|
7c896243a5 | ||
|
|
954fef7c3e | ||
|
|
105126e498 | ||
|
|
7aa5a8949d | ||
|
|
27079928a7 | ||
|
|
99968e57ec | ||
|
|
f75bc1a551 | ||
|
|
ef347f9381 | ||
|
|
f1aace3d8f | ||
|
|
b2bec62766 | ||
|
|
3a8682bbed | ||
|
|
5cfc1f97fe | ||
|
|
cfc8220f8e | ||
|
|
ac5ffefaed | ||
|
|
cbd2b8e0e9 | ||
|
|
f0f427a7bb | ||
|
|
7b6f651015 | ||
|
|
c793daa79a | ||
|
|
71b436aebe | ||
|
|
06e108da5b | ||
|
|
5677c58dd2 | ||
|
|
58ca801e30 | ||
|
|
e750d7caba | ||
|
|
3c0964ef0e | ||
|
|
33613cdf1c | ||
|
|
abfe174825 | ||
|
|
c750f469bb | ||
|
|
c7ac56d5cc | ||
|
|
6601f44013 | ||
|
|
b7baf862b6 | ||
|
|
ca79f4cf21 | ||
|
|
58ffbe8c74 | ||
|
|
dfa7b995fc | ||
|
|
59c65fe6ee | ||
|
|
087c042c14 | ||
|
|
d1ee488ffd | ||
|
|
34100bc580 | ||
|
|
22d91517fb | ||
|
|
1c088bd4e0 | ||
|
|
fd5bbb7f5d | ||
|
|
426d39bec0 | ||
|
|
8244c2dfb2 | ||
|
|
e7f9d32f68 | ||
|
|
71158a0030 | ||
|
|
573ce14b7a | ||
|
|
00ef1f470f | ||
|
|
a9357034c8 | ||
|
|
a45f5157d4 | ||
|
|
0d1009b8db | ||
|
|
4f0416cd45 | ||
|
|
76655d76d5 | ||
|
|
3b38cbe9ac | ||
|
|
acf37b8850 | ||
|
|
f47a0699d3 | ||
|
|
8ae429b06b | ||
|
|
626dbbcb49 | ||
|
|
b623dd80fd | ||
|
|
3978a7c9f7 | ||
|
|
7d2acb7438 | ||
|
|
096032301c | ||
|
|
c3e99bf2ff | ||
|
|
9795642bc7 | ||
|
|
4281a432fb | ||
|
|
18df5589b1 | ||
|
|
79536eac2e | ||
|
|
6df82fca04 | ||
|
|
cc14123d27 | ||
|
|
bd5e7b87ff | ||
|
|
42568916d6 | ||
|
|
180803cd8a | ||
|
|
08fcb0ce01 | ||
|
|
120b4c9df7 | ||
|
|
0eb66c10f6 | ||
|
|
1a6b14a250 | ||
|
|
072c8569eb | ||
|
|
5b9378255b | ||
|
|
ac3cf16377 | ||
|
|
31154d20f6 | ||
|
|
f8031ac71a | ||
|
|
898ec6a454 | ||
|
|
9dbd54fdf6 | ||
|
|
934017384d | ||
|
|
aee3dc0d93 | ||
|
|
8046687ae7 | ||
|
|
a89ee796c1 | ||
|
|
af1d3c3edc | ||
|
|
e1a54c2781 | ||
|
|
2d9f7d49b5 | ||
|
|
d10b046033 | ||
|
|
1725c0ff65 | ||
|
|
b852756c82 | ||
|
|
f164d878d7 | ||
|
|
ecc10fffcb | ||
|
|
5c75b015ba | ||
|
|
65f7dc697e | ||
|
|
d981f0f899 | ||
|
|
ab50beefab | ||
|
|
58d1215fd6 | ||
|
|
1dc137c314 | ||
|
|
ca51e9bf5f | ||
|
|
c588583dfc | ||
|
|
57c7c53eae | ||
|
|
76a62d9992 | ||
|
|
575aa1c6b1 | ||
|
|
4867a61fd0 | ||
|
|
a63e8f350b | ||
|
|
6c1b4f28af | ||
|
|
09adccf752 | ||
|
|
79bb522dee |
@@ -26,6 +26,7 @@ SESSION_LIFETIME=120
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
REDIS_CLIENT=predis
|
||||
|
||||
MAIL_MAILER=smtp
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -12,3 +12,5 @@ npm-debug.log
|
||||
yarn-error.log
|
||||
.idea
|
||||
.php_cs.cache
|
||||
.php-cs-fixer.cache
|
||||
/public/js/resources*.js
|
||||
|
||||
@@ -8,11 +8,11 @@ $finder = Symfony\Component\Finder\Finder::create()
|
||||
->name('*.php')
|
||||
->notName('*.blade.php');
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
return (new PhpCsFixer\Config)
|
||||
->setRules([
|
||||
'@PSR2' => true,
|
||||
'array_syntax' => ['syntax' => 'short'],
|
||||
'ordered_imports' => ['sortAlgorithm' => 'length'],
|
||||
'ordered_imports' => ['sort_algorithm' => 'length'],
|
||||
'no_unused_imports' => true,
|
||||
])
|
||||
->setFinder($finder);
|
||||
@@ -3,7 +3,7 @@
|
||||
With Ploi Core, you'll power-launch your webhosting company.
|
||||
Using the ploi.io system as backbone you will be able to serve your customers your custom panel & feeling.
|
||||
|
||||
<p align="center"><img src="https://ploi-core.io/images/featured.png" width="100%"></p>
|
||||
<p align="center"><img src="https://ploi-core.io/images/og.jpg" width="100%"></p>
|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
60
app/Console/Commands/Core/Cleanup.php
Normal file
60
app/Console/Commands/Core/Cleanup.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands\Core;
|
||||
|
||||
use App\Models\SystemLog;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class Cleanup extends Command
|
||||
{
|
||||
protected $signature = 'core:cleanup';
|
||||
|
||||
protected $description = 'Clean up any old logs';
|
||||
|
||||
public function handle()
|
||||
{
|
||||
if (!setting('rotate_logs_after')) {
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
$rotationDate = $this->getRotationDate();
|
||||
|
||||
$rotated = SystemLog::query()
|
||||
->where('created_at', '<', $rotationDate)
|
||||
->delete();
|
||||
|
||||
$this->info('Rotated ' . $rotated . ' system logs!');
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
protected function getRotationDate()
|
||||
{
|
||||
switch (setting('rotate_logs_after')) {
|
||||
case 'weeks-1':
|
||||
return now()->subWeek();
|
||||
break;
|
||||
case 'months-1':
|
||||
return now()->subMonth();
|
||||
break;
|
||||
case 'months-3':
|
||||
return now()->subMonths(3);
|
||||
break;
|
||||
case 'months-6':
|
||||
return now()->subMonths(6);
|
||||
break;
|
||||
case 'years-1':
|
||||
return now()->subYear();
|
||||
break;
|
||||
case 'years-2':
|
||||
return now()->subYears(2);
|
||||
break;
|
||||
case 'years-3':
|
||||
return now()->subYears(3);
|
||||
break;
|
||||
case 'years-4':
|
||||
return now()->subYears(4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ class Css extends Command
|
||||
|
||||
public function handle()
|
||||
{
|
||||
if(file_exists(storage_path('app/public/theme.css')) && !$this->confirm('You seem to already have a theme.css published, are you sure you want to overwrite?')){
|
||||
if (file_exists(storage_path('app/public/theme.css')) && !$this->confirm('You seem to already have a theme.css published, are you sure you want to overwrite?')) {
|
||||
$this->warn('Aborted publishing of theme.css.');
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -13,7 +13,7 @@ class CssBackup extends Command
|
||||
|
||||
public function handle()
|
||||
{
|
||||
if(!file_exists(storage_path('app/public/theme.css'))){
|
||||
if (!file_exists(storage_path('app/public/theme.css'))) {
|
||||
$this->warn('There is no custom theme.css, aborting backup.');
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -7,16 +7,18 @@ use App\Models\User;
|
||||
use RuntimeException;
|
||||
use App\Models\Package;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Console\Command;
|
||||
use App\Services\VersionChecker;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
|
||||
class Install extends Command
|
||||
{
|
||||
protected $company;
|
||||
protected $signature = 'core:install';
|
||||
protected $signature = 'core:install {--force}';
|
||||
protected $description = 'Installation command for Ploi Core';
|
||||
protected $versionChecker;
|
||||
protected $installationFile = 'app/installation';
|
||||
@@ -34,8 +36,17 @@ class Install extends Command
|
||||
$this->askAboutDefaultPackages();
|
||||
$this->checkApplicationUrl();
|
||||
$this->createInstallationFile();
|
||||
$this->linkStorage();
|
||||
|
||||
$this->info('Succes! Installation has finished.');
|
||||
$this->info('Success! Installation has finished.');
|
||||
$this->line(' ');
|
||||
$this->writeSeparationLine();
|
||||
$this->info('Make sure to also setup emailing, the cronjob and the queue worker.');
|
||||
$this->line(' ');
|
||||
$this->info('Setting up emailing: https://docs.ploi-core.io/getting-started/setting-up-email');
|
||||
$this->info('Setting up cronjob & queue worker: https://docs.ploi-core.io/getting-started/installation');
|
||||
$this->writeSeparationLine();
|
||||
$this->line(' ');
|
||||
$this->info('Visit your platform at ' . env('APP_URL'));
|
||||
}
|
||||
|
||||
@@ -46,28 +57,32 @@ class Install extends Command
|
||||
|
||||
protected function askAboutAdministrationAccount()
|
||||
{
|
||||
$this->info('Let\'s start by setting up your administration account.');
|
||||
if (!User::query()->where('role', User::ADMIN)->count()) {
|
||||
$this->info('Let\'s start by setting up your administration account.');
|
||||
|
||||
$name = $this->ask('What is your name', $this->company['user_name']);
|
||||
$email = $this->ask('What is your e-mail address', $this->company['email']);
|
||||
$password = $this->secret('What password do you desire');
|
||||
$name = $this->ask('What is your name', $this->company['user_name']);
|
||||
$email = $this->ask('What is your e-mail address', $this->company['email']);
|
||||
$password = $this->secret('What password do you desire');
|
||||
|
||||
$check = User::where('email', $email)->count();
|
||||
$check = User::where('email', $email)->count();
|
||||
|
||||
if ($check) {
|
||||
$this->line('');
|
||||
$this->comment('This user is already present in your system, please refresh your database or use different credentials.');
|
||||
$this->comment('Aborting installation..');
|
||||
if ($check) {
|
||||
$this->line('');
|
||||
$this->comment('This user is already present in your system, please refresh your database or use different credentials.');
|
||||
$this->comment('Aborting installation..');
|
||||
|
||||
exit();
|
||||
exit();
|
||||
}
|
||||
|
||||
User::forceCreate([
|
||||
'name' => $name,
|
||||
'email' => $email,
|
||||
'password' => $password,
|
||||
'role' => User::ADMIN
|
||||
]);
|
||||
} else {
|
||||
$this->line('Already found a administrator user in your system. Use that user to login.');
|
||||
}
|
||||
|
||||
User::forceCreate([
|
||||
'name' => $name,
|
||||
'email' => $email,
|
||||
'password' => $password,
|
||||
'role' => User::ADMIN
|
||||
]);
|
||||
}
|
||||
|
||||
protected function askAboutDefaultPackages()
|
||||
@@ -98,7 +113,7 @@ class Install extends Command
|
||||
|
||||
Package::create([
|
||||
'name' => 'Professional',
|
||||
'maximum_sites' => 5,
|
||||
'maximum_sites' => 30,
|
||||
'site_permissions' => [
|
||||
'create' => true,
|
||||
'update' => true,
|
||||
@@ -138,7 +153,9 @@ class Install extends Command
|
||||
->get((new Ploi)->url . 'ping');
|
||||
|
||||
if (!$response->ok() || !$response->json()) {
|
||||
return false;
|
||||
return [
|
||||
'error' => Arr::get($response->json(), 'message', 'An unknown error has occurred.')
|
||||
];
|
||||
}
|
||||
|
||||
return $response->json();
|
||||
@@ -153,7 +170,7 @@ class Install extends Command
|
||||
|
||||
protected function intro()
|
||||
{
|
||||
$this->info('*---------------------------------------------------------------------------*');
|
||||
$this->writeSeparationLine();
|
||||
$this->line('Ploi Core Installation');
|
||||
$this->line('Ploi Core version: ' . $this->versionChecker->currentVersion);
|
||||
$this->line('Ploi Core remote: ' . $this->versionChecker->remoteVersion);
|
||||
@@ -163,13 +180,13 @@ class Install extends Command
|
||||
$this->line('Website: https://ploi-core.io');
|
||||
$this->line('E-mail: core@ploi.io');
|
||||
$this->line('Terms of service: https://ploi-core.io/terms');
|
||||
$this->info('*---------------------------------------------------------------------------*');
|
||||
$this->writeSeparationLine();
|
||||
$this->line('');
|
||||
}
|
||||
|
||||
protected function isInstalled()
|
||||
{
|
||||
if (file_exists(storage_path($this->installationFile))) {
|
||||
if (file_exists(storage_path($this->installationFile)) && !$this->option('force')) {
|
||||
$this->line('');
|
||||
$this->comment('Ploi Core has already been installed before.');
|
||||
$this->comment('If you still want to start installation, remove this file to continue: ./storage/' . $this->installationFile);
|
||||
@@ -203,6 +220,11 @@ class Install extends Command
|
||||
file_put_contents(storage_path($this->installationFile), json_encode($this->getInstallationPayload(), JSON_PRETTY_PRINT));
|
||||
}
|
||||
|
||||
protected function linkStorage()
|
||||
{
|
||||
Artisan::call('storage:link');
|
||||
}
|
||||
|
||||
protected function createDatabaseCredentials(): bool
|
||||
{
|
||||
$storeCredentials = $this->confirm(
|
||||
@@ -269,6 +291,18 @@ class Install extends Command
|
||||
exit();
|
||||
}
|
||||
|
||||
if (isset($this->company['error'])) {
|
||||
$this->error($this->company['error']);
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
if ($this->company['user']['subscription'] !== 'unlimited') {
|
||||
$this->error('Your subscription does not cover the usage of Ploi Core. Please upgrade your subscription to Unlimited.');
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
$this->writeToEnvironmentFile('PLOI_TOKEN', $ploiApiToken);
|
||||
$this->writeToEnvironmentFile('PLOI_CORE_TOKEN', $ploiCoreKey);
|
||||
|
||||
@@ -372,4 +406,9 @@ class Install extends Command
|
||||
{
|
||||
$this->laravel['config'][$key] = $value;
|
||||
}
|
||||
|
||||
protected function writeSeparationLine()
|
||||
{
|
||||
$this->info('*---------------------------------------------------------------------------*');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
|
||||
namespace App\Console;
|
||||
|
||||
use App\Console\Commands\Core\Css;
|
||||
use App\Console\Commands\Core\CssBackup;
|
||||
use App\Jobs\Core\Ping;
|
||||
use App\Console\Commands\Core\Css;
|
||||
use App\Console\Commands\Core\Cleanup;
|
||||
use App\Console\Commands\Core\Install;
|
||||
use App\Console\Commands\Core\CssBackup;
|
||||
use App\Console\Commands\Core\Synchronize;
|
||||
use Illuminate\Console\Scheduling\Schedule;
|
||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||
@@ -17,6 +18,7 @@ class Kernel extends ConsoleKernel
|
||||
CssBackup::class,
|
||||
Install::class,
|
||||
Synchronize::class,
|
||||
Cleanup::class,
|
||||
];
|
||||
|
||||
protected function schedule(Schedule $schedule)
|
||||
@@ -24,5 +26,7 @@ class Kernel extends ConsoleKernel
|
||||
$schedule->call(function () {
|
||||
dispatch(new Ping())->delay(now()->addMinutes(rand(1, 30)));
|
||||
})->dailyAt('02:00');
|
||||
|
||||
$schedule->command('core:cleanup')->daily();
|
||||
}
|
||||
}
|
||||
|
||||
281
app/Helpers/Country.php
Normal file
281
app/Helpers/Country.php
Normal file
@@ -0,0 +1,281 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('countries')) {
|
||||
function countries($key = null)
|
||||
{
|
||||
$arr = [
|
||||
'af' => 'Afghanistan',
|
||||
'al' => 'Albania',
|
||||
'dz' => 'Algeria',
|
||||
'as' => 'American Samoa',
|
||||
'ad' => 'Andorra',
|
||||
'ao' => 'Angola',
|
||||
'ai' => 'Anguilla',
|
||||
'aq' => 'Antarctica',
|
||||
'ag' => 'Antigua and Barbuda',
|
||||
'ar' => 'Argentina',
|
||||
'am' => 'Armenia',
|
||||
'aw' => 'Aruba',
|
||||
'au' => 'Australia',
|
||||
'at' => 'Austria',
|
||||
'az' => 'Azerbaijan',
|
||||
'bs' => 'Bahamas',
|
||||
'bh' => 'Bahrain',
|
||||
'bd' => 'Bangladesh',
|
||||
'bb' => 'Barbados',
|
||||
'by' => 'Belarus',
|
||||
'be' => 'Belgium',
|
||||
'bz' => 'Belize',
|
||||
'bj' => 'Benin',
|
||||
'bm' => 'Bermuda',
|
||||
'bt' => 'Bhutan',
|
||||
'bo' => 'Bolivia',
|
||||
'ba' => 'Bosnia and Herzegovina',
|
||||
'bw' => 'Botswana',
|
||||
'bv' => 'Bouvet Island',
|
||||
'br' => 'Brazil',
|
||||
'bq' => 'British Antarctic Territory',
|
||||
'io' => 'British Indian Ocean Territory',
|
||||
'vg' => 'British Virgin Islands',
|
||||
'bn' => 'Brunei',
|
||||
'bg' => 'Bulgaria',
|
||||
'bf' => 'Burkina Faso',
|
||||
'bi' => 'Burundi',
|
||||
'kh' => 'Cambodia',
|
||||
'cm' => 'Cameroon',
|
||||
'ca' => 'Canada',
|
||||
'ct' => 'Canton and Enderbury Islands',
|
||||
'cv' => 'Cape Verde',
|
||||
'ky' => 'Cayman Islands',
|
||||
'cf' => 'Central African Republic',
|
||||
'td' => 'Chad',
|
||||
'cl' => 'Chile',
|
||||
'cn' => 'China',
|
||||
'cx' => 'Christmas Island',
|
||||
'cc' => 'Cocos [Keeling] Islands',
|
||||
'co' => 'Colombia',
|
||||
'km' => 'Comoros',
|
||||
'cg' => 'Congo - Brazzaville',
|
||||
'cd' => 'Congo - Kinshasa',
|
||||
'ck' => 'Cook Islands',
|
||||
'cr' => 'Costa Rica',
|
||||
'hr' => 'Croatia',
|
||||
'cu' => 'Cuba',
|
||||
'cy' => 'Cyprus',
|
||||
'cz' => 'Czech Republic',
|
||||
'ci' => 'Côte d’Ivoire',
|
||||
'dk' => 'Denmark',
|
||||
'dj' => 'Djibouti',
|
||||
'dm' => 'Dominica',
|
||||
'do' => 'Dominican Republic',
|
||||
'nq' => 'Dronning Maud Land',
|
||||
'dd' => 'East Germany',
|
||||
'ec' => 'Ecuador',
|
||||
'eg' => 'Egypt',
|
||||
'sv' => 'El Salvador',
|
||||
'gq' => 'Equatorial Guinea',
|
||||
'er' => 'Eritrea',
|
||||
'ee' => 'Estonia',
|
||||
'et' => 'Ethiopia',
|
||||
'fk' => 'Falkland Islands',
|
||||
'fo' => 'Faroe Islands',
|
||||
'fj' => 'Fiji',
|
||||
'fi' => 'Finland',
|
||||
'fr' => 'France',
|
||||
'gf' => 'French Guiana',
|
||||
'pf' => 'French Polynesia',
|
||||
'tf' => 'French Southern Territories',
|
||||
'fq' => 'French Southern and Antarctic Territories',
|
||||
'ga' => 'Gabon',
|
||||
'gm' => 'Gambia',
|
||||
'ge' => 'Georgia',
|
||||
'de' => 'Germany',
|
||||
'gh' => 'Ghana',
|
||||
'gi' => 'Gibraltar',
|
||||
'gr' => 'Greece',
|
||||
'gl' => 'Greenland',
|
||||
'gd' => 'Grenada',
|
||||
'gp' => 'Guadeloupe',
|
||||
'gu' => 'Guam',
|
||||
'gt' => 'Guatemala',
|
||||
'gg' => 'Guernsey',
|
||||
'gn' => 'Guinea',
|
||||
'gw' => 'Guinea-Bissau',
|
||||
'gy' => 'Guyana',
|
||||
'ht' => 'Haiti',
|
||||
'hm' => 'Heard Island and McDonald Islands',
|
||||
'hn' => 'Honduras',
|
||||
'hk' => 'Hong Kong SAR China',
|
||||
'hu' => 'Hungary',
|
||||
'is' => 'Iceland',
|
||||
'in' => 'India',
|
||||
'id' => 'Indonesia',
|
||||
'ir' => 'Iran',
|
||||
'iq' => 'Iraq',
|
||||
'ie' => 'Ireland',
|
||||
'im' => 'Isle of Man',
|
||||
'il' => 'Israel',
|
||||
'it' => 'Italy',
|
||||
'jm' => 'Jamaica',
|
||||
'jp' => 'Japan',
|
||||
'je' => 'Jersey',
|
||||
'jt' => 'Johnston Island',
|
||||
'jo' => 'Jordan',
|
||||
'kz' => 'Kazakhstan',
|
||||
'ke' => 'Kenya',
|
||||
'ki' => 'Kiribati',
|
||||
'kw' => 'Kuwait',
|
||||
'kg' => 'Kyrgyzstan',
|
||||
'la' => 'Laos',
|
||||
'lv' => 'Latvia',
|
||||
'lb' => 'Lebanon',
|
||||
'ls' => 'Lesotho',
|
||||
'lr' => 'Liberia',
|
||||
'ly' => 'Libya',
|
||||
'li' => 'Liechtenstein',
|
||||
'lt' => 'Lithuania',
|
||||
'lu' => 'Luxembourg',
|
||||
'mo' => 'Macau SAR China',
|
||||
'mk' => 'Macedonia',
|
||||
'mg' => 'Madagascar',
|
||||
'mw' => 'Malawi',
|
||||
'my' => 'Malaysia',
|
||||
'mv' => 'Maldives',
|
||||
'ml' => 'Mali',
|
||||
'mt' => 'Malta',
|
||||
'mh' => 'Marshall Islands',
|
||||
'mq' => 'Martinique',
|
||||
'mr' => 'Mauritania',
|
||||
'mu' => 'Mauritius',
|
||||
'yt' => 'Mayotte',
|
||||
'fx' => 'Metropolitan France',
|
||||
'mx' => 'Mexico',
|
||||
'fm' => 'Micronesia',
|
||||
'mi' => 'Midway Islands',
|
||||
'md' => 'Moldova',
|
||||
'mc' => 'Monaco',
|
||||
'mn' => 'Mongolia',
|
||||
'me' => 'Montenegro',
|
||||
'ms' => 'Montserrat',
|
||||
'ma' => 'Morocco',
|
||||
'mz' => 'Mozambique',
|
||||
'mm' => 'Myanmar [Burma]',
|
||||
'na' => 'Namibia',
|
||||
'nr' => 'Nauru',
|
||||
'np' => 'Nepal',
|
||||
'nl' => 'Netherlands',
|
||||
'an' => 'Netherlands Antilles',
|
||||
'nt' => 'Neutral Zone',
|
||||
'nc' => 'New Caledonia',
|
||||
'nz' => 'New Zealand',
|
||||
'ni' => 'Nicaragua',
|
||||
'ne' => 'Niger',
|
||||
'ng' => 'Nigeria',
|
||||
'nu' => 'Niue',
|
||||
'nf' => 'Norfolk Island',
|
||||
'kp' => 'North Korea',
|
||||
'vd' => 'North Vietnam',
|
||||
'mp' => 'Northern Mariana Islands',
|
||||
'no' => 'Norway',
|
||||
'om' => 'Oman',
|
||||
'pc' => 'Pacific Islands Trust Territory',
|
||||
'pk' => 'Pakistan',
|
||||
'pw' => 'Palau',
|
||||
'ps' => 'Palestinian Territories',
|
||||
'pa' => 'Panama',
|
||||
'pz' => 'Panama Canal Zone',
|
||||
'pg' => 'Papua New Guinea',
|
||||
'py' => 'Paraguay',
|
||||
'yd' => 'People\'s Democratic Republic of Yemen',
|
||||
'pe' => 'Peru',
|
||||
'ph' => 'Philippines',
|
||||
'pn' => 'Pitcairn Islands',
|
||||
'pl' => 'Poland',
|
||||
'pt' => 'Portugal',
|
||||
'pr' => 'Puerto Rico',
|
||||
'qa' => 'Qatar',
|
||||
'ro' => 'Romania',
|
||||
'ru' => 'Russia',
|
||||
'rw' => 'Rwanda',
|
||||
're' => 'Réunion',
|
||||
'bl' => 'Saint Barthélemy',
|
||||
'sh' => 'Saint Helena',
|
||||
'kn' => 'Saint Kitts and Nevis',
|
||||
'lc' => 'Saint Lucia',
|
||||
'mf' => 'Saint Martin',
|
||||
'pm' => 'Saint Pierre and Miquelon',
|
||||
'vc' => 'Saint Vincent and the Grenadines',
|
||||
'ws' => 'Samoa',
|
||||
'sm' => 'San Marino',
|
||||
'sa' => 'Saudi Arabia',
|
||||
'sn' => 'Senegal',
|
||||
'rs' => 'Serbia',
|
||||
'cs' => 'Serbia and Montenegro',
|
||||
'sc' => 'Seychelles',
|
||||
'sl' => 'Sierra Leone',
|
||||
'sg' => 'Singapore',
|
||||
'sk' => 'Slovakia',
|
||||
'si' => 'Slovenia',
|
||||
'sb' => 'Solomon Islands',
|
||||
'so' => 'Somalia',
|
||||
'za' => 'South Africa',
|
||||
'gs' => 'South Georgia and the South Sandwich Islands',
|
||||
'kr' => 'South Korea',
|
||||
'es' => 'Spain',
|
||||
'lk' => 'Sri Lanka',
|
||||
'sd' => 'Sudan',
|
||||
'sr' => 'Suriname',
|
||||
'sj' => 'Svalbard and Jan Mayen',
|
||||
'sz' => 'Swaziland',
|
||||
'se' => 'Sweden',
|
||||
'ch' => 'Switzerland',
|
||||
'sy' => 'Syria',
|
||||
'st' => 'São Tomé and Príncipe',
|
||||
'tw' => 'Taiwan',
|
||||
'tj' => 'Tajikistan',
|
||||
'tz' => 'Tanzania',
|
||||
'th' => 'Thailand',
|
||||
'tl' => 'Timor-Leste',
|
||||
'tg' => 'Togo',
|
||||
'tk' => 'Tokelau',
|
||||
'to' => 'Tonga',
|
||||
'tt' => 'Trinidad and Tobago',
|
||||
'tn' => 'Tunisia',
|
||||
'tr' => 'Turkey',
|
||||
'tm' => 'Turkmenistan',
|
||||
'tc' => 'Turks and Caicos Islands',
|
||||
'tv' => 'Tuvalu',
|
||||
'um' => 'U.S. Minor Outlying Islands',
|
||||
'pu' => 'U.S. Miscellaneous Pacific Islands',
|
||||
'vi' => 'U.S. Virgin Islands',
|
||||
'ug' => 'Uganda',
|
||||
'ua' => 'Ukraine',
|
||||
'su' => 'Union of Soviet Socialist Republics',
|
||||
'ae' => 'United Arab Emirates',
|
||||
'en' => 'United Kingdom (EN)',
|
||||
'uk' => 'United Kingdom (UK)',
|
||||
'gb' => 'United Kingdom (GB)',
|
||||
'us' => 'United States',
|
||||
'zz' => 'Unknown or Invalid Region',
|
||||
'uy' => 'Uruguay',
|
||||
'uz' => 'Uzbekistan',
|
||||
'vu' => 'Vanuatu',
|
||||
'va' => 'Vatican City',
|
||||
've' => 'Venezuela',
|
||||
'vn' => 'Vietnam',
|
||||
'wk' => 'Wake Island',
|
||||
'wf' => 'Wallis and Futuna',
|
||||
'eh' => 'Western Sahara',
|
||||
'ye' => 'Yemen',
|
||||
'zm' => 'Zambia',
|
||||
'zw' => 'Zimbabwe',
|
||||
'ax' => 'Åland Islands',
|
||||
];
|
||||
|
||||
if ($key && array_key_exists($key, $arr)) {
|
||||
return $arr[strtolower($key)];
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('languages')) {
|
||||
function languages()
|
||||
function languages(): array
|
||||
{
|
||||
$languages = [
|
||||
'en'
|
||||
|
||||
@@ -2,10 +2,9 @@
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Models\Alert;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Admin\AlertRequest;
|
||||
use App\Models\Alert;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class AlertController extends Controller
|
||||
{
|
||||
|
||||
@@ -10,14 +10,17 @@ use App\Http\Controllers\Controller;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
public function index()
|
||||
public function __invoke()
|
||||
{
|
||||
return inertia('Admin/Dashboard', [
|
||||
'servers' => Server::count(),
|
||||
'sites' => Site::count(),
|
||||
'users' => User::count(),
|
||||
'logs' => SystemLog::latest()->limit(10)->with('model')->get()
|
||||
->map(function (SystemLog $systemLog) {
|
||||
'logs' => SystemLog::query()
|
||||
->latest()
|
||||
->with('model')
|
||||
->paginate(5)
|
||||
->through(function (SystemLog $systemLog) {
|
||||
return [
|
||||
'title' => __($systemLog->title, [
|
||||
'site' => $systemLog->model->domain ?? '-Unknown-'
|
||||
|
||||
@@ -14,6 +14,8 @@ class ProviderController extends Controller
|
||||
|
||||
return inertia('Admin/Services/Provider/Edit', [
|
||||
'provider' => $provider,
|
||||
'availablePlans' => $provider->plans()->pluck('label', 'id'),
|
||||
'availableRegions' => $provider->regions()->pluck('label', 'id'),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,12 +12,12 @@ class ServiceController extends Controller
|
||||
public function index()
|
||||
{
|
||||
return inertia('Admin/Services/Index', [
|
||||
'servers' => Server::withCount('sites')->latest()->paginate(5, ['*'], 'servers_per_page'),
|
||||
'sites' => Site::with('server:id,name')->latest()->paginate(5, ['*'], 'sites_per_page'),
|
||||
'servers' => Server::query()->withCount('sites', 'users')->latest()->paginate(config('core.pagination.per_page'), ['*'], 'servers_per_page'),
|
||||
'sites' => Site::with('server:id,name')->withCount('users')->latest()->paginate(config('core.pagination.per_page'), ['*'], 'sites_per_page'),
|
||||
'providers' => Provider::query()
|
||||
->withCount('regions', 'plans', 'servers')
|
||||
->latest()
|
||||
->paginate(5, ['*'], 'providers_per_page'),
|
||||
->paginate(config('core.pagination.per_page'), ['*'], 'providers_per_page'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Models\Package;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Admin\SettingRequest;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use App\Http\Requests\Admin\SettingRequest;
|
||||
|
||||
class SettingController extends Controller
|
||||
{
|
||||
@@ -24,7 +25,9 @@ class SettingController extends Controller
|
||||
'isolate_per_site_per_user' => setting('isolate_per_site_per_user'),
|
||||
'enable_api' => setting('enable_api'),
|
||||
'api_token' => setting('api_token') ? decrypt(setting('api_token')) : null,
|
||||
'default_language' => setting('default_language', 'en')
|
||||
'rotate_logs_after' => setting('rotate_logs_after') ? setting('rotate_logs_after') : null,
|
||||
'default_language' => setting('default_language', 'en'),
|
||||
'has_logo' => (bool)setting('logo'),
|
||||
];
|
||||
|
||||
$packages = Package::pluck('name', 'id');
|
||||
@@ -50,12 +53,25 @@ class SettingController extends Controller
|
||||
'isolate_per_site_per_user',
|
||||
'enable_api',
|
||||
'api_token',
|
||||
'default_language'
|
||||
'default_language',
|
||||
'rotate_logs_after',
|
||||
]) as $key => $value) {
|
||||
if ($key === 'api_token') {
|
||||
$value = encrypt($value);
|
||||
}
|
||||
|
||||
if ($key === 'default_package' && $value === 'false') {
|
||||
$value = null;
|
||||
}
|
||||
|
||||
if ($value === 'false') {
|
||||
$value = 0;
|
||||
}
|
||||
|
||||
if ($value === 'true') {
|
||||
$value = 1;
|
||||
}
|
||||
|
||||
setting([$key => $value]);
|
||||
}
|
||||
|
||||
@@ -75,4 +91,51 @@ class SettingController extends Controller
|
||||
|
||||
return redirect()->route('admin.settings')->with('success', __('Settings have been updated'));
|
||||
}
|
||||
|
||||
public function terms()
|
||||
{
|
||||
return inertia('Admin/Terms', [
|
||||
'terms_settings' => [
|
||||
'logo' => setting('logo'),
|
||||
'name' => setting('name'),
|
||||
'terms_required' => setting('accept_terms_required'),
|
||||
'terms' => setting('terms'),
|
||||
'privacy' => setting('privacy')
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateTerms(Request $request)
|
||||
{
|
||||
setting(['accept_terms_required' => $request->input('terms_required'),]);
|
||||
setting(['terms' => $request->input('terms'),]);
|
||||
setting(['privacy' => $request->input('privacy'),]);
|
||||
|
||||
return redirect()->route('admin.settings.terms')->with('success', __('Terms have been updated'));
|
||||
}
|
||||
|
||||
public function termsTemplate(Request $request)
|
||||
{
|
||||
$template = file_get_contents(storage_path('templates/terms-of-service.md'));
|
||||
$template = str_replace([
|
||||
'{NAME}',
|
||||
'{WEBSITE}',
|
||||
'{DATE}'
|
||||
], [
|
||||
setting('name'),
|
||||
config('app.url'),
|
||||
date('Y-m-d')
|
||||
], $template);
|
||||
|
||||
return ['content' => $template];
|
||||
}
|
||||
|
||||
public function removeLogo(Request $request)
|
||||
{
|
||||
Storage::delete(setting('logo'));
|
||||
|
||||
setting(['logo' => null]);
|
||||
|
||||
return redirect()->back()->with('success', 'Logo has ben removed');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Models\Provider;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
@@ -11,15 +10,15 @@ class SynchronizeProviderController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (config('app.demo')) {
|
||||
if ($this->isDemo()) {
|
||||
return redirect('/')->with('info', __('This feature is not available in demo mode.'));
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
$availableProviders = $this->getPloi()->user()->serverProviders()->getData();
|
||||
|
||||
$availableProviders = $ploi->user()->serverProviders()->getData();
|
||||
|
||||
$currentProviders = Provider::whereNotIn('id', array_keys((array)$availableProviders))->get();
|
||||
$currentProviders = Provider::query()
|
||||
->whereNotIn('id', array_keys((array)$availableProviders))
|
||||
->get();
|
||||
|
||||
return inertia('Admin/Services/Providers', [
|
||||
'availableProviders' => $availableProviders,
|
||||
@@ -29,7 +28,7 @@ class SynchronizeProviderController extends Controller
|
||||
|
||||
public function synchronize(Request $request, $providerId)
|
||||
{
|
||||
$ploiProvider = (new Ploi)->user()->serverProviders($providerId)->getData();
|
||||
$ploiProvider = $this->getPloi()->user()->serverProviders($providerId)->getData();
|
||||
|
||||
$provider = Provider::updateOrCreate([
|
||||
'ploi_id' => $ploiProvider->id,
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Models\Server;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
@@ -11,15 +10,15 @@ class SynchronizeServerController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (config('app.demo')) {
|
||||
if ($this->isDemo()) {
|
||||
return redirect('/')->with('info', __('This feature is not available in demo mode.'));
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
$availableServers = $this->getPloi()->synchronize()->servers()->getData();
|
||||
|
||||
$availableServers = $ploi->synchronize()->servers()->getData();
|
||||
|
||||
$currentServers = Server::whereNotIn('id', array_keys((array)$availableServers))->get();
|
||||
$currentServers = Server::query()
|
||||
->whereNotIn('id', array_keys((array)$availableServers))
|
||||
->get();
|
||||
|
||||
return inertia('Admin/Services/Servers', [
|
||||
'availableServers' => $availableServers,
|
||||
@@ -29,15 +28,37 @@ class SynchronizeServerController extends Controller
|
||||
|
||||
public function synchronizeServer(Request $request)
|
||||
{
|
||||
Server::updateOrCreate([
|
||||
'ploi_id' => $request->input('id')
|
||||
], [
|
||||
'status' => $request->input('status'),
|
||||
'name' => $request->input('name'),
|
||||
'ip' => $request->input('ip_address'),
|
||||
'ssh_port' => $request->input('ssh_port', 22),
|
||||
'internal_ip' => $request->input('internal_ip'),
|
||||
'available_php_versions' => $request->input('installed_php_versions')
|
||||
]);
|
||||
Server::query()
|
||||
->updateOrCreate([
|
||||
'ploi_id' => $request->input('id')
|
||||
], [
|
||||
'status' => $request->input('status'),
|
||||
'name' => $request->input('name'),
|
||||
'ip' => $request->input('ip_address'),
|
||||
'ssh_port' => $request->input('ssh_port', 22),
|
||||
'internal_ip' => $request->input('internal_ip'),
|
||||
'available_php_versions' => $request->input('installed_php_versions')
|
||||
]);
|
||||
}
|
||||
|
||||
public function synchronizeAll(Request $request)
|
||||
{
|
||||
$availableServers = $this->getPloi()->synchronize()->servers()->getData();
|
||||
|
||||
foreach ($availableServers as $availableServer) {
|
||||
Server::query()
|
||||
->updateOrCreate([
|
||||
'ploi_id' => $availableServer->id
|
||||
], [
|
||||
'status' => $availableServer->status,
|
||||
'name' => $availableServer->name,
|
||||
'ip' => $availableServer->ip_address,
|
||||
'ssh_port' => $availableServer->ssh_port,
|
||||
'internal_ip' => $availableServer->internal_ip,
|
||||
'available_php_versions' => $availableServer->installed_php_versions
|
||||
]);
|
||||
}
|
||||
|
||||
return response('ok');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,84 @@
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Models\Site;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
class SynchronizeSiteController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return inertia('Admin/Services/Sites');
|
||||
if ($this->isDemo()) {
|
||||
return redirect('/')->with('info', __('This feature is not available in demo mode.'));
|
||||
}
|
||||
|
||||
$availableSites = $this->getPloi()->synchronize()->sites()->getData();
|
||||
|
||||
$currentSites = Site::query()
|
||||
->whereNotIn('id', array_keys((array)$availableSites))
|
||||
->get();
|
||||
|
||||
return inertia('Admin/Services/Sites', [
|
||||
'availableSites' => $availableSites,
|
||||
'currentSites' => $currentSites
|
||||
]);
|
||||
}
|
||||
|
||||
public function synchronizeSite(Request $request)
|
||||
{
|
||||
$server = Server::query()->where('ploi_id', $request->input('server_id'))->firstOrFail();
|
||||
|
||||
/* @var $site \App\Models\Site */
|
||||
$site = Site::query()
|
||||
->updateOrCreate([
|
||||
'ploi_id' => $request->input('id')
|
||||
], [
|
||||
'domain' => $request->input('domain'),
|
||||
'php_version' => $request->input('php_version'),
|
||||
]);
|
||||
|
||||
$site->status = $request->input('status');
|
||||
$site->server_id = $server->id;
|
||||
$site->save();
|
||||
|
||||
$certificates = $this->getPloi()->server($request->input('server_id'))->sites($request->input('id'))->certificates()->get()->getData();
|
||||
|
||||
if ($certificates) {
|
||||
foreach ($certificates as $certificate) {
|
||||
$site->certificates()->updateOrCreate([
|
||||
'ploi_id' => $certificate->id,
|
||||
], [
|
||||
'status' => $certificate->status,
|
||||
'ploi_id' => $certificate->id,
|
||||
'domain' => $certificate->domain,
|
||||
'type' => $certificate->type,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return response('ok');
|
||||
}
|
||||
|
||||
public function synchronizeAll(Request $request)
|
||||
{
|
||||
$availableSites = $this->getPloi()->synchronize()->sites()->getData();
|
||||
|
||||
foreach ($availableSites as $availableSite) {
|
||||
$server = Server::query()->where('ploi_id', $availableSite->server_id)->firstOrFail();
|
||||
|
||||
$site = Site::query()
|
||||
->updateOrCreate([
|
||||
'ploi_id' => $availableSite->server_id
|
||||
], [
|
||||
'domain' => $availableSite->domain,
|
||||
'php_version' => $availableSite->php_version,
|
||||
]);
|
||||
|
||||
$site->status = $availableSite->status;
|
||||
$site->server_id = $server->id;
|
||||
$site->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,15 +6,12 @@ use Illuminate\Http\Request;
|
||||
use App\Jobs\Core\UpdateSystem;
|
||||
use App\Services\VersionChecker;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Laravel\Horizon\Contracts\MasterSupervisorRepository;
|
||||
|
||||
class SystemController extends Controller
|
||||
{
|
||||
public function index()
|
||||
public function index(MasterSupervisorRepository $masterSupervisorRepository)
|
||||
{
|
||||
if (config('app.demo')) {
|
||||
return redirect('/')->with('info', __('This feature is not available in demo mode.'));
|
||||
}
|
||||
|
||||
$version = (new VersionChecker)->getVersions();
|
||||
|
||||
return inertia('Admin/System', [
|
||||
@@ -22,7 +19,8 @@ class SystemController extends Controller
|
||||
'out_of_date' => $version->isOutOfDate(),
|
||||
'current' => $version->currentVersion,
|
||||
'remote' => $version->remoteVersion
|
||||
]
|
||||
],
|
||||
'horizonRunning' => !!$masterSupervisorRepository->all()
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class UserController extends Controller
|
||||
return $query->where('name', 'like', '%' . $value . '%')->orWhere('email', 'like', '%' . $value . '%');
|
||||
})
|
||||
->latest()
|
||||
->paginate(5);
|
||||
->paginate(config('core.pagination.per_page'));
|
||||
|
||||
return inertia('Admin/Users/Index', [
|
||||
'filters' => request()->all('search'),
|
||||
@@ -45,8 +45,8 @@ class UserController extends Controller
|
||||
$user->save();
|
||||
}
|
||||
|
||||
if ($package = $request->input('package')) {
|
||||
$user->package_id = $package;
|
||||
if ($request->input('package') && Package::find($request->input('package'))) {
|
||||
$user->package_id = $request->input('package');
|
||||
$user->save();
|
||||
}
|
||||
|
||||
@@ -55,7 +55,17 @@ class UserController extends Controller
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
// TODO: Implement show feature for a user
|
||||
$user = User::query()->findOrFail($id);
|
||||
|
||||
$servers = $user->servers()->withCount('sites')->latest()->paginate(config('core.pagination.per_page'), ['*'], 'page_servers');
|
||||
|
||||
$sites = $user->sites()->with('server:id,name')->latest()->paginate(config('core.pagination.per_page'), ['*'], 'page_sites');
|
||||
|
||||
return inertia('Admin/Users/Show', [
|
||||
'user' => $user,
|
||||
'sites' => $sites,
|
||||
'servers' => $servers,
|
||||
]);
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
|
||||
@@ -7,6 +7,7 @@ use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||
|
||||
class RegisterController extends Controller
|
||||
@@ -27,11 +28,27 @@ class RegisterController extends Controller
|
||||
|
||||
protected function validator(array $data)
|
||||
{
|
||||
return Validator::make($data, [
|
||||
$rules = [
|
||||
'name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
]);
|
||||
'password' => [
|
||||
'required',
|
||||
'string',
|
||||
'confirmed',
|
||||
Password::min(6)
|
||||
->letters()
|
||||
->numbers()
|
||||
->uncompromised()
|
||||
],
|
||||
];
|
||||
|
||||
if (setting('accept_terms_required')) {
|
||||
$rules['terms'] = [
|
||||
'accepted'
|
||||
];
|
||||
}
|
||||
|
||||
return Validator::make($data, $rules);
|
||||
}
|
||||
|
||||
protected function create(array $data)
|
||||
@@ -45,8 +62,8 @@ class RegisterController extends Controller
|
||||
|
||||
protected function registered(Request $request, $user)
|
||||
{
|
||||
if ($defaultPackage = setting('default_package')) {
|
||||
$user->package_id = $defaultPackage;
|
||||
if (setting('default_package') && setting('default_package') != 'false') {
|
||||
$user->package_id = setting('default_package');
|
||||
$user->save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,17 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use ValidatesRequests, AuthorizesRequests;
|
||||
use ValidatesRequests, AuthorizesRequests, HasPloi;
|
||||
|
||||
protected function isDemo()
|
||||
{
|
||||
return config('app.demo');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,17 +2,43 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use App\Models\DocumentationItem;
|
||||
use App\Http\Resources\DocumentationItemResource;
|
||||
use App\Models\DocumentationCategory;
|
||||
use App\Http\Resources\DocumentationCategoryRouteResource;
|
||||
|
||||
class DocumentationController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$documentationItems = DocumentationItem::latest()->paginate();
|
||||
$items = DocumentationCategory::query()->oldest()->get();
|
||||
|
||||
return inertia('Documentation/Index', [
|
||||
'items' => DocumentationItemResource::collection($documentationItems)
|
||||
'items' => DocumentationCategoryRouteResource::collection($items)
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(DocumentationCategory $documentationCategory)
|
||||
{
|
||||
$items = DocumentationCategory::query()->oldest()->get();
|
||||
|
||||
return inertia('Documentation/Show', [
|
||||
'category' => $documentationCategory,
|
||||
'articles' => $documentationCategory->items()->latest()->get(),
|
||||
'items' => DocumentationCategoryRouteResource::collection($items)
|
||||
]);
|
||||
}
|
||||
|
||||
public function showArticle(DocumentationCategory $documentationCategory, DocumentationItem $documentationItem)
|
||||
{
|
||||
$items = DocumentationCategory::query()->oldest()->get();
|
||||
|
||||
$documentationItem->content = Str::markdown($documentationItem->content);
|
||||
|
||||
return inertia('Documentation/Article', [
|
||||
'category' => $documentationCategory,
|
||||
'article' => $documentationItem,
|
||||
'items' => DocumentationCategoryRouteResource::collection($items)
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,29 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class PageController extends Controller
|
||||
{
|
||||
public function installationIncomplete()
|
||||
{
|
||||
return inertia('Core/InstallationIncomplete');
|
||||
}
|
||||
|
||||
public function show($slug)
|
||||
{
|
||||
if ($slug === 'terms-of-service' && setting('terms')) {
|
||||
return inertia('Pages/Terms', [
|
||||
'content' => Str::markdown(setting('terms'))
|
||||
]);
|
||||
}
|
||||
|
||||
if ($slug === 'privacy-policy' && setting('privacy')) {
|
||||
return inertia('Pages/Privacy', [
|
||||
'content' => Str::markdown(setting('privacy'))
|
||||
]);
|
||||
}
|
||||
|
||||
abort(404);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,11 @@ class ProfileBillingController extends Controller
|
||||
$packages = Package::query()
|
||||
->where(function ($query) {
|
||||
return $query
|
||||
->where('price_monthly', '>', 0)
|
||||
->where(function ($query) {
|
||||
return $query
|
||||
->where('price_monthly', '>', 0)
|
||||
->orWhere('price_yearly', '>', 0);
|
||||
})
|
||||
->whereNotNull('plan_id');
|
||||
})
|
||||
->when($request->input('sortBy.' . $sortByType), function ($query, $value) use ($sortByType) {
|
||||
@@ -53,27 +57,35 @@ class ProfileBillingController extends Controller
|
||||
})
|
||||
->get()
|
||||
->transform(function (Package $package) {
|
||||
$currencies = [
|
||||
Package::CURRENCY_EURO => '€',
|
||||
Package::CURRENCY_USD => '$',
|
||||
Package::CURRENCY_NOK => 'KR ',
|
||||
Package::CURRENCY_CAD => 'CAD $',
|
||||
Package::CURRENCY_AUD => 'AUD $',
|
||||
];
|
||||
$currency = $this->transformCurrency($package->currency);
|
||||
|
||||
$package->price_monthly = ($currencies[$package->currency] ?? '[Unknown currency]') . number_format($package->price_monthly, 2, ',', '.');
|
||||
$package->period = 'monthly';
|
||||
|
||||
if ($package->price_yearly > 0) {
|
||||
$package->period = 'yearly';
|
||||
}
|
||||
|
||||
$package->price_monthly = ($currency ?? '[Unknown currency]') . number_format($package->price_monthly, 2, ',', '.');
|
||||
$package->price_yearly = ($currency ?? '[Unknown currency]') . number_format($package->price_yearly, 2, ',', '.');
|
||||
|
||||
return $package;
|
||||
});
|
||||
|
||||
try {
|
||||
$clientSecret = $user->createSetupIntent()->client_secret;
|
||||
} catch (\Exception $exception) {
|
||||
return inertia('Profile/BillingError');
|
||||
}
|
||||
|
||||
$subscription = $user->subscription();
|
||||
|
||||
return inertia('Profile/Billing', [
|
||||
'packages' => $packages,
|
||||
'subscription' => $user->subscription('default'),
|
||||
'countries' => countries(),
|
||||
'subscription' => $subscription,
|
||||
'public_key' => config('cashier.key'),
|
||||
'data_client_secret' => function () use ($user) {
|
||||
$intent = $user->createSetupIntent();
|
||||
return $intent->client_secret;
|
||||
},
|
||||
'ends' => $subscription ? Carbon::createFromTimeStamp($subscription->asStripeSubscription()->current_period_end)->format('F jS, Y') ?? null : null,
|
||||
'data_client_secret' => $clientSecret,
|
||||
'card' => [
|
||||
'last_four' => $user->card_last_four,
|
||||
'brand' => $user->card_brand
|
||||
@@ -92,8 +104,14 @@ class ProfileBillingController extends Controller
|
||||
$user = $request->user();
|
||||
|
||||
$user->createOrGetStripeCustomer([
|
||||
'name' => $user->name,
|
||||
'description' => $request->input('billing_details')
|
||||
'name' => $request->input('billing_details.name'),
|
||||
'description' => 'Ploi Core Customer ' . $request->input('billing_details.name'),
|
||||
'address' => [
|
||||
'line1' => $request->input('billing_details.address.line1'),
|
||||
'postal_code' => $request->input('billing_details.address.postal_code'),
|
||||
'city' => $request->input('billing_details.address.city'),
|
||||
'country' => $request->input('billing_details.address.country'),
|
||||
]
|
||||
]);
|
||||
|
||||
foreach ($user->paymentMethods() as $paymentMethod) {
|
||||
@@ -107,6 +125,16 @@ class ProfileBillingController extends Controller
|
||||
return redirect()->route('profile.billing.index')->with('success', 'Your card has been added, you can now update your plan');
|
||||
}
|
||||
|
||||
public function deleteCard(Request $request)
|
||||
{
|
||||
/** @var User $user */
|
||||
$user = $request->user();
|
||||
|
||||
$user->deletePaymentMethods();
|
||||
|
||||
return redirect()->route('profile.billing.index')->with('success', 'Your credit card has been removed from your account');
|
||||
}
|
||||
|
||||
public function updatePlan(Request $request)
|
||||
{
|
||||
/** @var User $user */
|
||||
@@ -163,7 +191,7 @@ class ProfileBillingController extends Controller
|
||||
public function invoices(Request $request)
|
||||
{
|
||||
return $request->user()->invoices()->map(function ($invoice) {
|
||||
$symbol = $invoice->currency === Package::CURRENCY_EURO ? '€' : '$';
|
||||
$symbol = $this->transformCurrency($invoice->currency);
|
||||
|
||||
return [
|
||||
'id' => $invoice->id,
|
||||
@@ -183,4 +211,20 @@ class ProfileBillingController extends Controller
|
||||
'product' => 'Webhosting'
|
||||
]);
|
||||
}
|
||||
|
||||
protected function transformCurrency($key)
|
||||
{
|
||||
$currencies = [
|
||||
Package::CURRENCY_EURO => '€',
|
||||
Package::CURRENCY_USD => '$',
|
||||
Package::CURRENCY_NOK => 'KR ',
|
||||
Package::CURRENCY_CAD => 'CAD $',
|
||||
Package::CURRENCY_AUD => 'AUD $',
|
||||
Package::CURRENCY_GBP => 'GBP £',
|
||||
Package::CURRENCY_INR => 'INR ₹',
|
||||
Package::CURRENCY_THB => 'THB ',
|
||||
];
|
||||
|
||||
return $currencies[strtolower($key)] ?? '$';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@ class ProfileController extends Controller
|
||||
public function index()
|
||||
{
|
||||
return inertia('Profile/Index', [
|
||||
'profile' => new UserProfileResource(auth()->user())
|
||||
'profile' => new UserProfileResource(auth()->user()),
|
||||
'countries' => countries()
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -36,4 +37,21 @@ class ProfileController extends Controller
|
||||
|
||||
return $mode;
|
||||
}
|
||||
|
||||
public function destroy(Request $request)
|
||||
{
|
||||
/* @var $user \App\Models\User */
|
||||
$user = $request->user();
|
||||
|
||||
$user->sites()->detach();
|
||||
$user->servers()->detach();
|
||||
$user->supportTicketReplies()->delete();
|
||||
$user->supportTickets()->delete();
|
||||
|
||||
$user->delete();
|
||||
|
||||
auth()->logout();
|
||||
|
||||
return redirect()->route('login');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,16 +2,15 @@
|
||||
|
||||
namespace App\Http\Controllers\Profile;
|
||||
|
||||
use App\Models\UserProvider;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\ProfileIntegrationRequest;
|
||||
use App\Models\UserProvider;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ProfileIntegrationController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$providers = auth()->user()->providers()->latest()->get()->map(function($provider){
|
||||
$providers = auth()->user()->providers()->latest()->get()->map(function ($provider) {
|
||||
return [
|
||||
'id' => $provider->id,
|
||||
'type' => $provider->type,
|
||||
@@ -28,7 +27,7 @@ class ProfileIntegrationController extends Controller
|
||||
{
|
||||
$request->user()->providers()->updateOrCreate([
|
||||
'type' => UserProvider::TYPE_CLOUDFLARE
|
||||
],[
|
||||
], [
|
||||
'type' => UserProvider::TYPE_CLOUDFLARE,
|
||||
'token' => $request->input('meta.api_key'),
|
||||
'meta' => [
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Server;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Jobs\Servers\CreateServer;
|
||||
@@ -38,7 +39,8 @@ class ServerController extends Controller
|
||||
|
||||
/* @var $server \App\Models\Server */
|
||||
$server = $request->user()->servers()->create([
|
||||
'name' => $request->input('name')
|
||||
'name' => $request->input('name'),
|
||||
'database_type' => $request->input('database_type', 'mysql')
|
||||
]);
|
||||
|
||||
$server->provider()->associate($provider);
|
||||
@@ -65,6 +67,10 @@ class ServerController extends Controller
|
||||
{
|
||||
$server = auth()->user()->servers()->findOrFail($id);
|
||||
|
||||
if ($server->status === Server::STATUS_BUSY) {
|
||||
return redirect()->back()->with('info', 'This server is currently busy, please check back later.');
|
||||
}
|
||||
|
||||
return inertia('Servers/Show', [
|
||||
'server' => $server,
|
||||
'sites' => $server->sites()->latest()->paginate(5, ['*'], 'sites_per_page'),
|
||||
@@ -104,9 +110,21 @@ class ServerController extends Controller
|
||||
{
|
||||
$provider = $request->user()->package->providers()->findOrFail($providerId);
|
||||
|
||||
$regions = $provider->regions()
|
||||
->when($provider->allowed_regions, function ($query) use ($provider) {
|
||||
return $query->whereIn('id', $provider->allowed_regions);
|
||||
})
|
||||
->pluck('label', 'id');
|
||||
|
||||
$plans = $provider->plans()
|
||||
->when($provider->allowed_plans, function ($query) use ($provider) {
|
||||
return $query->whereIn('id', $provider->allowed_plans);
|
||||
})
|
||||
->pluck('label', 'id');
|
||||
|
||||
return [
|
||||
'regions' => $provider->regions()->pluck('label', 'id'),
|
||||
'plans' => $provider->plans()->pluck('label', 'id'),
|
||||
'regions' => $regions,
|
||||
'plans' => $plans,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,9 @@ class SiteCertificateController extends Controller
|
||||
|
||||
$certificate = $site->certificates()->create([
|
||||
'domain' => $request->input('domain'),
|
||||
'type' => $request->input('type', 'letsencrypt'),
|
||||
'certificate' => $request->input('certificate'),
|
||||
'private' => $request->input('private')
|
||||
]);
|
||||
|
||||
$certificate->server_id = $site->server_id;
|
||||
|
||||
@@ -21,7 +21,7 @@ class SiteController extends Controller
|
||||
return $query->where('server_id', $value);
|
||||
})
|
||||
->latest()
|
||||
->paginate(10);
|
||||
->paginate(config('core.pagination.per_page'));
|
||||
|
||||
$availableServers = auth()->user()->servers()->pluck('name', 'id');
|
||||
|
||||
@@ -37,7 +37,18 @@ class SiteController extends Controller
|
||||
$server = $request->user()->servers()->findOrFail($serverId);
|
||||
} else {
|
||||
$server = Server::query()
|
||||
->doesntHave('users')
|
||||
->where('maximum_sites', '>', 0)
|
||||
->where(function ($query) {
|
||||
return $query
|
||||
->where(function ($query) {
|
||||
return $query->whereHas('users', function ($query) {
|
||||
return $query->where('user_id', auth()->id());
|
||||
});
|
||||
})
|
||||
->orWhere(function ($query) {
|
||||
return $query->doesntHave('users');
|
||||
});
|
||||
})
|
||||
->withCount('sites')
|
||||
->inRandomOrder()
|
||||
->first();
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\SiteDnsRequest;
|
||||
use App\Models\Site;
|
||||
use Illuminate\Support\Arr;
|
||||
use App\Models\UserProvider;
|
||||
use App\Services\Cloudflare;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Arr;
|
||||
use App\Http\Requests\SiteDnsRequest;
|
||||
|
||||
class SiteDnsController extends Controller
|
||||
{
|
||||
|
||||
@@ -68,6 +68,7 @@ class Kernel extends HttpKernel
|
||||
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
|
||||
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||
'has.access' => \App\Http\Middleware\HasAccessToThisGroup::class,
|
||||
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||
'global.api.authenticated' => \App\Http\Middleware\GlobalApiAuthenticated::class,
|
||||
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
|
||||
@@ -10,7 +10,7 @@ class Demo
|
||||
protected $safeRoutes = [
|
||||
'login',
|
||||
'logout',
|
||||
//'profile/toggle-theme'
|
||||
'profile/toggle-theme'
|
||||
];
|
||||
|
||||
protected $allowedIps = [
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Models\Alert;
|
||||
use App\Models\UserProvider;
|
||||
use Inertia\Middleware;
|
||||
use Illuminate\Support\Arr;
|
||||
use App\Models\UserProvider;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
@@ -61,6 +61,10 @@ class HandleInertiaRequests extends Middleware
|
||||
'theme' => Auth::user()->theme,
|
||||
'keyboard_shortcuts' => Auth::user()->keyboard_shortcuts,
|
||||
'requires_password_for_ftp' => Auth::user()->requires_password_for_ftp,
|
||||
'address' => Auth::user()->address,
|
||||
'country' => Auth::user()->country,
|
||||
'zip' => Auth::user()->zip,
|
||||
'city' => Auth::user()->city,
|
||||
] : null,
|
||||
'package' => auth()->user() && auth()->user()->package ? [
|
||||
'name' => auth()->user()->package->name,
|
||||
@@ -83,7 +87,10 @@ class HandleInertiaRequests extends Middleware
|
||||
'documentation' => setting('documentation', false),
|
||||
'logo' => setting('logo'),
|
||||
'allow_registration' => setting('allow_registration'),
|
||||
'billing' => config('cashier.key') && config('cashier.secret')
|
||||
'billing' => config('cashier.key') && config('cashier.secret'),
|
||||
'has_terms' => (bool)setting('terms'),
|
||||
'has_privacy' => (bool)setting('privacy'),
|
||||
'accept_terms_required' => (bool)setting('accept_terms_required')
|
||||
];
|
||||
},
|
||||
'flash' => function () {
|
||||
|
||||
27
app/Http/Middleware/HasAccessToThisGroup.php
Normal file
27
app/Http/Middleware/HasAccessToThisGroup.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class HasAccessToThisGroup
|
||||
{
|
||||
public function handle(Request $request, Closure $next, $group)
|
||||
{
|
||||
if ($group === 'servers') {
|
||||
$package = $request->user()->package ?? [];
|
||||
|
||||
if (
|
||||
!Arr::get($package->server_permissions, 'create', false) &&
|
||||
!Arr::get($package->server_permissions, 'update', false) &&
|
||||
!Arr::get($package->server_permissions, 'delete', false)
|
||||
) {
|
||||
abort(404);
|
||||
}
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -3,8 +3,8 @@
|
||||
namespace App\Http\Requests\Admin;
|
||||
|
||||
use App\Models\Alert;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class AlertRequest extends FormRequest
|
||||
{
|
||||
|
||||
@@ -39,6 +39,9 @@ class PackageRequest extends FormRequest
|
||||
Package::CURRENCY_NOK,
|
||||
Package::CURRENCY_AUD,
|
||||
Package::CURRENCY_CAD,
|
||||
Package::CURRENCY_GBP,
|
||||
Package::CURRENCY_INR,
|
||||
Package::CURRENCY_THB,
|
||||
])
|
||||
],
|
||||
'maximum_sites' => [
|
||||
@@ -56,7 +59,11 @@ class PackageRequest extends FormRequest
|
||||
],
|
||||
'price_monthly' => [
|
||||
'nullable',
|
||||
'numeric'
|
||||
'numeric',
|
||||
],
|
||||
'price_yearly' => [
|
||||
'nullable',
|
||||
'numeric',
|
||||
],
|
||||
'server_permissions' => [
|
||||
'array'
|
||||
@@ -76,8 +83,12 @@ class PackageRequest extends FormRequest
|
||||
$merge['price_monthly'] = 0.000;
|
||||
}
|
||||
|
||||
if (!$this->price_yearly) {
|
||||
$merge['price_yearly'] = 0.000;
|
||||
}
|
||||
|
||||
// If we don't have the currency filled in, merge a default
|
||||
if (!$this->price_monthly) {
|
||||
if (!$this->price_monthly || !$this->price_yearly) {
|
||||
$merge['currency'] = Package::CURRENCY_USD;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,14 @@ class ProviderRequest extends FormRequest
|
||||
'required',
|
||||
'string',
|
||||
'max:255'
|
||||
],
|
||||
'allowed_plans' => [
|
||||
'nullable',
|
||||
'array'
|
||||
],
|
||||
'allowed_regions' => [
|
||||
'nullable',
|
||||
'array'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Models\UserProvider;
|
||||
use Illuminate\Validation\Rule;
|
||||
use App\Rules\CloudflareGeneralTest;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class ProfileIntegrationRequest extends FormRequest
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Http\Requests;
|
||||
|
||||
use App\Models\Server;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class ServerRequest extends FormRequest
|
||||
{
|
||||
@@ -45,6 +46,11 @@ class ServerRequest extends FormRequest
|
||||
'required',
|
||||
'not_in:0',
|
||||
'exists:provider_plans,id'
|
||||
],
|
||||
'database_type' => [
|
||||
'required',
|
||||
'string',
|
||||
Rule::in(['mysql', 'mariadb', 'postgresql', 'postgresql13'])
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
@@ -25,15 +25,36 @@ class SiteCertificateRequest extends FormRequest
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'domain' => [
|
||||
'required',
|
||||
'string',
|
||||
Rule::unique('certificates', 'domain')->where(function ($query) {
|
||||
return $query->where('site_id', $this->route('site'));
|
||||
}),
|
||||
new LetsEncryptMatchHostWithIp($this->route('site'))
|
||||
]
|
||||
];
|
||||
$rules = [];
|
||||
|
||||
if ($this->input('type') === 'letsencrypt') {
|
||||
$rules = [
|
||||
'domain' => [
|
||||
'required',
|
||||
'string',
|
||||
Rule::unique('certificates', 'domain')->where(function ($query) {
|
||||
return $query->where('site_id', $this->route('site'));
|
||||
}),
|
||||
new LetsEncryptMatchHostWithIp($this->route('site'))
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
if ($this->input('type') === 'custom') {
|
||||
$rules = [
|
||||
'certificate' => [
|
||||
'required',
|
||||
'string',
|
||||
'min:5'
|
||||
],
|
||||
'private' => [
|
||||
'required',
|
||||
'string',
|
||||
'min:5'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,22 @@ class UserProfileRequest extends FormRequest
|
||||
'required',
|
||||
'string',
|
||||
Rule::in(languages()),
|
||||
],
|
||||
'address' => [
|
||||
'nullable',
|
||||
'string'
|
||||
],
|
||||
'country' => [
|
||||
'nullable',
|
||||
'string'
|
||||
],
|
||||
'zip' => [
|
||||
'nullable',
|
||||
'string'
|
||||
],
|
||||
'city' => [
|
||||
'nullable',
|
||||
'string'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
23
app/Http/Resources/DocumentationCategoryRouteResource.php
Normal file
23
app/Http/Resources/DocumentationCategoryRouteResource.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class DocumentationCategoryRouteResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
'title' => $this->title,
|
||||
'to' => route('documentation.show', $this->id),
|
||||
'active' => object_get(request()->route('documentationCategory'), 'id') === $this->id ? true : false
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,11 @@ class UserProfileResource extends JsonResource
|
||||
return [
|
||||
'name' => $this->name,
|
||||
'email' => $this->email,
|
||||
'language' => $this->language
|
||||
'language' => $this->language,
|
||||
'address' => $this->address,
|
||||
'country' => $this->country,
|
||||
'zip' => $this->zip,
|
||||
'city' => $this->city
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Apps;
|
||||
|
||||
use App\Models\Site;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,9 +12,9 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class InstallApp implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $site;
|
||||
public Site $site;
|
||||
public $type;
|
||||
public $options;
|
||||
|
||||
@@ -25,7 +25,7 @@ class InstallApp implements ShouldQueue
|
||||
* @param string $type
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(Site $site, $type = Site::PROJECT_WORDPRESS, array $options = [])
|
||||
public function __construct(Site $site, string $type = Site::PROJECT_WORDPRESS, array $options = [])
|
||||
{
|
||||
$this->site = $site;
|
||||
$this->type = $type;
|
||||
@@ -39,8 +39,10 @@ class InstallApp implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->site->server->ploi_id)->sites($this->site->ploi_id)->app()->install($this->type, $this->options);
|
||||
$this->getPloi()
|
||||
->server($this->site->server->ploi_id)
|
||||
->sites($this->site->ploi_id)
|
||||
->app()
|
||||
->install($this->type, $this->options);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Apps;
|
||||
|
||||
use App\Models\Site;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,9 +12,9 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class UninstallApp implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $site;
|
||||
public Site $site;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
@@ -37,9 +37,11 @@ class UninstallApp implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->site->server->ploi_id)->sites($this->site->ploi_id)->app()->uninstall($this->site->project);
|
||||
$this->getPloi()
|
||||
->server($this->site->server->ploi_id)
|
||||
->sites($this->site->ploi_id)
|
||||
->app()
|
||||
->uninstall($this->site->project);
|
||||
|
||||
$this->site->project = null;
|
||||
$this->site->save();
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Jobs\Certificates;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use App\Models\Certificate;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,38 +12,44 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class CreateCertificate implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $certificate;
|
||||
public Certificate $certificate;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @param Certificate $certificate
|
||||
*/
|
||||
public function __construct(Certificate $certificate)
|
||||
{
|
||||
$this->certificate = $certificate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
if ($this->certificate->type === 'letsencrypt') {
|
||||
$ploiCertificate = $this->getPloi()
|
||||
->server($this->certificate->server->ploi_id)
|
||||
->sites($this->certificate->site->ploi_id)
|
||||
->certificates()
|
||||
->create(
|
||||
$this->certificate->domain
|
||||
);
|
||||
|
||||
$ploiCertificate = $ploi->server($this->certificate->server->ploi_id)
|
||||
->sites($this->certificate->site->ploi_id)
|
||||
->certificates()
|
||||
->create(
|
||||
$this->certificate->domain
|
||||
);
|
||||
$this->certificate->ploi_id = $ploiCertificate->id;
|
||||
$this->certificate->save();
|
||||
}
|
||||
|
||||
$this->certificate->ploi_id = $ploiCertificate->id;
|
||||
$this->certificate->save();
|
||||
if ($this->certificate->type === 'custom') {
|
||||
$ploiCertificate = $this->getPloi()
|
||||
->server($this->certificate->server->ploi_id)
|
||||
->sites($this->certificate->site->ploi_id)
|
||||
->certificates()
|
||||
->create(
|
||||
$this->certificate->certificate,
|
||||
$this->certificate->type,
|
||||
$this->certificate->private
|
||||
);
|
||||
|
||||
$this->certificate->ploi_id = $ploiCertificate->id;
|
||||
$this->certificate->save();
|
||||
}
|
||||
|
||||
// Lets fetch the status after 5 seconds
|
||||
dispatch(new FetchCertificateStatus($this->certificate))->delay(now()->addSeconds(5));
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Certificates;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -11,7 +11,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class DeleteCertificate implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $serverPloiId;
|
||||
public $sitePloiId;
|
||||
@@ -42,9 +42,8 @@ class DeleteCertificate implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->serverPloiId)
|
||||
$this->getPloi()
|
||||
->server($this->serverPloiId)
|
||||
->sites($this->sitePloiId)
|
||||
->certificates()
|
||||
->delete($this->certificatePloiId);
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Jobs\Certificates;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use App\Models\Certificate;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Traits\JobHasThresholds;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class FetchCertificateStatus implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds, HasPloi;
|
||||
|
||||
public $certificate;
|
||||
|
||||
@@ -23,7 +23,7 @@ class FetchCertificateStatus implements ShouldQueue
|
||||
* @param Certificate $certificate
|
||||
* @param int $threshold
|
||||
*/
|
||||
public function __construct(Certificate $certificate, $threshold = 0)
|
||||
public function __construct(Certificate $certificate, int $threshold = 0)
|
||||
{
|
||||
$this->certificate = $certificate;
|
||||
$this->setThreshold($threshold);
|
||||
@@ -43,9 +43,8 @@ class FetchCertificateStatus implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiCronjob = $ploi->server($this->certificate->server->ploi_id)
|
||||
$ploiCronjob = $this->getPloi()
|
||||
->server($this->certificate->server->ploi_id)
|
||||
->sites($this->certificate->site->ploi_id)
|
||||
->certificates()
|
||||
->get($this->certificate->ploi_id)
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
namespace App\Jobs\Core;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Services\VersionChecker;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Services\VersionChecker;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -19,6 +19,8 @@ class Ping implements ShouldQueue
|
||||
{
|
||||
$version = new VersionChecker;
|
||||
|
||||
$version->flushVersionData();
|
||||
|
||||
$response = Http::withHeaders([
|
||||
'Accept' => 'application/json',
|
||||
'Content-Type' => 'application/json',
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Cronjobs;
|
||||
|
||||
use App\Models\Cronjob;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,7 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class CreateCronjob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $cronjob;
|
||||
|
||||
@@ -35,13 +35,14 @@ class CreateCronjob implements ShouldQueue
|
||||
{
|
||||
$owner = $this->cronjob->site->users()->first();
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiCronjob = $ploi->server($this->cronjob->server->ploi_id)->cronjobs()->create(
|
||||
$this->cronjob->command,
|
||||
$this->cronjob->frequency,
|
||||
$owner->user_name
|
||||
);
|
||||
$ploiCronjob = $this->getPloi()
|
||||
->server($this->cronjob->server->ploi_id)
|
||||
->cronjobs()
|
||||
->create(
|
||||
$this->cronjob->command,
|
||||
$this->cronjob->frequency,
|
||||
$owner->user_name
|
||||
);
|
||||
|
||||
$this->cronjob->ploi_id = $ploiCronjob->id;
|
||||
$this->cronjob->save();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Cronjobs;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -11,7 +11,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class DeleteCronjob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $serverPloiId;
|
||||
public $cronjobPloiId;
|
||||
@@ -39,8 +39,9 @@ class DeleteCronjob implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->serverPloiId)->cronjobs()->delete($this->cronjobPloiId);
|
||||
$this->getPloi()
|
||||
->server($this->serverPloiId)
|
||||
->cronjobs()
|
||||
->delete($this->cronjobPloiId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Cronjobs;
|
||||
|
||||
use App\Models\Cronjob;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Traits\JobHasThresholds;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class FetchCronjobStatus implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds, HasPloi;
|
||||
|
||||
public $cronjob;
|
||||
|
||||
@@ -23,7 +23,7 @@ class FetchCronjobStatus implements ShouldQueue
|
||||
* @param Cronjob $cronjob
|
||||
* @param int $threshold
|
||||
*/
|
||||
public function __construct(Cronjob $cronjob, $threshold = 0)
|
||||
public function __construct(Cronjob $cronjob, int $threshold = 0)
|
||||
{
|
||||
$this->cronjob = $cronjob;
|
||||
$this->setThreshold($threshold);
|
||||
@@ -43,9 +43,11 @@ class FetchCronjobStatus implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiCronjob = $ploi->server($this->cronjob->server->ploi_id)->cronjobs()->get($this->cronjob->ploi_id)->getData();
|
||||
$ploiCronjob = $this->getPloi()
|
||||
->server($this->cronjob->server->ploi_id)
|
||||
->cronjobs()
|
||||
->get($this->cronjob->ploi_id)
|
||||
->getData();
|
||||
|
||||
if ($ploiCronjob->status !== Cronjob::STATUS_ACTIVE) {
|
||||
$this->incrementThreshold();
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Jobs\Databases;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use App\Models\Database;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,7 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class CreateDatabase implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $database;
|
||||
public $password;
|
||||
@@ -38,9 +38,10 @@ class CreateDatabase implements ShouldQueue
|
||||
{
|
||||
$databaseUser = $this->database->users()->first();
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiDatabase = $ploi->server($this->database->server->ploi_id)->databases()->create($this->database->name, $databaseUser->name, $this->password);
|
||||
$ploiDatabase = $this->getPloi()
|
||||
->server($this->database->server->ploi_id)
|
||||
->databases()
|
||||
->create($this->database->name, $databaseUser->name, $this->password);
|
||||
|
||||
$this->database->ploi_id = $ploiDatabase->id;
|
||||
$this->database->save();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Databases;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -11,7 +11,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class DeleteDatabase implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $serverPloiId;
|
||||
public $databasePloiId;
|
||||
@@ -40,8 +40,6 @@ class DeleteDatabase implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->serverPloiId)->databases()->delete($this->databasePloiId);
|
||||
$this->getPloi()->server($this->serverPloiId)->databases()->delete($this->databasePloiId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Jobs\Databases;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use App\Models\Database;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Traits\JobHasThresholds;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class FetchDatabaseStatus implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds, HasPloi;
|
||||
|
||||
public $database;
|
||||
|
||||
@@ -23,7 +23,7 @@ class FetchDatabaseStatus implements ShouldQueue
|
||||
* @param Database $database
|
||||
* @param int $threshold
|
||||
*/
|
||||
public function __construct(Database $database, $threshold = 0)
|
||||
public function __construct(Database $database, int $threshold = 0)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->setThreshold($threshold);
|
||||
@@ -43,9 +43,11 @@ class FetchDatabaseStatus implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiDatabase = $ploi->server($this->database->server->ploi_id)->databases()->get($this->database->ploi_id)->getData();
|
||||
$ploiDatabase = $this->getPloi()
|
||||
->server($this->database->server->ploi_id)
|
||||
->databases()
|
||||
->get($this->database->ploi_id)
|
||||
->getData();
|
||||
|
||||
if ($ploiDatabase->status !== Database::STATUS_ACTIVE) {
|
||||
$this->incrementThreshold();
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Jobs\Redirects;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use App\Models\Redirect;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,7 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class CreateRedirect implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $redirect;
|
||||
|
||||
@@ -33,9 +33,7 @@ class CreateRedirect implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiRedirect = $ploi
|
||||
$ploiRedirect = $this->getPloi()
|
||||
->server($this->redirect->server->ploi_id)
|
||||
->sites($this->redirect->site->ploi_id)
|
||||
->redirects()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Redirects;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -11,7 +11,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class DeleteRedirect implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $serverPloiId;
|
||||
public $sitePloiId;
|
||||
@@ -42,9 +42,8 @@ class DeleteRedirect implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->serverPloiId)
|
||||
$this->getPloi()
|
||||
->server($this->serverPloiId)
|
||||
->sites($this->sitePloiId)
|
||||
->redirects()
|
||||
->delete($this->redirectPloiId);
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Jobs\Redirects;
|
||||
|
||||
use App\Traits\HasPloi;
|
||||
use App\Models\Redirect;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Traits\JobHasThresholds;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class FetchRedirectStatus implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds, HasPloi;
|
||||
|
||||
public $redirect;
|
||||
|
||||
@@ -23,7 +23,7 @@ class FetchRedirectStatus implements ShouldQueue
|
||||
* @param Redirect $redirect
|
||||
* @param int $threshold
|
||||
*/
|
||||
public function __construct(Redirect $redirect, $threshold = 0)
|
||||
public function __construct(Redirect $redirect, int $threshold = 0)
|
||||
{
|
||||
$this->redirect = $redirect;
|
||||
$this->setThreshold($threshold);
|
||||
@@ -43,9 +43,8 @@ class FetchRedirectStatus implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiRedirect = $ploi->server($this->redirect->server->ploi_id)
|
||||
$ploiRedirect = $this->getPloi()
|
||||
->server($this->redirect->server->ploi_id)
|
||||
->sites($this->redirect->site->ploi_id)
|
||||
->redirects()
|
||||
->get($this->redirect->ploi_id)->getData();
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Servers;
|
||||
|
||||
use App\Models\Server;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,41 +12,31 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class CreateServer implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $server;
|
||||
public $tries = 1;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @param Server $server
|
||||
*/
|
||||
public function __construct(Server $server)
|
||||
{
|
||||
$this->server = $server;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploiServer = $ploi->server()->create(
|
||||
$ploiServer = $this->getPloi()->server()->create(
|
||||
$this->server->name,
|
||||
$this->server->provider->ploi_id,
|
||||
$this->server->providerRegion->region_id,
|
||||
$this->server->providerPlan->plan_id,
|
||||
'server',
|
||||
$this->server->database_type
|
||||
);
|
||||
|
||||
$this->server->ploi_id = $ploiServer->id;
|
||||
$this->server->save();
|
||||
|
||||
// Lets fetch the status after 5 minutes
|
||||
// Let's fetch the status after 5 minutes
|
||||
dispatch(new FetchServerStatus($this->server))->delay(now()->addMinutes(5));
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Servers;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -11,7 +11,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class DeleteServer implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $serverPloiId;
|
||||
|
||||
@@ -32,8 +32,6 @@ class DeleteServer implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->serverPloiId)->delete();
|
||||
$this->getPloi()->server($this->serverPloiId)->delete();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Servers;
|
||||
|
||||
use App\Models\Server;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Traits\JobHasThresholds;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class FetchServerStatus implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds, HasPloi;
|
||||
|
||||
public $server;
|
||||
|
||||
@@ -43,9 +43,7 @@ class FetchServerStatus implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi;
|
||||
|
||||
$ploiServer = $ploi->server($this->server->ploi_id)->get()->getData();
|
||||
$ploiServer = $this->getPloi()->server($this->server->ploi_id)->get()->getData();
|
||||
|
||||
if ($ploiServer->status !== Server::STATUS_ACTIVE) {
|
||||
$this->incrementThreshold();
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Jobs\Servers;
|
||||
|
||||
use App\Models\Server;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class SynchronizeServers implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new \App\Services\Ploi\Ploi(config('services.ploi.token'));
|
||||
|
||||
$servers = $ploi->server()->get()->getData();
|
||||
|
||||
foreach ($servers as $server) {
|
||||
Server::firstOrCreate([
|
||||
'ip' => $server->ip_address,
|
||||
], [
|
||||
'name' => $server->name
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Sites;
|
||||
|
||||
use App\Models\Site;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -12,7 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class ChangePhpVersion implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $site;
|
||||
public $version;
|
||||
@@ -36,9 +36,7 @@ class ChangePhpVersion implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->site->server->ploi_id)->sites($this->site->ploi_id)->phpVersion($this->version);
|
||||
$this->getPloi()->server($this->site->server->ploi_id)->sites($this->site->ploi_id)->phpVersion($this->version);
|
||||
|
||||
$this->site->php_version = $this->version;
|
||||
$this->site->save();
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Sites;
|
||||
|
||||
use App\Models\Site;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class CreateSite implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $site;
|
||||
|
||||
@@ -34,11 +34,9 @@ class CreateSite implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$systemUser = $this->site->getSystemUser();
|
||||
|
||||
$ploiSite = $ploi->server($this->site->server->ploi_id)->sites()->create(
|
||||
$ploiSite = $this->getPloi()->server($this->site->server->ploi_id)->sites()->create(
|
||||
$this->site->domain,
|
||||
'/public',
|
||||
'/',
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Sites;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
@@ -11,7 +11,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class DeleteSite implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, HasPloi;
|
||||
|
||||
public $serverPloiId;
|
||||
public $sitePloiId;
|
||||
@@ -34,8 +34,6 @@ class DeleteSite implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$ploi = new Ploi(config('services.ploi.token'));
|
||||
|
||||
$ploi->server($this->serverPloiId)->sites()->delete($this->sitePloiId);
|
||||
$this->getPloi()->server($this->serverPloiId)->sites()->delete($this->sitePloiId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace App\Jobs\Sites;
|
||||
|
||||
use App\Models\Site;
|
||||
use App\Services\Ploi\Ploi;
|
||||
use App\Traits\HasPloi;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use App\Traits\JobHasThresholds;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
@@ -13,7 +13,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
||||
class FetchSiteStatus implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds;
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, JobHasThresholds, HasPloi;
|
||||
|
||||
public $site;
|
||||
|
||||
@@ -43,9 +43,7 @@ class FetchSiteStatus implements ShouldQueue
|
||||
return;
|
||||
}
|
||||
|
||||
$ploi = new Ploi;
|
||||
|
||||
$ploiSite = $ploi->server($this->site->server->ploi_id)->sites()->get($this->site->ploi_id)->getData();
|
||||
$ploiSite = $this->getPloi()->server($this->site->server->ploi_id)->sites()->get($this->site->ploi_id)->getData();
|
||||
|
||||
if ($ploiSite->status !== Site::STATUS_ACTIVE) {
|
||||
$this->incrementThreshold();
|
||||
|
||||
@@ -18,6 +18,10 @@ class Certificate extends Model
|
||||
|
||||
public $fillable = [
|
||||
'domain',
|
||||
'type'
|
||||
'type',
|
||||
'certificate',
|
||||
'private',
|
||||
'ploi_id',
|
||||
'status'
|
||||
];
|
||||
}
|
||||
|
||||
@@ -12,6 +12,9 @@ class Package extends Model
|
||||
const CURRENCY_NOK = 'nok';
|
||||
const CURRENCY_AUD = 'aud';
|
||||
const CURRENCY_CAD = 'cad';
|
||||
const CURRENCY_GBP = 'gbp';
|
||||
const CURRENCY_INR = 'inr';
|
||||
const CURRENCY_THB = 'thb';
|
||||
|
||||
public $fillable = [
|
||||
'name',
|
||||
@@ -19,6 +22,7 @@ class Package extends Model
|
||||
'currency',
|
||||
'price_hourly',
|
||||
'price_monthly',
|
||||
'price_yearly',
|
||||
'maximum_sites',
|
||||
'maximum_servers',
|
||||
'site_permissions',
|
||||
|
||||
@@ -8,6 +8,11 @@ class Provider extends Model
|
||||
{
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
'allowed_plans' => 'json',
|
||||
'allowed_regions' => 'json',
|
||||
];
|
||||
|
||||
public function getNameWithLabelAttribute()
|
||||
{
|
||||
$string = $this->name;
|
||||
@@ -41,12 +46,12 @@ class Provider extends Model
|
||||
|
||||
public static function booted()
|
||||
{
|
||||
static::deleting(function(self $provider){
|
||||
static::deleting(function (self $provider) {
|
||||
$provider->regions()->delete();
|
||||
$provider->plans()->delete();
|
||||
$provider->packages()->detach();
|
||||
|
||||
foreach($provider->servers as $server){
|
||||
foreach ($provider->servers as $server) {
|
||||
$server->provider_id = null;
|
||||
$server->provider_plan_id = null;
|
||||
$server->provider_region_id = null;
|
||||
|
||||
@@ -17,7 +17,8 @@ class Server extends Model
|
||||
'internal_ip',
|
||||
'ssh_port',
|
||||
'maximum_sites',
|
||||
'available_php_versions'
|
||||
'available_php_versions',
|
||||
'database_type'
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
|
||||
@@ -5,6 +5,9 @@ namespace App\Models;
|
||||
use DateTimeInterface;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* @property mixed|string domain
|
||||
*/
|
||||
class Site extends Model
|
||||
{
|
||||
const STATUS_BUSY = 'busy';
|
||||
@@ -15,6 +18,7 @@ class Site extends Model
|
||||
const PROJECT_OCTOBERCMS = 'october-cms';
|
||||
|
||||
public $fillable = [
|
||||
'ploi_id',
|
||||
'domain',
|
||||
'dns_id'
|
||||
];
|
||||
@@ -95,6 +99,10 @@ class Site extends Model
|
||||
|
||||
public static function booted()
|
||||
{
|
||||
static::creating(function (self $site) {
|
||||
$site->domain = strtolower($site->domain);
|
||||
});
|
||||
|
||||
static::created(function (self $site) {
|
||||
$site->systemUsers()->create();
|
||||
});
|
||||
|
||||
@@ -28,6 +28,7 @@ class User extends Authenticatable implements HasLocalePreference
|
||||
'address',
|
||||
'city',
|
||||
'country',
|
||||
'zip',
|
||||
'notes',
|
||||
'language',
|
||||
'blocked',
|
||||
@@ -109,6 +110,11 @@ class User extends Authenticatable implements HasLocalePreference
|
||||
return $this->hasMany(SupportTicket::class);
|
||||
}
|
||||
|
||||
public function supportTicketReplies()
|
||||
{
|
||||
return $this->hasMany(SupportTicketReply::class);
|
||||
}
|
||||
|
||||
public function systemLogs()
|
||||
{
|
||||
return $this->hasMany(SystemLog::class);
|
||||
@@ -138,6 +144,10 @@ class User extends Authenticatable implements HasLocalePreference
|
||||
$user->systemLogs()->delete();
|
||||
$user->servers()->detach();
|
||||
$user->sites()->detach();
|
||||
foreach ($user->supportTickets as $supportTicket) {
|
||||
$supportTicket->replies()->delete();
|
||||
}
|
||||
$user->supportTickets()->delete();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,19 +3,10 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Models\Setting;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Pagination\UrlWindow;
|
||||
use Illuminate\Support\Facades\Request;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->singleton('settings', function ($app) {
|
||||
@@ -27,75 +18,5 @@ class AppServiceProvider extends ServiceProvider
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (!$this->app->request->is('api*')) {
|
||||
$this->registerLengthAwarePaginator();
|
||||
}
|
||||
}
|
||||
|
||||
protected function registerLengthAwarePaginator()
|
||||
{
|
||||
$this->app->bind(LengthAwarePaginator::class, function ($app, $values) {
|
||||
return new class(...array_values($values)) extends LengthAwarePaginator {
|
||||
public function only(...$attributes)
|
||||
{
|
||||
return $this->transform(function ($item) use ($attributes) {
|
||||
return $item->only($attributes);
|
||||
});
|
||||
}
|
||||
|
||||
public function transform($callback)
|
||||
{
|
||||
$this->items->transform($callback);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
return [
|
||||
'data' => $this->items->toArray(),
|
||||
'links' => $this->links(),
|
||||
'per_page' => $this->perPage(),
|
||||
'total' => $this->total(),
|
||||
];
|
||||
}
|
||||
|
||||
public function links($view = null, $data = [])
|
||||
{
|
||||
$this->appends(Request::all());
|
||||
|
||||
$window = UrlWindow::make($this);
|
||||
|
||||
$elements = array_filter([
|
||||
$window['first'],
|
||||
is_array($window['slider']) ? '...' : null,
|
||||
$window['slider'],
|
||||
is_array($window['last']) ? '...' : null,
|
||||
$window['last'],
|
||||
]);
|
||||
|
||||
return Collection::make($elements)->flatMap(function ($item) {
|
||||
if (is_array($item)) {
|
||||
return Collection::make($item)->map(function ($url, $page) {
|
||||
return [
|
||||
'url' => $url,
|
||||
'label' => $page,
|
||||
'active' => $this->currentPage() === $page,
|
||||
];
|
||||
});
|
||||
} else {
|
||||
return [
|
||||
[
|
||||
'url' => null,
|
||||
'label' => '...',
|
||||
'active' => false,
|
||||
],
|
||||
];
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ class HorizonServiceProvider extends HorizonApplicationServiceProvider
|
||||
protected function gate()
|
||||
{
|
||||
Gate::define('viewHorizon', function ($user) {
|
||||
return $user->isAdmin();
|
||||
return $user->isAdmin() && !config('app.demo');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use GuzzleHttp\Exception\ClientException;
|
||||
use Illuminate\Support\Str;
|
||||
use GuzzleHttp\Exception\ClientException;
|
||||
|
||||
class Cloudflare
|
||||
{
|
||||
|
||||
@@ -21,4 +21,9 @@ class Unauthenticated extends Exception
|
||||
{
|
||||
parent::__construct($message);
|
||||
}
|
||||
|
||||
public function render($request)
|
||||
{
|
||||
return redirect()->route('dashboard')->with('error', 'Unable to authenticate with backend server, please check API keys and connection.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ class Ploi
|
||||
|
||||
public function __construct(string $token = null, string $coreApiToken = null)
|
||||
{
|
||||
$this->url = app()->isLocal() ? 'http://core-api.ploi.test/' : 'https://core-api.ploi.io/';
|
||||
$this->url = config('services.ploi-api.url');
|
||||
|
||||
if (!$token) {
|
||||
$token = config('services.ploi.token');
|
||||
|
||||
@@ -43,7 +43,7 @@ class Certificate extends Resource
|
||||
return $this->getPloi()->makeAPICall($this->getEndpoint());
|
||||
}
|
||||
|
||||
public function create(string $certificate, string $type = 'letsencrypt'): stdClass
|
||||
public function create(string $certificate, string $type = 'letsencrypt', string $private = null): stdClass
|
||||
{
|
||||
// Remove the id
|
||||
$this->setId(null);
|
||||
@@ -51,8 +51,9 @@ class Certificate extends Resource
|
||||
// Set the options
|
||||
$options = [
|
||||
'body' => json_encode([
|
||||
'certificate' => $certificate,
|
||||
'type' => $type,
|
||||
'certificate' => $certificate,
|
||||
'private' => $private,
|
||||
]),
|
||||
];
|
||||
|
||||
|
||||
@@ -61,9 +61,13 @@ class Server extends Resource
|
||||
|
||||
public function create(
|
||||
string $name,
|
||||
int $provider,
|
||||
int $region,
|
||||
int $plan
|
||||
$provider,
|
||||
$region,
|
||||
$plan,
|
||||
$type = 'server',
|
||||
$databaseType = 'mysql',
|
||||
$webserverType = 'nginx',
|
||||
$phpVersion = '7.4'
|
||||
): stdClass {
|
||||
|
||||
// Remove the id
|
||||
@@ -76,10 +80,10 @@ class Server extends Resource
|
||||
'plan' => $plan,
|
||||
'region' => $region,
|
||||
'credential' => $provider,
|
||||
'type' => 'server',
|
||||
'database_type' => 'mysql',
|
||||
'webserver_type' => 'nginx',
|
||||
'php_version' => '7.4'
|
||||
'type' => $type,
|
||||
'database_type' => $databaseType,
|
||||
'webserver_type' => $webserverType,
|
||||
'php_version' => $phpVersion
|
||||
]),
|
||||
];
|
||||
|
||||
@@ -89,8 +93,6 @@ class Server extends Resource
|
||||
} catch (NotValid $exception) {
|
||||
$errors = json_decode($exception->getMessage())->errors;
|
||||
|
||||
dd($errors);
|
||||
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
|
||||
@@ -98,6 +98,13 @@ class Site extends Resource
|
||||
}
|
||||
|
||||
throw $exception;
|
||||
} catch (\Exception $exception) {
|
||||
info($exception->getMessage());
|
||||
}
|
||||
|
||||
// TODO: Debugging purposes
|
||||
if (!$response->getJson() || !isset($response->getJson()->data)) {
|
||||
throw new \Exception($response->getJson()->error ?? 'Unknown error has occured');
|
||||
}
|
||||
|
||||
// Set the id of the site
|
||||
@@ -142,7 +149,7 @@ class Site extends Resource
|
||||
return $response->getJson()->data;
|
||||
}
|
||||
|
||||
public function phpVersion($version = '7.4') :stdClass
|
||||
public function phpVersion($version = '7.4'): stdClass
|
||||
{
|
||||
// Set the options
|
||||
$options = [
|
||||
|
||||
@@ -19,4 +19,9 @@ class Synchronize extends Resource
|
||||
{
|
||||
return $this->getPloi()->makeAPICall($this->getEndpoint() . '/servers');
|
||||
}
|
||||
|
||||
public function sites()
|
||||
{
|
||||
return $this->getPloi()->makeAPICall($this->getEndpoint() . '/sites');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,4 +34,13 @@ class VersionChecker
|
||||
{
|
||||
return $this->currentVersion < $this->remoteVersion || $this->currentVersion != $this->remoteVersion;
|
||||
}
|
||||
|
||||
public function flushVersionData()
|
||||
{
|
||||
try {
|
||||
cache()->forget('ploi-core-current-version');
|
||||
cache()->forget('ploi-core-remote-version');
|
||||
} catch (\Exception $exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
13
app/Traits/HasPloi.php
Normal file
13
app/Traits/HasPloi.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
use App\Services\Ploi\Ploi;
|
||||
|
||||
trait HasPloi
|
||||
{
|
||||
protected function getPloi()
|
||||
{
|
||||
return new Ploi(config('services.ploi.token'));
|
||||
}
|
||||
}
|
||||
@@ -9,30 +9,32 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^7.3",
|
||||
"php": "^7.4|^8.0",
|
||||
"ext-json": "*",
|
||||
"cloudflare/sdk": "^1.1",
|
||||
"fideloper/proxy": "^4.2",
|
||||
"fruitcake/laravel-cors": "^1.0",
|
||||
"guzzlehttp/guzzle": "^6.2|^7.0.1",
|
||||
"inertiajs/inertia-laravel": "^0.3.1",
|
||||
"laravel/cashier": "^12.3",
|
||||
"laravel/framework": "^8.4",
|
||||
"laravel/horizon": "^5.0",
|
||||
"inertiajs/inertia-laravel": "^v0.4.3",
|
||||
"laravel/cashier": "^12.16",
|
||||
"laravel/framework": "^v8.80.0",
|
||||
"laravel/horizon": "^5.8",
|
||||
"laravel/tinker": "^2.0",
|
||||
"laravel/ui": "^2.1",
|
||||
"laravel/ui": "^2.1|^3.3.0",
|
||||
"league/glide": "^1.6",
|
||||
"pragmarx/google2fa-laravel": "^1.3",
|
||||
"tightenco/ziggy": "^0.9.4"
|
||||
"predis/predis": "^1.1",
|
||||
"tightenco/ziggy": "^1.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3.3",
|
||||
"facade/ignition": "^2.3",
|
||||
"friendsofphp/php-cs-fixer": "^2.16",
|
||||
"friendsofphp/php-cs-fixer": "^3.1.0",
|
||||
"fzaninotto/faker": "^1.9.1",
|
||||
"laravel/dusk": "^6.15",
|
||||
"mockery/mockery": "^1.3.1",
|
||||
"nunomaduro/collision": "^5.0",
|
||||
"phpunit/phpunit": "^8.5"
|
||||
"phpunit/phpunit": "^9.5.4"
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
|
||||
5116
composer.lock
generated
5116
composer.lock
generated
File diff suppressed because it is too large
Load Diff
7
config/core.php
Normal file
7
config/core.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'pagination' => [
|
||||
'per_page' => env('PAGINATION_PER_PAGE', 5)
|
||||
]
|
||||
];
|
||||
@@ -15,7 +15,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => null,
|
||||
'domain' => env('HORIZON_DOMAIN', null),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -28,7 +28,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => 'horizon',
|
||||
'path' => env('HORIZON_PATH', 'horizon'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -145,13 +145,13 @@ return [
|
||||
| Memory Limit (MB)
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value describes the maximum amount of memory the Horizon worker
|
||||
| may consume before it is terminated and restarted. You should set
|
||||
| this value according to the resources available to your server.
|
||||
| This value describes the maximum amount of memory the Horizon master
|
||||
| supervisor may consume before it is terminated and restarted. For
|
||||
| configuring these limits on your workers, see the next section.
|
||||
|
|
||||
*/
|
||||
|
||||
'memory_limit' => 64,
|
||||
'memory_limit' => env('HORIZON_MEMORY_LIMIT', 64),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -164,6 +164,9 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'defaults' => [
|
||||
],
|
||||
|
||||
'environments' => [
|
||||
'production' => [
|
||||
'supervisor-1' => [
|
||||
|
||||
@@ -33,5 +33,9 @@ return [
|
||||
'ploi' => [
|
||||
'token' => env('PLOI_TOKEN'),
|
||||
'core-token' => env('PLOI_CORE_TOKEN')
|
||||
],
|
||||
|
||||
'ploi-api' => [
|
||||
'url' => env('PLOI_API_URL', 'https://core-api.ploi.io/')
|
||||
]
|
||||
];
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class CreateAlertsTable extends Migration
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddMetaToUserProvidersTable extends Migration
|
||||
{
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddZipToUsersTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('zip')->after('city')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('zip');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddPriceYearlyToPackagesTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('packages', function (Blueprint $table) {
|
||||
$table->decimal('price_yearly', 10, 4)->after('price_monthly')->default(0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('packages', function (Blueprint $table) {
|
||||
$table->dropColumn('price_yearly');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddColumnsToCertificatesTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('certificates', function (Blueprint $table) {
|
||||
$table->after('domain', function ($table) {
|
||||
$table->longText('certificate')->nullable();
|
||||
$table->longText('private')->nullable();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('certificates', function (Blueprint $table) {
|
||||
//
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddAllowedRegionsAndPlansToProvidersTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('providers', function (Blueprint $table) {
|
||||
$table->json('allowed_plans')->nullable()->after('name');
|
||||
$table->json('allowed_regions')->nullable()->after('allowed_plans');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('providers', function (Blueprint $table) {
|
||||
$table->dropColumn('allowed_plans', 'allowed_regions');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddColumnsToServersTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->after('available_php_versions', function (Blueprint $table) {
|
||||
$table->string('type')->default('server');
|
||||
$table->string('database_type')->default('mysql');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->dropColumn('type', 'database_type');
|
||||
});
|
||||
}
|
||||
}
|
||||
20777
package-lock.json
generated
20777
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
38
package.json
38
package.json
@@ -2,34 +2,40 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run development",
|
||||
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch": "npm run development -- --watch",
|
||||
"watch-poll": "npm run watch -- --watch-poll",
|
||||
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"prod": "npm run production",
|
||||
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
|
||||
"development": "mix",
|
||||
"watch": "mix watch",
|
||||
"watch-poll": "mix watch -- --watch-options-poll=1000",
|
||||
"hot": "mix watch --hot",
|
||||
"production": "mix --production"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@inertiajs/inertia": "^0.4.3",
|
||||
"@inertiajs/inertia-vue": "^0.3.2",
|
||||
"@inertiajs/progress": "^0.1.2",
|
||||
"@tailwindcss/ui": "^0.3.0",
|
||||
"axios": "^0.19",
|
||||
"@inertiajs/inertia": "^0.10.0",
|
||||
"@inertiajs/inertia-vue": "^0.7.1",
|
||||
"@inertiajs/progress": "^0.2.6",
|
||||
"@tailwindcss/forms": "^0.4.0",
|
||||
"@tailwindcss/typography": "^0.5.0",
|
||||
"autoprefixer": "^10.4.0",
|
||||
"axios": "^0.21.1",
|
||||
"balloon-css": "^1.2.0",
|
||||
"cross-env": "^7.0",
|
||||
"laravel-mix": "^5.0.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"laravel-mix": "^6.0.41",
|
||||
"lodash": "^4.17.15",
|
||||
"portal-vue": "^2.1.7",
|
||||
"postcss": "^8.4.5",
|
||||
"resolve-url-loader": "^3.1.0",
|
||||
"sass": "^1.15.2",
|
||||
"sass-loader": "^8.0.0",
|
||||
"tailwindcss": "^1.9.6",
|
||||
"v-click-outside": "^3.0.1",
|
||||
"tailwindcss": "^3.0.7",
|
||||
"v-click-outside": "^3.1.2",
|
||||
"vue": "^2.6.11",
|
||||
"vue-clipboard2": "^0.3.1",
|
||||
"vue-loader": "^15.9.8",
|
||||
"vue-meta": "^2.4.0",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"vuex": "^3.5.1"
|
||||
"vuex": "^3.6.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"vue-simplemde": "^2.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
4
public/css/app.css
vendored
4
public/css/app.css
vendored
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user