Split the importer module out from the installer module (#468)

* Split the importer module out from the installer module

* Cleanup of unused imports

* Move updater into separate module #453

* Remove unused imports/formatting

* Disable the install and importer modules at the end of the setup

* Unused imports; update IJ style

* test explicit stage for php+mysql

* add more to matrix

* Add different MariaDB versions

* undo
This commit is contained in:
Nabeel S 2019-12-12 15:07:35 -05:00 committed by GitHub
parent a58bca390b
commit e862537a20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
64 changed files with 856 additions and 259 deletions

View File

@ -44,9 +44,83 @@ script:
after_failure: after_failure:
- cat storage/logs/*.log - cat storage/logs/*.log
# Refer to: https://github.com/doctrine/dbal/blob/master/.travis.yml#L39
jobs: jobs:
fast_finish: true
include: include:
# Different test stages
# - stage: Test
# name: PHP 7.2 + MySQL 5.7
# php: 7.2
# env: DB=mysql
# services:
# - mysql
# - stage: Test
# name: PHP 7.3 + MySQL 5.7
# php: 7.3
# env: DB=mysql
# services:
# - mysql
# - stage: Test
# name: PHP 7.4 + MySQL 5.7
# php: 7.4
# env: DB=mysql
# services:
# - mysql
# - stage: Test
# name: PHP 7.2 + MariaDB 10.1
# php: 7.2
# env: DB=mariadb
# addons:
# mariadb: '10.1'
# - stage: Test
# name: PHP 7.3 + MariaDB 10.1
# php: 7.3
# env: DB=mariadb
# addons:
# mariadb: '10.1'
# - stage: Test
# name: PHP 7.4 + MariaDB 10.1
# php: 7.4
# env: DB=mariadb MARIADB_VERSION=10.1
# addons:
# mariadb: '10.1'
# - stage: Test
# name: PHP 7.2 + MariaDB 10.2
# php: 7.2
# env: DB=mariadb
# addons:
# mariadb: '10.2'
# - stage: Test
# name: PHP 7.3 + MariaDB 10.3
# php: 7.3
# env: DB=mariadb
# addons:
# mariadb: '10.2'
# - stage: Test
# name: PHP 7.4 + MariaDB 10.2
# php: 7.4
# env: DB=mariadb
# addons:
# mariadb: '10.2'
# - stage: Test
# name: PHP 7.2 + MariaDB 10.3
# php: 7.2
# env: DB=mariadb
# addons:
# mariadb: '10.3'
# - stage: Test
# name: PHP 7.3 + MariaDB 10.3
# php: 7.3
# env: DB=mariadb
# addons:
# mariadb: '10.3'
# - stage: Test
# name: PHP 7.4 + MariaDB 10.3
# php: 7.4
# env: DB=mariadb
# addons:
# mariadb: '10.3'
# Just packages up a release # Just packages up a release
- stage: package - stage: package
script: skip script: skip

View File

@ -6,7 +6,7 @@ namespace App\Contracts;
* @property mixed $id * @property mixed $id
* @property bool $skip_mutator * @property bool $skip_mutator
* *
* @method static create(array $attrs) * @method static Model create(array $attrs)
* @method static Model find(int $id) * @method static Model find(int $id)
* @method static Model select(array $array) * @method static Model select(array $array)
* @method static Model where(array $array) * @method static Model where(array $array)

View File

@ -5,9 +5,6 @@ namespace App\Facades;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use Illuminate\Support\Facades\Facade; use Illuminate\Support\Facades\Facade;
/**
* Class Utils
*/
class Utils extends Facade class Utils extends Facade
{ {
/** /**

View File

@ -25,7 +25,7 @@ use App\Models\Subfleet;
use App\Models\User; use App\Models\User;
use App\Repositories\SettingRepository; use App\Repositories\SettingRepository;
use App\Services\ModuleService; use App\Services\ModuleService;
use Illuminate\Contracts\Container\BindingResolutionException; use App\Support\Utils;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@ -76,13 +76,10 @@ class AppServiceProvider extends ServiceProvider
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
} }
try { if (config('app.debug_toolbar') === true) {
if (config('app.debug_toolbar') === true) { Utils::enableDebugToolbar();
app('debugbar')->enable(); } else {
} else { Utils::disableDebugToolbar();
app('debugbar')->disable();
}
} catch (BindingResolutionException $e) {
} }
} }
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Services; namespace App\Services\Installer;
use App\Contracts\Service; use App\Contracts\Service;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;

View File

@ -3,6 +3,7 @@
namespace App\Services\Installer; namespace App\Services\Installer;
use App\Contracts\Service; use App\Contracts\Service;
use Nwidart\Modules\Facades\Module;
class InstallerService extends Service class InstallerService extends Service
{ {
@ -36,4 +37,16 @@ class InstallerService extends Service
return false; return false;
} }
/**
* Disable the installer and importer modules
*/
public function disableInstallerModules()
{
$module = Module::find('installer');
$module->disable();
$module = Module::find('importer');
$module->disable();
}
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Utils; namespace App\Services\Installer;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;

View File

@ -2,6 +2,7 @@
namespace App\Support; namespace App\Support;
use Illuminate\Contracts\Container\BindingResolutionException;
use Nwidart\Modules\Facades\Module; use Nwidart\Modules\Facades\Module;
/** /**
@ -9,6 +10,28 @@ use Nwidart\Modules\Facades\Module;
*/ */
class Utils class Utils
{ {
/**
* Enable the debug toolbar
*/
public static function enableDebugToolbar()
{
try {
app('debugbar')->enable();
} catch (BindingResolutionException $e) {
}
}
/**
* Disable the debug toolbar
*/
public static function disableDebugToolbar()
{
try {
app('debugbar')->disable();
} catch (BindingResolutionException $e) {
}
}
/** /**
* Is the installer enabled? * Is the installer enabled?
* *

View File

@ -1,7 +1,9 @@
{ {
"Awards": true, "Awards": true,
"Importer": true,
"Installer": true, "Installer": true,
"Sample": true, "Sample": true,
"Updater": true,
"VMSAcars": true, "VMSAcars": true,
"Vacentral": true "Vacentral": true
} }

View File

@ -17,9 +17,9 @@
<option name="VARIABLE_NAMING_STYLE" value="CAMEL_CASE" /> <option name="VARIABLE_NAMING_STYLE" value="CAMEL_CASE" />
<option name="BLANK_LINES_BEFORE_RETURN_STATEMENT" value="1" /> <option name="BLANK_LINES_BEFORE_RETURN_STATEMENT" value="1" />
<option name="KEEP_RPAREN_AND_LBRACE_ON_ONE_LINE" value="true" /> <option name="KEEP_RPAREN_AND_LBRACE_ON_ONE_LINE" value="true" />
<option name="SPACE_AFTER_UNARY_NOT" value="true" />
<option name="SPACES_WITHIN_SHORT_ECHO_TAGS" value="false" /> <option name="SPACES_WITHIN_SHORT_ECHO_TAGS" value="false" />
<option name="FORCE_SHORT_DECLARATION_ARRAY_STYLE" value="true" /> <option name="FORCE_SHORT_DECLARATION_ARRAY_STYLE" value="true" />
<option name="PHPDOC_USE_FQCN" value="true" />
</PHPCodeStyleSettings> </PHPCodeStyleSettings>
<XML> <XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" /> <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
@ -32,6 +32,8 @@
</indentOptions> </indentOptions>
</codeStyleSettings> </codeStyleSettings>
<codeStyleSettings language="PHP"> <codeStyleSettings language="PHP">
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="false" />
<option name="LINE_COMMENT_ADD_SPACE" value="true" />
<option name="KEEP_LINE_BREAKS" value="false" /> <option name="KEEP_LINE_BREAKS" value="false" />
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" /> <option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
@ -44,6 +46,7 @@
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" /> <option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" />
<option name="SPACE_AFTER_TYPE_CAST" value="true" /> <option name="SPACE_AFTER_TYPE_CAST" value="true" />
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_CLASS_LBRACE" value="false" /> <option name="SPACE_BEFORE_CLASS_LBRACE" value="false" />
<option name="METHOD_PARAMETERS_WRAP" value="5" /> <option name="METHOD_PARAMETERS_WRAP" value="5" />
<option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" /> <option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />

1
modules/.gitignore vendored
View File

@ -7,4 +7,5 @@
!/Importer !/Importer
!/Installer !/Installer
!/Sample !/Sample
!/Updater
!/Vacentral !/Vacentral

View File

@ -0,0 +1,7 @@
<?php
return [
'importer' => [
'batch_size' => 20,
],
];

View File

@ -1,10 +1,10 @@
<?php <?php
namespace Modules\Installer\Console\Commands; namespace Modules\Importer\Console\Commands;
use App\Contracts\Command; use App\Contracts\Command;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Modules\Installer\Services\Importer\ImporterService; use Modules\Importer\Services\ImporterService;
class ImportFromClassicCommand extends Command class ImportFromClassicCommand extends Command
{ {

View File

@ -1,25 +1,26 @@
<?php <?php
namespace Modules\Installer\Http\Controllers; namespace Modules\Importer\Http\Controllers;
use App\Contracts\Controller; use App\Contracts\Controller;
use Illuminate\Contracts\Container\BindingResolutionException; use App\Services\Installer\DatabaseService;
use App\Services\Installer\InstallerService;
use App\Support\Utils;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Modules\Installer\Services\Importer\ImporterService; use Modules\Importer\Services\ImporterService;
class ImporterController extends Controller class ImporterController extends Controller
{ {
private $dbSvc;
private $importerSvc; private $importerSvc;
public function __construct(ImporterService $importerSvc) public function __construct(DatabaseService $dbSvc, ImporterService $importerSvc)
{ {
$this->dbSvc = $dbSvc;
$this->importerSvc = $importerSvc; $this->importerSvc = $importerSvc;
try { Utils::disableDebugToolbar();
app('debugbar')->disable();
} catch (BindingResolutionException $e) {
}
} }
/** /**
@ -28,16 +29,43 @@ class ImporterController extends Controller
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return mixed
*/ */
public function index(Request $request) public function index(Request $request)
{ {
return view('importer::step1-configure');
}
/**
* Check the database connection
*
* @param \Illuminate\Http\Request $request
*
* @return mixed
*/
public function dbtest(Request $request)
{
$status = 'success'; // success|warn|danger
$message = 'Database connection looks good!';
try { try {
app('debugbar')->disable(); $this->dbSvc->checkDbConnection(
} catch (BindingResolutionException $e) { $request->post('db_conn'),
$request->post('db_host'),
$request->post('db_port'),
$request->post('db_name'),
$request->post('db_user'),
$request->post('db_pass')
);
} catch (\Exception $e) {
$status = 'danger';
$message = 'Failed! '.$e->getMessage();
} }
return view('installer::importer/step1-configure'); return view('importer::dbtest', [
'status' => $status,
'message' => $message,
]);
} }
/** /**
@ -45,15 +73,10 @@ class ImporterController extends Controller
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return mixed
*/ */
public function config(Request $request) public function config(Request $request)
{ {
try {
app('debugbar')->disable();
} catch (BindingResolutionException $e) {
}
try { try {
// Save the credentials to use later // Save the credentials to use later
$this->importerSvc->saveCredentialsFromRequest($request); $this->importerSvc->saveCredentialsFromRequest($request);
@ -62,14 +85,15 @@ class ImporterController extends Controller
$manifest = $this->importerSvc->generateImportManifest(); $manifest = $this->importerSvc->generateImportManifest();
} catch (\Exception $e) { } catch (\Exception $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
// Send it to run, step1 // Send it to run, step1
return view('installer::importer/error', [ return view('importer::error', [
'error' => $e->getMessage(), 'error' => $e->getMessage(),
]); ]);
} }
// Send it to run, step1 // Send it to run, step1
return view('installer::importer/step2-processing', [ return view('importer::step2-processing', [
'manifest' => $manifest, 'manifest' => $manifest,
]); ]);
} }
@ -84,15 +108,10 @@ class ImporterController extends Controller
* *
* @throws \Exception * @throws \Exception
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return mixed
*/ */
public function run(Request $request) public function run(Request $request)
{ {
try {
app('debugbar')->disable();
} catch (BindingResolutionException $e) {
}
$importer = $request->input('importer'); $importer = $request->input('importer');
$start = $request->input('start'); $start = $request->input('start');
@ -110,6 +129,9 @@ class ImporterController extends Controller
*/ */
public function complete() public function complete()
{ {
$installerSvc = app(InstallerService::class);
$installerSvc->disableInstallerModules();
return redirect('/'); return redirect('/');
} }
} }

View File

@ -0,0 +1,102 @@
<?php
namespace Modules\Importer\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Modules\Importer\Console\Commands\ImportFromClassicCommand;
class ImporterServiceProvider extends ServiceProvider
{
/**
* Boot the application events.
*/
public function boot()
{
$this->registerCommands();
$this->registerRoutes();
$this->registerTranslations();
$this->registerConfig();
$this->registerViews();
}
protected function registerCommands()
{
$this->commands([
ImportFromClassicCommand::class,
]);
}
/**
* Register the routes
*/
protected function registerRoutes()
{
Route::group([
'as' => 'importer.',
'prefix' => 'importer',
'middleware' => ['web'],
'namespace' => 'Modules\Importer\Http\Controllers',
], function () {
Route::get('/', 'ImporterController@index')->name('index');
Route::post('/config', 'ImporterController@config')->name('config');
Route::post('/dbtest', 'ImporterController@dbtest')->name('dbtest');
// Run the actual importer process. Additional middleware
Route::post('/run', 'ImporterController@run')->middleware('api')->name('run');
Route::post('/complete', 'ImporterController@complete')->name('complete');
});
}
/**
* Register config.
*/
protected function registerConfig()
{
$this->mergeConfigFrom(__DIR__.'/../Config/config.php', 'importer');
}
/**
* Register views.
*/
public function registerViews()
{
$viewPath = resource_path('views/modules/importer');
$sourcePath = __DIR__.'/../Resources/views';
$this->publishes([$sourcePath => $viewPath], 'views');
$paths = array_map(
function ($path) {
return $path.'/modules/importer';
},
\Config::get('view.paths')
);
$paths[] = $sourcePath;
$this->loadViewsFrom($paths, 'importer');
}
/**
* Register translations.
*/
public function registerTranslations()
{
$langPath = resource_path('lang/modules/importer');
if (is_dir($langPath)) {
$this->loadTranslationsFrom($langPath, 'importer');
} else {
$this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'importer');
}
}
/**
* Get the services provided by the provider.
*/
public function provides(): array
{
return [];
}
}

View File

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title') - importer</title>
<link rel="shortcut icon" type="image/png" href="{{ public_asset('/assets/img/favicon.png') }}"/>
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no'
name='viewport'/>
<meta name="base-url" content="{!! url('') !!}">
<meta name="api-key" content="{!! Auth::check() ? Auth::user()->api_key: '' !!}">
<meta name="csrf-token" content="{!! csrf_token() !!}">
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"/>
<link href="{{ public_asset('/assets/frontend/css/bootstrap.min.css') }}" rel="stylesheet"/>
<link href="{{ public_asset('/assets/frontend/css/now-ui-kit.css') }}" rel="stylesheet"/>
<link href="{{ public_asset('/assets/installer/css/vendor.css') }}" rel="stylesheet"/>
<link href="{{ public_asset('/assets/frontend/css/styles.css') }}" rel="stylesheet"/>
<link rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css">
<style>
.table tr:first-child td { border-top: 0px; }
@yield('css')
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-toggleable-md" style="background: #067ec1;">
<div class="container" style="width: 85%!important;">
<div class="navbar-translate">
<p class="navbar-brand text-white" data-placement="bottom" target="_blank">
<a href="{{ url('/') }}">
<img src="{{ public_asset('/assets/img/logo_blue_bg.svg') }}" width="135px" style=""/>
</a>
</p>
</div>
<div class="justify-content-center" id="navigation" style="margin-left: 50px; color: white; font-size: 20px;">
@yield('title')
</div>
</div>
</nav>
<!-- End Navbar -->
{{--<div class="clearfix" style="height: 25px;"></div>--}}
<div class="wrapper">
<div class="clear"></div>
<div class="container" style="width: 50%">
<div class="row">
<div class="col-12">
@include('importer::flash.message')
@yield('content')
</div>
</div>
</div>
<div class="clearfix" style="height: 200px;"></div>
</div>
{{--<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>--}}
<script src="{{ public_mix('/assets/global/js/vendor.js') }}"></script>
<script src="{{ public_mix('/assets/frontend/js/vendor.js') }}"></script>
<script src="{{ public_mix('/assets/frontend/js/app.js') }}"></script>
<script src="{{ public_asset('/assets/installer/js/vendor.js') }}" type="text/javascript"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>
hljs.configure({languages: ['sh']});
$(document).ready(function () {
$(".select2").select2();
$('pre code').each(function (i, block) {
hljs.fixMarkup(block);
hljs.highlightBlock(block);
});
});
</script>
@yield('scripts')
</body>
</html>

View File

@ -1,9 +1,9 @@
@extends('installer::app') @extends('importer::app')
@section('title', 'Import Completed!') @section('title', 'Import Completed!')
@section('content') @section('content')
<div style="align-content: center;"> <div style="align-content: center;">
{{ Form::open(['route' => 'installer.complete', 'method' => 'GET']) }} {{ Form::open(['route' => 'importer.complete', 'method' => 'GET']) }}
<h4>Installer Completed!</h4> <h4>Installer Completed!</h4>
@ -11,7 +11,7 @@
<p>Click the button to proceed to the login screen!</p> <p>Click the button to proceed to the login screen!</p>
<p style="text-align: right"> <p style="text-align: right">
{{ Form::submit('Install Complete! Continue to Log-In >>', {{ Form::submit('Import Complete! Continue to Log-In >>',
['class' => 'btn btn-success']) ['class' => 'btn btn-success'])
}} }}
</p> </p>

View File

@ -1,4 +1,4 @@
@extends('installer::app') @extends('importer::app')
@section('title', 'Import Error!') @section('title', 'Import Error!')
@section('content') @section('content')

View File

@ -0,0 +1,6 @@
@if($errors->has($field))
<p class="text-danger" style="margin-top: 10px;">{{ $errors->first($field) }}</p>
{{--<div class="alert alert-danger" role="alert" style="margin-top: 10px;">
{{ $errors->first($field) }}
</div>--}}
@endif

View File

@ -0,0 +1,11 @@
@foreach (session('flash_notification', collect())->toArray() as $message)
<div class="alert alert-danger" role="alert">
<div class="container">
<div class="alert-icon">
<i class="now-ui-icons ui-2_like"></i>
</div>
{{ $message['message'] }}
</div>
</div>
@endforeach
{{ session()->forget('flash_notification') }}

View File

@ -1,4 +1,4 @@
@extends('installer::app') @extends('importer::app')
@section('title', 'Import Configuration') @section('title', 'Import Configuration')
@section('content') @section('content')
@ -125,7 +125,7 @@
db_pass: $("input[name=db_pass]").val(), db_pass: $("input[name=db_pass]").val(),
}; };
$.post("{{ route('installer.dbtest') }}", opts, (data) => { $.post("{{ route('importer.dbtest') }}", opts, (data) => {
$("#dbtest").html(data); $("#dbtest").html(data);
}) })
}) })

