Compare commits

..

1 Commits

Author SHA1 Message Date
Nabeel Shahzad
18206f4601 Update the meta link to include query strings 2021-06-10 19:29:25 -04:00
553 changed files with 21908 additions and 26150 deletions

View File

@@ -15,10 +15,7 @@ declare -a remove_files=(
.idea .idea
.travis .travis
docker docker
node_modules
vendor/willdurand/geocoder/tests
_ide_helper.php _ide_helper.php
.env
.dockerignore .dockerignore
.dpl .dpl
.editorconfig .editorconfig
@@ -26,7 +23,6 @@ declare -a remove_files=(
.eslintrc .eslintrc
.php_cs .php_cs
.php_cs.cache .php_cs.cache
.php-cs-fixer.php
.phpstorm.meta.php .phpstorm.meta.php
.styleci.yml .styleci.yml
.phpunit.result.cache .phpunit.result.cache
@@ -41,8 +37,9 @@ declare -a remove_files=(
phpvms.iml phpvms.iml
Procfile Procfile
phpstan.neon phpstan.neon
symfony.lock node_modules
composer.phar composer.phar
vendor/willdurand/geocoder/tests
) )
for file in "${remove_files[@]}"; do for file in "${remove_files[@]}"; do
@@ -73,22 +70,14 @@ mkdir -p storage/framework/views
cd /tmp cd /tmp
echo "Current directory contents"
ls -al $BASE_DIR
echo "Parent directory contents"
ls -al $BASE_DIR/../ ls -al $BASE_DIR/../
echo "Calling find" tar -czf $TAR_NAME -C $BASE_DIR .
find $BASE_DIR/../ -type d -maxdepth 2
tar -czf $TAR_NAME -C $BASE_DIR --xform 's:^\./::' . [--show-transformed-names|--show-stored-names]
sha256sum $TAR_NAME >"$TAR_NAME.sha256" sha256sum $TAR_NAME >"$TAR_NAME.sha256"
cd $BASE_DIR; cd $BASE_DIR;
zip -r $ZIP_NAME ./ zip -r $ZIP_NAME *
sha256sum $ZIP_NAME >"$ZIP_NAME.sha256" sha256sum $ZIP_NAME >"$ZIP_NAME.sha256"
mv $ZIP_NAME /tmp mv $ZIP_NAME /tmp
mv "$ZIP_NAME.sha256" /tmp mv "$ZIP_NAME.sha256" /tmp

View File

@@ -2,12 +2,12 @@ name: 'Build'
on: ['push', 'pull_request', 'workflow_dispatch', 'release'] on: ['push', 'pull_request', 'workflow_dispatch', 'release']
jobs: jobs:
build: build:
runs-on: ubuntu-20.04 runs-on: ubuntu-18.04
if: github.repository == 'nabeelio/phpvms' if: github.repository == 'nabeelio/phpvms'
strategy: strategy:
fail-fast: true fail-fast: true
matrix: matrix:
php-versions: ['8.0', '8.1'] php-versions: ['7.3', '7.4', '8.0']
name: PHP ${{ matrix.php-versions }} name: PHP ${{ matrix.php-versions }}
env: env:
extensions: intl, pcov, mbstring extensions: intl, pcov, mbstring
@@ -69,7 +69,6 @@ jobs:
run: | run: |
php --version php --version
mysql --version mysql --version
sleep 15
# Downgrade composer version to 1.x # Downgrade composer version to 1.x
composer install --dev --no-interaction --verbose composer install --dev --no-interaction --verbose
cp .github/scripts/env.php env.php cp .github/scripts/env.php env.php
@@ -79,8 +78,7 @@ jobs:
- name: Run Tests - name: Run Tests
run: | run: |
export PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix --config=.php_cs -v --dry-run --diff --using-cache=no
#vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php -v --dry-run --diff --using-cache=no
vendor/bin/phpunit --debug --verbose vendor/bin/phpunit --debug --verbose
# This runs after all of the tests, run have run. Creates a cleaned up version of the # This runs after all of the tests, run have run. Creates a cleaned up version of the
@@ -88,7 +86,7 @@ jobs:
artifacts: artifacts:
name: 'Create dev build' name: 'Create dev build'
needs: build needs: build
runs-on: ubuntu-20.04 runs-on: 'ubuntu-18.04'
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev' if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev'
steps: steps:
- name: Checkout - name: Checkout
@@ -97,7 +95,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '8.0' php-version: '7.4'
- uses: olegtarasov/get-tag@v2.1 - uses: olegtarasov/get-tag@v2.1
id: tagName id: tagName
@@ -118,6 +116,7 @@ jobs:
- name: 'Install Release Dependencies' - name: 'Install Release Dependencies'
run: | run: |
rm -rf vendor rm -rf vendor
sudo npm i tar-to-zip -g
composer install --no-dev --prefer-dist --no-interaction --verbose composer install --no-dev --prefer-dist --no-interaction --verbose
sudo chmod +x ./.github/scripts/* sudo chmod +x ./.github/scripts/*
@@ -150,7 +149,7 @@ jobs:
release: release:
name: 'Create Release' name: 'Create Release'
needs: build needs: build
runs-on: ubuntu-20.04 runs-on: 'ubuntu-18.04'
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
steps: steps:
- name: Checkout - name: Checkout
@@ -159,7 +158,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: 8.0 php-version: '7.4'
- uses: olegtarasov/get-tag@v2.1 - uses: olegtarasov/get-tag@v2.1
id: tagName id: tagName
@@ -180,6 +179,7 @@ jobs:
- name: 'Install Release Dependencies' - name: 'Install Release Dependencies'
run: | run: |
rm -rf vendor rm -rf vendor
sudo npm i tar-to-zip -g
composer install --no-dev --prefer-dist --no-interaction --verbose composer install --no-dev --prefer-dist --no-interaction --verbose
sudo chmod +x ./.github/scripts/* sudo chmod +x ./.github/scripts/*

12
.gitignore vendored
View File

@@ -22,7 +22,6 @@ storage/*.sqlite
.env.*.php .env.*.php
.env.php .env.php
.env .env
.env.*
.env.bak .env.bak
env.php env.php
.env.generated .env.generated
@@ -77,14 +76,3 @@ error_log
/config.php /config.php
/config.bak.php /config.bak.php
/VERSION /VERSION
sync.sh
###> friendsofphp/php-cs-fixer ###
/.php-cs-fixer.php
/.php-cs-fixer.cache
###< friendsofphp/php-cs-fixer ###
###> phpunit/phpunit ###
/phpunit.xml
.phpunit.result.cache
###< phpunit/phpunit ###

View File

@@ -1,69 +0,0 @@
<?php
declare(strict_types=1);
/*
* This file is part of PHP CS Fixer.
*
* (c) Fabien Potencier <fabien@symfony.com>
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
$header = <<<'EOF'
This file is part of PHP CS Fixer.
(c) Fabien Potencier <fabien@symfony.com>
Dariusz Rumiński <dariusz.ruminski@gmail.com>
This source file is subject to the MIT license that is bundled
with this source code in the file LICENSE.
EOF;
$finder = PhpCsFixer\Finder::create()
->ignoreVCSIgnored(true)
->exclude('tests/data')
->exclude('storage')
->exclude('resources')
->in(__DIR__)
->append([
__DIR__.'/dev-tools/doc.php',
// __DIR__.'/php-cs-fixer', disabled, as we want to be able to run bootstrap file even on lower PHP version, to show nice message
__FILE__,
])
;
$config = new PhpCsFixer\Config();
$config
->setRiskyAllowed(true)
->setRules([
'@PSR2' => true,
'strict_param' => true,
'no_php4_constructor' => true,
'no_extra_blank_lines' => true,
'no_superfluous_elseif' => true,
'single_line_comment_style' => false,
'simple_to_complex_string_variable' => true,
'array_syntax' => [
'syntax' => 'short',
],
'binary_operator_spaces' => [
'operators' => [
'=>' => 'align_single_space_minimal'
]
],
/*
'blank_line_before_statement' => [
'statements' => [
'declare',
'for',
'return',
'throw',
'try',
],
],
*/
])
->setFinder($finder);
return $config;

37
.php_cs Normal file
View File

@@ -0,0 +1,37 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in('app')
->in('config');
return PhpCsFixer\Config::create()
->setHideProgress(true)
->setUsingCache(false)
->setRiskyAllowed(true)
->setRules([
'@PSR2' => true,
'strict_param' => true,
'no_php4_constructor' => true,
'no_extra_blank_lines' => true,
'no_superfluous_elseif' => true,
'single_line_comment_style' => false,
'simple_to_complex_string_variable' => true,
'array_syntax' => [
'syntax' => 'short',
],
'binary_operator_spaces' => [
'align_double_arrow' => true,
],
/*
'blank_line_before_statement' => [
'statements' => [
'declare',
'for',
'return',
'throw',
'try',
],
],
*/
])
->setFinder($finder);

View File

@@ -1,15 +1,14 @@
FROM php:8.1-fpm-alpine3.15 FROM php:7.4-fpm-alpine
WORKDIR /var/www/ WORKDIR /var/www/
# Setup composer RUN apk add gmp-dev icu-dev zlib-dev libpng-dev
COPY --from=composer:2.2.7 /usr/bin/composer /usr/local/bin/composer RUN curl --silent --show-error https://getcomposer.org/installer | php
RUN apk add gmp-dev icu-dev zlib-dev libpng-dev libzip-dev zip
# Copy any config files in # Copy any config files in
COPY resources/docker/php/ext-opcache.ini $PHP_INI_DIR/conf.d/ COPY resources/docker/php/ext-opcache.ini $PHP_INI_DIR/conf.d/
COPY resources/docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf COPY resources/docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf
RUN ln -sf /dev/stderr /var/log/fpm-error.log
RUN docker-php-ext-install \ RUN docker-php-ext-install \
calendar \ calendar \
@@ -17,19 +16,17 @@ RUN docker-php-ext-install \
pdo_mysql \ pdo_mysql \
gd \ gd \
gmp \ gmp \
bcmath \ opcache && \
opcache \ docker-php-ext-enable pdo_mysql opcache
zip && \
docker-php-ext-enable pdo_mysql opcache bcmath zip intl
COPY . /var/www/ COPY . /var/www/
RUN composer install \ RUN php composer.phar install \
--ignore-platform-reqs \ --ignore-platform-reqs \
--no-interaction \ --no-interaction \
--no-plugins \ --no-plugins \
--no-scripts \ --no-scripts \
--prefer-dist --prefer-dist
#RUN chown -R www-data:www-data /var/www RUN chown -R www-data:www-data /var/www
EXPOSE 9000 EXPOSE 9000

