Compare commits

..
Author SHA1 Message Date
Nabeel Shahzad e4a42c53ba Build new assets 2022-08-22 12:42:52 -05:00
Nabeel Shahzad a4b90fcce3 Add colors to the maps options 2022-08-22 12:39:31 -05:00
3112 changed files with 40633 additions and 60847 deletions
-4
View File
@@ -1,10 +1,6 @@
# #
root = true root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.js] [*.js]
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
+2
View File
@@ -30,6 +30,8 @@ env.php
Homestead.json Homestead.json
LocalValetDriver.php LocalValetDriver.php
docker-compose-profiler.yml docker-compose-profiler.yml
sync.sh
.env.*
# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer # Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer
.rocketeer/ .rocketeer/
+1
View File
@@ -6,6 +6,7 @@ language: php
php: php:
- '7.4' - '7.4'
- '7.3' - '7.3'
- '7.2'
#env: #env:
# - DB=mysql # - DB=mysql
+2 -2
View File
@@ -21,9 +21,9 @@
<directory suffix=".php">./app</directory> <directory suffix=".php">./app</directory>
</whitelist> </whitelist>
</filter> </filter>
<!--<listeners> <listeners>
<listener class="NunoMaduro\Collision\Adapters\Phpunit\Listener"/> <listener class="NunoMaduro\Collision\Adapters\Phpunit\Listener"/>
</listeners>--> </listeners>
<php> <php>
<ini name="error_reporting" value="E_ALL"/> <ini name="error_reporting" value="E_ALL"/>
<ini name="display_errors" value="On"/> <ini name="display_errors" value="On"/>
+3 -3
View File
@@ -74,9 +74,9 @@ reload-db:
tests: test tests: test
.PHONY: test .PHONY: test
test: test: phpcs
@#php artisan database:create --reset #php artisan database:create --reset
@vendor/bin/phpunit --verbose vendor/bin/phpunit --debug --verbose
.PHONY: phpcs .PHONY: phpcs
phpcs: phpcs:
+13 -10
View File
@@ -1,17 +1,20 @@
# phpVMS <sup>7</sup> # phpvms <sup>7</sup>
[![Build Status](https://travis-ci.org/nabeelio/phpvms.svg)](https://travis-ci.org/nabeelio/phpvms) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d668bebb0a3c46bda381af16ce3d9450)](https://www.codacy.com/app/nabeelio/phpvms?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nabeelio/phpvms&amp;utm_campaign=Badge_Grade) [![Latest Stable Version](https://poser.pugx.org/nabeel/phpvms/v/stable)](https://packagist.org/packages/nabeel/phpvms) ![StyleCI](https://github.styleci.io/repos/93688482/shield?branch=dev) [![License](https://poser.pugx.org/nabeel/phpvms/license)](https://packagist.org/packages/nabeel/phpvms) [![Build Status](https://travis-ci.org/nabeelio/phpvms.svg)](https://travis-ci.org/nabeelio/phpvms) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d668bebb0a3c46bda381af16ce3d9450)](https://www.codacy.com/app/nabeelio/phpvms?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nabeelio/phpvms&amp;utm_campaign=Badge_Grade) [![Latest Stable Version](https://poser.pugx.org/nabeel/phpvms/v/stable)](https://packagist.org/packages/nabeel/phpvms) ![StyleCI](https://github.styleci.io/repos/93688482/shield?branch=dev) [![License](https://poser.pugx.org/nabeel/phpvms/license)](https://packagist.org/packages/nabeel/phpvms)
The next phpvms version built on the laravel framework. work in progress. The latest documentation, with installation instructions is available [on the phpVMS documentation](https://docs.phpvms.net/) page. The next phpvms version built on the laravel framework. work in progress. The latest documentation, with installation instructions is available
[on the phpVMS documentation](http://docs.phpvms.net/) page.
## Installation # installation
A full distribution, with all of the composer dependencies, is available at this A full distribution, with all of the composer dependencies, is available at this
[GitHub Releases](https://github.com/nabeelio/phpvms/releases) link. [GitHub Releases](https://github.com/nabeelio/phpvms/releases) link.
### Requirements
- PHP 7.3+, extensions:
## Requirements
- PHP 7.1+, extensions:
- cURL - cURL
- JSON - JSON
- mbstring - mbstring
@@ -21,16 +24,16 @@ A full distribution, with all of the composer dependencies, is available at this
- Database: - Database:
- MySQL 5.5+ (or MySQL variant, including MariaDB and Percona) - MySQL 5.5+ (or MySQL variant, including MariaDB and Percona)
[View more details on requirements](https://docs.phpvms.net/requirements) [View more details on requirements](http://docs.phpvms.net/setup/requirements)
### Installer ## Installer
1. Upload to your server 1. Upload to your server
1. Visit the site, and follow the link to the installer 1. Visit the site, and follow the link to the installer
[View installation details](https://docs.phpvms.net/installation/installation) [View installation details](http://docs.phpvms.net/setup/installation)
## Development Environment # development environment
A full development environment can be brought up using Docker: A full development environment can be brought up using Docker:
@@ -47,7 +50,7 @@ Then go to `http://localhost`. If you're using dnsmasq, the `app` container is l
127.0.0.1 phpvms.test 127.0.0.1 phpvms.test
``` ```
### Building JS/CSS assets ## Building JS/CSS assets
Yarn is required, run: Yarn is required, run:
+5 -13
View File
@@ -79,29 +79,21 @@ class CreateDatabase extends Command
*/ */
protected function create_sqlite($dbkey) protected function create_sqlite($dbkey)
{ {
$dbPath = config($dbkey.'database');
// Skip if running in memory
if ($dbPath === ':memory:') {
return;
}
$exec = 'sqlite3'; $exec = 'sqlite3';
if ($this->os->isWindowsLike()) { if ($this->os->isWindowsLike()) {
$exec = 'sqlite3.exe'; $exec = 'sqlite3.exe';
} }
if ($this->option('reset') === true) { if ($this->option('reset') === true) {
if (file_exists($dbPath)) { $cmd = ['rm', '-rf', config($dbkey.'database')];
unlink(config($dbkey.'database')); $this->runCommand($cmd);
}
} }
if (!file_exists($dbPath)) { if (!file_exists(config($dbkey.'database'))) {
$cmd = [ $cmd = [
$exec, $exec,
$dbPath, config($dbkey.'database'),
'".exit"', '""',
]; ];
$this->runCommand($cmd); $this->runCommand($cmd);
+1 -15
View File
@@ -3,7 +3,7 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Contracts\Command; use App\Contracts\Command;
use Illuminate\Support\Facades\DB; use DB;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;
/** /**
@@ -25,20 +25,6 @@ class YamlExport extends Command
exit(); exit();
} }
// A "preset" for exporting the base set of data
if ($tables[0] === 'base') {
$tables = [
'airlines',
'aircraft',
'subfleets',
'subfleet_fare',
'subfleet_rank',
'bids',
'fares',
'flights',
];
}
$export_tables = []; $export_tables = [];
foreach ($tables as $table) { foreach ($tables as $table) {
$export_tables[$table] = []; $export_tables[$table] = [];
-3
View File
@@ -36,10 +36,7 @@ abstract class Award
* You don't really need to mess with anything below here * You don't really need to mess with anything below here
*/ */
/** @var \App\Models\Award|null */
protected $award; protected $award;
/** @var \App\Models\User|null */
protected $user; protected $user;
public function __construct(AwardModel $award = null, User $user = null) public function __construct(AwardModel $award = null, User $user = null)
+6 -7
View File
@@ -3,7 +3,6 @@
namespace App\Contracts; namespace App\Contracts;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use function is_array;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;
/** /**
@@ -83,9 +82,9 @@ abstract class Command extends \Illuminate\Console\Command
} }
/** /**
* @param array|string $cmd * @param $cmd
* @param bool $return * @param bool $return
* @param mixed $verbose * @param mixed $verbose
* *
* @throws \Symfony\Component\Process\Exception\RuntimeException * @throws \Symfony\Component\Process\Exception\RuntimeException
* @throws \Symfony\Component\Process\Exception\LogicException * @throws \Symfony\Component\Process\Exception\LogicException
@@ -94,16 +93,16 @@ abstract class Command extends \Illuminate\Console\Command
*/ */
public function runCommand($cmd, $return = false, $verbose = true): string public function runCommand($cmd, $return = false, $verbose = true): string
{ {
if (is_array($cmd)) { if (\is_array($cmd)) {
$cmd = implode(' ', $cmd); $cmd = implode(' ', $cmd);
} }
if ($verbose) { if ($verbose) {
$this->info('Running '.$cmd); $this->info('Running "'.$cmd.'"');
} }
$val = ''; $val = '';
$process = Process::fromShellCommandline($cmd); $process = new Process($cmd);
$process->run(function ($type, $buffer) use ($return, &$val) { $process->run(function ($type, $buffer) use ($return, &$val) {
if ($return) { if ($return) {
$val .= $buffer; $val .= $buffer;
-12
View File
@@ -1,12 +0,0 @@
<?php
namespace App\Contracts;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class Event
{
use Dispatchable;
use SerializesModels;
}
+4 -4
View File
@@ -3,9 +3,9 @@
namespace App\Contracts; namespace App\Contracts;
use App\Models\Airline; use App\Models\Airline;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Log;
use Validator;
/** /**
* Common functionality used across all of the importers * Common functionality used across all of the importers
@@ -51,9 +51,9 @@ class ImportExport
* *
* @param $code * @param $code
* *
* @return Airline * @return \Illuminate\Database\Eloquent\Model
*/ */
public function getAirline($code): Airline public function getAirline($code)
{ {
$airline = Airline::firstOrCreate([ $airline = Airline::firstOrCreate([
'icao' => $code, 'icao' => $code,
+1 -1
View File
@@ -16,7 +16,7 @@ abstract class Listener
public function subscribe(Dispatcher $events): void public function subscribe(Dispatcher $events): void
{ {
foreach (static::$callbacks as $klass => $cb) { foreach (static::$callbacks as $klass => $cb) {
$events->listen($klass, static::class.'@'.$cb); $events->listen($klass, get_class($this).'@'.$cb);
} }
} }
} }
+3 -48
View File
@@ -2,13 +2,9 @@
namespace App\Contracts; namespace App\Contracts;
use App\Models\Module;
use App\Support\Database; use App\Support\Database;
use Exception; use DB;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
/** /**
* Class Migration * Class Migration
@@ -29,29 +25,6 @@ abstract class Migration extends \Illuminate\Database\Migrations\Migration
{ {
} }
/**
* Add a module and enable it
*
* @param array $attrs
*/
public function addModule(array $attrs)
{
$module = array_merge([
'enabled' => true,
'created_at' => DB::raw('NOW()'),
'updated_at' => DB::raw('NOW()'),
], $attrs);
try {
DB::table('modules')->insert($module);
} catch (Exception $e) {
// setting already exists, just ignore it
if ($e->getCode() === 23000) {
return;
}
}
}
/** /**
* Seed a YAML file into the database * Seed a YAML file into the database
* *
@@ -62,7 +35,7 @@ abstract class Migration extends \Illuminate\Database\Migrations\Migration
try { try {
$path = base_path($file); $path = base_path($file);
Database::seed_from_yaml_file($path, false); Database::seed_from_yaml_file($path, false);
} catch (Exception $e) { } catch (\Exception $e) {
Log::error('Unable to load '.$file.' file'); Log::error('Unable to load '.$file.' file');
Log::error($e); Log::error($e);
} }
@@ -79,7 +52,7 @@ abstract class Migration extends \Illuminate\Database\Migrations\Migration
foreach ($rows as $row) { foreach ($rows as $row) {
try { try {
DB::table($table)->insert($row); DB::table($table)->insert($row);
} catch (Exception $e) { } catch (\Exception $e) {
// setting already exists, just ignore it // setting already exists, just ignore it
if ($e->getCode() === 23000) { if ($e->getCode() === 23000) {
continue; continue;
@@ -87,22 +60,4 @@ abstract class Migration extends \Illuminate\Database\Migrations\Migration
} }
} }
} }
/**
* Add an award from the migrations (for example, if you're adding an award module)
*
* @param array $award See \App\Models\Awardv
*
* @throws \Illuminate\Validation\ValidationException
*/
public function addAward(array $award)
{
$validator = Validator::make($award, \App\Models\Award::$rules);
if ($validator->fails()) {
throw new ValidationException($validator);
}
$awardModel = new \App\Models\Award($award);
$awardModel->save();
}
} }
-49
View File
@@ -1,49 +0,0 @@
<?php
namespace App\Contracts\Modules;
/**
* Base class for module service providers
* Add-on module service providers must extend this class. Docs on Service Providers:
* https://laravel.com/docs/7.x/providers
*
* For a sample service provider, view the sample module one:
* https://github.com/nabeelio/phpvms-module/blob/master/Providers/SampleServiceProvider.php
*/
abstract class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
/**
* A boot method is required, even if it doesn't do anything.
* https://laravel.com/docs/7.x/providers#the-boot-method
*
* This is normally where you'd register the routes or other startup tasks for your module
*/
public function boot(): void
{
}
/**
* This is required to register the links in either the public or admin toolbar
* For example, adding a frontend link:
*
* $this->moduleSvc->addFrontendLink('Sample', '/sample', '', $logged_in=true);
*
* Or an admin link:
*
* $this->moduleSvc->addAdminLink('Sample', '/admin/sample');
*/
public function registerLinks(): void
{
}
/**
* Deferred providers:
* https://laravel.com/docs/7.x/providers#deferred-providers
*
* @return array
*/
public function provides(): array
{
return [];
}
}
+1 -3
View File
@@ -2,12 +2,10 @@
namespace App\Contracts; namespace App\Contracts;
use Illuminate\Http\Resources\Json\JsonResource;
/** /**
* Base class for a resource/response * Base class for a resource/response
*/ */
class Resource extends JsonResource class Resource extends \Illuminate\Http\Resources\Json\Resource
{ {
/** /**
* Iterate through the list of $fields and check if they're a "Unit" * Iterate through the list of $fields and check if they're a "Unit"
+5 -11
View File
@@ -1,30 +1,24 @@
<?php <?php
use App\Models\Airport;
use App\Models\Enums\AircraftState;
use App\Models\Enums\AircraftStatus;
use App\Models\Subfleet;
use App\Support\ICAO;
use Faker\Generator as Faker; use Faker\Generator as Faker;
$factory->define(App\Models\Aircraft::class, function (Faker $faker) { $factory->define(App\Models\Aircraft::class, function (Faker $faker) {
return [ return [
'id' => null, 'id' => null,
'subfleet_id' => function () { 'subfleet_id' => function () {
return factory(Subfleet::class)->create()->id; return factory(App\Models\Subfleet::class)->create()->id;
}, },
'airport_id' => function () { 'airport_id' => function () {
return factory(Airport::class)->create()->id; return factory(App\Models\Airport::class)->create()->id;
}, },
'iata' => $faker->unique()->text(5), 'iata' => $faker->unique()->text(5),
'icao' => $faker->unique()->text(5), 'icao' => $faker->unique()->text(5),
'name' => $faker->text(50), 'name' => $faker->text(50),
'registration' => $faker->unique()->text(10), 'registration' => $faker->unique()->text(10),
'hex_code' => ICAO::createHexCode(), 'hex_code' => \App\Support\ICAO::createHexCode(),
'mtow' => $faker->randomFloat(2, 0, 50000),
'zfw' => $faker->randomFloat(2, 0, 50000), 'zfw' => $faker->randomFloat(2, 0, 50000),
'status' => AircraftStatus::ACTIVE, 'status' => \App\Models\Enums\AircraftStatus::ACTIVE,
'state' => AircraftState::PARKED, 'state' => \App\Models\Enums\AircraftState::PARKED,
'created_at' => $faker->dateTimeBetween('-1 week', 'now'), 'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'updated_at' => function (array $pirep) { 'updated_at' => function (array $pirep) {
return $pirep['created_at']; return $pirep['created_at'];
+1 -1
View File
@@ -9,7 +9,7 @@ use Hashids\Hashids;
$factory->define(App\Models\Airline::class, function (Faker $faker) { $factory->define(App\Models\Airline::class, function (Faker $faker) {
return [ return [
'id' => null, 'id' => null,
'icao' => function (array $apt) { 'icao' => function (array $apt) use ($faker) {
$hashids = new Hashids(microtime(), 5); $hashids = new Hashids(microtime(), 5);
$mt = str_replace('.', '', microtime(true)); $mt = str_replace('.', '', microtime(true));
+4 -4
View File
@@ -8,19 +8,19 @@ $factory->define(App\Models\Flight::class, function (Faker $faker) {
return [ return [
'id' => $faker->unique()->numberBetween(10, 10000000), 'id' => $faker->unique()->numberBetween(10, 10000000),
'airline_id' => function () { 'airline_id' => function () {
return factory(\App\Models\Airline::class)->create()->id; return factory(App\Models\Airline::class)->create()->id;
}, },
'flight_number' => $faker->unique()->numberBetween(10, 1000000), 'flight_number' => $faker->unique()->numberBetween(10, 1000000),
'route_code' => $faker->randomElement(['', $faker->text(5)]), 'route_code' => $faker->randomElement(['', $faker->text(5)]),
'route_leg' => $faker->randomElement(['', $faker->numberBetween(0, 1000)]), 'route_leg' => $faker->randomElement(['', $faker->numberBetween(0, 1000)]),
'dpt_airport_id' => function () { 'dpt_airport_id' => function () {
return factory(\App\Models\Airport::class)->create()->id; return factory(App\Models\Airport::class)->create()->id;
}, },
'arr_airport_id' => function () { 'arr_airport_id' => function () {
return factory(\App\Models\Airport::class)->create()->id; return factory(App\Models\Airport::class)->create()->id;
}, },
'alt_airport_id' => function () { 'alt_airport_id' => function () {
return factory(\App\Models\Airport::class)->create()->id; return factory(App\Models\Airport::class)->create()->id;
}, },
'distance' => $faker->numberBetween(1, 1000), 'distance' => $faker->numberBetween(1, 1000),
'route' => null, 'route' => null,
@@ -6,7 +6,7 @@ $factory->define(App\Models\JournalTransactions::class, function (Faker $faker)
return [ return [
'transaction_group' => \Ramsey\Uuid\Uuid::uuid4()->toString(), 'transaction_group' => \Ramsey\Uuid\Uuid::uuid4()->toString(),
'journal_id' => function () { 'journal_id' => function () {
return factory(\App\Models\Journal::class)->create()->id; return factory(App\Models\Journal::class)->create()->id;
}, },
'credit' => $faker->numberBetween(100, 10000), 'credit' => $faker->numberBetween(100, 10000),
'debit' => $faker->numberBetween(100, 10000), 'debit' => $faker->numberBetween(100, 10000),
+1 -1
View File
@@ -6,7 +6,7 @@ $factory->define(App\Models\News::class, function (Faker $faker) {
return [ return [
'id' => null, 'id' => null,
'user_id' => function () { 'user_id' => function () {
return factory(\App\Models\User::class)->create()->id; return factory(App\Models\User::class)->create()->id;
}, },
'subject' => $faker->text(), 'subject' => $faker->text(),
'body' => $faker->sentence, 'body' => $faker->sentence,
+4 -4
View File
@@ -10,8 +10,8 @@ use Faker\Generator as Faker;
* Create a new PIREP * Create a new PIREP
*/ */
$factory->define(App\Models\Pirep::class, function (Faker $faker) { $factory->define(App\Models\Pirep::class, function (Faker $faker) {
$airline = factory(\App\Models\Airline::class)->create(); $airline = factory(App\Models\Airline::class)->create();
$flight = factory(\App\Models\Flight::class)->create([ $flight = factory(App\Models\Flight::class)->create([
'airline_id' => $airline->id, 'airline_id' => $airline->id,
]); ]);
@@ -21,10 +21,10 @@ $factory->define(App\Models\Pirep::class, function (Faker $faker) {
return $airline->id; return $airline->id;
}, },
'user_id' => function () { 'user_id' => function () {
return factory(\App\Models\User::class)->create()->id; return factory(App\Models\User::class)->create()->id;
}, },
'aircraft_id' => function () { 'aircraft_id' => function () {
return factory(\App\Models\Aircraft::class)->create()->id; return factory(App\Models\Aircraft::class)->create()->id;
}, },
'flight_id' => function () use ($flight) { 'flight_id' => function () use ($flight) {
return $flight->id; return $flight->id;
+1 -1
View File
@@ -6,7 +6,7 @@ $factory->define(App\Models\Subfleet::class, function (Faker $faker) {
return [ return [
'id' => null, 'id' => null,
'airline_id' => function () { 'airline_id' => function () {
return factory(\App\Models\Airline::class)->create()->id; return factory(App\Models\Airline::class)->create()->id;
}, },
'name' => $faker->unique()->text(50), 'name' => $faker->unique()->text(50),
'type' => $faker->unique()->text(7), 'type' => $faker->unique()->text(7),
+1 -3
View File
@@ -1,9 +1,7 @@
<?php <?php
use App\Models\Airline;
use App\Models\Enums\UserState; use App\Models\Enums\UserState;
use Faker\Generator as Faker; use Faker\Generator as Faker;
use Illuminate\Support\Facades\Hash;
$factory->define(App\Models\User::class, function (Faker $faker) { $factory->define(App\Models\User::class, function (Faker $faker) {
static $password; static $password;
@@ -16,7 +14,7 @@ $factory->define(App\Models\User::class, function (Faker $faker) {
'password' => $password ?: $password = Hash::make('secret'), 'password' => $password ?: $password = Hash::make('secret'),
'api_key' => $faker->sha1, 'api_key' => $faker->sha1,
'airline_id' => function () { 'airline_id' => function () {
return factory(Airline::class)->create()->id; return factory(App\Models\Airline::class)->create()->id;
}, },
'rank_id' => 1, 'rank_id' => 1,
'flights' => $faker->numberBetween(0, 1000), 'flights' => $faker->numberBetween(0, 1000),
@@ -3,15 +3,12 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use Modules\Awards\Awards\PilotFlightAwards;
class CreateAwardsTable extends Migration class CreateAwardsTable extends Migration
{ {
/** /**
* Run the migrations. * Run the migrations.
* *
* @throws \Illuminate\Validation\ValidationException
*
* @return void * @return void
*/ */
public function up() public function up()
@@ -26,6 +23,7 @@ class CreateAwardsTable extends Migration
// EG, the airports has an internal expense for gate costs // EG, the airports has an internal expense for gate costs
$table->string('ref_model')->nullable(); $table->string('ref_model')->nullable();
$table->text('ref_model_params')->nullable(); $table->text('ref_model_params')->nullable();
//$table->string('ref_model_id', 36)->nullable();
$table->timestamps(); $table->timestamps();
@@ -40,18 +38,6 @@ class CreateAwardsTable extends Migration
$table->index(['user_id', 'award_id']); $table->index(['user_id', 'award_id']);
}); });
/**
* Add a default, sample award
*/
$award = [
'name' => 'Pilot 50 flights',
'description' => 'When a pilot has 50 flights, give this award',
'ref_model' => PilotFlightAwards::class,
'ref_model_params' => 50,
];
$this->addAward($award);
} }
/** /**
@@ -1,6 +1,5 @@
<?php <?php
use App\Models\Enums\PageType;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
@@ -23,7 +22,7 @@ class CreatePages extends Migration
$table->string('name'); $table->string('name');
$table->string('slug'); $table->string('slug');
$table->string('icon'); $table->string('icon');
$table->unsignedSmallInteger('type')->default(PageType::PAGE); $table->unsignedSmallInteger('type');
$table->boolean('public'); $table->boolean('public');
$table->boolean('enabled'); $table->boolean('enabled');
$table->mediumText('body'); $table->mediumText('body');
@@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class PagesAddLink extends Migration
{
/**
* Add a `link` column and make the body optional. Also add a "new_window" bool
* which determines if we open this link in a new window or not
*/
public function up()
{
Schema::table('pages', function (Blueprint $table) {
$table->string('body')->change()->nullable();
$table->string('link')
->default('')
->nullable()
->after('body');
$table->boolean('new_window')->default(false);
});
}
/**
* @return void
*/
public function down()
{
Schema::table('fares', function (Blueprint $table) {
$table->dropColumn('link');
$table->dropColumn('new_window');
});
}
}
@@ -1,49 +0,0 @@
<?php
use App\Contracts\Model;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUserFields extends Migration
{
/**
* Add two tables for holding user fields and the values
*/
public function up()
{
/*
* Hold a master list of fields
*/
Schema::create('user_fields', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 200);
$table->text('description')->nullable();
$table->boolean('show_on_registration')->default(false)->nullable();
$table->boolean('required')->default(false)->nullable();
$table->boolean('private')->default(false)->nullable();
$table->boolean('active')->default(true)->nullable();
$table->timestamps();
});
/*
* The values for the actual fields
*/
Schema::create('user_field_values', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_field_id');
$table->string('user_id', Model::ID_MAX_LENGTH);
$table->text('value')->nullable();
$table->timestamps();
$table->index(['user_field_id', 'user_id']);
});
}
/**
* @return void
*/
public function down()
{
}
}
@@ -1,33 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Add a `mtow` column for the max takeoff weight
*/
class AircraftAddMtow extends Migration
{
public function up()
{
Schema::table('aircraft', function (Blueprint $table) {
$table->unsignedDecimal('mtow')
->nullable()
->default(0.0)
->after('hex_code');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('aircraft', function (Blueprint $table) {
$table->dropColumn('mtow');
});
}
}
@@ -1,39 +0,0 @@
<?php
use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateModulesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('modules', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->boolean('enabled')->default(1);
$table->timestamps();
});
$this->addModule(['name' => 'Awards']);
$this->addModule(['name' => 'Sample']);
$this->addModule(['name' => 'VMSAcars']);
$this->addModule(['name' => 'Vacentral']);
$this->addModule(['name' => 'TestModule']);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('modules');
}
}
+3 -15
View File
@@ -1,21 +1,15 @@
<?php <?php
use App\Services\Installer\MigrationService;
use App\Services\Installer\SeederService; use App\Services\Installer\SeederService;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder class DatabaseSeeder extends Seeder
{ {
/** @var MigrationService */ private $seederService;
private $migrationSvc;
/** @var SeederService */
private $seederSvc;
public function __construct() public function __construct()
{ {
$this->migrationSvc = app(MigrationService::class); $this->seederService = app(SeederService::class);
$this->seederSvc = app(SeederService::class);
} }
/** /**
@@ -25,12 +19,6 @@ class DatabaseSeeder extends Seeder
*/ */
public function run() public function run()
{ {
// Make sure any migrations that need to be run are run/cleared out $this->seederService->syncAllSeeds();
if ($this->migrationSvc->migrationsAvailable()) {
$this->migrationSvc->runAllMigrations();
}
// Then sync all of the seeds
$this->seederSvc->syncAllSeeds();
} }
} }
-1
View File
@@ -1,2 +1 @@
local.yml local.yml
vmsacars.yml
-8
View File
@@ -12,11 +12,3 @@ airlines:
active: 1 active: 1
created_at: now created_at: now
updated_at: now updated_at: now
- id: 2
icao: XXX
iata: XX
name: inactive airline
country: us
active: 0
created_at: now
updated_at: now
+71 -273
View File
@@ -1,10 +1,30 @@
#airlines:
# - id: 1
# icao: VMS
# iata: VM
# name: phpvms airlines
# country: us
# active: 1
# created_at: now
# updated_at: now
roles: roles:
id_column: name id_column: name
data: data:
- name: fleet-only - name: fleet-only
display_name: Edit Fleet display_name: Edit Fleet
awards:
- id: 1
name: Pilot 50 flights
description: When a pilot has 50 flights, give this award
image_url:
ref_model: Modules\Awards\Awards\PilotFlightAwards
ref_model_params: 50
created_at: now
updated_at: now
news: news:
- id: 1 - id: 1
user_id: 1 user_id: 1
@@ -116,91 +136,34 @@ airports:
ground_handling_cost: 50 ground_handling_cost: 50
# #
aircraft: aircraft:
- - id: 1
id: 1
subfleet_id: 1 subfleet_id: 1
icao: null
iata: null
airport_id: KJFK airport_id: KJFK
landing_time: '2020-10-23 07:50:16' name: Boeing 747-438
name: 'Boeing 747-438'
registration: 001Z registration: 001Z
hex_code: null flight_time: 360
mtow: '0.00'
zfw: '0.00'
flight_time: 540
status: A status: A
state: 0 - id: 2
created_at: null
updated_at: '2020-10-23 07:50:16'
-
id: 2
subfleet_id: 2 subfleet_id: 2
icao: null
iata: null
airport_id: LGRP airport_id: LGRP
landing_time: null name: Boeing 777-200
name: 'Boeing 777-200'
registration: C202 registration: C202
hex_code: null
mtow: '0.00'
zfw: '0.00'
flight_time: 260 flight_time: 260
status: A status: A
state: 0 - id: 3
created_at: null
updated_at: null
-
id: 3
subfleet_id: 1 subfleet_id: 1
icao: null
iata: null
airport_id: KAUS airport_id: KAUS
landing_time: '2020-10-24 08:50:13' name: Boeing 747-412
name: 'Boeing 747-412'
registration: S2333 registration: S2333
hex_code: null
mtow: '0.00'
zfw: '0.00'
flight_time: 180
status: A
state: 0
created_at: null
updated_at: '2020-10-24 08:50:13'
-
id: 4
subfleet_id: 1
icao: null
iata: null
airport_id: KAUS
landing_time: null
name: 'Boeing 747-436 RETIRED'
registration: null
hex_code: null
mtow: '0.00'
zfw: '0.00'
flight_time: 45
status: R
state: 0
created_at: null
updated_at: null
-
id: 5
subfleet_id: 4
icao: A320
iata: '320'
airport_id: EGLL
landing_time: null
name: 'Airbus A320'
registration: N786DL
hex_code: b47165dd
mtow: '78800.00'
zfw: '62500.00'
flight_time: 0 flight_time: 0
status: A status: A
state: 0 - id: 4
created_at: '2020-10-22 13:38:50' subfleet_id: 1
updated_at: '2020-10-22 13:38:50' airport_id: KAUS
name: Boeing 747-436 RETIRED
registration:
flight_time: 45
status: R
expenses: expenses:
- name: Per-Flight (no muliplier) - name: Per-Flight (no muliplier)
@@ -257,192 +220,68 @@ expenses:
updated_at: now updated_at: now
fares: fares:
- - id: 1
id: 1 code: Y
code: 'Y'
name: Economy name: Economy
price: '100.00' price: 100
cost: '0.00'
capacity: 200 capacity: 200
type: 0 - id: 2
notes: null
active: 1
created_at: null
updated_at: null
-
id: 2
code: B code: B
name: Business name: Business
price: '500.00' price: 500
cost: '0.00'
capacity: 10 capacity: 10
type: 0 - id: 3
notes: null
active: 1
created_at: null
updated_at: null
-
id: 3
code: F code: F
name: First-Class name: First-Class
price: '800.00' price: 800
cost: '0.00'
capacity: 5 capacity: 5
type: 0
notes: null
active: 1
created_at: null
updated_at: null
subfleets: subfleets:
- - id: 1
id: 1
airline_id: 1 airline_id: 1
name: 747-43X RB211-524G
type: 744-3X-RB211 type: 744-3X-RB211
name: '747-43X RB211-524G' cost_block_hour: 1000
cost_block_hour: '1000.00' ground_handling_multiplier: 200
cost_delay_minute: '0.00' - id: 2
fuel_type: null
ground_handling_multiplier: '200.00'
cargo_capacity: null
fuel_capacity: null
gross_weight: null
created_at: null
updated_at: null
-
id: 2
airline_id: 1 airline_id: 1
name: 777-222ER GE90-76B
type: 772-22ER-GE90-76B type: 772-22ER-GE90-76B
name: '777-222ER GE90-76B' cost_block_hour: 500
cost_block_hour: '500.00' ground_handling_multiplier: 150
cost_delay_minute: '0.00' - id: 3
fuel_type: null
ground_handling_multiplier: '150.00'
cargo_capacity: null
fuel_capacity: null
gross_weight: null
created_at: null
updated_at: null
-
id: 3
airline_id: 1 airline_id: 1
name: 777-367 ER GE90-115B
type: 772-36ER-GE90-115B type: 772-36ER-GE90-115B
name: '777-367 ER GE90-115B' cost_block_hour: 100
cost_block_hour: '100.00' ground_handling_multiplier: 150
cost_delay_minute: '0.00'
fuel_type: null
ground_handling_multiplier: '150.00'
cargo_capacity: null
fuel_capacity: null
gross_weight: null
created_at: null
updated_at: null
-
id: 4
airline_id: 1
type: A320
name: A320
cost_block_hour: '2300.00'
cost_delay_minute: null
fuel_type: 1
ground_handling_multiplier: '100.00'
cargo_capacity: null
fuel_capacity: null
gross_weight: null
created_at: '2020-10-22 13:36:49'
updated_at: '2020-10-22 13:36:49'
# add a few mods to aircraft and fares
subfleet_fare: subfleet_fare:
-
subfleet_id: 1 # Fare classes on the 747
- subfleet_id: 1
fare_id: 1 fare_id: 1
price: '200' price: 200
cost: null capacity: 400
capacity: '400' - subfleet_id: 1
created_at: null
updated_at: null
-
subfleet_id: 1
fare_id: 2 fare_id: 2
price: 120% price: 120%
cost: null - subfleet_id: 1
capacity: null
created_at: null
updated_at: null
-
subfleet_id: 1
fare_id: 3 fare_id: 3
price: '1000' price: 1000
cost: null
capacity: 110% capacity: 110%
created_at: null
updated_at: null # Fare classes on the 777
- - subfleet_id: 2
subfleet_id: 2
fare_id: 1 fare_id: 1
price: null - subfleet_id: 2
cost: null
capacity: null
created_at: null
updated_at: null
-
subfleet_id: 2
fare_id: 3 fare_id: 3
price: null capacity: 10
cost: null
capacity: '10'
created_at: null
updated_at: null
-
subfleet_id: 4
fare_id: 1
price: null
cost: null
capacity: '123'
created_at: null
updated_at: null
-
subfleet_id: 4
fare_id: 2
price: null
cost: null
capacity: '8'
created_at: null
updated_at: null
-
subfleet_id: 4
fare_id: 3
price: null
cost: null
capacity: '2'
created_at: null
updated_at: null
subfleet_rank: subfleet_rank:
- - rank_id: 1
rank_id: 1
subfleet_id: 1 subfleet_id: 1
acars_pay: null
manual_pay: null
-
rank_id: 1
subfleet_id: 4
acars_pay: null
manual_pay: null
-
rank_id: 2
subfleet_id: 4
acars_pay: null
manual_pay: null
-
rank_id: 3
subfleet_id: 4
acars_pay: null
manual_pay: null
-
rank_id: 4
subfleet_id: 4
acars_pay: null
manual_pay: null
flights: flights:
- id: flightid_1 - id: flightid_1
@@ -520,35 +359,6 @@ flights:
route: 'MLY5 KEMBO UG442 SIA UG633 OTEKO UR640 NALRO GUBEL3' route: 'MLY5 KEMBO UG442 SIA UG633 OTEKO UR640 NALRO GUBEL3'
created_at: NOW created_at: NOW
updated_at: NOW updated_at: NOW
-
id: q8mvZ5vdExoy0mQG
airline_id: 1
flight_number: 3003
route_code: null
route_leg: null
dpt_airport_id: KSEA
arr_airport_id: KPAE
alt_airport_id: null
dpt_time: '8:00'
arr_time: '8:45'
level: null
distance: '27.51'
flight_time: 45
flight_type: J
load_factor: null
load_factor_variance: null
route: null
pilot_pay: null
notes: null
scheduled: 0
days: null
start_date: null
end_date: null
has_bid: 1
active: 1
visible: 1
created_at: now
updated_at: now
flight_fields: flight_fields:
- name: Departure Terminal - name: Departure Terminal
@@ -579,24 +389,12 @@ flight_subfleet:
flight_id: flightid_4 flight_id: flightid_4
bids: bids:
- - id: 100
id: 100
user_id: 1 user_id: 1
flight_id: flightid_1 flight_id: flightid_1
created_at: now - id: 101
updated_at: now
-
id: 101
user_id: 1 user_id: 1
flight_id: flightid_3 flight_id: flightid_3
created_at: now
updated_at: now
-
id: 102
user_id: 1
flight_id: q8mvZ5vdExoy0mQG
created_at: now
updated_at: now
pireps: pireps:
- id: pirepid_1 - id: pirepid_1
-30
View File
@@ -69,33 +69,3 @@ role_user:
- user_id: 3 - user_id: 3
role_id: 2 role_id: 2
user_type: App\Models\User user_type: App\Models\User
user_fields:
- id: 1
name: 'VATSIM ID'
show_on_registration: true
required: false
private: false
- id: 2
name: 'Referral'
description: 'Who referred you'
show_on_registration: true
required: false
private: true
user_field_values:
- id: 1
user_field_id: 1
user_id: 1
value: 'my vatsim id'
- id: 2
user_field_id: 2
user_id: 1
value: 'Nobody did'
user_awards:
- id: 1
user_id: 1
award_id: 1
created_at: now
updated_at: now
-10
View File
@@ -1,10 +0,0 @@
- name: 'Awards'
enabled: 1
- name: 'Sample'
enabled: 1
- name: 'VMSAcars'
enabled: 1
- name: 'Vacentral'
enabled: 1
- name: 'TestModule'
enabled: 1
-6
View File
@@ -3,9 +3,6 @@
- name: admin-access - name: admin-access
display_name: Admin Panel display_name: Admin Panel
description: Access the admin panel description: Access the admin panel
- name: aircraft
display_name: Aircraft
description: Create/edit aircraft
- name: airlines - name: airlines
display_name: Airlines display_name: Airlines
description: Create/edit airlines description: Create/edit airlines
@@ -51,6 +48,3 @@
- name: maintenance - name: maintenance
display_name: Maintenance display_name: Maintenance
description: Run maintenance tasks description: Run maintenance tasks
- name: modules
display_name: Modules
description: Add/Edit Modules
-21
View File
@@ -26,13 +26,6 @@
options: options:
type: boolean type: boolean
description: If an airport isn't added, try to look it up when adding schedules description: If an airport isn't added, try to look it up when adding schedules
- key: general.allow_unadded_airports
name: 'Allow unadded airports'
group: general
value: false
options:
type: boolean
description: If an un-added airport is used, it is looked up and added
- key: general.check_prerelease_version - key: general.check_prerelease_version
name: 'Pre-release versions in version check' name: 'Pre-release versions in version check'
group: general group: general
@@ -130,20 +123,6 @@
options: '' options: ''
type: int type: int
description: 'Initial zoom level on the map' description: 'Initial zoom level on the map'
- key: airports.default_ground_handling_cost
name: 'Default Ground Handling Cost'
group: airports
value: 250
options:
type: int
description: If an airport's Ground Handling Cost Cost isn't added, set this value by default
- key: airports.default_jet_a_fuel_cost
name: 'Default Jet A Fuel Cost'
group: airports
value: 0.7
options:
type: text
description: If an airport's Jet A Fuel Cost isn't added, set this value by default
- key: bids.disable_flight_on_bid - key: bids.disable_flight_on_bid
name: 'Disable flight on bid' name: 'Disable flight on bid'
group: bids group: bids
-22
View File
@@ -1,22 +0,0 @@
<?php
namespace App\Events;
use App\Contracts\Event;
use App\Models\Acars;
use App\Models\Pirep;
class AcarsUpdate extends Event
{
/** @var Pirep */
public $pirep;
/** @var Acars */
public $acars;
public function __construct(Pirep $pirep, Acars $acars)
{
$this->pirep = $pirep;
$this->acars = $acars;
}
}
+7 -5
View File
@@ -2,11 +2,13 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event; use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/** class BaseEvent
* @deprecated Extend App\Contracts\Event directly
*/
class BaseEvent extends Event
{ {
use Dispatchable;
use InteractsWithSockets;
use SerializesModels;
} }
+1 -3
View File
@@ -2,8 +2,6 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event; class CronHourly extends BaseEvent
class CronHourly extends Event
{ {
} }
+1 -3
View File
@@ -2,12 +2,10 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
/** /**
* This event is dispatched when the monthly cron is run * This event is dispatched when the monthly cron is run
* It happens after all of the default nightly tasks * It happens after all of the default nightly tasks
*/ */
class CronMonthly extends Event class CronMonthly extends BaseEvent
{ {
} }
+1 -3
View File
@@ -2,12 +2,10 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
/** /**
* This event is dispatched when the daily cron is run * This event is dispatched when the daily cron is run
* It happens after all of the default nightly tasks * It happens after all of the default nightly tasks
*/ */
class CronNightly extends Event class CronNightly extends BaseEvent
{ {
} }
+1 -3
View File
@@ -2,13 +2,11 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
/** /**
* This event is dispatched when the weekly cron is run * This event is dispatched when the weekly cron is run
* It happens after all of the default nightly tasks * It happens after all of the default nightly tasks
*/ */
class CronWeekly extends Event class CronWeekly extends BaseEvent
{ {
public function __construct() public function __construct()
{ {
+1 -2
View File
@@ -2,7 +2,6 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
/** /**
@@ -26,7 +25,7 @@ use App\Models\Pirep;
* *
* The event will have a copy of the PIREP model, if it's applicable * The event will have a copy of the PIREP model, if it's applicable
*/ */
class Expenses extends Event class Expenses extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\News; use App\Models\News;
class NewsAdded extends Event class NewsAdded extends BaseEvent
{ {
public $news; public $news;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
class PirepAccepted extends Event class PirepAccepted extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
class PirepCancelled extends Event class PirepCancelled extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
class PirepFiled extends Event class PirepFiled extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
class PirepPrefiled extends Event class PirepPrefiled extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
class PirepRejected extends Event class PirepRejected extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\Pirep; use App\Models\Pirep;
class PirepUpdated extends Event class PirepUpdated extends BaseEvent
{ {
public $pirep; public $pirep;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\User; use App\Models\User;
class TestEvent extends Event class TestEvent extends BaseEvent
{ {
public $user; public $user;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\User; use App\Models\User;
class UserAccepted extends Event class UserAccepted extends BaseEvent
{ {
public $user; public $user;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\User; use App\Models\User;
class UserRegistered extends Event class UserRegistered extends BaseEvent
{ {
public $user; public $user;
+1 -2
View File
@@ -2,13 +2,12 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\User; use App\Models\User;
/** /**
* Event triggered when a user's state changes * Event triggered when a user's state changes
*/ */
class UserStateChanged extends Event class UserStateChanged extends BaseEvent
{ {
public $old_state; public $old_state;
public $user; public $user;
+1 -2
View File
@@ -2,10 +2,9 @@
namespace App\Events; namespace App\Events;
use App\Contracts\Event;
use App\Models\User; use App\Models\User;
class UserStatsChanged extends Event class UserStatsChanged extends BaseEvent
{ {
public $stat_name; public $stat_name;
public $old_value; public $old_value;
-47
View File
@@ -1,47 +0,0 @@
<?php
namespace App\Exceptions;
use App\Models\Aircraft;
class AircraftInvalid extends AbstractHttpException
{
public const MESSAGE = 'The supplied aircraft is invalid';
private $aircraft;
public function __construct(Aircraft $aircraft)
{
$this->aircraft = $aircraft;
parent::__construct(
400,
static::MESSAGE
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'aircraft-invalid';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [
'aircraft_id' => optional($this->aircraft)->id,
];
}
}
@@ -3,13 +3,13 @@
namespace App\Exceptions\Converters; namespace App\Exceptions\Converters;
use App\Exceptions\AbstractHttpException; use App\Exceptions\AbstractHttpException;
use Throwable; use Exception;
class GenericExceptionAbstract extends AbstractHttpException class GenericExceptionAbstract extends AbstractHttpException
{ {
private $exception; private $exception;
public function __construct(Throwable $exception) public function __construct(Exception $exception)
{ {
$this->exception = $exception; $this->exception = $exception;
parent::__construct( parent::__construct(
@@ -18,7 +18,7 @@ class ValidationException extends AbstractHttpException
parent::__construct( parent::__construct(
400, 400,
'Validation Error' 'Validation exception'
); );
} }
+37 -10
View File
@@ -5,7 +5,8 @@ namespace App\Exceptions;
use App\Exceptions\Converters\GenericExceptionAbstract; use App\Exceptions\Converters\GenericExceptionAbstract;
use App\Exceptions\Converters\SymfonyException; use App\Exceptions\Converters\SymfonyException;
use App\Exceptions\Converters\ValidationException; use App\Exceptions\Converters\ValidationException;
use App\Http\Middleware\SetActiveTheme; use Exception;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\AuthenticationException; use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Database\Eloquent\ModelNotFoundException;
@@ -14,9 +15,10 @@ use Illuminate\Http\Request;
use Illuminate\Session\TokenMismatchException; use Illuminate\Session\TokenMismatchException;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException as IlluminateValidationException; use Illuminate\Validation\ValidationException as IlluminateValidationException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException as SymfonyHttpException; use Symfony\Component\HttpKernel\Exception\HttpException as SymfonyHttpException;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Throwable;
use Whoops\Handler\HandlerInterface; use Whoops\Handler\HandlerInterface;
/** /**
@@ -40,19 +42,19 @@ class Handler extends ExceptionHandler
/** /**
* Render an exception into an HTTP response. * Render an exception into an HTTP response.
* *
* @param Request $request * @param Request $request
* @param \Throwable $exception * @param Exception $exception
* *
* @return mixed * @return mixed
*/ */
public function render($request, Throwable $exception) public function render($request, Exception $exception)
{ {
if ($request->is('api/*')) { if ($request->is('api/*')) {
return $this->handleApiError($request, $exception); return $this->handleApiError($request, $exception);
} }
(new SetActiveTheme())->setTheme($request); if ($exception instanceof AbstractHttpException
if ($exception instanceof AbstractHttpException && $exception->getStatusCode() === 403) { && $exception->getStatusCode() === 403) {
return redirect()->guest('login'); return redirect()->guest('login');
} }
@@ -63,11 +65,11 @@ class Handler extends ExceptionHandler
* Handle errors in the API * Handle errors in the API
* *
* @param $request * @param $request
* @param \Throwable $exception * @param \Exception $exception
* *
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Response * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Response
*/ */
private function handleApiError($request, Throwable $exception) private function handleApiError($request, Exception $exception)
{ {
Log::error('API Error', $exception->getTrace()); Log::error('API Error', $exception->getTrace());
@@ -116,13 +118,38 @@ class Handler extends ExceptionHandler
{ {
if ($request->expectsJson() || $request->is('api/*')) { if ($request->expectsJson() || $request->is('api/*')) {
$error = new Unauthenticated(); $error = new Unauthenticated();
return $error->getResponse(); return $error->getResponse();
} }
return redirect()->guest('login'); return redirect()->guest('login');
} }
/**
* Render the given HttpException.
*
* @param AbstractHttpException $e
*
* @return \Illuminate\Http\Response|Response
*/
protected function renderHttpException(HttpExceptionInterface $e)
{
$status = $e->getStatusCode();
view()->replaceNamespace('errors', [
resource_path('views/layouts/'.setting('general.theme', 'default').'/errors'),
resource_path('views/errors'),
__DIR__.'/views',
]);
if (view()->exists("errors::{$status}")) {
return response()->view("errors::{$status}", [
'exception' => $e,
'SKIN_NAME' => setting('general.theme', 'default'),
], $status, $e->getHeaders());
}
return $this->convertExceptionToResponse($e);
}
/** /**
* Ignition error page integration * Ignition error page integration
*/ */
-41
View File
@@ -1,41 +0,0 @@
<?php
namespace App\Exceptions;
class ModuleExistsException extends AbstractHttpException
{
private $module_name;
public function __construct($module_name)
{
$this->module_name = $module_name;
parent::__construct(
409,
'Module '.$module_name.' Already Exists!'
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'module-already-exists';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}
@@ -1,38 +0,0 @@
<?php
namespace App\Exceptions;
class ModuleInstallationError extends AbstractHttpException
{
public function __construct()
{
parent::__construct(
500,
'Installation of Module Failed!'
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'module-installation-error';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}
-38
View File
@@ -1,38 +0,0 @@
<?php
namespace App\Exceptions;
class ModuleInvalidFileType extends AbstractHttpException
{
public function __construct()
{
parent::__construct(
415,
'The Module File Type is Invalid!'
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'module-file-type-invalid';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}
-43
View File
@@ -1,43 +0,0 @@
<?php
namespace App\Exceptions;
class PilotIdNotFound extends AbstractHttpException
{
private $pilot_id;
public function __construct($pilot_id)
{
$this->pilot_id = $pilot_id;
parent::__construct(
404,
'Pilot '.$pilot_id.' not found'
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'pilot-id-not-found';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [
'pilot_id' => $this->pilot_id,
];
}
}
-43
View File
@@ -1,43 +0,0 @@
<?php
namespace App\Exceptions;
use Exception;
class Unauthorized extends AbstractHttpException
{
private $exception;
public function __construct(Exception $exception)
{
$this->exception = $exception;
parent::__construct(
403,
$exception->getMessage()
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'unauthorized';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}
-46
View File
@@ -1,46 +0,0 @@
<?php
namespace App\Exceptions;
use App\Models\Page;
class UnknownPageType extends AbstractHttpException
{
private $page;
public function __construct(Page $page)
{
$this->page = $page;
parent::__construct(
400,
'Unknown page type "'.$page->type.'"'
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'unknown-page-type';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [
'id' => $this->page->id,
'type' => $this->page->type,
];
}
}
+4 -10
View File
@@ -10,10 +10,7 @@ use Illuminate\View\View;
class PageLinksComposer extends Composer class PageLinksComposer extends Composer
{ {
private static $fields = ['id', 'name', 'slug', 'icon', 'type', 'link', 'new_window']; protected $pageRepo;
/** @var \App\Repositories\PageRepository */
private $pageRepo;
/** /**
* PageLinksComposer constructor. * PageLinksComposer constructor.
@@ -31,16 +28,13 @@ class PageLinksComposer extends Composer
public function compose(View $view) public function compose(View $view)
{ {
try { try {
$w = [
'enabled' => true,
];
// If not logged in, then only get the public pages // If not logged in, then only get the public pages
$w = ['enabled' => true];
if (!Auth::check()) { if (!Auth::check()) {
$w['public'] = true; $w = ['public' => true];
} }
$pages = $this->pageRepo->findWhere($w, static::$fields); $pages = $this->pageRepo->findWhere($w, ['id', 'name', 'slug', 'icon']);
} catch (Exception $e) { } catch (Exception $e) {
$pages = []; $pages = [];
} }
@@ -12,7 +12,6 @@ use App\Repositories\FareRepository;
use App\Services\ExportService; use App\Services\ExportService;
use App\Services\ImportService; use App\Services\ImportService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Laracasts\Flash\Flash; use Laracasts\Flash\Flash;
use Prettus\Repository\Criteria\RequestCriteria; use Prettus\Repository\Criteria\RequestCriteria;
@@ -163,8 +162,6 @@ class FareController extends Controller
return redirect(route('admin.fares.index')); return redirect(route('admin.fares.index'));
} }
Log::info('Deleting fare "'.$fare->name.'", id='.$fare->id);
$this->fareRepo->delete($id); $this->fareRepo->delete($id);
Flash::success('Fare deleted successfully.'); Flash::success('Fare deleted successfully.');
@@ -11,7 +11,6 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Laracasts\Flash\Flash; use Laracasts\Flash\Flash;
use Nwidart\Modules\Facades\Module;
class MaintenanceController extends Controller class MaintenanceController extends Controller
{ {
@@ -37,7 +36,7 @@ class MaintenanceController extends Controller
return view('admin.maintenance.index', [ return view('admin.maintenance.index', [
'cron_path' => $this->cronSvc->getCronExecString(), 'cron_path' => $this->cronSvc->getCronExecString(),
'cron_problem_exists' => $this->cronSvc->cronProblemExists(), 'cron_problem_exists' => $this->cronSvc->cronProblemExists(),
'new_version' => $this->kvpRepo->get('new_version_available', false), 'new_version' => true, //$this->kvpRepo->get('new_version_available', false),
'new_version_tag' => $this->kvpRepo->get('latest_version_tag'), 'new_version_tag' => $this->kvpRepo->get('latest_version_tag'),
]); ]);
} }
@@ -111,10 +110,6 @@ class MaintenanceController extends Controller
{ {
$new_version_tag = $this->kvpRepo->get('latest_version_tag'); $new_version_tag = $this->kvpRepo->get('latest_version_tag');
Log::info('Attempting to update to '.$new_version_tag); Log::info('Attempting to update to '.$new_version_tag);
$module = Module::find('updater');
$module->enable();
return redirect('/update/downloader'); return redirect('/update/downloader');
} }
} }
@@ -1,122 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Contracts\Controller;
use App\Services\ModuleService;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
class ModulesController extends Controller
{
private $moduleSvc;
public function __construct(ModuleService $moduleSvc)
{
$this->moduleSvc = $moduleSvc;
}
/**
* Display a listing of the Module.
*
* @return mixed
*/
public function index()
{
$modules = $this->moduleSvc->getAllModules();
$new_modules = $this->moduleSvc->scan();
return view('admin.modules.index', [
'modules' => $modules,
'new_modules' => $new_modules,
]);
}
/**
* Show the form for creating a new Module.
*
* @return Application|Factory|View
*/
public function create()
{
return view('admin.modules.create');
}
/**
* Store a newly Uploaded Module in the Storage.
*
* @param Request $request
*
* @return Application|RedirectResponse|Redirector
*/
public function store(Request $request)
{
$this->moduleSvc->installModule($request->file('module_file'));
return $this->index();
}
/**
* Show the form for editing the specified Module.
*
* @param $id
*
* @return Application|Factory|View
*/
public function edit($id)
{
$module = $this->moduleSvc->getModule($id);
return view('admin.modules.edit', [
'module' => $module,
]);
}
/**
* Update the specified Module in storage.
*
* @param $id
* @param Request $request
*
* @return Application|RedirectResponse|Redirector
*/
public function update($id, Request $request)
{
$this->moduleSvc->updateModule($id, $request->has('enabled'));
flash()->success('Module Status Changed!');
return redirect(route('admin.modules.index'));
}
/**
* Enabling Module Present in the Modules Folder
*
* @param Request $request
*
* @return Application|RedirectResponse|Redirector
*/
public function enable(Request $request)
{
$this->moduleSvc->addModule($request->input('name'));
return redirect(route('admin.modules.index'));
}
/**
* Verify and Remove the specified Module from storage.
*
* @param mixed $id
* @param Request $request
*
* @return mixed
*/
public function destroy($id, Request $request)
{
$delete = $this->moduleSvc->deleteModule($id, $request->all());
if ($delete == true) {
flash()->success('Module Deleted Successfully!');
return redirect(route('admin.modules.index'));
}
flash()->error('Verification Failed!');
return redirect(route('admin.modules.edit', $id));
}
}
+41 -50
View File
@@ -8,7 +8,6 @@ use App\Http\Requests\UpdateUserRequest;
use App\Models\Rank; use App\Models\Rank;
use App\Models\Role; use App\Models\Role;
use App\Models\User; use App\Models\User;
use App\Models\UserAward;
use App\Repositories\AirlineRepository; use App\Repositories\AirlineRepository;
use App\Repositories\AirportRepository; use App\Repositories\AirportRepository;
use App\Repositories\PirepRepository; use App\Repositories\PirepRepository;
@@ -21,7 +20,6 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Laracasts\Flash\Flash; use Laracasts\Flash\Flash;
use League\ISO3166\ISO3166;
use Prettus\Repository\Exceptions\RepositoryException; use Prettus\Repository\Exceptions\RepositoryException;
class UserController extends Controller class UserController extends Controller
@@ -71,7 +69,7 @@ class UserController extends Controller
return view('admin.users.index', [ return view('admin.users.index', [
'users' => $users, 'users' => $users,
'country' => new ISO3166(), 'country' => new \League\ISO3166\ISO3166(),
]); ]);
} }
@@ -84,18 +82,13 @@ class UserController extends Controller
{ {
$airlines = $this->airlineRepo->selectBoxList(); $airlines = $this->airlineRepo->selectBoxList();
$airports = $this->airportRepo->selectBoxList(false); $airports = $this->airportRepo->selectBoxList(false);
$countries = collect((new ISO3166())->all())
->mapWithKeys(function ($item, $key) {
return [strtolower($item['alpha2']) => $item['name']];
});
return view('admin.users.create', [ return view('admin.users.create', [
'user' => null, 'user' => null,
'pireps' => null, 'pireps' => null,
'airlines' => $airlines, 'airlines' => $airlines,
'timezones' => Timezonelist::toArray(), 'timezones' => Timezonelist::toArray(),
'country' => new ISO3166(), 'country' => new \League\ISO3166\ISO3166(),
'countries' => $countries,
'airports' => $airports, 'airports' => $airports,
'ranks' => Rank::all()->pluck('name', 'id'), 'ranks' => Rank::all()->pluck('name', 'id'),
'roles' => Role::all()->pluck('name', 'id'), 'roles' => Role::all()->pluck('name', 'id'),
@@ -129,26 +122,11 @@ class UserController extends Controller
*/ */
public function show($id) public function show($id)
{ {
return $this->edit($id); $user = $this->userRepo->findWithoutFail($id);
}
/**
* Show the form for editing the specified User.
*
* @param int $id
*
* @throws RepositoryException
*
* @return mixed
*/
public function edit($id)
{
$user = $this->userRepo
->with(['awards', 'fields', 'rank'])
->findWithoutFail($id);
if (empty($user)) { if (empty($user)) {
Flash::error('User not found'); Flash::error('User not found');
return redirect(route('admin.users.index')); return redirect(route('admin.users.index'));
} }
@@ -156,7 +134,43 @@ class UserController extends Controller
->whereOrder(['user_id' => $id], 'created_at', 'desc') ->whereOrder(['user_id' => $id], 'created_at', 'desc')
->paginate(); ->paginate();
$countries = collect((new ISO3166())->all()) $airlines = $this->airlineRepo->selectBoxList();
$airports = $this->airportRepo->selectBoxList(false);
return view('admin.users.show', [
'user' => $user,
'pireps' => $pireps,
'airlines' => $airlines,
'timezones' => Timezonelist::toArray(),
'country' => new \League\ISO3166\ISO3166(),
'airports' => $airports,
'ranks' => Rank::all()->pluck('name', 'id'),
'roles' => Role::all()->pluck('name', 'id'),
]);
}
/**
* Show the form for editing the specified User.
*
* @param int $id
*
* @return mixed
*/
public function edit($id)
{
$user = $this->userRepo->findWithoutFail($id);
if (empty($user)) {
Flash::error('User not found');
return redirect(route('admin.users.index'));
}
$pireps = $this->pirepRepo
->whereOrder(['user_id' => $id], 'created_at', 'desc')
->paginate();
$countries = collect((new \League\ISO3166\ISO3166())->all())
->mapWithKeys(function ($item, $key) { ->mapWithKeys(function ($item, $key) {
return [strtolower($item['alpha2']) => $item['name']]; return [strtolower($item['alpha2']) => $item['name']];
}); });
@@ -167,7 +181,6 @@ class UserController extends Controller
return view('admin.users.edit', [ return view('admin.users.edit', [
'user' => $user, 'user' => $user,
'pireps' => $pireps, 'pireps' => $pireps,
'country' => new ISO3166(),
'countries' => $countries, 'countries' => $countries,
'timezones' => Timezonelist::toArray(), 'timezones' => Timezonelist::toArray(),
'airports' => $airports, 'airports' => $airports,
@@ -266,28 +279,6 @@ class UserController extends Controller
return redirect(route('admin.users.index')); return redirect(route('admin.users.index'));
} }
/**
* Remove the award from a user
*
* @param \Illuminate\Http\Request $request
* @param mixed $id
* @param mixed $award_id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy_user_award($id, $award_id, Request $request)
{
$userAward = UserAward::where(['user_id' => $id, 'award_id' => $award_id]);
if (empty($userAward)) {
Flash::error('The user award could not be found');
return redirect()->back();
}
$userAward->delete();
return redirect()->back();
}
/** /**
* Regenerate the user's API key * Regenerate the user's API key
* *
@@ -1,154 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Contracts\Controller;
use App\Repositories\UserFieldRepository;
use Illuminate\Http\Request;
use Laracasts\Flash\Flash;
use Prettus\Repository\Criteria\RequestCriteria;
class UserFieldController extends Controller
{
/** @var \App\Repositories\UserFieldRepository */
private $userFieldRepo;
/**
* @param UserFieldRepository $userFieldRepo
*/
public function __construct(UserFieldRepository $userFieldRepo)
{
$this->userFieldRepo = $userFieldRepo;
}
/**
* Display a listing of the UserField.
*
* @param Request $request
*
* @throws \Prettus\Repository\Exceptions\RepositoryException
*
* @return mixed
*/
public function index(Request $request)
{
$this->userFieldRepo->pushCriteria(new RequestCriteria($request));
$fields = $this->userFieldRepo->all();
return view('admin.userfields.index', ['fields' => $fields]);
}
/**
* Show the form for creating a new UserField.
*/
public function create()
{
return view('admin.userfields.create');
}
/**
* Store a newly created UserField in storage.
*
* @param Request $request
*
* @throws \Prettus\Validator\Exceptions\ValidatorException
*
* @return mixed
*/
public function store(Request $request)
{
$this->userFieldRepo->create($request->all());
Flash::success('Field added successfully.');
return redirect(route('admin.userfields.index'));
}
/**
* Display the specified UserField.
*
* @param int $id
*
* @return mixed
*/
public function show($id)
{
$field = $this->userFieldRepo->findWithoutFail($id);
if (empty($field)) {
Flash::error('Flight field not found');
return redirect(route('admin.userfields.index'));
}
return view('admin.userfields.show', ['field' => $field]);
}
/**
* Show the form for editing the specified UserField.
*
* @param int $id
*
* @return mixed
*/
public function edit($id)
{
$field = $this->userFieldRepo->findWithoutFail($id);
if (empty($field)) {
Flash::error('Field not found');
return redirect(route('admin.userfields.index'));
}
return view('admin.userfields.edit', ['field' => $field]);
}
/**
* Update the specified UserField in storage.
*
* @param $id
* @param Request $request
*
* @throws \Prettus\Validator\Exceptions\ValidatorException
*
* @return mixed
*/
public function update($id, Request $request)
{
$field = $this->userFieldRepo->findWithoutFail($id);
if (empty($field)) {
Flash::error('UserField not found');
return redirect(route('admin.userfields.index'));
}
$this->userFieldRepo->update($request->all(), $id);
Flash::success('Field updated successfully.');
return redirect(route('admin.userfields.index'));
}
/**
* Remove the specified UserField from storage.
*
* @param int $id
*
* @return mixed
*/
public function destroy($id)
{
$field = $this->userFieldRepo->findWithoutFail($id);
if (empty($field)) {
Flash::error('Field not found');
return redirect(route('admin.userfields.index'));
}
if ($this->userFieldRepo->isInUse($id)) {
Flash::error('This field cannot be deleted, it is in use. Deactivate it instead');
return redirect(route('admin.userfields.index'));
}
$this->userFieldRepo->delete($id);
Flash::success('Field deleted successfully.');
return redirect(route('admin.userfields.index'));
}
}
@@ -3,7 +3,6 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Events\AcarsUpdate;
use App\Exceptions\PirepCancelled; use App\Exceptions\PirepCancelled;
use App\Http\Requests\Acars\EventRequest; use App\Http\Requests\Acars\EventRequest;
use App\Http\Requests\Acars\LogRequest; use App\Http\Requests\Acars\LogRequest;
@@ -199,9 +198,6 @@ class AcarsController extends Controller
$pirep->save(); $pirep->save();
// Post a new update for this ACARS position
event(new AcarsUpdate($pirep, $pirep->position));
return $this->message($count.' positions added', $count); return $this->message($count.' positions added', $count);
} }
+10 -28
View File
@@ -9,7 +9,6 @@ use App\Http\Resources\Navdata as NavdataResource;
use App\Models\SimBrief; use App\Models\SimBrief;
use App\Repositories\Criteria\WhereCriteria; use App\Repositories\Criteria\WhereCriteria;
use App\Repositories\FlightRepository; use App\Repositories\FlightRepository;
use App\Services\FareService;
use App\Services\FlightService; use App\Services\FlightService;
use Exception; use Exception;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -19,26 +18,19 @@ use Prettus\Repository\Exceptions\RepositoryException;
class FlightController extends Controller class FlightController extends Controller
{ {
/** @var \App\Services\FareService */
private $fareSvc;
/** @var \App\Repositories\FlightRepository */
private $flightRepo; private $flightRepo;
/** @var \App\Services\FlightService */
private $flightSvc; private $flightSvc;
/** /**
* @param FareService $fareSvc * FlightController constructor.
*
* @param FlightRepository $flightRepo * @param FlightRepository $flightRepo
* @param FlightService $flightSvc * @param FlightService $flightSvc
*/ */
public function __construct( public function __construct(
FareService $fareSvc,
FlightRepository $flightRepo, FlightRepository $flightRepo,
FlightService $flightSvc FlightService $flightSvc
) { ) {
$this->fareSvc = $fareSvc;
$this->flightRepo = $flightRepo; $this->flightRepo = $flightRepo;
$this->flightSvc = $flightSvc; $this->flightSvc = $flightSvc;
} }
@@ -62,13 +54,9 @@ class FlightController extends Controller
*/ */
public function get($id) public function get($id)
{ {
/** @var \App\Models\User $user */
$user = Auth::user(); $user = Auth::user();
/** @var \App\Models\Flight $flight */
$flight = $this->flightRepo->with([ $flight = $this->flightRepo->with([
'airline', 'airline',
'fares',
'subfleets', 'subfleets',
'subfleets.aircraft', 'subfleets.aircraft',
'subfleets.fares', 'subfleets.fares',
@@ -78,8 +66,7 @@ class FlightController extends Controller
}, },
])->find($id); ])->find($id);
$flight = $this->flightSvc->filterSubfleets($user, $flight); $this->flightSvc->filterSubfleets(Auth::user(), $flight);
$flight = $this->fareSvc->getReconciledFaresForFlight($flight);
return new FlightResource($flight); return new FlightResource($flight);
} }
@@ -91,38 +78,34 @@ class FlightController extends Controller
*/ */
public function search(Request $request) public function search(Request $request)
{ {
/** @var \App\Models\User $user */
$user = Auth::user(); $user = Auth::user();
$where = [ $where = [
'active' => true, 'active' => true,
'visible' => true, 'visible' => true,
]; ];
// Allow the option to bypass some of these restrictions for the searches // Allow the option to bypass some of these restrictions for the searches
if (!$request->filled('ignore_restrictions') || $request->get('ignore_restrictions') === '0') { if (!$request->filled('ignore_restrictions')
|| $request->get('ignore_restrictions') === '0'
) {
if (setting('pilots.restrict_to_company')) { if (setting('pilots.restrict_to_company')) {
$where['airline_id'] = $user->airline_id; $where['airline_id'] = Auth::user()->airline_id;
} }
if (setting('pilots.only_flights_from_current')) { if (setting('pilots.only_flights_from_current')) {
$where['dpt_airport_id'] = $user->curr_airport_id; $where['dpt_airport_id'] = Auth::user()->curr_airport_id;
} }
} }
try { try {
$this->flightRepo->resetCriteria(); $this->flightRepo->resetCriteria();
$this->flightRepo->searchCriteria($request); $this->flightRepo->searchCriteria($request);
$this->flightRepo->pushCriteria(new WhereCriteria($request, $where, [ $this->flightRepo->pushCriteria(new WhereCriteria($request, $where));
'airline' => ['active' => true],
]));
$this->flightRepo->pushCriteria(new RequestCriteria($request)); $this->flightRepo->pushCriteria(new RequestCriteria($request));
$flights = $this->flightRepo $flights = $this->flightRepo
->with([ ->with([
'airline', 'airline',
'fares',
'subfleets', 'subfleets',
'subfleets.aircraft', 'subfleets.aircraft',
'subfleets.fares', 'subfleets.fares',
@@ -138,8 +121,7 @@ class FlightController extends Controller
// TODO: Remove any flights here that a user doesn't have permissions to // TODO: Remove any flights here that a user doesn't have permissions to
foreach ($flights as $flight) { foreach ($flights as $flight) {
$this->flightSvc->filterSubfleets($user, $flight); $this->flightSvc->filterSubfleets(Auth::user(), $flight);
$this->fareSvc->getReconciledFaresForFlight($flight);
} }
return FlightResource::collection($flights); return FlightResource::collection($flights);
+6 -4
View File
@@ -61,8 +61,7 @@ class UserController extends Controller
*/ */
protected function getUserId(Request $request) protected function getUserId(Request $request)
{ {
$id = $request->get('id'); if ($request->get('id') === null) {
if ($id === null || $id === 'me') {
return Auth::user()->id; return Auth::user()->id;
} }
@@ -90,7 +89,10 @@ class UserController extends Controller
*/ */
public function get($id) public function get($id)
{ {
$user = $this->userSvc->getUser($id); $user = $this->userRepo
->with(['airline', 'bids', 'rank'])
->find($id);
return new UserResource($user); return new UserResource($user);
} }
@@ -106,7 +108,7 @@ class UserController extends Controller
*/ */
public function bids(Request $request) public function bids(Request $request)
{ {
$user = $this->userSvc->getUser($this->getUserId($request)); $user = $this->userRepo->find($this->getUserId($request));
// Add a bid // Add a bid
if ($request->isMethod('PUT') || $request->isMethod('POST')) { if ($request->isMethod('PUT') || $request->isMethod('POST')) {
+9 -70
View File
@@ -3,98 +3,36 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Exceptions\PilotIdNotFound;
use App\Models\Enums\UserState; use App\Models\Enums\UserState;
use App\Services\UserService;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
/**
* Class LoginController
*/
class LoginController extends Controller class LoginController extends Controller
{ {
use AuthenticatesUsers; use AuthenticatesUsers;
protected $redirectTo = '/dashboard'; protected $redirectTo = '/dashboard';
/** @var UserService */
private $userSvc;
/** @var string */
private $loginFieldValue;
/** /**
* LoginController constructor. * LoginController constructor.
*
* @param UserService $userSvc
*/ */
public function __construct(UserService $userSvc) public function __construct()
{ {
$this->redirectTo = config('phpvms.login_redirect'); $this->redirectTo = config('phpvms.login_redirect');
$this->middleware('guest', ['except' => 'logout']); $this->middleware('guest', ['except' => 'logout']);
$this->userSvc = $userSvc;
} }
/** /**
* Get the needed authorization credentials from the request. * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* Overriding the value from the trait
*
* @override
*
* @param \Illuminate\Http\Request $request
*
* @return array
*/ */
protected function credentials(Request $request) public function showLoginForm()
{ {
return [ return view('auth/login');
'email' => $this->loginFieldValue,
'password' => $request->input('password'),
];
}
/**
* Validate the user login request.
*
* @override
*
* @param \Illuminate\Http\Request $request
*
* @return void
*/
protected function validateLogin(Request $request)
{
$id_field = $request->input('email');
$validations = ['required', 'string'];
/*
* Trying to login by email or not?
*
* If not, run a validation rule which attempts to split the user by their VA and ID
* Then inject that user's email into the request
*/
if (strpos($id_field, '@') !== false) {
$validations[] = 'email';
$this->loginFieldValue = $request->input('email');
} else {
$validations[] = function ($attr, $value, $fail) use ($request) {
try {
$user = $this->userSvc->findUserByPilotId($value);
} catch (PilotIdNotFound $ex) {
Log::warning('Error logging in, pilot_id not found, id='.$value);
$fail('Pilot not found');
return;
}
$request->email = $user->email;
$this->loginFieldValue = $user->email;
};
}
$request->validate([
'email' => $validations,
'password' => 'required|string',
]);
} }
/** /**
@@ -109,7 +47,8 @@ class LoginController extends Controller
$user->last_ip = $request->ip(); $user->last_ip = $request->ip();
$user->save(); $user->save();
if ($user->state !== UserState::ACTIVE && $user->state !== UserState::ON_LEAVE) { // TODO: How to handle ON_LEAVE?
if ($user->state !== UserState::ACTIVE) {
Log::info('Trying to login '.$user->ident.', state ' Log::info('Trying to login '.$user->ident.', state '
.UserState::label($user->state)); .UserState::label($user->state));
@@ -3,20 +3,19 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Http\Requests\CreateUserRequest;
use App\Models\Enums\UserState; use App\Models\Enums\UserState;
use App\Models\User; use App\Models\User;
use App\Models\UserField;
use App\Models\UserFieldValue;
use App\Repositories\AirlineRepository; use App\Repositories\AirlineRepository;
use App\Repositories\AirportRepository; use App\Repositories\AirportRepository;
use App\Services\UserService; use App\Services\UserService;
use App\Support\Countries; use App\Support\Countries;
use App\Support\Timezonelist; use App\Support\Timezonelist;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Foundation\Auth\RegistersUsers;
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;
class RegisterController extends Controller class RegisterController extends Controller
{ {
@@ -62,14 +61,12 @@ class RegisterController extends Controller
{ {
$airports = $this->airportRepo->selectBoxList(false, setting('pilots.home_hubs_only')); $airports = $this->airportRepo->selectBoxList(false, setting('pilots.home_hubs_only'));
$airlines = $this->airlineRepo->selectBoxList(); $airlines = $this->airlineRepo->selectBoxList();
$userFields = UserField::where(['show_on_registration' => true])->get();
return view('auth.register', [ return view('auth.register', [
'airports' => $airports, 'airports' => $airports,
'airlines' => $airlines, 'airlines' => $airlines,
'countries' => Countries::getSelectList(), 'countries' => Countries::getSelectList(),
'timezones' => Timezonelist::toArray(), 'timezones' => Timezonelist::toArray(),
'userFields' => $userFields,
]); ]);
} }
@@ -84,24 +81,13 @@ class RegisterController extends Controller
{ {
$rules = [ $rules = [
'name' => 'required|max:255', 'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users,email', 'email' => 'required|email|max:255|unique:users, email',
'airline_id' => 'required', 'airline_id' => 'required',
'home_airport_id' => 'required', 'home_airport_id' => 'required',
'password' => 'required|min:5|confirmed', 'password' => 'required|min:5|confirmed',
'toc_accepted' => 'accepted', 'toc_accepted' => 'accepted',
]; ];
// Dynamically add the required fields
$userFields = UserField::where([
'show_on_registration' => true,
'required' => true,
'active' => true,
])->get();
foreach ($userFields as $field) {
$rules['field_'.$field->slug] = 'required';
}
if (config('captcha.enabled')) { if (config('captcha.enabled')) {
$rules['g-recaptcha-response'] = 'required|captcha'; $rules['g-recaptcha-response'] = 'required|captcha';
} }
@@ -133,15 +119,6 @@ class RegisterController extends Controller
Log::info('User registered: ', $user->toArray()); Log::info('User registered: ', $user->toArray());
$userFields = UserField::all();
foreach ($userFields as $field) {
$field_name = 'field_'.$field->slug;
UserFieldValue::updateOrCreate([
'user_field_id' => $field->id,
'user_id' => $user->id,
], ['value' => $opts[$field_name]]);
}
return $user; return $user;
} }
@@ -154,10 +131,8 @@ class RegisterController extends Controller
* *
* @return mixed * @return mixed
*/ */
public function register(Request $request) public function register(CreateUserRequest $request)
{ {
$this->validator($request->all())->validate();
$user = $this->create($request->all()); $user = $this->create($request->all());
if ($user->state === UserState::PENDING) { if ($user->state === UserState::PENDING) {
return view('auth.pending'); return view('auth.pending');
@@ -79,26 +79,20 @@ class FlightController extends Controller
'visible' => true, 'visible' => true,
]; ];
/** @var \App\Models\User $user */
$user = Auth::user();
if (setting('pilots.restrict_to_company')) { if (setting('pilots.restrict_to_company')) {
$where['airline_id'] = $user->airline_id; $where['airline_id'] = Auth::user()->airline_id;
} }
// default restrictions on the flights shown. Handle search differently // default restrictions on the flights shown. Handle search differently
if (setting('pilots.only_flights_from_current')) { if (setting('pilots.only_flights_from_current')) {
$where['dpt_airport_id'] = $user->curr_airport_id; $where['dpt_airport_id'] = Auth::user()->curr_airport_id;
} }
$this->flightRepo->resetCriteria(); $this->flightRepo->resetCriteria();
try { try {
$this->flightRepo->searchCriteria($request); $this->flightRepo->searchCriteria($request);
$this->flightRepo->pushCriteria(new WhereCriteria($request, $where, [ $this->flightRepo->pushCriteria(new WhereCriteria($request, $where));
'airline' => ['active' => true],
]));
$this->flightRepo->pushCriteria(new RequestCriteria($request)); $this->flightRepo->pushCriteria(new RequestCriteria($request));
} catch (RepositoryException $e) { } catch (RepositoryException $e) {
Log::emergency($e); Log::emergency($e);
@@ -4,10 +4,8 @@ namespace App\Http\Controllers\Frontend;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Exceptions\PageNotFound; use App\Exceptions\PageNotFound;
use App\Exceptions\Unauthorized;
use App\Repositories\PageRepository; use App\Repositories\PageRepository;
use Exception; use Exception;
use Illuminate\Support\Facades\Auth;
class PageController extends Controller class PageController extends Controller
{ {
@@ -30,16 +28,11 @@ class PageController extends Controller
*/ */
public function show($slug) public function show($slug)
{ {
/** @var \App\Models\Page $page */
$page = $this->pageRepo->findWhere(['slug' => $slug])->first(); $page = $this->pageRepo->findWhere(['slug' => $slug])->first();
if (!$page) { if (!$page) {
throw new PageNotFound(new Exception('Page not found')); throw new PageNotFound(new Exception('Page not found'));
} }
if (!$page->public && !Auth::check()) {
throw new Unauthorized(new Exception('You must be logged in to view this page'));
}
return view('pages.index', ['page' => $page]); return view('pages.index', ['page' => $page]);
} }
} }
@@ -10,7 +10,6 @@ use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus; use App\Models\Enums\PirepStatus;
use App\Models\Pirep; use App\Models\Pirep;
use App\Models\SimBrief; use App\Models\SimBrief;
use App\Models\User;
use App\Repositories\AircraftRepository; use App\Repositories\AircraftRepository;
use App\Repositories\AirlineRepository; use App\Repositories\AirlineRepository;
use App\Repositories\AirportRepository; use App\Repositories\AirportRepository;
@@ -181,9 +180,8 @@ class PirepController extends Controller
$where = [['user_id', $user->id]]; $where = [['user_id', $user->id]];
$where[] = ['state', '<>', PirepState::CANCELLED]; $where[] = ['state', '<>', PirepState::CANCELLED];
$with = ['airline', 'aircraft', 'dpt_airport', 'arr_airport', 'fares', 'comments'];
$this->pirepRepo->with($with) $this->pirepRepo->with(['airline', 'aircraft', 'dpt_airport', 'arr_airport'])
->pushCriteria(new WhereCriteria($request, $where)); ->pushCriteria(new WhereCriteria($request, $where));
$pireps = $this->pirepRepo->orderBy('created_at', 'desc')->paginate(); $pireps = $this->pirepRepo->orderBy('created_at', 'desc')->paginate();
@@ -282,11 +280,9 @@ class PirepController extends Controller
*/ */
public function store(CreatePirepRequest $request) public function store(CreatePirepRequest $request)
{ {
/** @var User $user */ // Create the main PIREP
$user = Auth::user();
$pirep = new Pirep($request->post()); $pirep = new Pirep($request->post());
$pirep->user_id = $user->id; $pirep->user_id = Auth::user()->id;
$attrs = $request->all(); $attrs = $request->all();
$attrs['submit'] = strtolower($attrs['submit']); $attrs['submit'] = strtolower($attrs['submit']);
@@ -294,13 +290,8 @@ class PirepController extends Controller
if ($attrs['submit'] === 'submit') { if ($attrs['submit'] === 'submit') {
// Are they allowed at this airport? // Are they allowed at this airport?
if (setting('pilots.only_flights_from_current') if (setting('pilots.only_flights_from_current')
&& $user->curr_airport_id !== $pirep->dpt_airport_id) { && Auth::user()->curr_airport_id !== $pirep->dpt_airport_id) {
Log::info( Log::info('Pilot '.Auth::user()->id.' not at departure airport, erroring out');
'Pilot '.$user->id
.' not at departure airport (curr='.$user->curr_airport_id
.', dpt='.$pirep->dpt_airport_id.')'
);
return $this->flashError( return $this->flashError(
'You are currently not at the departure airport!', 'You are currently not at the departure airport!',
'frontend.pireps.create' 'frontend.pireps.create'
@@ -309,8 +300,8 @@ class PirepController extends Controller
// Can they fly this aircraft? // Can they fly this aircraft?
if (setting('pireps.restrict_aircraft_to_rank', false) if (setting('pireps.restrict_aircraft_to_rank', false)
&& !$this->userSvc->aircraftAllowed($user, $pirep->aircraft_id)) { && !$this->userSvc->aircraftAllowed(Auth::user(), $pirep->aircraft_id)) {
Log::info('Pilot '.$user->id.' not allowed to fly aircraft'); Log::info('Pilot '.Auth::user()->id.' not allowed to fly aircraft');
return $this->flashError( return $this->flashError(
'You are not allowed to fly this aircraft!', 'You are not allowed to fly this aircraft!',
'frontend.pireps.create' 'frontend.pireps.create'
@@ -319,20 +310,9 @@ class PirepController extends Controller
// is the aircraft in the right place? // is the aircraft in the right place?
/* @noinspection NotOptimalIfConditionsInspection */ /* @noinspection NotOptimalIfConditionsInspection */
// Get the aircraft
$aircraft = $this->aircraftRepo->findWithoutFail($pirep->aircraft_id);
if ($aircraft === null) {
Log::error('Aircraft for PIREP not found, id='.$pirep->aircraft_id);
return $this->flashError(
'The aircraft for the PIREP hasn\'t been found',
'frontend.pireps.create'
);
}
if (setting('pireps.only_aircraft_at_dpt_airport') if (setting('pireps.only_aircraft_at_dpt_airport')
&& $aircraft->airport_id !== $pirep->dpt_airport_id && $pirep->aircraft_id !== $pirep->dpt_airport_id) {
) { Log::info('Aircraft '.$pirep->aircraft_id.' not at departure airport '.$pirep->dpt_airport_id.', erroring out');
Log::info('Aircraft '.$pirep->aircraft_id.' not at departure airport (curr='.$pirep->aircraft->airport_id.', apt='.$pirep->dpt_airport_id.')');
return $this->flashError( return $this->flashError(
'This aircraft is not positioned at the departure airport!', 'This aircraft is not positioned at the departure airport!',
'frontend.pireps.create' 'frontend.pireps.create'
@@ -4,8 +4,6 @@ namespace App\Http\Controllers\Frontend;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Models\User; use App\Models\User;
use App\Models\UserField;
use App\Models\UserFieldValue;
use App\Repositories\AirlineRepository; use App\Repositories\AirlineRepository;
use App\Repositories\AirportRepository; use App\Repositories\AirportRepository;
use App\Repositories\UserRepository; use App\Repositories\UserRepository;
@@ -61,14 +59,21 @@ class ProfileController extends Controller
} }
/** /**
* Redirect to show() since only a single page gets shown and the template controls
* the other items that are/aren't shown
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function index() public function index()
{ {
return $this->show(Auth::user()->id); if (setting('pilots.home_hubs_only')) {
$airports = $this->airportRepo->findWhere(['hub' => true]);
} else {
$airports = $this->airportRepo->all();
}
return view('profile.index', [
'acars' => $this->acarsEnabled(),
'user' => Auth::user(),
'airports' => $airports,
]);
} }
/** /**
@@ -78,23 +83,18 @@ class ProfileController extends Controller
*/ */
public function show($id) public function show($id)
{ {
/** @var \App\Models\User $user */ $user = User::where('id', $id)->first();
$user = User::with(['awards', 'fields', 'fields.field'])
->where('id', $id)
->first();
if (empty($user)) { if (empty($user)) {
Flash::error('User not found!'); Flash::error('User not found!');
return redirect(route('frontend.dashboard.index')); return redirect(route('frontend.dashboard.index'));
} }
$airports = $this->airportRepo->all(); $airports = $this->airportRepo->all();
$userFields = $this->userRepo->getUserFields($user, true);
return view('profile.index', [ return view('profile.index', [
'user' => $user, 'user' => $user,
'userFields' => $userFields, 'airports' => $airports,
'airports' => $airports,
]); ]);
} }
@@ -109,27 +109,22 @@ class ProfileController extends Controller
*/ */
public function edit(Request $request) public function edit(Request $request)
{ {
/** @var \App\Models\User $user */ $user = User::where('id', Auth::user()->id)->first();
$user = User::with(['fields', 'fields.field'])
->where('id', Auth::user()->id)
->first();
if (empty($user)) { if (empty($user)) {
Flash::error('User not found!'); Flash::error('User not found!');
return redirect(route('frontend.dashboard.index')); return redirect(route('frontend.dashboard.index'));
} }
$airlines = $this->airlineRepo->selectBoxList(); $airlines = $this->airlineRepo->selectBoxList();
$airports = $this->airportRepo->selectBoxList(false, setting('pilots.home_hubs_only')); $airports = $this->airportRepo->selectBoxList(false, setting('pilots.home_hubs_only'));
$userFields = $this->userRepo->getUserFields($user, false);
return view('profile.edit', [ return view('profile.edit', [
'user' => $user, 'user' => $user,
'airlines' => $airlines, 'airlines' => $airlines,
'airports' => $airports, 'airports' => $airports,
'countries' => Countries::getSelectList(), 'countries' => Countries::getSelectList(),
'timezones' => Timezonelist::toArray(), 'timezones' => Timezonelist::toArray(),
'userFields' => $userFields,
]); ]);
} }
@@ -145,20 +140,13 @@ class ProfileController extends Controller
$id = Auth::user()->id; $id = Auth::user()->id;
$user = $this->userRepo->findWithoutFail($id); $user = $this->userRepo->findWithoutFail($id);
$rules = [ $validator = Validator::make($request->toArray(), [
'name' => 'required', 'name' => 'required',
'email' => 'required|unique:users,email,'.$id, 'email' => 'required|unique:users,email,'.$id,
'airline_id' => 'required', 'airline_id' => 'required',
'password' => 'confirmed', 'password' => 'confirmed',
'avatar' => 'nullable|mimes:jpeg,png,jpg', 'avatar' => 'nullable|mimes:jpeg,png,jpg',
]; ]);
$userFields = UserField::where(['show_on_registration' => true, 'required' => true])->get();
foreach ($userFields as $field) {
$rules['field_'.$field->slug] = 'required';
}
$validator = Validator::make($request->toArray(), $rules);
if ($validator->fails()) { if ($validator->fails()) {
Log::info('validator failed for user '.$user->ident); Log::info('validator failed for user '.$user->ident);
@@ -179,7 +167,6 @@ class ProfileController extends Controller
if (isset($req_data['avatar']) !== null) { if (isset($req_data['avatar']) !== null) {
Storage::delete($user->avatar); Storage::delete($user->avatar);
} }
if ($request->hasFile('avatar')) { if ($request->hasFile('avatar')) {
$avatar = $request->file('avatar'); $avatar = $request->file('avatar');
$file_name = $user->ident.'.'.$avatar->getClientOriginalExtension(); $file_name = $user->ident.'.'.$avatar->getClientOriginalExtension();
@@ -203,16 +190,6 @@ class ProfileController extends Controller
$this->userRepo->update($req_data, $id); $this->userRepo->update($req_data, $id);
// Save all of the user fields
$userFields = UserField::all();
foreach ($userFields as $field) {
$field_name = 'field_'.$field->slug;
UserFieldValue::updateOrCreate([
'user_field_id' => $field->id,
'user_id' => $id,
], ['value' => $request->get($field_name)]);
}
Flash::success('Profile updated successfully!'); Flash::success('Profile updated successfully!');
return redirect(route('frontend.profile.index')); return redirect(route('frontend.profile.index'));
-1
View File
@@ -45,7 +45,6 @@ class Kernel extends HttpKernel
ShareErrorsFromSession::class, ShareErrorsFromSession::class,
// VerifyCsrfToken::class, // VerifyCsrfToken::class,
SubstituteBindings::class, SubstituteBindings::class,
SetActiveTheme::class,
], ],
]; ];
+2 -36
View File
@@ -13,44 +13,8 @@ use Illuminate\Support\Facades\Log;
*/ */
class SetActiveTheme implements Middleware class SetActiveTheme implements Middleware
{ {
private static $skip = [
'admin',
'admin/*',
'api',
'api/*',
'importer',
'importer/*',
'install',
'install/*',
'update',
'update/*',
];
/**
* Handle the request
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle(Request $request, Closure $next) public function handle(Request $request, Closure $next)
{ {
$this->setTheme($request);
return $next($request);
}
/**
* Set the theme for the current middleware
*
* @param \Illuminate\Http\Request $request
*/
public function setTheme(Request $request)
{
if ($request->is(self::$skip)) {
return;
}
try { try {
$theme = setting('general.theme'); $theme = setting('general.theme');
} catch (\Exception $e) { } catch (\Exception $e) {
@@ -61,5 +25,7 @@ class SetActiveTheme implements Middleware
if (!empty($theme)) { if (!empty($theme)) {
Theme::set($theme); Theme::set($theme);
} }
return $next($request);
} }
} }
+1 -1
View File
@@ -11,7 +11,7 @@ class PrefileRequest extends FormRequest
return [ return [
'airline_id' => 'required|exists:airlines,id', 'airline_id' => 'required|exists:airlines,id',
'aircraft_id' => 'required|exists:aircraft,id', 'aircraft_id' => 'required|exists:aircraft,id',
'flight_id' => 'sometimes|nullable|exists:flights,id', 'flight_id' => 'sometimes|exists:flights,id',
'flight_number' => 'required', 'flight_number' => 'required',
'dpt_airport_id' => 'required', 'dpt_airport_id' => 'required',
'arr_airport_id' => 'required', 'arr_airport_id' => 'required',
+1 -1
View File
@@ -19,7 +19,7 @@ class UpdatePageRequest extends FormRequest
'required', 'required',
Rule::unique('pages')->ignore($this->id, 'id'), Rule::unique('pages')->ignore($this->id, 'id'),
], ],
'body' => 'nullable', 'body' => 'required',
]; ];
} }
} }
+2 -2
View File
@@ -15,9 +15,9 @@ class Fare extends Resource
'id' => $this->id, 'id' => $this->id,
'code' => $this->code, 'code' => $this->code,
'name' => $this->name, 'name' => $this->name,
'capacity' => $this->capacity,
'cost' => $this->cost,
'price' => $this->price, 'price' => $this->price,
'cost' => $this->cost,
'capacity' => $this->capacity,
'type' => $this->type, 'type' => $this->type,
'notes' => $this->notes, 'notes' => $this->notes,
'active' => $this->active, 'active' => $this->active,
+4 -4
View File
@@ -18,17 +18,17 @@ class Flight extends Resource
private function setFields() private function setFields()
{ {
/** @var \Illuminate\Support\Collection $field_values */ /** @var \Illuminate\Support\Collection $field_values */
$return_values = new stdClass();
$field_values = $this->field_values; $field_values = $this->field_values;
if (empty($field_values) || $field_values->count() === 0) { if (empty($field_values) || $field_values->count() === 0) {
return $return_values; return new stdClass();
} }
$fields = [];
foreach ($field_values as $field) { foreach ($field_values as $field) {
$return_values->{$field->name} = $field->value; $fields[$field->name] = $field->value;
} }
return $return_values; return $fields;
} }
/** /**
+1 -1
View File
@@ -2,7 +2,7 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use App\Contracts\Resource; use Illuminate\Http\Resources\Json\Resource;
/** /**
* @mixin \App\Models\SimBrief * @mixin \App\Models\SimBrief
-1
View File
@@ -31,7 +31,6 @@ class User extends Resource
$res['airline'] = Airline::make($this->whenLoaded('airline')); $res['airline'] = Airline::make($this->whenLoaded('airline'));
$res['bids'] = UserBid::collection($this->whenLoaded('bids')); $res['bids'] = UserBid::collection($this->whenLoaded('bids'));
$res['rank'] = Rank::make($this->whenLoaded('rank')); $res['rank'] = Rank::make($this->whenLoaded('rank'));
$res['subfleets'] = Subfleet::make($this->whenLoaded('subfleets'));
return $res; return $res;
} }
-71
View File
@@ -1,71 +0,0 @@
<?php
namespace App\Listeners;
use App\Contracts\Listener;
use App\Events\PirepAccepted;
use App\Events\UserStateChanged;
use App\Events\UserStatsChanged;
use App\Models\Award;
/**
* Look for and run any of the award classes. Don't modify this.
* See the documentation on creating awards:
*
* @url http://docs.phpvms.net/customizing/awards
*/
class AwardHandler extends Listener
{
/** The events and the callback */
public static $callbacks = [
PirepAccepted::class => 'onPirepAccept',
UserStatsChanged::class => 'onUserStatsChanged',
UserStateChanged::class => 'onUserStateChanged',
];
/**
* Called when a PIREP is accepted
*
* @param \App\Events\PirepAccepted $event
*/
public function onPirepAccept(PirepAccepted $event)
{
$this->checkForAwards($event->pirep->user);
}
/**
* When the user's state has changed
*
* @param \App\Events\UserStateChanged $event
*/
public function onUserStateChanged(UserStateChanged $event): void
{
$this->checkForAwards($event->user);
}
/**
* Called when any of the user's states have changed
*
* @param UserStatsChanged $event
*/
public function onUserStatsChanged(UserStatsChanged $event): void
{
$this->checkForAwards($event->user);
}
/**
* Check for any awards to be run and test them against the user
*
* @param \App\Models\User $user
*/
public function checkForAwards($user)
{
$awards = Award::all();
foreach ($awards as $award) {
$klass = $award->getReference($award, $user);
if ($klass) {
$klass->handle();
}
}
}
}
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace App\Listeners;
use App\Contracts\Listener;
use App\Events\UserStatsChanged;
use App\Models\Award;
/**
* Look for and run any of the award classes. Don't modify this.
* See the documentation on creating awards:
*
* @url http://docs.phpvms.net/customizing/awards
*/
class AwardListener extends Listener
{
/**
* Call all of the awards
*
* @param UserStatsChanged $event
*/
public function handle(UserStatsChanged $event): void
{
$awards = Award::all();
foreach ($awards as $award) {
$klass = $award->getReference($award, $event->user);
if ($klass) {
$klass->handle();
}
}
}
}
-6
View File
@@ -16,8 +16,6 @@ use Carbon\Carbon;
* @property string icao * @property string icao
* @property string registration * @property string registration
* @property int flight_time * @property int flight_time
* @property float mtow
* @property float zfw
* @property string hex_code * @property string hex_code
* @property Airport airport * @property Airport airport
* @property Subfleet subfleet * @property Subfleet subfleet
@@ -41,7 +39,6 @@ class Aircraft extends Model
'registration', 'registration',
'hex_code', 'hex_code',
'flight_time', 'flight_time',
'mtow',
'zfw', 'zfw',
'status', 'status',
'state', 'state',
@@ -52,7 +49,6 @@ class Aircraft extends Model
*/ */
protected $casts = [ protected $casts = [
'subfleet_id' => 'integer', 'subfleet_id' => 'integer',
'mtow' => 'float',
'zfw' => 'float', 'zfw' => 'float',
'flight_time' => 'float', 'flight_time' => 'float',
'state' => 'integer', 'state' => 'integer',
@@ -66,8 +62,6 @@ class Aircraft extends Model
'name' => 'required', 'name' => 'required',
'status' => 'required', 'status' => 'required',
'registration' => 'required', 'registration' => 'required',
'mtow' => 'nullable|numeric',
'zfw' => 'nullable|numeric',
]; ];
/** /**
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App\Models\Enums;
use App\Contracts\Enum;
class AnalyticsDimensions extends Enum
{
public const PHP_VERSION = 1;
public const DATABASE_VERSION = 2;
public const PHPVMS_VERSION = 3;
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace App\Models\Enums;
use App\Contracts\Enum;
/**
* Metrics IDs used in Google Analytics
*/
class AnalyticsMetrics extends Enum
{
// Track the lookup time for airports from vaCentral
public const AIRPORT_LOOKUP_TIME = 1;
}
+2 -7
View File
@@ -6,11 +6,6 @@ use App\Contracts\Enum;
class PageType extends Enum class PageType extends Enum
{ {
public const PAGE = 0; public const HTML = 0;
public const LINK = 1; public const MARKDOWN = 1;
public static $labels = [
self::PAGE => 'Page',
self::LINK => 'Link',
];
} }
+8 -8
View File
@@ -9,14 +9,14 @@ use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str; use Illuminate\Support\Str;
/** /**
* @property string $name * @property string $name
* @property string $description * @property string $description
* @property string $disk * @property string $disk
* @property string $path * @property string $path
* @property bool $public * @property bool $public
* @property int $download_count * @property int $download_count
* @property string $url * @property string $url
* @property string $filename * @property string $filename
*/ */
class File extends Model class File extends Model
{ {
-4
View File
@@ -25,10 +25,6 @@ use Illuminate\Support\Collection;
* @property int distance * @property int distance
* @property int flight_time * @property int flight_time
* @property string route * @property string route
* @property string dpt_time
* @property string arr_time
* @property string flight_type
* @property string notes
* @property int level * @property int level
* @property float load_factor * @property float load_factor
* @property float load_factor_variance * @property float load_factor_variance
+5 -5
View File
@@ -14,11 +14,11 @@ use Carbon\Carbon;
* Holds various journals, depending on the morphed_type and morphed_id columns * Holds various journals, depending on the morphed_type and morphed_id columns
* *
* @property mixed id * @property mixed id
* @property Money $balance * @property Money $balance
* @property string $currency * @property string $currency
* @property Carbon $updated_at * @property Carbon $updated_at
* @property Carbon $post_date * @property Carbon $post_date
* @property Carbon $created_at * @property Carbon $created_at
* @property \App\Models\Enums\JournalType type * @property \App\Models\Enums\JournalType type
* @property mixed morphed_type * @property mixed morphed_type
* @property mixed morphed_id * @property mixed morphed_id
+5 -5
View File
@@ -13,11 +13,11 @@ use Carbon\Carbon;
/** /**
* Class Ledger * Class Ledger
* *
* @property Money $balance * @property Money $balance
* @property string $currency * @property string $currency
* @property Carbon $updated_at * @property Carbon $updated_at
* @property Carbon $post_date * @property Carbon $post_date
* @property Carbon $created_at * @property Carbon $created_at
*/ */
class Ledger extends Model class Ledger extends Model
{ {

Some files were not shown because too many files have changed in this diff Show More