View File

@ -1,4 +1,4 @@
@extends('installer::app') @extends('importer::app')
@section('title', 'Import Configuration') @section('title', 'Import Configuration')
@section('content') @section('content')
@ -37,21 +37,6 @@
<script> <script>
const manifest = {!!json_encode($manifest) !!}; const manifest = {!!json_encode($manifest) !!};
/**
* Get the total number of steps
*/
const getTotalSteps = () => {
let total = 0;
for (let importer of manifest_keys) {
for (let stage of manifest[importer]) {
total++;
}
}
return total;
};
/** /**
* Run each step of the importer * Run each step of the importer
*/ */

View File

@ -1,22 +1,39 @@
<?php <?php
namespace Modules\Installer\Services\Importer; namespace Modules\Importer\Services;
use App\Services\Installer\LoggerTrait;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Modules\Installer\Utils\IdMapper; use Modules\Importer\Utils\IdMapper;
use Modules\Installer\Utils\ImporterDB; use Modules\Importer\Utils\ImporterDB;
use Modules\Installer\Utils\LoggerTrait;
abstract class BaseImporter implements ShouldQueue abstract class BaseImporter implements ShouldQueue
{ {
use LoggerTrait, Dispatchable, InteractsWithQueue, Queueable; use LoggerTrait, Dispatchable, InteractsWithQueue, Queueable;
/**
* Holds the connection to the legacy database
*
* @var \Modules\Importer\Utils\ImporterDB
*/
protected $db; protected $db;
/**
* The mapper class used for old IDs to new IDs
*
* @var \Illuminate\Contracts\Foundation\Application|mixed
*/
protected $idMapper; protected $idMapper;
/**
* The legacy table this importer targets
*
* @var string
*/
protected $table; protected $table;
public function __construct() public function __construct()

View File

@ -1,21 +1,21 @@
<?php <?php
namespace Modules\Installer\Services\Importer; namespace Modules\Importer\Services;
use App\Contracts\Service; use App\Contracts\Service;
use App\Repositories\KvpRepository; use App\Repositories\KvpRepository;
use Exception; use Exception;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Modules\Installer\Services\Importer\Importers\AircraftImporter; use Modules\Importer\Services\Importers\AircraftImporter;
use Modules\Installer\Services\Importer\Importers\AirlineImporter; use Modules\Importer\Services\Importers\AirlineImporter;
use Modules\Installer\Services\Importer\Importers\AirportImporter; use Modules\Importer\Services\Importers\AirportImporter;
use Modules\Installer\Services\Importer\Importers\ClearDatabase; use Modules\Importer\Services\Importers\ClearDatabase;
use Modules\Installer\Services\Importer\Importers\FinalizeImporter; use Modules\Importer\Services\Importers\FinalizeImporter;
use Modules\Installer\Services\Importer\Importers\FlightImporter; use Modules\Importer\Services\Importers\FlightImporter;
use Modules\Installer\Services\Importer\Importers\GroupImporter; use Modules\Importer\Services\Importers\GroupImporter;
use Modules\Installer\Services\Importer\Importers\PirepImporter; use Modules\Importer\Services\Importers\PirepImporter;
use Modules\Installer\Services\Importer\Importers\RankImport; use Modules\Importer\Services\Importers\RankImport;
use Modules\Installer\Services\Importer\Importers\UserImport; use Modules\Importer\Services\Importers\UserImport;
class ImporterService extends Service class ImporterService extends Service
{ {
@ -104,7 +104,7 @@ class ImporterService extends Service
$manifest = []; $manifest = [];
foreach ($this->importList as $importerKlass) { foreach ($this->importList as $importerKlass) {
/** @var \Modules\Installer\Services\Importer\BaseImporter $importer */ /** @var \Modules\Importer\Services\BaseImporter $importer */
$importer = new $importerKlass(); $importer = new $importerKlass();
$manifest = array_merge($manifest, $importer->getManifest()); $manifest = array_merge($manifest, $importer->getManifest());
} }
@ -128,7 +128,7 @@ class ImporterService extends Service
throw new Exception('Unknown importer "'.$importer.'"'); throw new Exception('Unknown importer "'.$importer.'"');
} }
/** @var $importerInst \Modules\Installer\Services\Importer\BaseImporter */ /** @var $importerInst \Modules\Importer\Services\BaseImporter */
$importerInst = new $importer(); $importerInst = new $importer();
$importerInst->run($start); $importerInst->run($start);
} }