View File

@@ -1,3 +1,5 @@
BSD 3-Clause License
Copyright (c) 2017, phpvms - http://www.phpvms.net Copyright (c) 2017, phpvms - http://www.phpvms.net
All rights reserved. All rights reserved.
@@ -15,9 +17,6 @@ modification, are permitted provided that the following conditions are met:
contributors may be used to endorse or promote products derived from contributors may be used to endorse or promote products derived from
this software without specific prior written permission. this software without specific prior written permission.
* A "powered by phpvms" is required in page footers, unless the license has
purchased to omit it.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

View File

@@ -80,7 +80,11 @@ test:
.PHONY: phpcs .PHONY: phpcs
phpcs: phpcs:
@PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php -v --dry-run --diff --using-cache=no @vendor/bin/php-cs-fixer fix --config=.php_cs -v --diff --diff-format=udiff --dry-run
#.PHONY: phpstan
#phpstan:
# vendor/bin/phpstan analyse -c phpstan.neon -v --level 2 app
.PHONY: replay-acars .PHONY: replay-acars
replay-acars: replay-acars:
@@ -91,6 +95,11 @@ replay-acars:
sass-watch: sass-watch:
sass --watch public/assets/admin/sass/paper-dashboard.scss:public/assets/admin/css/paper-dashboard.css sass --watch public/assets/admin/sass/paper-dashboard.scss:public/assets/admin/css/paper-dashboard.css
.PHONY: schema
schema:
#php artisan infyom:scaffold Aircraft --fieldsFile=database/schema/aircraft.json
echo ""
.PHONY: deploy-package .PHONY: deploy-package
deploy-package: deploy-package:
./.travis/deploy_script.sh ./.travis/deploy_script.sh
@@ -102,7 +111,7 @@ reset-installer:
.PHONY: docker-test .PHONY: docker-test
docker-test: docker-test:
@docker compose -f docker-compose.dev.yml up @docker-compose -f docker-compose.yml -f docker-compose.local.yml up
.PHONY: docker-clean .PHONY: docker-clean
docker-clean: docker-clean:

View File

@@ -11,7 +11,7 @@ A full distribution, with all of the composer dependencies, is available at this
### Requirements ### Requirements
- PHP 8.0+, extensions: - PHP 7.3+, extensions:
- cURL - cURL
- JSON - JSON
- mbstring - mbstring
@@ -39,7 +39,7 @@ make docker-test
# **OR** with docker-compose directly # **OR** with docker-compose directly
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up docker-compose -f docker-compose.yml -f docker-compose.local.yml up
``` ```
Then go to `http://localhost`. If you're using dnsmasq, the `app` container is listening on `phpvms.test`, or you can add to your `/etc/hosts` file: Then go to `http://localhost`. If you're using dnsmasq, the `app` container is listening on `phpvms.test`, or you can add to your `/etc/hosts` file:

View File

@@ -17,25 +17,25 @@ class AcarsReplay extends Command
* *
* @var string * @var string
*/ */
protected string $apiKey = 'testadminapikey'; protected $apiKey = 'testadminapikey';
/** /**
* For automatic updates, how many seconds to sleep between updates * For automatic updates, how many seconds to sleep between updates
* *
* @var int * @var int
*/ */
protected int $sleepTime = 10; protected $sleepTime = 10;
/** /**
* @var array key == update[callsign] * @var array key == update[callsign]
* value == PIREP ID * value == PIREP ID
*/ */
protected array $pirepList = []; protected $pirepList = [];
/** /**
* @var Client * @var Client
*/ */
protected Client $httpClient; protected $httpClient;
/** /**
* Return an instance of an HTTP client all ready to post * Return an instance of an HTTP client all ready to post

View File

@@ -2,11 +2,11 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App;
use App\Contracts\Command; use App\Contracts\Command;
use App\Services\Installer\ConfigService; use App\Services\Installer\ConfigService;
use App\Services\Installer\SeederService; use App\Services\Installer\SeederService;
use DatabaseSeeder; use DatabaseSeeder;
use Illuminate\Support\Facades\App;
/** /**
* Create the config files * Create the config files
@@ -16,8 +16,8 @@ class CreateConfigs extends Command
protected $signature = 'phpvms:config {db_host} {db_name} {db_user} {db_pass}'; protected $signature = 'phpvms:config {db_host} {db_name} {db_user} {db_pass}';
protected $description = 'Create the config files'; protected $description = 'Create the config files';
private DatabaseSeeder $databaseSeeder; private $databaseSeeder;
private SeederService $seederSvc; private $seederSvc;
public function __construct(DatabaseSeeder $databaseSeeder, SeederService $seederSvc) public function __construct(DatabaseSeeder $databaseSeeder, SeederService $seederSvc)
{ {

View File

@@ -11,11 +11,7 @@ class CreateDatabase extends Command
{ {
protected $signature = 'database:create {--reset} {--migrate} {--conn=?}'; protected $signature = 'database:create {--reset} {--migrate} {--conn=?}';
protected $description = 'Create a database'; protected $description = 'Create a database';
protected $os;
/**
* @var Detector
*/
protected Detector $os;
/** /**
* CreateDatabase constructor. * CreateDatabase constructor.

View File

@@ -24,8 +24,7 @@ class DevCommands extends Command
{ {
protected $signature = 'phpvms {cmd} {param?}'; protected $signature = 'phpvms {cmd} {param?}';
protected $description = 'Developer commands'; protected $description = 'Developer commands';
protected $dbSvc;
protected DatabaseService $dbSvc;
/** /**
* DevCommands constructor. * DevCommands constructor.

View File

@@ -13,7 +13,7 @@ class DevInstall extends Command
protected $signature = 'phpvms:dev-install {--reset-db} {--reset-configs}'; protected $signature = 'phpvms:dev-install {--reset-db} {--reset-configs}';
protected $description = 'Run a developer install and run the sample migration'; protected $description = 'Run a developer install and run the sample migration';
private \DatabaseSeeder $databaseSeeder; private $databaseSeeder;
public function __construct(\DatabaseSeeder $databaseSeeder) public function __construct(\DatabaseSeeder $databaseSeeder)
{ {

View File

@@ -10,7 +10,7 @@ class ImportCsv extends Command
protected $signature = 'phpvms:csv-import {type} {file}'; protected $signature = 'phpvms:csv-import {type} {file}';
protected $description = 'Import from a CSV file'; protected $description = 'Import from a CSV file';
private ImportService $importer; private $importer;
/** /**
* Import constructor. * Import constructor.

View File

@@ -18,15 +18,11 @@ class ProcessQueue extends Command
public function handle() public function handle()
{ {
Artisan::call('queue:work', [ Artisan::call('queue:work', [
//'--sansdaemon' => null, '--sansdaemon' => null,
'--stop-when-empty' => null, '--stop-when-empty' => null,
]); ]);
$jobOutput = trim(Artisan::output()); Log::info(Artisan::output());
if (!empty($jobOutput)) {
Log::info($jobOutput);
}
///** @var App\Support\WorkCommand $queueWorker */ ///** @var App\Support\WorkCommand $queueWorker */
//$queueWorker = new App\Support\WorkCommand(app('queue.worker'), app('cache.store')); //$queueWorker = new App\Support\WorkCommand(app('queue.worker'), app('cache.store'));

View File

@@ -8,11 +8,7 @@ use GuzzleHttp\Client;
class TestApi extends Command class TestApi extends Command
{ {
protected $signature = 'phpvms:test-api {apikey} {url}'; protected $signature = 'phpvms:test-api {apikey} {url}';
protected $httpClient;
/**
* @var Client
*/
protected Client $httpClient;
/** /**
* Run dev related commands * Run dev related commands

View File

@@ -10,14 +10,8 @@ class Version extends Command
{ {
protected $signature = 'phpvms:version {--write} {--base-only} {--write-full-version} {version?}'; protected $signature = 'phpvms:version {--write} {--base-only} {--write-full-version} {version?}';
/** private $versionSvc;
* @var VersionService
*/
private VersionService $versionSvc;
/**
* @param VersionService $versionSvc
*/
public function __construct(VersionService $versionSvc) public function __construct(VersionService $versionSvc)
{ {
parent::__construct(); parent::__construct();

View File

@@ -12,11 +12,7 @@ class YamlImport extends Command
{ {
protected $signature = 'phpvms:yaml-import {files*}'; protected $signature = 'phpvms:yaml-import {files*}';
protected $description = 'Developer commands'; protected $description = 'Developer commands';
protected $dbSvc;
/**
* @var DatabaseService
*/
protected DatabaseService $dbSvc;
/** /**
* YamlImport constructor. * YamlImport constructor.

View File

@@ -1,90 +0,0 @@
<?php
/**
* This runs any of the cron tasks that are set to run according to the Laravel schedule
*/
namespace App\Console;
use App\Console\Cron\FifteenMinute;
use App\Console\Cron\FiveMinute;
use App\Console\Cron\Hourly;
use App\Console\Cron\JobQueue;
use App\Console\Cron\Monthly;
use App\Console\Cron\Nightly;
use App\Console\Cron\ThirtyMinute;
use App\Console\Cron\Weekly;
use App\Contracts\Command;
use Illuminate\Console\Scheduling\Schedule;
class Cron
{
/** @var Schedule */
private $scheduler;
/**
* @var string[] The cron tasks which get called/run
*/
private $cronTasks = [
JobQueue::class,
FiveMinute::class,
FifteenMinute::class,
ThirtyMinute::class,
Hourly::class,
Nightly::class,
Weekly::class,
Monthly::class,
];
/**
* @var array Stores the instantiated cron tasks
*/
private $cronRunners = [];
/**
* @param Schedule $scheduler
*/
public function __construct(Schedule $scheduler)
{
$this->scheduler = $scheduler;
foreach ($this->cronTasks as $task) {
/** @var Command $cronTask */
$cronTask = app($task);
$signature = $cronTask->getSignature();
if (empty($signature)) {
continue;
}
$this->cronRunners[$signature] = $cronTask;
}
}
/**
* Try to figure out which commands are supposed to run right now
*
* @return array string of tasks that were run
*/
public function run(): array
{
$events = $this->scheduler->dueEvents(app());
if (empty($events)) {
return [];
}
$run = [];
/** @var \Illuminate\Console\Scheduling\Event $event */
foreach ($events as $event) {
foreach ($this->cronRunners as $signature => $task) {
if (!str_contains($event->command, $signature)) {
continue;
}
$task->callEvent();
$run[] = $signature;
}
}
return $run;
}
}

View File

@@ -1,26 +0,0 @@
<?php
namespace App\Console\Cron;
use App\Contracts\CronCommand;
use App\Events\CronFifteenMinute;
/**
* The actual cron tasks are in app/Cron
*/
class FifteenMinute extends CronCommand
{
protected $signature = 'cron:fifteen';
protected $description = 'Run the 15 minute cron tasks';
protected $schedule;
public function handle(): void
{
$this->callEvent();
}
public function callEvent()
{
event(new CronFifteenMinute());
}
}

View File

@@ -1,29 +0,0 @@
<?php
namespace App\Console\Cron;
use App\Contracts\CronCommand;
use App\Events\CronFiveMinute;
/**
* This just calls the CronNightly event, so all of the
* listeners, etc can just be called to run those tasks
*
* The actual cron tasks are in app/Cron
*/
class FiveMinute extends CronCommand
{
protected $signature = 'cron:five';
protected $description = 'Run the 5 minute cron tasks';
protected $schedule;
public function handle(): void
{
$this->callEvent();
}
public function callEvent()
{
event(new CronFiveMinute());
}
}

View File

@@ -2,14 +2,14 @@
namespace App\Console\Cron; namespace App\Console\Cron;
use App\Contracts\CronCommand; use App\Contracts\Command;
use App\Events\CronHourly; use App\Events\CronHourly;
/** /**
* This just calls the CronHourly event, so all of the * This just calls the CronHourly event, so all of the
* listeners, etc can just be called to run those tasks * listeners, etc can just be called to run those tasks
*/ */
class Hourly extends CronCommand class Hourly extends Command
{ {
protected $signature = 'cron:hourly'; protected $signature = 'cron:hourly';
protected $description = 'Run the hourly cron tasks'; protected $description = 'Run the hourly cron tasks';
@@ -17,11 +17,7 @@ class Hourly extends CronCommand
public function handle(): void public function handle(): void
{ {
$this->callEvent(); $this->redirectLoggingToFile('cron');
}
public function callEvent()
{
event(new CronHourly()); event(new CronHourly());
} }
} }

View File

@@ -2,14 +2,14 @@
namespace App\Console\Cron; namespace App\Console\Cron;
use App\Contracts\CronCommand; use App\Contracts\Command;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
/** /**
* This just calls the CronHourly event, so all of the * This just calls the CronHourly event, so all of the
* listeners, etc can just be called to run those tasks * listeners, etc can just be called to run those tasks
*/ */
class JobQueue extends CronCommand class JobQueue extends Command
{ {
protected $signature = 'cron:queue'; protected $signature = 'cron:queue';
protected $description = 'Run the cron queue tasks'; protected $description = 'Run the cron queue tasks';
@@ -17,16 +17,9 @@ class JobQueue extends CronCommand
public function handle(): void public function handle(): void
{ {
$this->callEvent(); $this->redirectLoggingToFile('cron');
$queueOutput = trim(Artisan::output());
if (!empty($queueOutput)) {
$this->info($queueOutput);
}
}
public function callEvent()
{
Artisan::call('queue:cron'); Artisan::call('queue:cron');
$this->info(Artisan::output());
} }
} }

View File

@@ -2,7 +2,7 @@
namespace App\Console\Cron; namespace App\Console\Cron;
use App\Contracts\CronCommand; use App\Contracts\Command;
use App\Events\CronMonthly; use App\Events\CronMonthly;
/** /**
@@ -11,7 +11,7 @@ use App\Events\CronMonthly;
* *
* The actual cron tasks are in app/Cron * The actual cron tasks are in app/Cron
*/ */
class Monthly extends CronCommand class Monthly extends Command
{ {
protected $signature = 'cron:monthly'; protected $signature = 'cron:monthly';
protected $description = 'Run the monthly cron tasks'; protected $description = 'Run the monthly cron tasks';
@@ -19,11 +19,7 @@ class Monthly extends CronCommand
public function handle(): void public function handle(): void
{ {
$this->callEvent(); $this->redirectLoggingToFile('cron');
}
public function callEvent()
{
event(new CronMonthly()); event(new CronMonthly());
} }
} }

View File

@@ -2,7 +2,7 @@
namespace App\Console\Cron; namespace App\Console\Cron;
use App\Contracts\CronCommand; use App\Contracts\Command;
use App\Events\CronNightly; use App\Events\CronNightly;
/** /**
@@ -11,7 +11,7 @@ use App\Events\CronNightly;
* *
* The actual cron tasks are in app/Cron * The actual cron tasks are in app/Cron
*/ */
class Nightly extends CronCommand class Nightly extends Command
{ {
protected $signature = 'cron:nightly'; protected $signature = 'cron:nightly';
protected $description = 'Run the nightly cron tasks'; protected $description = 'Run the nightly cron tasks';
@@ -19,11 +19,7 @@ class Nightly extends CronCommand
public function handle(): void public function handle(): void
{ {
$this->callEvent(); $this->redirectLoggingToFile('cron');
}
public function callEvent()
{
event(new CronNightly()); event(new CronNightly());
} }
} }

View File

@@ -1,26 +0,0 @@
<?php
namespace App\Console\Cron;
use App\Contracts\CronCommand;
use App\Events\CronThirtyMinute;
/**
* The actual cron tasks are in app/Cron
*/
class ThirtyMinute extends CronCommand
{
protected $signature = 'cron:thirty';
protected $description = 'Run the 30 minute cron tasks';
protected $schedule;
public function handle(): void
{
$this->callEvent();
}
public function callEvent()
{
event(new CronThirtyMinute());
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Console\Cron; namespace App\Console\Cron;
use App\Contracts\CronCommand; use App\Contracts\Command;
use App\Events\CronWeekly; use App\Events\CronWeekly;
/** /**
@@ -11,7 +11,7 @@ use App\Events\CronWeekly;
* *
* The actual cron tasks are in app/Cron * The actual cron tasks are in app/Cron
*/ */
class Weekly extends CronCommand class Weekly extends Command
{ {
protected $signature = 'cron:weekly'; protected $signature = 'cron:weekly';
protected $description = 'Run the weekly cron tasks'; protected $description = 'Run the weekly cron tasks';
@@ -19,11 +19,7 @@ class Weekly extends CronCommand
public function handle(): void public function handle(): void
{ {
$this->callEvent(); $this->redirectLoggingToFile('cron');
}
public function callEvent()
{
event(new CronWeekly()); event(new CronWeekly());
} }
} }

View File

@@ -2,13 +2,10 @@
namespace App\Console; namespace App\Console;
use App\Console\Cron\FifteenMinute;
use App\Console\Cron\FiveMinute;
use App\Console\Cron\Hourly; use App\Console\Cron\Hourly;
use App\Console\Cron\JobQueue; use App\Console\Cron\JobQueue;
use App\Console\Cron\Monthly; use App\Console\Cron\Monthly;
use App\Console\Cron\Nightly; use App\Console\Cron\Nightly;
use App\Console\Cron\ThirtyMinute;
use App\Console\Cron\Weekly; use App\Console\Cron\Weekly;
use App\Services\CronService; use App\Services\CronService;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
@@ -36,16 +33,10 @@ class Kernel extends ConsoleKernel
->withoutOverlapping(); ->withoutOverlapping();
} }
/*
* NOTE: IF MORE TASKS ARE ADDED, THEY ALSO MUST BE ADDED TO THE CRON.PHP
*/
$schedule->command(FiveMinute::class)->everyFiveMinutes();
$schedule->command(FifteenMinute::class)->everyFifteenMinutes();
$schedule->command(ThirtyMinute::class)->everyThirtyMinutes();
$schedule->command(Nightly::class)->dailyAt('01:00'); $schedule->command(Nightly::class)->dailyAt('01:00');
$schedule->command(Hourly::class)->hourly();
$schedule->command(Weekly::class)->weeklyOn(0); $schedule->command(Weekly::class)->weeklyOn(0);
$schedule->command(Monthly::class)->monthlyOn(1); $schedule->command(Monthly::class)->monthlyOn(1);
$schedule->command(Hourly::class)->hourly();
// When spatie-backups runs // When spatie-backups runs
/*if (config('backup.backup.enabled', false) === true) { /*if (config('backup.backup.enabled', false) === true) {

View File

@@ -37,10 +37,10 @@ abstract class Award
*/ */
/** @var \App\Models\Award|null */ /** @var \App\Models\Award|null */
protected ?AwardModel $award; protected $award;
/** @var \App\Models\User|null */ /** @var \App\Models\User|null */
protected ?User $user; protected $user;
public function __construct(AwardModel $award = null, User $user = null) public function __construct(AwardModel $award = null, User $user = null)
{ {
@@ -69,9 +69,9 @@ abstract class Award
/** /**
* Add the award to this user, if they don't already have it * Add the award to this user, if they don't already have it
* *
* @return bool|UserAward|null * @return bool|UserAward
*/ */
protected function addAward(): bool|UserAward|null protected function addAward()
{ {
$w = [ $w = [
'user_id' => $this->user->id, 'user_id' => $this->user->id,

View File

@@ -29,16 +29,6 @@ abstract class Command extends \Illuminate\Console\Command
}*/ }*/
} }
/**
* Return the signature of the command
*
* @return string
*/
public function getSignature(): string
{
return $this->signature;
}
/** /**
* Splice the logger and replace the active handlers with the handlers from the * Splice the logger and replace the active handlers with the handlers from the
* a stack in config/logging.php * a stack in config/logging.php

View File

@@ -84,21 +84,19 @@ abstract class Controller extends \Illuminate\Routing\Controller
* *
* @param $message * @param $message
* @param null|mixed $count * @param null|mixed $count
* @param mixed $attrs
* *
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function message($message, $count = null, $attrs = []) public function message($message, $count = null)
{ {
$ret = [ $attrs = [
'message' => $message, 'message' => $message,
'attrs' => $attrs,
]; ];
if ($count !== null) { if ($count !== null) {
$ret['count'] = $count; $attrs['count'] = $count;
} }
return response()->json($ret); return response()->json($attrs);
} }
} }

View File

@@ -1,20 +0,0 @@
<?php
namespace App\Contracts;
abstract class CronCommand extends Command
{
/**
* @return mixed
*/
abstract public function callEvent();
/**
* Adjust the logging depending on where we're running from
*/
public function __construct()
{
parent::__construct();
$this->redirectLoggingToFile('cron');
}
}

View File

@@ -7,14 +7,14 @@ namespace App\Contracts;
*/ */
abstract class Enum abstract class Enum
{ {
protected static array $cache = []; protected static $cache = [];
protected static array $codes = []; protected static $codes = [];
protected static array $labels = []; protected static $labels = [];
/** /**
* @var int * @var int
*/ */
protected int $value; protected $value;
/** /**
* Create an instance of this Enum * Create an instance of this Enum
@@ -29,9 +29,9 @@ abstract class Enum
/** /**
* Return the value that's been set if this is an instance * Return the value that's been set if this is an instance
* *
* @return int|null * @return mixed
*/ */
final public function getValue(): ?int final public function getValue()
{ {
return $this->value; return $this->value;
} }
@@ -41,9 +41,9 @@ abstract class Enum
* *
* @param $value * @param $value
* *
* @return string * @return mixed
*/ */
final public static function label($value): string final public static function label($value)
{ {
if (isset(static::$labels[$value])) { if (isset(static::$labels[$value])) {
$val = static::$labels[$value]; $val = static::$labels[$value];
@@ -53,8 +53,6 @@ abstract class Enum
return $val; return $val;
} }
return $value;
} }
/** /**
@@ -89,11 +87,11 @@ abstract class Enum
* *
* @return false|int|string * @return false|int|string
*/ */
public static function convertToCode($value): bool|int|string|null public static function convertToCode($value)
{ {
$value = (int) $value; $value = (int) $value;
if (!array_key_exists($value, static::$codes)) { if (!array_key_exists($value, static::$codes)) {
return null; return;
} }
return static::$codes[$value]; return static::$codes[$value];

View File

@@ -1,9 +0,0 @@
<?php
namespace App\Contracts;
use Illuminate\Database\Eloquent\Factories\Factory as EloquentFactory;
abstract class Factory extends EloquentFactory
{
}

View File

@@ -166,36 +166,10 @@ class ImportExport
return []; return [];
} }
if (strpos($split_values[0], '?') !== false) {
// This contains the query string, which turns it into a multi-level array
$query_str = explode('?', $split_values[0]);
$parent = trim($query_str[0]);
$children = [];
$kvp = explode('&', trim($query_str[1]));
foreach ($kvp as $items) {
if (!$items) {
continue;
}
$this->kvpToArray($items, $children);
}
$ret[$parent] = $children;
return $ret;
}
// This is not a query string, return it back untouched
return [$split_values[0]]; return [$split_values[0]];
} }
foreach ($split_values as $value) { foreach ($split_values as $value) {
$value = trim($value);
if ($value === '') {
continue;
}
// This isn't in the query string format, so it's // This isn't in the query string format, so it's
// just a straight key-value pair set // just a straight key-value pair set
if (strpos($value, '?') === false) { if (strpos($value, '?') === false) {

View File

@@ -2,6 +2,7 @@
namespace App\Contracts; namespace App\Contracts;
use App\Notifications\Channels\Discord\DiscordMessage;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
@@ -25,4 +26,24 @@ class Notification extends \Illuminate\Notifications\Notification implements Sho
$this->channels = $notif_config[$klass];*/ $this->channels = $notif_config[$klass];*/
} }
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
*
* @return array
*/
/*public function via($notifiable)
{
return $this->channels;
}*/
/**
* @return DiscordMessage|null
*/
public function toDiscordChannel($notifiable): ?DiscordMessage
{
return null;
}
} }

View File

@@ -133,10 +133,7 @@ abstract class Repository extends BaseRepository
$page = (int) request()->query('page', 1); $page = (int) request()->query('page', 1);
$results = $this->model->{$method}($limit, $columns, 'page', $page); $results = $this->model->{$method}($limit, $columns, 'page', $page);
$results->appends(app('request')->query());
$qs = request()->except(['page', 'user']);
$results->appends($qs);
$this->resetModel(); $this->resetModel();
return $this->parserResult($results); return $this->parserResult($results);

View File

@@ -3,6 +3,7 @@
namespace App\Contracts; namespace App\Contracts;
use ArrayAccess; use ArrayAccess;
use PhpUnitsOfMeasure\Exception\UnknownUnitOfMeasure;
/** /**
* Abstract unit wrapper * Abstract unit wrapper
@@ -10,89 +11,45 @@ use ArrayAccess;
class Unit implements ArrayAccess class Unit implements ArrayAccess
{ {
/** /**
* The localized unit the user wants it displayed in * The unit this is kept as
*/ */
public string $localUnit; public $unit;
/** /**
* The unit that this value is stored in locally * All of the units of this class
*/ */
public string $internalUnit; public $units;
/**
* All of the units of this class which are reported in an API response
*/
public array $units;
/** /**
* Holds an instance of the PhpUnit type * Holds an instance of the PhpUnit type
*
* @var \PhpUnitsOfMeasure\AbstractPhysicalQuantity
*/ */
protected mixed $instance; protected $instance;
/** /**
* Units that are included as part of the REST response * Units that are included as part of the REST response
*/ */
public array $responseUnits = []; public $responseUnits = [];
/** /**
* Factory method for creating a new unit type * @return mixed
*
* @param mixed $value
* @param string $unit
*
* @throws \Exception
*
* @return Unit
*/ */
public static function make(mixed $value, string $unit): self public function value()
{ {
if ($value instanceof self) { return $this->__toString();
return $value;
}
return new static($value, $unit);
}
/**
* Return the value in an internal format
*
* @param int|null $round Optional value to round to
*
* @return float|null
*/
public function internal(?int $round = null): ?float
{
return $this->toUnit($this->internalUnit, $round);
}
/**
* Return the value in the localized format
*
* @param int|null $round Optional value to round to
*
* @return float|null
*/
public function local(?int $round = null): ?float
{
return $this->toUnit($this->localUnit, $round);
} }
/** /**
* Just call toUnit() on the PhpUnitOfMeasure instance * Just call toUnit() on the PhpUnitOfMeasure instance
* *
* @param string $unit * @param string $unit
* @param int|null $round Optional value to round to
* *
* @return float|null * @return mixed
*/ */
public function toUnit(string $unit, ?int $round = null): ?float public function toUnit($unit)
{ {
$val = $this->instance->toUnit($unit); return $this->instance->toUnit($unit);
if ($round === null) {
return $val;
}
return round($val, $round);
} }
/** /**
@@ -102,7 +59,7 @@ class Unit implements ArrayAccess
{ {
$response = []; $response = [];
foreach ($this->responseUnits as $unit) { foreach ($this->responseUnits as $unit) {
$response[$unit] = round($this->instance->toUnit($unit), 2); $response[$unit] = $this[$unit] ?? 0;
} }
return $response; return $response;
@@ -115,7 +72,7 @@ class Unit implements ArrayAccess
* *
* @return bool * @return bool
*/ */
public function offsetExists($offset): bool public function offsetExists($offset)
{ {
return $this->offsetGet($offset) !== null; return $this->offsetGet($offset) !== null;
} }
@@ -123,15 +80,19 @@ class Unit implements ArrayAccess
/** /**
* Implements ArrayAccess * Implements ArrayAccess
* *
* @param $unit * @param $offset
* *
* @return float|null * @return mixed
*/ */
public function offsetGet($unit): ?float public function offsetGet($offset)
{ {
$value = $this->instance->toUnit($unit); try {
if (!$value) { $value = $this->instance->toUnit($offset);
return null; if (!$value) {
return;
}
} catch (UnknownUnitOfMeasure $e) {
return;
} }
return round($value, 2); return round($value, 2);
@@ -163,6 +124,6 @@ class Unit implements ArrayAccess
*/ */
public function __toString() public function __toString()
{ {
return (string) $this->offsetGet($this->localUnit); return (string) $this->offsetGet($this->unit);
} }
} }

View File

@@ -12,7 +12,7 @@ use Illuminate\Support\Facades\Log;
*/ */
class ClearExpiredSimbrief extends Listener class ClearExpiredSimbrief extends Listener
{ {
private SimBriefService $simbriefSvc; private $simbriefSvc;
public function __construct(SimBriefService $simbriefSvc) public function __construct(SimBriefService $simbriefSvc)
{ {
@@ -20,7 +20,7 @@ class ClearExpiredSimbrief extends Listener
} }
/** /**
* @param CronHourly $event * @param \App\Events\CronNightly $event
*/ */
public function handle(CronHourly $event): void public function handle(CronHourly $event): void
{ {

View File

@@ -5,7 +5,6 @@ namespace App\Cron\Hourly;
use App\Contracts\Listener; use App\Contracts\Listener;
use App\Events\CronHourly; use App\Events\CronHourly;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus;
use App\Models\Pirep; use App\Models\Pirep;
use App\Services\PirepService; use App\Services\PirepService;
use Carbon\Carbon; use Carbon\Carbon;
@@ -39,10 +38,7 @@ class DeletePireps extends Listener
protected function deletePireps(int $expire_time_hours, int $state) protected function deletePireps(int $expire_time_hours, int $state)
{ {
$dt = Carbon::now('UTC')->subHours($expire_time_hours); $dt = Carbon::now('UTC')->subHours($expire_time_hours);
$pireps = Pirep::where('created_at', '<', $dt) $pireps = Pirep::where('created_at', '<', $dt)->where(['state' => $state])->get();
->where(['state' => $state])
->where('status', '<>', PirepStatus::PAUSED)
->get();
/** @var PirepService $pirepSvc */ /** @var PirepService $pirepSvc */
$pirepSvc = app(PirepService::class); $pirepSvc = app(PirepService::class);

View File

@@ -6,7 +6,6 @@ use App\Contracts\Listener;
use App\Events\CronHourly; use App\Events\CronHourly;
use App\Events\PirepCancelled; use App\Events\PirepCancelled;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus;
use App\Models\Pirep; use App\Models\Pirep;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -32,9 +31,7 @@ class RemoveExpiredLiveFlights extends Listener
$date = Carbon::now('UTC')->subHours(setting('acars.live_time')); $date = Carbon::now('UTC')->subHours(setting('acars.live_time'));
$pireps = Pirep::where('updated_at', '<', $date) $pireps = Pirep::where('updated_at', '<', $date)
->where('state', PirepState::IN_PROGRESS) ->where('state', PirepState::IN_PROGRESS)
->where('status', '<>', PirepStatus::PAUSED)
->get(); ->get();
foreach ($pireps as $pirep) { foreach ($pireps as $pirep) {
event(new PirepCancelled($pirep)); event(new PirepCancelled($pirep));
Log::info('Cron: Deleting Expired Live PIREP id='.$pirep->id.', state='.PirepState::label($pirep->state)); Log::info('Cron: Deleting Expired Live PIREP id='.$pirep->id.', state='.PirepState::label($pirep->state));

View File

@@ -13,7 +13,7 @@ use Illuminate\Support\Facades\Log;
*/ */
class ApplyExpenses extends Listener class ApplyExpenses extends Listener
{ {
private RecurringFinanceService $financeSvc; private $financeSvc;
/** /**
* ApplyExpenses constructor. * ApplyExpenses constructor.

View File

@@ -13,7 +13,7 @@ use Illuminate\Support\Facades\Log;
*/ */
class ApplyExpenses extends Listener class ApplyExpenses extends Listener
{ {
private RecurringFinanceService $financeSvc; private $financeSvc;
/** /**
* ApplyExpenses constructor. * ApplyExpenses constructor.

View File

@@ -9,7 +9,7 @@ use Illuminate\Support\Facades\Log;
class NewVersionCheck extends Listener class NewVersionCheck extends Listener
{ {
private VersionService $versionSvc; private $versionSvc;
/** /**
* @param VersionService $versionSvc * @param VersionService $versionSvc

View File

@@ -12,7 +12,7 @@ use Illuminate\Support\Facades\Log;
*/ */
class PilotLeave extends Listener class PilotLeave extends Listener
{ {
private UserService $userSvc; private $userSvc;
/** /**
* PilotLeave constructor. * PilotLeave constructor.

View File

@@ -6,14 +6,14 @@ use App\Contracts\Listener;
use App\Events\CronNightly; use App\Events\CronNightly;
use App\Models\Journal; use App\Models\Journal;
use App\Repositories\JournalRepository; use App\Repositories\JournalRepository;
use Illuminate\Support\Facades\Log; use Log;
/** /**
* This recalculates the balances on all of the journals * This recalculates the balances on all of the journals
*/ */
class RecalculateBalances extends Listener class RecalculateBalances extends Listener
{ {
private JournalRepository $journalRepo; private $journalRepo;
/** /**
* Nightly constructor. * Nightly constructor.

View File

@@ -13,8 +13,8 @@ use Illuminate\Support\Facades\Log;
*/ */
class RecalculateStats extends Listener class RecalculateStats extends Listener
{ {
private AircraftService $aircraftSvc; private $aircraftSvc;
private UserService $userSvc; private $userSvc;
public function __construct(AircraftService $aircraftSvc, UserService $userSvc) public function __construct(AircraftService $aircraftSvc, UserService $userSvc)
{ {

View File

@@ -1,43 +1,23 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; $factory->define(App\Models\Acars::class, function (Faker $faker) {
return [
use App\Contracts\Factory; 'id' => null,
use App\Models\Acars; 'pirep_id' => null,
use DateTime; 'log' => $faker->text(100),
'lat' => $faker->latitude,
class AcarsFactory extends Factory 'lon' => $faker->longitude,
{ 'distance' => $faker->randomFloat(2, 0, 6000),
/** 'heading' => $faker->numberBetween(0, 359),
* The name of the factory's corresponding model. 'altitude' => $faker->numberBetween(20, 400),
* 'vs' => $faker->numberBetween(-5000, 5000),
* @var string 'gs' => $faker->numberBetween(300, 500),
*/ 'transponder' => $faker->numberBetween(200, 9999),
protected $model = Acars::class; 'autopilot' => $faker->text(10),
'fuel' => $faker->randomFloat(2, 100, 1000),
/** 'fuel_flow' => $faker->randomFloat(2, 100, 1000),
* @return array <string, mixed> 'sim_time' => $faker->dateTime('now', 'UTC'),
*/ ];
public function definition(): array });
{
return [
'id' => null,
'pirep_id' => null,
'log' => $this->faker->text(100),
'lat' => $this->faker->latitude,
'lon' => $this->faker->longitude,
'distance' => $this->faker->randomFloat(2, 0, 6000),
'heading' => $this->faker->numberBetween(0, 359),
'altitude' => $this->faker->numberBetween(20, 400),
'vs' => $this->faker->numberBetween(-5000, 5000),
'gs' => $this->faker->numberBetween(300, 500),
'transponder' => $this->faker->numberBetween(200, 9999),
'autopilot' => $this->faker->text(10),
'fuel' => $this->faker->randomFloat(2, 100, 1000),
'fuel_flow' => $this->faker->randomFloat(2, 100, 1000),
'sim_time' => $this->faker->dateTime('now', 'UTC')->format(DateTime::ATOM),
];
}
}

View File

@@ -1,51 +1,33 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Aircraft;
use App\Models\Airport; use App\Models\Airport;
use App\Models\Enums\AircraftState; use App\Models\Enums\AircraftState;
use App\Models\Enums\AircraftStatus; use App\Models\Enums\AircraftStatus;
use App\Models\Subfleet; use App\Models\Subfleet;
use App\Support\ICAO; use App\Support\ICAO;
use DateTime; use Faker\Generator as Faker;
class AircraftFactory extends Factory $factory->define(App\Models\Aircraft::class, function (Faker $faker) {
{ return [
/** 'id' => null,
* The name of the factory's corresponding model. 'subfleet_id' => function () {
* return factory(Subfleet::class)->create()->id;
* @var string },
*/ 'airport_id' => function () {
protected $model = Aircraft::class; return factory(Airport::class)->create()->id;
},
/** 'iata' => $faker->unique()->text(5),
* Define the model's default state. 'icao' => $faker->unique()->text(5),
* 'name' => $faker->text(50),
* @throws \Exception 'registration' => $faker->unique()->text(10),
* 'hex_code' => ICAO::createHexCode(),
* @return array<string, mixed> 'mtow' => $faker->randomFloat(2, 0, 50000),
*/ 'zfw' => $faker->randomFloat(2, 0, 50000),
public function definition(): array 'status' => AircraftStatus::ACTIVE,
{ 'state' => AircraftState::PARKED,
return [ 'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'id' => null, 'updated_at' => function (array $pirep) {
'subfleet_id' => fn () => Subfleet::factory()->create()->id, return $pirep['created_at'];
'airport_id' => fn () => Airport::factory()->create()->id, },
'iata' => $this->faker->unique()->text(5), ];
'icao' => $this->faker->unique()->text(5), });
'name' => $this->faker->text(50),
'registration' => $this->faker->unique()->text(10),
'hex_code' => ICAO::createHexCode(),
'mtow' => $this->faker->randomFloat(2, 0, 50000),
'zfw' => $this->faker->randomFloat(2, 0, 50000),
'status' => AircraftStatus::ACTIVE,
'state' => AircraftState::PARKED,
'created_at' => $this->faker->dateTimeBetween('-1 week')->format(DateTime::ATOM),
'updated_at' => fn (array $pirep) => $pirep['created_at'],
];
}
}

View File

@@ -1,41 +1,25 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Airline;
use Hashids\Hashids; use Hashids\Hashids;
class AirlineFactory extends Factory /*
{ * Add any number of airports. Don't really care if they're real or not
/** */
* The name of the factory's corresponding model. $factory->define(App\Models\Airline::class, function (Faker $faker) {
* return [
* @var string 'id' => null,
*/ 'icao' => function (array $apt) {
protected $model = Airline::class; $hashids = new Hashids(microtime(), 5);
$mt = str_replace('.', '', microtime(true));
/** return $hashids->encode($mt);
* Define the model's default state. },
* 'iata' => function (array $apt) {
* @return array<string, mixed> return $apt['icao'];
*/ },
public function definition(): array 'name' => $faker->sentence(3),
{ 'country' => $faker->country,
return [ 'active' => 1,
'id' => null, ];
'icao' => function (array $apt): string { });
$hashids = new Hashids(microtime(), 5);
$mt = str_replace('.', '', microtime(true));
return $hashids->encode($mt);
},
'iata' => fn (array $apt) => $apt['icao'],
'name' => $this->faker->sentence(3),
'country' => $this->faker->country,
'active' => 1,
];
}
}

View File

@@ -1,31 +1,12 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; /*
* Create an ICAO for use in the factory.
use App\Contracts\Factory; */
use App\Models\Airport; if (!function_exists('createFactoryICAO')) {
function createFactoryICAO(): string
class AirportFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Airport::class;
protected array $usedIcaos = [];
/**
* Generate a fake ICAO
*
* @throws \Exception
*
* @return string
*/
protected function createFactoryICAO(): string
{ {
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$max = strlen($characters) - 1; $max = strlen($characters) - 1;
@@ -39,35 +20,37 @@ class AirportFactory extends Factory
return $string; return $string;
} }
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => function () {
do {
$airport = $this->createFactoryICAO();
} while (in_array($airport, $this->usedIcaos, true));
return $airport;
},
'icao' => fn (array $apt) => $apt['id'],
'iata' => fn (array $apt) => $apt['id'],
'name' => $this->faker->sentence(3),
'country' => $this->faker->country,
'timezone' => $this->faker->timezone,
'lat' => $this->faker->latitude,
'lon' => $this->faker->longitude,
'hub' => false,
'notes' => null,
'ground_handling_cost' => $this->faker->randomFloat(2, 0, 500),
'fuel_100ll_cost' => $this->faker->randomFloat(2, 1, 10),
'fuel_jeta_cost' => $this->faker->randomFloat(2, 1, 10),
'fuel_mogas_cost' => $this->faker->randomFloat(2, 1, 10),
];
}
} }
/*
* Add any number of airports. Don't really care if they're real or not
*/
$factory->define(App\Models\Airport::class, function (Faker $faker) {
$usedIcaos = [];
return [
'id' => function () use ($usedIcaos) {
do {
$airport = createFactoryICAO();
} while (in_array($airport, $usedIcaos, true));
return $airport;
},
'icao' => function (array $apt) {
return $apt['id'];
},
'iata' => function (array $apt) {
return $apt['id'];
},
'name' => $faker->sentence(3),
'country' => $faker->country,
'timezone' => $faker->timezone,
'lat' => $faker->latitude,
'lon' => $faker->longitude,
'hub' => false,
'ground_handling_cost' => $faker->randomFloat(2, 0, 500),
'fuel_100ll_cost' => $faker->randomFloat(2, 1, 10),
'fuel_jeta_cost' => $faker->randomFloat(2, 1, 10),
'fuel_mogas_cost' => $faker->randomFloat(2, 1, 10),
];
});

View File

@@ -1,34 +0,0 @@
<?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Award;
class AwardFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Award::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => null,
'name' => $this->faker->name,
'description' => $this->faker->text(10),
'ref_model' => null,
'ref_model_params' => null,
];
}
}

View File

@@ -0,0 +1,13 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\Award::class, function (Faker $faker) {
return [
'id' => null,
'name' => $faker->name,
'description' => $faker->text(10),
'ref_model' => null,
'ref_model_params' => null,
];
});

View File

@@ -1,39 +1,18 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Enums\ExpenseType; use App\Models\Enums\ExpenseType;
use App\Models\Expense; use Faker\Generator as Faker;
class ExpenseFactory extends Factory $factory->define(App\Models\Expense::class, function (Faker $faker) {
{ return [
/** 'id' => null,
* The name of the factory's corresponding model. 'airline_id' => null,
* 'name' => $faker->text(20),
* @var string 'amount' => $faker->randomFloat(2, 100, 1000),
*/ 'type' => ExpenseType::FLIGHT,
protected $model = Expense::class; 'multiplier' => false,
'ref_model' => \App\Models\Expense::class,
/** 'ref_model_id' => null,
* Define the model's default state. 'active' => true,
* ];
* @return array<string, mixed> });
*/
public function definition(): array
{
return [
'id' => null,
'airline_id' => null,
'name' => $this->faker->text(20),
'amount' => $this->faker->randomFloat(2, 100, 1000),
'type' => ExpenseType::FLIGHT,
'multiplier' => false,
'ref_model' => \App\Models\Expense::class,
'ref_model_id' => null,
'active' => true,
];
}
}

View File

@@ -1,35 +1,16 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; $factory->define(App\Models\Fare::class, function (Faker $faker) {
return [
use App\Contracts\Factory; 'id' => null,
use App\Models\Fare; 'code' => $faker->unique()->text(50),
'name' => $faker->text(50),
class FareFactory extends Factory 'price' => $faker->randomFloat(2, 100, 1000),
{ 'cost' => function (array $fare) {
/** return round($fare['price'] / 2);
* The name of the factory's corresponding model. },
* 'capacity' => $faker->randomFloat(0, 20, 500),
* @var string ];
*/ });
protected $model = Fare::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => null,
'code' => $this->faker->unique()->text(50),
'name' => $this->faker->text(50),
'price' => $this->faker->randomFloat(2, 100, 1000),
'cost' => fn (array $fare) => round($fare['price'] / 2),
'capacity' => $this->faker->randomFloat(0, 20, 500),
];
}
}

View File

@@ -1,58 +1,44 @@
<?php <?php
/**
* Create flights
*/
use Faker\Generator as Faker;
/** @noinspection PhpIllegalPsrClassPathInspection */ $factory->define(App\Models\Flight::class, function (Faker $faker) {
return [
namespace App\Database\Factories; 'id' => $faker->unique()->numberBetween(10, 10000000),
'airline_id' => function () {
use App\Contracts\Factory; return factory(\App\Models\Airline::class)->create()->id;
use App\Models\Flight; },
use DateTime; 'flight_number' => $faker->unique()->numberBetween(10, 1000000),
'route_code' => $faker->randomElement(['', $faker->text(5)]),
class FlightFactory extends Factory 'route_leg' => $faker->randomElement(['', $faker->numberBetween(0, 1000)]),
{ 'dpt_airport_id' => function () {
/** return factory(\App\Models\Airport::class)->create()->id;
* The name of the factory's corresponding model. },
* 'arr_airport_id' => function () {
* @var string return factory(\App\Models\Airport::class)->create()->id;
*/ },
protected $model = Flight::class; 'alt_airport_id' => function () {
return factory(\App\Models\Airport::class)->create()->id;
/** },
* Define the model's default state. 'distance' => $faker->numberBetween(1, 1000),
* 'route' => null,
* @return array<string, mixed> 'level' => 0,
*/ 'dpt_time' => $faker->time(),
public function definition(): array 'arr_time' => $faker->time(),
{ 'flight_time' => $faker->numberBetween(60, 360),
return [ 'load_factor' => $faker->randomElement([15, 20, 50, 90, 100]),
'id' => $this->faker->unique()->numberBetween(10, 10000000), 'load_factor_variance' => $faker->randomElement([15, 20, 50, 90, 100]),
'airline_id' => fn () => \App\Models\Airline::factory()->create()->id, 'has_bid' => false,
'flight_number' => $this->faker->unique()->numberBetween(10, 1000000), 'active' => true,
'route_code' => $this->faker->randomElement(['', $this->faker->text(5)]), 'visible' => true,
'route_leg' => $this->faker->randomElement( 'days' => 0,
['', $this->faker->numberBetween(0, 1000)] 'start_date' => null,
), 'end_date' => null,
'dpt_airport_id' => static fn () => \App\Models\Airport::factory()->create()->id, 'created_at' => $faker->dateTimeBetween('-1 week', 'now'),
'arr_airport_id' => static fn () => \App\Models\Airport::factory()->create()->id, 'updated_at' => static function (array $flight) {
'alt_airport_id' => static fn () => \App\Models\Airport::factory()->create()->id, return $flight['created_at'];
'distance' => $this->faker->numberBetween(1, 1000), },
'route' => null, ];
'level' => 0, });
'dpt_time' => $this->faker->time(),
'arr_time' => $this->faker->time(),
'flight_time' => $this->faker->numberBetween(60, 360),
'load_factor' => $this->faker->randomElement([15, 20, 50, 90, 100]),
'load_factor_variance' => $this->faker->randomElement([15, 20, 50, 90, 100]),
'has_bid' => false,
'active' => true,
'visible' => true,
'days' => 0,
'start_date' => null,
'end_date' => null,
'created_at' => $this->faker->dateTimeBetween('-1 week')->format(
DateTime::ATOM
),
'updated_at' => static fn (array $flight) => $flight['created_at'],
];
}
}

View File

@@ -1,30 +1,9 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; $factory->define(App\Models\Journal::class, function (Faker $faker) {
return [
use App\Contracts\Factory; 'currency' => 'USD',
use App\Models\Journal; ];
});
class JournalFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Journal::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'currency' => 'USD',
];
}
}

View File

@@ -1,39 +1,20 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Journal; use App\Models\Journal;
use App\Models\JournalTransaction;
use Carbon\Carbon; use Carbon\Carbon;
use Faker\Generator as Faker;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
class JournalTransactionsFactory extends Factory $factory->define(App\Models\JournalTransaction::class, function (Faker $faker) {
{ return [
/** 'transaction_group' => Uuid::uuid4()->toString(),
* The name of the factory's corresponding model. 'journal_id' => function () {
* return factory(Journal::class)->create()->id;
* @var string },
*/ 'credit' => $faker->numberBetween(100, 10000),
protected $model = JournalTransaction::class; 'debit' => $faker->numberBetween(100, 10000),
'currency' => 'USD',
/** 'memo' => $faker->sentence(6),
* Define the model's default state. 'post_date' => Carbon::now('UTC'),
* ];
* @return array<string, mixed> });
*/
public function definition(): array
{
return [
'transaction_group' => Uuid::uuid4()->toString(),
'journal_id' => fn () => Journal::factory()->create()->id,
'credit' => $this->faker->numberBetween(100, 10000),
'debit' => $this->faker->numberBetween(100, 10000),
'currency' => 'USD',
'memo' => $this->faker->sentence(6),
'post_date' => Carbon::now('UTC')->toDateTimeString(),
];
}
}

View File

@@ -1,36 +1,15 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Enums\NavaidType; use App\Models\Enums\NavaidType;
use App\Models\Navdata; use Faker\Generator as Faker;
class NavdataFactory extends Factory $factory->define(App\Models\Navdata::class, function (Faker $faker) {
{ return [
/** 'id' => str_replace(' ', '', str_replace('.', '', $faker->unique()->text(5))),
* The name of the factory's corresponding model. 'name' => str_replace('.', '', $faker->unique()->word),
* 'type' => $faker->randomElement([NavaidType::VOR, NavaidType::NDB]),
* @var string 'lat' => $faker->latitude,
*/ 'lon' => $faker->longitude,
protected $model = Navdata::class; 'freq' => $faker->randomFloat(2, 100, 1000),
];
/** });
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => str_replace(' ', '', str_replace('.', '', $this->faker->unique()->text(5))),
'name' => str_replace('.', '', $this->faker->unique()->word),
'type' => $this->faker->randomElement([NavaidType::VOR, NavaidType::NDB]),
'lat' => $this->faker->latitude,
'lon' => $this->faker->longitude,
'freq' => $this->faker->randomFloat(2, 100, 1000),
];
}
}

View File

@@ -1,33 +1,14 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; $factory->define(App\Models\News::class, function (Faker $faker) {
return [
use App\Contracts\Factory; 'id' => null,
use App\Models\News; 'user_id' => function () {
return factory(\App\Models\User::class)->create()->id;
class NewsFactory extends Factory },
{ 'subject' => $faker->text(),
/** 'body' => $faker->sentence,
* The name of the factory's corresponding model. ];
* });
* @var string
*/
protected $model = News::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => null,
'user_id' => fn () => \App\Models\User::factory()->create()->id,
'subject' => $this->faker->text(),
'body' => $this->faker->sentence,
];
}
}

View File

@@ -1,74 +1,69 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Airline;
use App\Models\Enums\PirepSource; use App\Models\Enums\PirepSource;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus; use App\Models\Enums\PirepStatus;
use App\Models\Flight;
use App\Models\Pirep;
use Carbon\Carbon; use Carbon\Carbon;
use Faker\Generator as Faker;
class PirepFactory extends Factory /*
{ * Create a new PIREP
/** */
* The name of the factory's corresponding model. $factory->define(App\Models\Pirep::class, function (Faker $faker) {
* $airline = factory(\App\Models\Airline::class)->create();
* @var string $flight = factory(\App\Models\Flight::class)->create([
*/ 'airline_id' => $airline->id,
protected $model = Pirep::class; ]);
/** return [
* Define the model's default state. 'id' => $faker->unique()->numberBetween(10, 10000000),
* 'airline_id' => function () use ($airline) {
* @return array<string, mixed> return $airline->id;
*/ },
public function definition(): array 'user_id' => function () {
{ return factory(\App\Models\User::class)->create()->id;
/** @var Airline $airline */ },
$airline = Airline::factory()->create(); 'aircraft_id' => function () {
return factory(\App\Models\Aircraft::class)->create()->id;
/** @var Flight $flight */ },
$flight = Flight::factory()->create(['airline_id' => $airline->id]); 'flight_id' => function () use ($flight) {
return $flight->id;
return [ },
'id' => $this->faker->unique()->numberBetween(10, 10000000), 'flight_number' => function () use ($flight) {
'airline_id' => fn () => $airline->id, return $flight->flight_number;
'user_id' => fn () => \App\Models\User::factory()->create()->id, },
'aircraft_id' => fn () => \App\Models\Aircraft::factory()->create()->id, 'route_code' => null,
'flight_id' => fn () => $flight->id, 'route_leg' => null,
'flight_number' => fn () => $flight->flight_number, 'dpt_airport_id' => function () use ($flight) {
'route_code' => null, return $flight->dpt_airport_id;
'route_leg' => null, },
'dpt_airport_id' => fn () => $flight->dpt_airport_id, 'arr_airport_id' => function () use ($flight) {
'arr_airport_id' => fn () => $flight->arr_airport_id, return $flight->arr_airport_id;
'level' => $this->faker->numberBetween(20, 400), },
'distance' => $this->faker->randomFloat(2, 0, 6000), 'level' => $faker->numberBetween(20, 400),
'planned_distance' => $this->faker->randomFloat(2, 0, 6000), 'distance' => $faker->randomFloat(2, 0, 6000),
'flight_time' => $this->faker->numberBetween(60, 360), 'planned_distance' => $faker->randomFloat(2, 0, 6000),
'planned_flight_time' => $this->faker->numberBetween(60, 360), 'flight_time' => $faker->numberBetween(60, 360),
'zfw' => $this->faker->randomFloat(2), 'planned_flight_time' => $faker->numberBetween(60, 360),
'block_fuel' => $this->faker->randomFloat(2, 0, 1000), 'zfw' => $faker->randomFloat(2),
'fuel_used' => fn (array $pirep) => round($pirep['block_fuel'] * .9, 2), 'block_fuel' => $faker->randomFloat(2, 0, 1000),
'block_on_time' => Carbon::now('UTC'), 'fuel_used' => function (array $pirep) {
'block_off_time' => fn (array $pirep) => $pirep['block_on_time']->subMinutes( return round($pirep['block_fuel'] * .9, 2); // 90% of the fuel loaded was used
$pirep['flight_time'] },
), 'block_on_time' => Carbon::now('UTC'),
'route' => $this->faker->text(200), 'block_off_time' => function (array $pirep) {
'notes' => $this->faker->text(200), return $pirep['block_on_time']->subMinutes($pirep['flight_time']);
'source' => $this->faker->randomElement( },
[PirepSource::MANUAL, PirepSource::ACARS] 'route' => $faker->text(200),
), 'notes' => $faker->text(200),
'source_name' => 'TestFactory', 'source' => $faker->randomElement([PirepSource::MANUAL, PirepSource::ACARS]),
'state' => PirepState::PENDING, 'source_name' => 'TestFactory',
'status' => PirepStatus::SCHEDULED, 'state' => PirepState::PENDING,
'submitted_at' => Carbon::now('UTC')->toDateTimeString(), 'status' => PirepStatus::SCHEDULED,
'created_at' => Carbon::now('UTC')->toDateTimeString(), 'submitted_at' => Carbon::now('UTC')->toDateTimeString(),
'updated_at' => fn (array $pirep) => $pirep['created_at'], 'created_at' => Carbon::now('UTC')->toDateTimeString(),
]; 'updated_at' => function (array $pirep) {
} return $pirep['created_at'];
} },
];
});

View File

@@ -1,37 +1,23 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; /*
* id: 2
use App\Contracts\Factory; name: Junior First Officer
use App\Models\Rank; hours: 10
auto_approve_acars: 1
class RankFactory extends Factory auto_approve_manual: 1
{ */
/** $factory->define(App\Models\Rank::class, function (Faker $faker) {
* The name of the factory's corresponding model. return [
* 'id' => null,
* @var string 'name' => $faker->unique()->text(50),
*/ 'hours' => $faker->numberBetween(10, 50),
protected $model = Rank::class; 'acars_base_pay_rate' => $faker->numberBetween(10, 100),
'manual_base_pay_rate' => $faker->numberBetween(10, 100),
/** 'auto_approve_acars' => 0,
* Define the model's default state. 'auto_approve_manual' => 0,
* 'auto_promote' => 0,
* @return array<string, mixed> ];
*/ });
public function definition(): array
{
return [
'id' => null,
'name' => $this->faker->unique()->text(50),
'hours' => $this->faker->numberBetween(10, 50),
'acars_base_pay_rate' => $this->faker->numberBetween(10, 100),
'manual_base_pay_rate' => $this->faker->numberBetween(10, 100),
'auto_approve_acars' => 0,
'auto_approve_manual' => 0,
'auto_promote' => 0,
];
}
}

View File

@@ -1,34 +1,13 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; $factory->define(App\Models\Role::class, function (Faker $faker) {
return [
use App\Contracts\Factory; 'id' => null,
use App\Models\Role; 'name' => $faker->name,
'display_name' => $faker->name,
class RoleFactory extends Factory 'read_only' => false,
{ 'disable_activity_checks' => $faker->boolean(),
/** ];
* The name of the factory's corresponding model. });
*
* @var string
*/
protected $model = Role::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => null,
'name' => $this->faker->name,
'display_name' => $this->faker->name,
'read_only' => false,
'disable_activity_checks' => $this->faker->boolean(),
];
}
}

View File

@@ -1,38 +0,0 @@
<?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\SimBrief;
use Carbon\Carbon;
class SimBriefFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = SimBrief::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'id' => $this->faker->unique()->numberBetween(10, 10000000),
'user_id' => null,
'flight_id' => null,
'pirep_id' => null,
'acars_xml' => '',
'ofp_xml' => '',
'created_at' => Carbon::now('UTC')->toDateTimeString(),
'updated_at' => fn (array $sb) => $sb['created_at'],
];
}
}

View File

@@ -0,0 +1,21 @@
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use Carbon\Carbon;
use Faker\Generator as Faker;
$factory->define(App\Models\SimBrief::class, function (Faker $faker) {
return [
'id' => $faker->unique()->numberBetween(10, 10000000),
'user_id' => null,
'flight_id' => null,
'pirep_id' => null,
'acars_xml' => '',
'ofp_xml' => '',
'created_at' => Carbon::now('UTC')->toDateTimeString(),
'updated_at' => function (array $sb) {
return $sb['created_at'];
},
];
});

View File

@@ -1,34 +1,15 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */ use Faker\Generator as Faker;
namespace App\Database\Factories; $factory->define(App\Models\Subfleet::class, function (Faker $faker) {
return [
use App\Contracts\Factory; 'id' => null,
use App\Models\Subfleet; 'airline_id' => function () {
return factory(\App\Models\Airline::class)->create()->id;
class SubfleetFactory extends Factory },
{ 'name' => $faker->unique()->text(50),
/** 'type' => $faker->unique()->text(7),
* The name of the factory's corresponding model. 'ground_handling_multiplier' => $faker->numberBetween(50, 200),
* ];
* @var string });
*/
protected $model = Subfleet::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'id' => null,
'airline_id' => fn () => \App\Models\Airline::factory()->create()->id,
'name' => $this->faker->unique()->text(50),
'type' => $this->faker->unique()->text(7),
'ground_handling_multiplier' => $this->faker->numberBetween(50, 200),
];
}
}

View File

@@ -1,54 +1,28 @@
<?php <?php
/** @noinspection PhpIllegalPsrClassPathInspection */
namespace App\Database\Factories;
use App\Contracts\Factory;
use App\Models\Airline; use App\Models\Airline;
use App\Models\Enums\UserState; use App\Models\Enums\UserState;
use App\Models\User; use Faker\Generator as Faker;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
class UserFactory extends Factory $factory->define(App\Models\User::class, function (Faker $faker) {
{ static $password;
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/** return [
* @var string 'id' => null,
*/ 'pilot_id' => null,
private static string $password; 'name' => $faker->name,
'email' => $faker->safeEmail,
/** 'password' => $password ?: $password = Hash::make('secret'),
* Define the model's default state. 'api_key' => $faker->sha1,
* 'airline_id' => function () {
* @return array<string, mixed> return factory(Airline::class)->create()->id;
*/ },
public function definition(): array 'rank_id' => 1,
{ 'flights' => $faker->numberBetween(0, 1000),
if (empty(self::$password)) { 'flight_time' => $faker->numberBetween(0, 10000),
self::$password = Hash::make('secret'); 'transfer_time' => $faker->numberBetween(0, 10000),
} 'state' => UserState::ACTIVE,
'remember_token' => $faker->unique()->text(5),
return [ ];
'id' => null, });
'pilot_id' => null,
'name' => $this->faker->name,
'email' => $this->faker->safeEmail,
'password' => self::$password,
'api_key' => $this->faker->sha1,
'airline_id' => fn () => Airline::factory()->create()->id,
'rank_id' => 1,
'flights' => $this->faker->numberBetween(0, 1000),
'flight_time' => $this->faker->numberBetween(0, 10000),
'transfer_time' => $this->faker->numberBetween(0, 10000),
'state' => UserState::ACTIVE,
'remember_token' => $this->faker->unique()->text(5),
];
}
}

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use App\Services\Installer\SeederService; use App\Services\Installer\SeederService;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateSettingsTable extends Migration
{
private $seederSvc; private $seederSvc;
public function __construct() public function __construct()
@@ -49,4 +50,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('settings'); Schema::dropIfExists('settings');
} }
}; }

View File

@@ -5,7 +5,8 @@ use App\Models\Pirep;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateUsersTable extends Migration
{
/** /**
* Run the migrations. * Run the migrations.
* *
@@ -54,4 +55,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('users'); Schema::dropIfExists('users');
} }
}; }

View File

@@ -2,9 +2,9 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class RolesPermissionsTables extends Migration
{
public function up() public function up()
{ {
// Create table for storing roles // Create table for storing roles
@@ -82,4 +82,4 @@ return new class() extends Migration {
Schema::dropIfExists('role_user'); Schema::dropIfExists('role_user');
Schema::dropIfExists('roles'); Schema::dropIfExists('roles');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreatePasswordResetsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('password_resets', function (Blueprint $table) { Schema::create('password_resets', function (Blueprint $table) {
@@ -18,4 +19,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('password_resets'); Schema::dropIfExists('password_resets');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateSessionsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('sessions', function (Blueprint $table) { Schema::create('sessions', function (Blueprint $table) {
@@ -21,4 +22,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('sessions'); Schema::dropIfExists('sessions');
} }
}; }

View File

@@ -3,7 +3,8 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateAirlinesTable extends Migration
{
public function up() public function up()
{ {
Schema::create('airlines', function (Blueprint $table) { Schema::create('airlines', function (Blueprint $table) {
@@ -30,4 +31,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('airlines'); Schema::dropIfExists('airlines');
} }
}; }

View File

@@ -5,7 +5,8 @@ use App\Models\Enums\AircraftState;
use App\Models\Enums\AircraftStatus; use App\Models\Enums\AircraftStatus;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateAircraftsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('aircraft', function (Blueprint $table) { Schema::create('aircraft', function (Blueprint $table) {
@@ -33,4 +34,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('aircraft'); Schema::dropIfExists('aircraft');
} }
}; }

View File

@@ -3,7 +3,8 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateFaresTable extends Migration
{
public function up() public function up()
{ {
Schema::create('fares', function (Blueprint $table) { Schema::create('fares', function (Blueprint $table) {
@@ -23,4 +24,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('fares'); Schema::dropIfExists('fares');
} }
}; }

View File

@@ -3,7 +3,8 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateAirportsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('airports', function (Blueprint $table) { Schema::create('airports', function (Blueprint $table) {
@@ -32,4 +33,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('airports'); Schema::dropIfExists('airports');
} }
}; }

View File

@@ -5,7 +5,8 @@ use App\Contracts\Model;
use App\Models\Enums\FlightType; use App\Models\Enums\FlightType;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateFlightTables extends Migration
{
public function up() public function up()
{ {
Schema::create('flights', function (Blueprint $table) { Schema::create('flights', function (Blueprint $table) {
@@ -97,4 +98,4 @@ return new class() extends Migration {
Schema::drop('flight_subfleet'); Schema::drop('flight_subfleet');
Schema::drop('flights'); Schema::drop('flights');
} }
}; }

View File

@@ -3,7 +3,8 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateRanksTable extends Migration
{
public function up() public function up()
{ {
Schema::create('ranks', function (Blueprint $table) { Schema::create('ranks', function (Blueprint $table) {
@@ -28,4 +29,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('ranks'); Schema::dropIfExists('ranks');
} }
}; }

View File

@@ -3,7 +3,8 @@
use App\Contracts\Migration; use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreateSubfleetTables extends Migration
{
public function up() public function up()
{ {
Schema::create('subfleets', function (Blueprint $table) { Schema::create('subfleets', function (Blueprint $table) {
@@ -50,4 +51,4 @@ return new class() extends Migration {
Schema::dropIfExists('subfleet_fare'); Schema::dropIfExists('subfleet_fare');
Schema::dropIfExists('subfleet_rank'); Schema::dropIfExists('subfleet_rank');
} }
}; }

View File

@@ -7,7 +7,8 @@ use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus; use App\Models\Enums\PirepStatus;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
return new class() extends Migration { class CreatePirepTables extends Migration
{
/** /**
* Run the migrations. * Run the migrations.
* *
@@ -105,4 +106,4 @@ return new class() extends Migration {
Schema::dropIfExists('pirep_fields'); Schema::dropIfExists('pirep_fields');
Schema::dropIfExists('pirep_field_values'); Schema::dropIfExists('pirep_field_values');
} }
}; }

View File

@@ -5,7 +5,8 @@ use App\Contracts\Model;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateBidsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('bids', function (Blueprint $table) { Schema::create('bids', function (Blueprint $table) {
@@ -23,4 +24,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('bids'); Schema::dropIfExists('bids');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateJobsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('jobs', function (Blueprint $table) { Schema::create('jobs', function (Blueprint $table) {
@@ -22,4 +23,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('jobs'); Schema::dropIfExists('jobs');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateFailedJobsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('failed_jobs', function (Blueprint $table) { Schema::create('failed_jobs', function (Blueprint $table) {
@@ -21,4 +22,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('failed_jobs'); Schema::dropIfExists('failed_jobs');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateNavdataTables extends Migration
{
public function up() public function up()
{ {
/* /*
@@ -29,4 +30,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('navdata'); Schema::dropIfExists('navdata');
} }
}; }

View File

@@ -5,7 +5,8 @@ use App\Contracts\Model;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateAcarsTables extends Migration
{
public function up() public function up()
{ {
Schema::create('acars', function (Blueprint $table) { Schema::create('acars', function (Blueprint $table) {
@@ -42,4 +43,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('acars'); Schema::dropIfExists('acars');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateStatsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('stats', function (Blueprint $table) { Schema::create('stats', function (Blueprint $table) {
@@ -23,4 +24,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('stats'); Schema::dropIfExists('stats');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateNewsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('news', function (Blueprint $table) { Schema::create('news', function (Blueprint $table) {
@@ -20,4 +21,4 @@ return new class() extends Migration {
{ {
Schema::drop('news'); Schema::drop('news');
} }
}; }

View File

@@ -5,7 +5,8 @@ use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use Modules\Awards\Awards\PilotFlightAwards; use Modules\Awards\Awards\PilotFlightAwards;
return new class() extends Migration { class CreateAwardsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('awards', function (Blueprint $table) { Schema::create('awards', function (Blueprint $table) {
@@ -51,4 +52,4 @@ return new class() extends Migration {
Schema::dropIfExists('awards'); Schema::dropIfExists('awards');
Schema::dropIfExists('user_awards'); Schema::dropIfExists('user_awards');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateExpensesTable extends Migration
{
public function up() public function up()
{ {
Schema::create('expenses', function (Blueprint $table) { Schema::create('expenses', function (Blueprint $table) {
@@ -33,4 +34,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('expenses'); Schema::dropIfExists('expenses');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateJournalTransactionsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('journal_transactions', function (Blueprint $table) { Schema::create('journal_transactions', function (Blueprint $table) {
@@ -32,4 +33,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('journal_transactions'); Schema::dropIfExists('journal_transactions');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateJournalsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('journals', function (Blueprint $table) { Schema::create('journals', function (Blueprint $table) {
@@ -22,4 +23,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('journals'); Schema::dropIfExists('journals');
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateLedgersTable extends Migration
{
/** /**
* Run the migrations. * Run the migrations.
* *
@@ -29,4 +30,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('ledgers'); Schema::dropIfExists('ledgers');
} }
}; }

View File

@@ -5,7 +5,8 @@ use App\Contracts\Model;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateFilesTable extends Migration
{
/** /**
* Create the files table. Acts as a morphable * Create the files table. Acts as a morphable
* *
@@ -39,4 +40,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('files'); Schema::dropIfExists('files');
} }
}; }

View File

@@ -5,7 +5,8 @@ use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class AddReadonlyToRoles extends Migration
{
public function up(): void public function up(): void
{ {
Schema::table('roles', static function (Blueprint $table) { Schema::table('roles', static function (Blueprint $table) {
@@ -24,4 +25,4 @@ return new class() extends Migration {
$table->dropColumn('read_only'); $table->dropColumn('read_only');
}); });
} }
}; }

View File

@@ -12,7 +12,8 @@ use Illuminate\Support\Facades\Schema;
* 3. Iterate through all of the users and set their `id` to the `pilot_id` * 3. Iterate through all of the users and set their `id` to the `pilot_id`
* 4. Change the other tables column types that reference `user_id` * 4. Change the other tables column types that reference `user_id`
*/ */
return new class() extends Migration { class UsersAddPilotId extends Migration
{
public function up() public function up()
{ {
Schema::table('users', static function (Blueprint $table) { Schema::table('users', static function (Blueprint $table) {
@@ -32,4 +33,4 @@ return new class() extends Migration {
$table->dropColumn('pilot_id'); $table->dropColumn('pilot_id');
}); });
} }
}; }

View File

@@ -4,7 +4,8 @@ use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class() extends Migration { class CreateNotificationsTable extends Migration
{
public function up() public function up()
{ {
Schema::create('notifications', function (Blueprint $table) { Schema::create('notifications', function (Blueprint $table) {
@@ -21,4 +22,4 @@ return new class() extends Migration {
{ {
Schema::dropIfExists('notifications'); Schema::dropIfExists('notifications');
} }
}; }

View File

@@ -9,7 +9,8 @@ use Illuminate\Support\Facades\Schema;
/** /**
* Change the PIREP state column to be a TINYINT * Change the PIREP state column to be a TINYINT
*/ */
return new class() extends Migration { class PirepsChangeStateType extends Migration
{
public function up() public function up()
{ {
// Migrate the old rejected state // Migrate the old rejected state
@@ -22,4 +23,4 @@ return new class() extends Migration {
$table->unsignedSmallInteger('state')->change(); $table->unsignedSmallInteger('state')->change();
}); });
} }
}; }

View File

@@ -8,11 +8,12 @@ use Illuminate\Support\Facades\Schema;
/** /**
* Add a `flight_id` column to the PIREPs table * Add a `flight_id` column to the PIREPs table
*/ */
return new class() extends Migration { class PirepsAddFlightId extends Migration
{
public function up() public function up()
{ {
Schema::table('pireps', function (Blueprint $table) { Schema::table('pireps', function (Blueprint $table) {
$table->string('flight_id', Model::ID_MAX_LENGTH)->nullable()->after('aircraft_id'); $table->string('flight_id', Model::ID_MAX_LENGTH)->nullable()->after('aircraft_id');
}); });
} }
}; }

View File

@@ -7,7 +7,8 @@ use Illuminate\Support\Facades\Schema;
/** /**
* Add a `flight_type` column to the expenses table * Add a `flight_type` column to the expenses table
*/ */
return new class() extends Migration { class ExpensesAddFlightType extends Migration
{
public function up() public function up()
{ {
Schema::table('expenses', function (Blueprint $table) { Schema::table('expenses', function (Blueprint $table) {
@@ -23,4 +24,4 @@ return new class() extends Migration {
$table->dropColumn('flight_type'); $table->dropColumn('flight_type');
}); });
} }
}; }

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