View File

@ -1,11 +1,11 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Aircraft; use App\Models\Aircraft;
use App\Models\Airline; use App\Models\Airline;
use App\Models\Subfleet; use App\Models\Subfleet;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class AircraftImporter extends BaseImporter class AircraftImporter extends BaseImporter
{ {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Airline; use App\Models\Airline;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class AirlineImporter extends BaseImporter class AirlineImporter extends BaseImporter
{ {

View File

@ -1,11 +1,11 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Airport; use App\Models\Airport;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class AirportImporter extends BaseImporter class AirportImporter extends BaseImporter
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Acars; use App\Models\Acars;
use App\Models\Airline; use App\Models\Airline;
@ -19,7 +19,7 @@ use App\Models\Subfleet;
use App\Models\User; use App\Models\User;
use App\Models\UserAward; use App\Models\UserAward;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class ClearDatabase extends BaseImporter class ClearDatabase extends BaseImporter
{ {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\User; use App\Models\User;
use App\Services\UserService; use App\Services\UserService;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class FinalizeImporter extends BaseImporter class FinalizeImporter extends BaseImporter
{ {

View File

@ -1,9 +1,9 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Flight; use App\Models\Flight;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class FlightImporter extends BaseImporter class FlightImporter extends BaseImporter
{ {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Role; use App\Models\Role;
use App\Services\RoleService; use App\Services\RoleService;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
/** /**
* Imports the groups into the permissions feature(s) * Imports the groups into the permissions feature(s)

View File

@ -1,12 +1,12 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Enums\FlightType; use App\Models\Enums\FlightType;
use App\Models\Enums\PirepSource; use App\Models\Enums\PirepSource;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
use App\Models\Pirep; use App\Models\Pirep;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class PirepImporter extends BaseImporter class PirepImporter extends BaseImporter
{ {

View File

@ -1,9 +1,9 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Models\Rank; use App\Models\Rank;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class RankImport extends BaseImporter class RankImport extends BaseImporter
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Services\Importer\Importers; namespace Modules\Importer\Services\Importers;
use App\Facades\Utils; use App\Facades\Utils;
use App\Models\Enums\UserState; use App\Models\Enums\UserState;
@ -9,7 +9,7 @@ use App\Services\UserService;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Modules\Installer\Services\Importer\BaseImporter; use Modules\Importer\Services\BaseImporter;
class UserImport extends BaseImporter class UserImport extends BaseImporter
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Utils; namespace Modules\Importer\Utils;
use App\Contracts\Service; use App\Contracts\Service;
use Spatie\Valuestore\Valuestore; use Spatie\Valuestore\Valuestore;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Utils; namespace Modules\Importer\Utils;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use PDO; use PDO;

View File

@ -0,0 +1,29 @@
{
"name": "phpvms/importer",
"type": "laravel-library",
"description": "The importer module for phpVMS",
"authors": [
{
"name": "Nabeel Shahzad",
"email": ""
}
],
"require": {
"composer/installers": "~1.0"
},
"extra": {
"laravel": {
"providers": [
"Modules\\Importer\\Providers\\ImporterServiceProvider"
],
"aliases": {
}
}
},
"autoload": {
"psr-4": {
"Modules\\Importer\\": ""
}
}
}

View File

@ -0,0 +1,14 @@
{
"name": "Importer",
"alias": "importer",
"description": "",
"keywords": [],
"active": 1,
"order": 0,
"providers": [
"Modules\\Importer\\Providers\\ImporterServiceProvider"
],
"aliases": {},
"files": [],
"requires": []
}

View File

@ -37,8 +37,4 @@ return [
'storage/framework/views', 'storage/framework/views',
'storage/logs', 'storage/logs',
], ],
'importer' => [
'batch_size' => 20,
],
]; ];

View File

@ -1,22 +0,0 @@
<?php
namespace Modules\Installer\Exceptions;
/**
* Go to the next page of the importer
*/
class ImporterNextRecordSet extends \Exception
{
public $nextOffset;
/**
* ImporterNextRecordSet constructor.
*
* @param int $nextOffset Where to start the next set of reads from
*/
public function __construct($nextOffset)
{
parent::__construct('', 0, null);
$this->nextOffset = $nextOffset;
}
}

View File

@ -1,11 +0,0 @@
<?php
namespace Modules\Installer\Exceptions;
class ImporterNoMoreRecords extends \Exception
{
public function __construct()
{
parent::__construct('', 0, null);
}
}

View File

@ -1,17 +0,0 @@
<?php
namespace Modules\Installer\Exceptions;
/**
* Signals that the stage is completed and we should go to the next one
*/
class StageCompleted extends \Exception
{
public $nextStage;
public function __construct($nextStage)
{
$this->nextStage = $nextStage;
parent::__construct('', 0, null);
}
}

View File

@ -7,18 +7,18 @@ use App\Facades\Utils;
use App\Models\User; use App\Models\User;
use App\Repositories\AirlineRepository; use App\Repositories\AirlineRepository;
use App\Services\AnalyticsService; use App\Services\AnalyticsService;
use App\Services\Installer\DatabaseService;
use App\Services\Installer\InstallerService;
use App\Services\Installer\MigrationService; use App\Services\Installer\MigrationService;
use App\Services\Installer\SeederService; use App\Services\Installer\SeederService;
use App\Services\UserService; use App\Services\UserService;
use App\Support\Countries; use App\Support\Countries;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Modules\Installer\Services\ConfigService; use Modules\Installer\Services\ConfigService;
use Modules\Installer\Services\DatabaseService;
use Modules\Installer\Services\RequirementsService; use Modules\Installer\Services\RequirementsService;
use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\Exception\FileException;
@ -64,10 +64,7 @@ class InstallerController extends Controller
$this->seederSvc = $seederSvc; $this->seederSvc = $seederSvc;
$this->userService = $userService; $this->userService = $userService;
try { \App\Support\Utils::disableDebugToolbar();
app('debugbar')->disable();
} catch (BindingResolutionException $e) {
}
} }
/** /**
@ -109,7 +106,7 @@ class InstallerController extends Controller
$message = 'Failed! '.$e->getMessage(); $message = 'Failed! '.$e->getMessage();
} }
return view('installer::flash/dbtest', [ return view('installer::install/dbtest', [
'status' => $status, 'status' => $status,
'message' => $message, 'message' => $message,
]); ]);
@ -354,6 +351,9 @@ class InstallerController extends Controller
*/ */
public function complete(Request $request) public function complete(Request $request)
{ {
$installerSvc = app(InstallerService::class);
$installerSvc->disableInstallerModules();
return redirect('/login'); return redirect('/login');
} }
} }

View File

@ -1,9 +0,0 @@
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', 'ImporterController@index')->name('index');
Route::post('/config', 'ImporterController@config')->name('config');
Route::post('/run', 'ImporterController@run')->middleware('api')->name('run');
Route::post('/complete', 'ImporterController@complete')->name('complete');

View File

@ -1,16 +0,0 @@
<?php
Route::get('/', 'InstallerController@index')->name('index');
Route::post('/dbtest', 'InstallerController@dbtest')->name('dbtest');
Route::get('/step1', 'InstallerController@step1')->name('step1');
Route::post('/step1', 'InstallerController@step1')->name('step1');
Route::get('/step2', 'InstallerController@step2')->name('step2');
Route::post('/envsetup', 'InstallerController@envsetup')->name('envsetup');
Route::get('/dbsetup', 'InstallerController@dbsetup')->name('dbsetup');
Route::get('/step3', 'InstallerController@step3')->name('step3');
Route::post('/usersetup', 'InstallerController@usersetup')->name('usersetup');
Route::get('/complete', 'InstallerController@complete')->name('complete');

View File

@ -1,9 +0,0 @@
<?php
Route::get('/', 'UpdaterController@index')->name('index');
Route::get('/step1', 'UpdaterController@step1')->name('step1');
Route::post('/step1', 'UpdaterController@step1')->name('step1');
Route::post('/run-migrations', 'UpdaterController@run_migrations')->name('run_migrations');
Route::get('/complete', 'UpdaterController@complete')->name('complete');

View File

@ -2,36 +2,20 @@
namespace Modules\Installer\Providers; namespace Modules\Installer\Providers;
use App\Services\ModuleService;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Modules\Installer\Console\Commands\ImportFromClassicCommand;
class InstallerServiceProvider extends ServiceProvider class InstallerServiceProvider extends ServiceProvider
{ {
protected $moduleSvc;
/** /**
* Boot the application events. * Boot the application events.
*/ */
public function boot() public function boot()
{ {
$this->moduleSvc = app(ModuleService::class);
$this->registerCommands();
$this->registerRoutes(); $this->registerRoutes();
$this->registerTranslations(); $this->registerTranslations();
$this->registerConfig(); $this->registerConfig();
$this->registerViews(); $this->registerViews();
$this->loadMigrationsFrom(__DIR__.'/../Database/migrations');
}
protected function registerCommands()
{
$this->commands([
ImportFromClassicCommand::class,
]);
} }
/** /**
@ -45,25 +29,20 @@ class InstallerServiceProvider extends ServiceProvider
'middleware' => ['web'], 'middleware' => ['web'],
'namespace' => 'Modules\Installer\Http\Controllers', 'namespace' => 'Modules\Installer\Http\Controllers',
], function () { ], function () {
$this->loadRoutesFrom(__DIR__.'/../Http/Routes/install.php'); Route::get('/', 'InstallerController@index')->name('index');
}); Route::post('/dbtest', 'InstallerController@dbtest')->name('dbtest');
Route::group([ Route::get('/step1', 'InstallerController@step1')->name('step1');
'as' => 'update.', Route::post('/step1', 'InstallerController@step1')->name('step1');
'prefix' => 'update',
'middleware' => ['web'],
'namespace' => 'Modules\Installer\Http\Controllers',
], function () {
$this->loadRoutesFrom(__DIR__.'/../Http/Routes/update.php');
});
Route::group([ Route::get('/step2', 'InstallerController@step2')->name('step2');
'as' => 'importer.', Route::post('/envsetup', 'InstallerController@envsetup')->name('envsetup');
'prefix' => 'importer', Route::get('/dbsetup', 'InstallerController@dbsetup')->name('dbsetup');
'middleware' => ['web'],
'namespace' => 'Modules\Installer\Http\Controllers', Route::get('/step3', 'InstallerController@step3')->name('step3');
], function () { Route::post('/usersetup', 'InstallerController@usersetup')->name('usersetup');
$this->loadRoutesFrom(__DIR__.'/../Http/Routes/importer.php');
Route::get('/complete', 'InstallerController@complete')->name('complete');
}); });
} }
@ -72,13 +51,7 @@ class InstallerServiceProvider extends ServiceProvider
*/ */
protected function registerConfig() protected function registerConfig()
{ {
$this->publishes([ $this->mergeConfigFrom(__DIR__.'/../Config/config.php', 'installer');
__DIR__.'/../Config/config.php' => config_path('installer.php'),
], 'installer');
$this->mergeConfigFrom(
__DIR__.'/../Config/config.php', 'installer'
);
} }
/** /**

View File

@ -0,0 +1,8 @@
<div class="alert alert-{{ $status }}" role="alert">
<div class="container">
<div class="alert-icon">
<i class="now-ui-icons ui-1_bell-53"></i>
</div>
{{ $message }}
</div>
</div>

View File

@ -13,9 +13,6 @@ use Nwidart\Modules\Support\Stub;
use PDO; use PDO;
use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\Exception\FileException;
/**
* Class ConfigService
*/
class ConfigService extends Service class ConfigService extends Service
{ {
/** /**

View File

@ -1,11 +1,12 @@
{ {
"name": "phpvms/installer", "name": "phpvms/installer",
"license": "",
"type": "laravel-library", "type": "laravel-library",
"description": "The installer module for phpVMS", "description": "The installer module for phpVMS",
"authors": [ "authors": [
{ {
"name": "Nabeel Shahzad", "name": "Nabeel Shahzad",
"email": "" "email": "nabeel@phpvms.net"
} }
], ],
"require": { "require": {

View File

@ -0,0 +1,4 @@
<?php
return [
];

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Installer\Http\Controllers; namespace Modules\Updater\Http\Controllers;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Services\Installer\MigrationService; use App\Services\Installer\MigrationService;
@ -9,17 +9,12 @@ use function count;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
/** class UpdateController extends Controller
* Class UpdaterController
*/
class UpdaterController extends Controller
{ {
private $migrationSvc; private $migrationSvc;
private $seederSvc; private $seederSvc;
/** /**
* UpdaterController constructor.
*
* @param MigrationService $migrationSvc * @param MigrationService $migrationSvc
* @param SeederService $seederSvc * @param SeederService $seederSvc
*/ */
@ -36,7 +31,7 @@ class UpdaterController extends Controller
*/ */
public function index() public function index()
{ {
return view('installer::update/index-start'); return view('updater::index-start');
} }
/** /**
@ -45,7 +40,7 @@ class UpdaterController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return mixed
*/ */
public function step1(Request $request) public function step1(Request $request)
{ {
@ -54,7 +49,7 @@ class UpdaterController extends Controller
Log::info('No migrations found'); Log::info('No migrations found');
} }
return view('installer::update/steps/step1-update-available'); return view('updater::steps/step1-update-available');
} }
/** /**
@ -62,7 +57,7 @@ class UpdaterController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return mixed
*/ */
public function run_migrations(Request $request) public function run_migrations(Request $request)
{ {
@ -71,13 +66,13 @@ class UpdaterController extends Controller
$migrations = $this->migrationSvc->migrationsAvailable(); $migrations = $this->migrationSvc->migrationsAvailable();
if (count($migrations) === 0) { if (count($migrations) === 0) {
$this->seederSvc->syncAllSeeds(); $this->seederSvc->syncAllSeeds();
return view('installer::update/steps/step3-update-complete'); return view('updater::steps/step3-update-complete');
} }
$output = $this->migrationSvc->runAllMigrations(); $output = $this->migrationSvc->runAllMigrations();
$this->seederSvc->syncAllSeeds(); $this->seederSvc->syncAllSeeds();
return view('installer::update/steps/step2-migrations-done', [ return view('updater::steps/step2-migrations-done', [
'console_output' => $output, 'console_output' => $output,
]); ]);
} }
@ -87,7 +82,7 @@ class UpdaterController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return mixed
*/ */
public function complete(Request $request) public function complete(Request $request)
{ {

View File

@ -0,0 +1,91 @@
<?php
namespace Modules\Updater\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
class UpdateServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerRoutes();
$this->registerTranslations();
$this->registerConfig();
$this->registerViews();
}
/**
* Register the routes
*/
protected function registerRoutes()
{
Route::group([
'as' => 'update.',
'prefix' => 'update',
'middleware' => ['web'],
'namespace' => 'Modules\Updater\Http\Controllers',
], function () {
Route::get('/', 'UpdateController@index')->name('index');
Route::get('/step1', 'UpdateController@step1')->name('step1');
Route::post('/step1', 'UpdateController@step1')->name('step1');
Route::post('/run-migrations', 'UpdateController@run_migrations')->name('run_migrations');
Route::get('/complete', 'UpdateController@complete')->name('complete');
});
}
/**
* Register config.
*/
protected function registerConfig()
{
$this->mergeConfigFrom(__DIR__.'/../Config/config.php', 'updater');
}
/**
* Register views.
*/
public function registerViews()
{
$viewPath = resource_path('views/modules/updater');
$sourcePath = __DIR__.'/../Resources/views';
$this->publishes([
$sourcePath => $viewPath,
], 'views');
$paths = array_map(
function ($path) {
return $path.'/modules/updater';
},
\Config::get('view.paths')
);
$paths[] = $sourcePath;
$this->loadViewsFrom($paths, 'updater');
}
/**
* Register translations.
*/
public function registerTranslations()
{
$langPath = resource_path('lang/modules/updater');
if (is_dir($langPath)) {
$this->loadTranslationsFrom($langPath, 'updater');
} else {
$this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'updater');
}
}
/**
* Get the services provided by the provider.
*/
public function provides(): array
{
return [];
}
}

View File

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title') - updater</title>
<link rel="shortcut icon" type="image/png" href="{{ public_asset('/assets/img/favicon.png') }}"/>
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no'
name='viewport'/>
<meta name="base-url" content="{!! url('') !!}">
<meta name="api-key" content="{!! Auth::check() ? Auth::user()->api_key: '' !!}">
<meta name="csrf-token" content="{!! csrf_token() !!}">
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet"/>
<link href="{{ public_asset('/assets/frontend/css/bootstrap.min.css') }}" rel="stylesheet"/>
<link href="{{ public_asset('/assets/frontend/css/now-ui-kit.css') }}" rel="stylesheet"/>
<link href="{{ public_asset('/assets/installer/css/vendor.css') }}" rel="stylesheet"/>
<link href="{{ public_asset('/assets/frontend/css/styles.css') }}" rel="stylesheet"/>
<link rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css">
<style>
.table tr:first-child td { border-top: 0px; }
@yield('css')
</style>
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-toggleable-md" style="background: #067ec1;">
<div class="container" style="width: 85%!important;">
<div class="navbar-translate">
<p class="navbar-brand text-white" data-placement="bottom" target="_blank">
<a href="{{ url('/') }}">
<img src="{{ public_asset('/assets/img/logo_blue_bg.svg') }}" width="135px" style=""/>
</a>
</p>
</div>
<div class="justify-content-center" id="navigation" style="margin-left: 50px; color: white; font-size: 20px;">
@yield('title')
</div>
</div>
</nav>
<!-- End Navbar -->
{{--<div class="clearfix" style="height: 25px;"></div>--}}
<div class="wrapper">
<div class="clear"></div>
<div class="container" style="width: 50%">
<div class="row">
<div class="col-12">
@include('installer::flash.message')
@yield('content')
</div>
</div>
</div>
<div class="clearfix" style="height: 200px;"></div>
</div>
{{--<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>--}}
<script src="{{ public_mix('/assets/global/js/vendor.js') }}"></script>
<script src="{{ public_mix('/assets/frontend/js/vendor.js') }}"></script>
<script src="{{ public_mix('/assets/frontend/js/app.js') }}"></script>
<script src="{{ public_asset('/assets/installer/js/vendor.js') }}" type="text/javascript"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>
hljs.configure({languages: ['sh']});
$(document).ready(function () {
$(".select2").select2();
$('pre code').each(function (i, block) {
hljs.fixMarkup(block);
hljs.highlightBlock(block);
});
});
</script>
@yield('scripts')
</body>
</html>

View File

@ -0,0 +1,6 @@
@if($errors->has($field))
<p class="text-danger" style="margin-top: 10px;">{{ $errors->first($field) }}</p>
{{--<div class="alert alert-danger" role="alert" style="margin-top: 10px;">
{{ $errors->first($field) }}
</div>--}}
@endif

View File

@ -0,0 +1,11 @@
@foreach (session('flash_notification', collect())->toArray() as $message)
<div class="alert alert-danger" role="alert">
<div class="container">
<div class="alert-icon">
<i class="now-ui-icons ui-2_like"></i>
</div>
{{ $message['message'] }}
</div>
</div>
@endforeach
{{ session()->forget('flash_notification') }}

View File

@ -0,0 +1,12 @@
@extends('installer::app')
@section('title', 'Update phpVMS')
@section('content')
<h2>phpvms updater</h2>
<p>Press continue to check if there are any updates available.</p>
{{ Form::open(['route' => 'update.step1', 'method' => 'post']) }}
<p style="text-align: right">
{{ Form::submit('Start >>', ['class' => 'btn btn-success']) }}
</p>
{{ Form::close() }}
@endsection

View File

@ -0,0 +1,13 @@
@extends('installer::app')
@section('title', 'Update phpVMS')
@section('content')
<h2>phpvms updater</h2>
<p>It seems like you're up to date!</p>
{{ Form::open(['route' => 'update.complete', 'method' => 'GET']) }}
<p style="text-align: right">
{{ Form::submit('Complete >>', ['class' => 'btn btn-success']) }}
</p>
{{ Form::close() }}
@endsection

View File

@ -0,0 +1,12 @@
@extends('installer::app')
@section('title', 'Update phpVMS')
@section('content')
<h2>phpvms updater</h2>
<p>Click run to complete the update!.</p>
{{ Form::open(['route' => 'update.run_migrations', 'method' => 'post']) }}
<p style="text-align: right">
{{ Form::submit('Run >>', ['class' => 'btn btn-success']) }}
</p>
{{ Form::close() }}
@endsection

View File

@ -0,0 +1,18 @@
@extends('installer::app')
@section('title', 'Update Completed')
@section('content')
<div style="align-content: center;">
{{ Form::open(['route' => 'update.complete', 'method' => 'GET']) }}
<pre class="lang-sh">
<code class="lang-sh">
{{ $console_output }}
</code>
</pre>
<p style="text-align: right">
{{ Form::submit('Complete >>', ['class' => 'btn btn-success']) }}
</p>
{{ Form::close() }}
</div>
@endsection

View File

@ -0,0 +1,13 @@
@extends('installer::app')
@section('title', 'Update Completed')
@section('content')
<h2>phpvms updater</h2>
<p>Update completed!.</p>
{{ Form::open(['route' => 'update.complete', 'method' => 'GET']) }}
<p style="text-align: right">
{{ Form::submit('Finish >>', ['class' => 'btn btn-success']) }}
</p>
{{ Form::close() }}
@endsection

View File

@ -0,0 +1,30 @@
{
"name": "phpvms/updater",
"license": "",
"type": "laravel-library",
"description": "The installer module for phpVMS",
"authors": [
{
"name": "Nabeel Shahzad",
"email": "nabeel@phpvms.net"
}
],
"require": {
"composer/installers": "~1.0"
},
"extra": {
"laravel": {
"providers": [
"Modules\\Updater\\Providers\\UpdateServiceProvider"
],
"aliases": {
}
}
},
"autoload": {
"psr-4": {
"Modules\\Installer\\": ""
}
}
}

View File

@ -0,0 +1,14 @@
{
"name": "Updater",
"alias": "updater",
"description": "",
"keywords": [],
"active": 1,
"order": 0,
"providers": [
"Modules\\Updater\\Providers\\UpdateServiceProvider"
],
"aliases": {},
"files": [],
"requires": []
}