From 6d0ecb19c97a8d1f8516ddf040c90e77787d5928 Mon Sep 17 00:00:00 2001 From: josh Date: Tue, 7 Jul 2026 20:59:05 +1000 Subject: [PATCH] Added Email Capability --- .env.example | 14 +- ...ements.php => RecalculateAchievements.php} | 5 +- app/Console/Commands/UpdateAlliances.php | 2 + .../Controllers/UserProfileController.php | 1 + app/Models/Aircraft.php | 16 + app/Models/Alliance.php | 18 + app/Models/User.php | 28 +- .../ResetPasswordNotification.php | 41 +++ app/Observers/FlightObserver.php | 22 +- app/Providers/AppServiceProvider.php | 4 + .../Achievements/Checkers/AircraftChecker.php | 26 +- composer.json | 2 + composer.lock | 332 +++++++++++++----- config/app.php | 2 +- config/mail.php | 4 +- config/services.php | 6 + .../2026_07_07_041555_all737_families.php | 64 ++++ public/img/logos/header_logo_color.png | Bin 0 -> 63344 bytes .../FlightsGoneBy/UserFlightContextMenu.vue | 6 +- resources/js/Pages/Auth/ForgotPassword.vue | 2 +- .../Achievements/aircraft.all_boeing_737.vue | 137 ++++++++ .../views/emails/reset-password.blade.php | 1 + .../views/vendor/mail/html/button.blade.php | 24 ++ .../views/vendor/mail/html/footer.blade.php | 12 + .../views/vendor/mail/html/header.blade.php | 12 + .../views/vendor/mail/html/layout.blade.php | 58 +++ .../views/vendor/mail/html/message.blade.php | 27 ++ .../views/vendor/mail/html/panel.blade.php | 14 + .../views/vendor/mail/html/subcopy.blade.php | 7 + .../views/vendor/mail/html/table.blade.php | 3 + .../views/vendor/mail/html/themes/default.css | 297 ++++++++++++++++ .../vendor/mail/html/themes/flightsgoneby.css | 52 +++ .../views/vendor/mail/text/button.blade.php | 1 + .../views/vendor/mail/text/footer.blade.php | 1 + .../views/vendor/mail/text/header.blade.php | 1 + .../views/vendor/mail/text/layout.blade.php | 9 + .../views/vendor/mail/text/message.blade.php | 27 ++ .../views/vendor/mail/text/panel.blade.php | 1 + .../views/vendor/mail/text/subcopy.blade.php | 1 + .../views/vendor/mail/text/table.blade.php | 1 + 40 files changed, 1153 insertions(+), 128 deletions(-) rename app/Console/Commands/{RecalculateAchivements.php => RecalculateAchievements.php} (82%) create mode 100644 app/Notifications/ResetPasswordNotification.php create mode 100644 database/migrations/2026_07_07_041555_all737_families.php create mode 100644 public/img/logos/header_logo_color.png create mode 100644 resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue create mode 100644 resources/views/emails/reset-password.blade.php create mode 100644 resources/views/vendor/mail/html/button.blade.php create mode 100644 resources/views/vendor/mail/html/footer.blade.php create mode 100644 resources/views/vendor/mail/html/header.blade.php create mode 100644 resources/views/vendor/mail/html/layout.blade.php create mode 100644 resources/views/vendor/mail/html/message.blade.php create mode 100644 resources/views/vendor/mail/html/panel.blade.php create mode 100644 resources/views/vendor/mail/html/subcopy.blade.php create mode 100644 resources/views/vendor/mail/html/table.blade.php create mode 100644 resources/views/vendor/mail/html/themes/default.css create mode 100644 resources/views/vendor/mail/html/themes/flightsgoneby.css create mode 100644 resources/views/vendor/mail/text/button.blade.php create mode 100644 resources/views/vendor/mail/text/footer.blade.php create mode 100644 resources/views/vendor/mail/text/header.blade.php create mode 100644 resources/views/vendor/mail/text/layout.blade.php create mode 100644 resources/views/vendor/mail/text/message.blade.php create mode 100644 resources/views/vendor/mail/text/panel.blade.php create mode 100644 resources/views/vendor/mail/text/subcopy.blade.php create mode 100644 resources/views/vendor/mail/text/table.blade.php diff --git a/.env.example b/.env.example index b42f89d..e07cdb6 100644 --- a/.env.example +++ b/.env.example @@ -59,14 +59,14 @@ REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 -MAIL_MAILER=log -MAIL_SCHEME=null -MAIL_HOST=127.0.0.1 -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_FROM_ADDRESS="hello@example.com" +MAIL_MAILER=mailgun +MAIL_FROM_ADDRESS="test@yourddomain.com" MAIL_FROM_NAME="${APP_NAME}" +LOCAL_DISK_ROOT= +TEST_EMAIL="" +MAILGUN_DOMAIN= +MAILGUN_SECRET= +MAILGUN_ENDPOINT=api.mailgun.net AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= diff --git a/app/Console/Commands/RecalculateAchivements.php b/app/Console/Commands/RecalculateAchievements.php similarity index 82% rename from app/Console/Commands/RecalculateAchivements.php rename to app/Console/Commands/RecalculateAchievements.php index 2e1a873..19f9eae 100644 --- a/app/Console/Commands/RecalculateAchivements.php +++ b/app/Console/Commands/RecalculateAchievements.php @@ -9,11 +9,8 @@ use Illuminate\Console\Command; #[Signature('app:recalculate-achivements')] #[Description('Recalculate achievements for all users')] -class RecalculateAchivements extends Command +class RecalculateAchievements extends Command { - /** - * Execute the console command. - */ public function handle(): void { $users = User::all(); diff --git a/app/Console/Commands/UpdateAlliances.php b/app/Console/Commands/UpdateAlliances.php index e2ad99e..7ff46da 100644 --- a/app/Console/Commands/UpdateAlliances.php +++ b/app/Console/Commands/UpdateAlliances.php @@ -37,6 +37,8 @@ class UpdateAlliances extends Command Airline::whereInternalName($change['airline'])->update(['alliance' => $allianceId]); } + + Alliance::recalculateChallengeThresholds(); } } diff --git a/app/Http/Controllers/UserProfileController.php b/app/Http/Controllers/UserProfileController.php index 83bc82c..6b69680 100644 --- a/app/Http/Controllers/UserProfileController.php +++ b/app/Http/Controllers/UserProfileController.php @@ -190,6 +190,7 @@ class UserProfileController extends Controller $aircraftFamilies = match($achievement->internal_name){ 'aircraft.all_boeing_7x7' => Aircraft::BOEING_FAMILIES, 'aircraft.all_airbus_a3xx' => Aircraft::AIRBUS_FAMILIES, + 'aircraft.all_boeing_737' => Aircraft::BOEING_737_VARIANTS, default => [], }; diff --git a/app/Models/Aircraft.php b/app/Models/Aircraft.php index 6fd4048..07f4035 100644 --- a/app/Models/Aircraft.php +++ b/app/Models/Aircraft.php @@ -40,6 +40,22 @@ class Aircraft extends Model '787' => ['B788', 'B789', 'B78X'], ]; + public const array BOEING_737_VARIANTS = [ + '737-100' => ['B731'], + '737-200' => ['B732'], + '737-300' => ['B733'], + '737-400' => ['B734'], + '737-500' => ['B735'], + '737-600' => ['B736'], + '737-700' => ['B737', 'E737'], + '737-800' => ['B738', 'P8'], + '737-900' => ['B739'], + '737 Max 7' => ['B37M'], + '737 Max 8' => ['B38M'], + '737 Max 9' => ['B39M'], + '737 Max 10' => ['B3XM'] + ]; + public const array AIRBUS_FAMILIES = [ 'A300' => ['A30B', 'A300', 'A306'], 'A310' => ['A310', 'A312', 'A313'], diff --git a/app/Models/Alliance.php b/app/Models/Alliance.php index b3416e8..7d91bf9 100644 --- a/app/Models/Alliance.php +++ b/app/Models/Alliance.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; class Alliance extends Model { + protected $table = 'alliances'; protected $fillable = [ @@ -18,8 +19,25 @@ class Alliance extends Model 'internal_name' => 'string', ]; + const ALLIANCE_CHALLENGES = [ + 'star_alliance' => 'airlines_alliances.all_star_alliance', + 'oneworld' => 'airlines_alliances.all_oneworld', + 'vanilla_alliance' => 'airlines_alliances.all_vanilla_alliance', + 'skyteam' => 'airlines_alliances.all_skyteam', + ]; + public function airlines(): HasMany { return $this->hasMany(Airline::class); } + + public static function recalculateChallengeThresholds() : void { + $alliances = Alliance::all(); + foreach ($alliances as $alliance) { + $airlineCount = $alliance->airlines()->count(); + $challenge = self::ALLIANCE_CHALLENGES[$alliance->internal_name]; + Achievement::where('internal_name', $challenge)->update(['threshold' => $airlineCount]); + } + + } } diff --git a/app/Models/User.php b/app/Models/User.php index beb4950..3dde6cf 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -13,11 +13,14 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use App\Traits\HasAchievements; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Laravel\Sanctum\HasApiTokens; use NotificationChannels\WebPush\HasPushSubscriptions; use Spatie\Permission\Traits\HasRoles; +use App\Notifications\ResetPasswordNotification; + #[Fillable(['name', 'email', 'password', 'distance_unit', 'settings'])] #[Hidden(['password', 'remember_token'])] @@ -35,6 +38,22 @@ class User extends Authenticatable protected $appends = ['resolved_settings']; + public function calculateAchievementsAndClearCache(): void + { + $this->clearCache(); + $this->calculateAchievements(); + } + + public function clearCache(): void + { + Cache::forget("user_flights_{$this->id}"); + + $this + ->followers() + ->get() + ->each(fn ($follower) => Cache::forget("user_following_flights_{$follower->id}")); + } + public function achievements(): HasMany { return $this->hasMany(UserAchievement::class); @@ -83,6 +102,11 @@ class User extends Authenticatable }); } + public function sendPasswordResetNotification($token): void + { + $this->notify(new ResetPasswordNotification($token)); + } + public function resolveRouteBinding($value, $field = null): ?User { return $this->where('name', 'ilike', $value)->firstOrFail(); @@ -129,8 +153,8 @@ class User extends Authenticatable $today = now('UTC')->toDateString(); return match ($filter) { - 'departed' => $collection->filter(fn($f) => $f->departure_date <= $today)->values(), - 'upcoming' => $collection->filter(fn($f) => $f->departure_date > $today)->values(), + 'departed' => $collection->filter(fn($f) => Carbon::parse($f->departure_date)->toDateString() <= $today)->values(), + 'upcoming' => $collection->filter(fn($f) => Carbon::parse($f->departure_date)->toDateString() > $today)->values(), default => $collection, }; } diff --git a/app/Notifications/ResetPasswordNotification.php b/app/Notifications/ResetPasswordNotification.php new file mode 100644 index 0000000..fd82b38 --- /dev/null +++ b/app/Notifications/ResetPasswordNotification.php @@ -0,0 +1,41 @@ +token = $token; + } + + public function via($notifiable): array + { + return ['mail']; + } + + public function toMail($notifiable) + { + $url = url(route('password.reset', [ + 'token' => $this->token, + 'email' => $notifiable->getEmailForPasswordReset(), + ], false)); + + return (new MailMessage) + ->theme('flightsgoneby') + ->subject(Lang::get('Reset your password')) + ->line(Lang::get('You are receiving this email because we received a password reset request for your account.')) + ->action(Lang::get('Reset Password'), $url) + ->line(Lang::get('This password reset link will expire in :count minutes.', ['count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')])) + ->line(Lang::get('If you did not request a password reset, no further action is required.')); + } +} diff --git a/app/Observers/FlightObserver.php b/app/Observers/FlightObserver.php index b107eb2..6b07f28 100644 --- a/app/Observers/FlightObserver.php +++ b/app/Observers/FlightObserver.php @@ -11,25 +11,12 @@ use Illuminate\Support\Facades\Cache; class FlightObserver { - protected function clearCache(UserFlight $flight): void - { - Cache::forget("user_flights_{$flight->user->id}"); - - $flight - ->user - ->followers() - ->get() - ->each(fn ($follower) => Cache::forget("user_following_flights_{$follower->id}")); - } - - /** * Recalculate after a flight is created. */ public function created(UserFlight $flight): void { - $flight->user->calculateAchievements(); - $this->clearCache($flight); + $flight->user->calculateAchievementsAndClearCache(); new FollowerNotificationService()->notifyFlightEvent($flight, FlightNotificationType::forCreation($flight)); } @@ -41,8 +28,7 @@ class FlightObserver public function updated(UserFlight $flight): void { \Log::info('Observer fired for flight ' . $flight->id); - $flight->user->calculateAchievements(); - $this->clearCache($flight); + $flight->user->calculateAchievementsAndClearCache(); } /** @@ -51,9 +37,7 @@ class FlightObserver */ public function deleted(UserFlight $flight): void { - $flight->user->calculateAchievements(); - $this->clearCache($flight); - + $flight->user->calculateAchievementsAndClearCache(); if ($flight->departure_date->isFuture()) { new FollowerNotificationService()->notifyFlightEvent($flight, FlightNotificationType::Cancelled); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 1ea6b4c..9ec3f9f 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,6 +13,7 @@ use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\RateLimiter; use Illuminate\Http\Request; use Illuminate\Cache\RateLimiting\Limit; +use Illuminate\Support\Facades\Mail; class AppServiceProvider extends ServiceProvider { @@ -29,6 +30,9 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { + if(!app()->isProduction()){ + Mail::alwaysTo(config('app.test_email')); + } Vite::prefetch(concurrency: 3); UserFlight::observe(FlightObserver::class); Airline::observe(AirlineObserver::class); diff --git a/app/Services/Achievements/Checkers/AircraftChecker.php b/app/Services/Achievements/Checkers/AircraftChecker.php index e0c7fa6..99bd939 100644 --- a/app/Services/Achievements/Checkers/AircraftChecker.php +++ b/app/Services/Achievements/Checkers/AircraftChecker.php @@ -99,9 +99,9 @@ class AircraftChecker extends BaseChecker $flownBoeingFamilies = collect(Aircraft::BOEING_FAMILIES) ->filter(fn($designators) => - $flightsWithAircraft->contains( - fn(UserFlight $f) => in_array($f->aircraft->designator, $designators) - ) + $flightsWithAircraft->contains( + fn(UserFlight $f) => in_array($f->aircraft->designator, $designators) + ) ) ->count(); @@ -109,14 +109,24 @@ class AircraftChecker extends BaseChecker // --- Airbus A3xx families --- - $flownAirbusFamilie = collect(Aircraft::AIRBUS_FAMILIES) + $flownAirbusFamilies = collect(Aircraft::AIRBUS_FAMILIES) ->filter(fn($designators) => - $flightsWithAircraft->contains( - fn(UserFlight $f) => in_array($f->aircraft->designator, $designators) - ) + $flightsWithAircraft->contains( + fn(UserFlight $f) => in_array($f->aircraft->designator, $designators) + ) ) ->count(); - $this->awardProgress($flownAirbusFamilie, 'aircraft.all_airbus_a3xx'); + $this->awardProgress($flownAirbusFamilies, 'aircraft.all_airbus_a3xx'); + + $flown737Variants = collect(Aircraft::BOEING_737_VARIANTS) + ->filter(fn($designators) => + $flightsWithAircraft->contains( + fn(UserFlight $f) => in_array($f->aircraft->designator, $designators) + ) + ) + ->count(); + $this->awardProgress($flown737Variants, 'aircraft.all_boeing_737'); + } } diff --git a/composer.json b/composer.json index 8debc92..a785cda 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,8 @@ "laravel/sanctum": "^4.0", "laravel/tinker": "^3.0", "spatie/laravel-permission": "^8.0", + "symfony/http-client": "^8.1", + "symfony/mailgun-mailer": "^8.1", "tightenco/ziggy": "^2.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index fe230ad..92febfa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "eb16a3b778bbeaad9a49b64820d911ba", + "content-hash": "6fb94af09ede5fe0164f292fa2c328bd", "packages": [ { "name": "brick/math", @@ -4475,87 +4475,6 @@ ], "time": "2024-06-11T12:45:25+00:00" }, - { - "name": "simplepie/simplepie", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/simplepie/simplepie.git", - "reference": "76cccb1b2c5dcaf44f304c925ab30c0f48643992" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/simplepie/simplepie/zipball/76cccb1b2c5dcaf44f304c925ab30c0f48643992", - "reference": "76cccb1b2c5dcaf44f304c925ab30c0f48643992", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "php": ">=7.2.0" - }, - "require-dev": { - "donatj/mock-webserver": "^2.7", - "friendsofphp/php-cs-fixer": "^2.19 || ^3.8", - "mf2/mf2": "^0.5.0", - "phpstan/phpstan": "~1.12.2", - "phpunit/phpunit": "^8 || ^9 || ^10", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1 || ^2 || ^3" - }, - "suggest": { - "ext-curl": "", - "ext-iconv": "", - "ext-intl": "", - "ext-mbstring": "", - "mf2/mf2": "Microformat module that allows for parsing HTML for microformats" - }, - "type": "library", - "autoload": { - "psr-0": { - "SimplePie": "library" - }, - "psr-4": { - "SimplePie\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ryan Parman", - "homepage": "http://ryanparman.com/", - "role": "Creator, alumnus developer" - }, - { - "name": "Sam Sneddon", - "homepage": "https://gsnedders.com/", - "role": "Alumnus developer" - }, - { - "name": "Ryan McCue", - "email": "me@ryanmccue.info", - "homepage": "http://ryanmccue.info/", - "role": "Developer" - } - ], - "description": "A simple Atom/RSS parsing library for PHP", - "homepage": "http://simplepie.org/", - "keywords": [ - "atom", - "feeds", - "rss" - ], - "support": { - "issues": "https://github.com/simplepie/simplepie/issues", - "source": "https://github.com/simplepie/simplepie/tree/1.9.0" - }, - "time": "2025-09-12T06:34:27+00:00" - }, { "name": "spatie/laravel-package-tools", "version": "1.93.1", @@ -5492,6 +5411,185 @@ ], "time": "2026-01-29T09:41:02+00:00" }, + { + "name": "symfony/http-client", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "d41e9778eed03c64b095532c6d414e92e3c520d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/d41e9778eed03c64b095532c6d414e92e3c520d9", + "reference": "d41e9778eed03c64b095532c6d414e92e3c520d9", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/http-client-contracts": "^3.7", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<3", + "php-http/discovery": "<1.15" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^5.3.2", + "amphp/http-tunnel": "^2.0", + "guzzlehttp/guzzle": "^7.10", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-16T12:55:20+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "41fc42d276aeff21192465331ebbab7d83a743c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41fc42d276aeff21192465331ebbab7d83a743c0", + "reference": "41fc42d276aeff21192465331ebbab7d83a743c0", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, { "name": "symfony/http-foundation", "version": "v8.0.7", @@ -5756,6 +5854,76 @@ ], "time": "2026-02-25T16:59:43+00:00" }, + { + "name": "symfony/mailgun-mailer", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailgun-mailer.git", + "reference": "d0567991cb97cbc2f5dd6f9cc7898af69abc9ba3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/d0567991cb97cbc2f5dd6f9cc7898af69abc9ba3", + "reference": "d0567991cb97cbc2f5dd6f9cc7898af69abc9ba3", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/mailer": "^7.4|^8.0" + }, + "require-dev": { + "symfony/http-client": "^7.4|^8.0", + "symfony/webhook": "^7.4|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailgun Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailgun-mailer/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-09T10:54:51+00:00" + }, { "name": "symfony/mime", "version": "v8.0.7", diff --git a/config/app.php b/config/app.php index 0f79282..b0b2ca8 100644 --- a/config/app.php +++ b/config/app.php @@ -41,7 +41,7 @@ return [ 'debug' => (bool) env('APP_DEBUG', false), 'verify_ssl' => env('VERIFY_SSL', true), - + 'test_email' => env('TEST_EMAIL', ''), /* |-------------------------------------------------------------------------- | Application URL diff --git a/config/mail.php b/config/mail.php index e32e88d..5b6f0c6 100644 --- a/config/mail.php +++ b/config/mail.php @@ -96,7 +96,9 @@ return [ ], 'retry_after' => 60, ], - + 'mailgun' => [ + 'transport' => 'mailgun', + ], ], /* diff --git a/config/services.php b/config/services.php index 6a90eb8..25c5f5e 100644 --- a/config/services.php +++ b/config/services.php @@ -34,5 +34,11 @@ return [ 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), ], ], + 'mailgun' => [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], ]; diff --git a/database/migrations/2026_07_07_041555_all737_families.php b/database/migrations/2026_07_07_041555_all737_families.php new file mode 100644 index 0000000..1223305 --- /dev/null +++ b/database/migrations/2026_07_07_041555_all737_families.php @@ -0,0 +1,64 @@ + 'B731', + 'manufacturer_code' => 'BOEING', + 'model_full_name' => '737-100', + 'aircraft_description' => 'LandPlane', + 'engine_type' => 'Jet', + 'engine_count' => 2, + 'wtc' => 'M', + 'preferred' => false, + ]); + + $modelNames = ['737-8', '737-9', '737-10', '737-7']; + Aircraft::whereIn('model_full_name', $modelNames)->delete(); + + $impossible = AchievementDifficulty::where('internal_name', 'impossible')->first(); + $aircraftCategory = AchievementCategory::where('internal_name', 'aircraft')->first(); + + Achievement::create([ + 'internal_name' => 'aircraft.all_boeing_737', + 'name' => 'Rarest of the Commoners', + 'short_description' => 'Fly Every Variant of the Boeing 737', + 'icon' => 'standard_achievement.png', + 'achievement_category_id' => $aircraftCategory->id, + 'achievement_difficulty_id' => $impossible->id, + 'progressive' => true, + 'threshold' => 13, + 'sort_order' => 7, + 'has_page' => true, + 'long_description' => '' + ]); + + foreach(User::all() as $user){ + $user->calculateAchievements(); + } + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/public/img/logos/header_logo_color.png b/public/img/logos/header_logo_color.png new file mode 100644 index 0000000000000000000000000000000000000000..53b3ac81004327927f5e24d799ee82d698b3359f GIT binary patch literal 63344 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

N)Bg)t1H=H)sMTHij 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 G|NIX$f{qOU literal 0 HcmV?d00001 diff --git a/resources/js/Components/FlightsGoneBy/UserFlightContextMenu.vue b/resources/js/Components/FlightsGoneBy/UserFlightContextMenu.vue index 15af63e..937e890 100644 --- a/resources/js/Components/FlightsGoneBy/UserFlightContextMenu.vue +++ b/resources/js/Components/FlightsGoneBy/UserFlightContextMenu.vue @@ -27,14 +27,14 @@ const showDeleteDialog = computed({ function copyFlightToClipboard(flight: Flight) { const dep = `${flight.departure_airport.display_code} (${flight.departure_airport.municipality})` const arr = `${flight.arrival_airport.display_code} (${flight.arrival_airport.municipality})` - const times = `${flight.departure_time_display} → ${flight.arrival_time_display}` const dayDiff = flight.arrival_day_difference !== 0 ? `(${flight.arrival_day_difference > 0 ? '+' : ''}${flight.arrival_day_difference})` : '' + const times = `${flight.departure_time_display} → ${flight.arrival_time_display} ${dayDiff}` const airline = flight.airline?.display_name const aircraft = flight.aircraft?.display_name - const reg = flight.aircraft_registration ? `(${flight.aircraft_registration})` : '' - const text = `${airline} | ${dep} → ${arr} ${dayDiff} | ${times} · ${flight.departure_date_display} | ${aircraft} ${reg}` + const reg = flight.aircraft_registration ? `· (${flight.aircraft_registration})` : '' + const text = `${flight.departure_date_display} | ${flight.flight_number} | ${airline} | ${dep} → ${arr} | ${times} | ${aircraft} ${reg}` copyToClipboard(text) } diff --git a/resources/js/Pages/Auth/ForgotPassword.vue b/resources/js/Pages/Auth/ForgotPassword.vue index 72a1311..be699f6 100644 --- a/resources/js/Pages/Auth/ForgotPassword.vue +++ b/resources/js/Pages/Auth/ForgotPassword.vue @@ -23,7 +23,7 @@ const submit = () => { {{ status }} - + diff --git a/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue b/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue new file mode 100644 index 0000000..f358dff --- /dev/null +++ b/resources/js/Pages/Profile/Achievements/aircraft.all_boeing_737.vue @@ -0,0 +1,137 @@ + + + + + + + diff --git a/resources/views/emails/reset-password.blade.php b/resources/views/emails/reset-password.blade.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/resources/views/emails/reset-password.blade.php @@ -0,0 +1 @@ + 'primary', + 'align' => 'center', +]) + + + + + diff --git a/resources/views/vendor/mail/html/footer.blade.php b/resources/views/vendor/mail/html/footer.blade.php new file mode 100644 index 0000000..c13e31a --- /dev/null +++ b/resources/views/vendor/mail/html/footer.blade.php @@ -0,0 +1,12 @@ +@props(['url']) + + + + + + + + + diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php new file mode 100644 index 0000000..be6f520 --- /dev/null +++ b/resources/views/vendor/mail/html/header.blade.php @@ -0,0 +1,12 @@ +@props(['url']) + + + + FlightsGoneBy + + + diff --git a/resources/views/vendor/mail/html/layout.blade.php b/resources/views/vendor/mail/html/layout.blade.php new file mode 100644 index 0000000..037efe3 --- /dev/null +++ b/resources/views/vendor/mail/html/layout.blade.php @@ -0,0 +1,58 @@ + + + +{{ config('app.name') }} + + + + + +{!! $head ?? '' !!} + + + + + + + + + + diff --git a/resources/views/vendor/mail/html/message.blade.php b/resources/views/vendor/mail/html/message.blade.php new file mode 100644 index 0000000..a16bace --- /dev/null +++ b/resources/views/vendor/mail/html/message.blade.php @@ -0,0 +1,27 @@ + +{{-- Header --}} + + +{{ config('app.name') }} + + + +{{-- Body --}} +{!! $slot !!} + +{{-- Subcopy --}} +@isset($subcopy) + + +{!! $subcopy !!} + + +@endisset + +{{-- Footer --}} + + +© {{ date('Y') }} {{ config('app.name') }}. {{ __('All rights reserved.') }} + + + diff --git a/resources/views/vendor/mail/html/panel.blade.php b/resources/views/vendor/mail/html/panel.blade.php new file mode 100644 index 0000000..2975a60 --- /dev/null +++ b/resources/views/vendor/mail/html/panel.blade.php @@ -0,0 +1,14 @@ + + + + + + diff --git a/resources/views/vendor/mail/html/subcopy.blade.php b/resources/views/vendor/mail/html/subcopy.blade.php new file mode 100644 index 0000000..790ce6c --- /dev/null +++ b/resources/views/vendor/mail/html/subcopy.blade.php @@ -0,0 +1,7 @@ + + + + + diff --git a/resources/views/vendor/mail/html/table.blade.php b/resources/views/vendor/mail/html/table.blade.php new file mode 100644 index 0000000..a5f3348 --- /dev/null +++ b/resources/views/vendor/mail/html/table.blade.php @@ -0,0 +1,3 @@ +
+{{ Illuminate\Mail\Markdown::parse($slot) }} +
diff --git a/resources/views/vendor/mail/html/themes/default.css b/resources/views/vendor/mail/html/themes/default.css new file mode 100644 index 0000000..d6ee6f0 --- /dev/null +++ b/resources/views/vendor/mail/html/themes/default.css @@ -0,0 +1,297 @@ +/* Base */ + +body, +body *:not(html):not(style):not(br):not(tr):not(code) { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + position: relative; +} + +body { + -webkit-text-size-adjust: none; + background-color: #ffffff; + color: #52525b; + height: 100%; + line-height: 1.4; + margin: 0; + padding: 0; + width: 100% !important; +} + +p, +ul, +ol, +blockquote { + line-height: 1.4; + text-align: start; +} + +a { + color: #18181b; +} + +a img { + border: none; +} + +/* Typography */ + +h1 { + color: #18181b; + font-size: 18px; + font-weight: bold; + margin-top: 0; + text-align: start; +} + +h2 { + font-size: 16px; + font-weight: bold; + margin-top: 0; + text-align: start; +} + +h3 { + font-size: 14px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +p { + font-size: 16px; + line-height: 1.5em; + margin-top: 0; + text-align: left; +} + +p.sub { + font-size: 12px; +} + +img { + max-width: 100%; +} + +/* Layout */ + +.wrapper { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + background-color: #fafafa; + margin: 0; + padding: 0; + width: 100%; +} + +.content { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +/* Header */ + +.header { + padding: 25px 0; + text-align: center; +} + +.header a { + color: #18181b; + font-size: 19px; + font-weight: bold; + text-decoration: none; +} + +/* Logo */ + +.logo { + height: 75px; + margin-top: 15px; + margin-bottom: 10px; + max-height: 75px; + width: 75px; +} + +/* Body */ + +.body { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + background-color: #fafafa; + border-bottom: 1px solid #fafafa; + border-top: 1px solid #fafafa; + margin: 0; + padding: 0; + width: 100%; +} + +.inner-body { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; + background-color: #ffffff; + border-color: #e4e4e7; + border-radius: 4px; + border-width: 1px; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1); + margin: 0 auto; + padding: 0; + width: 570px; +} + +.inner-body a { + word-break: break-all; +} + +/* Subcopy */ + +.subcopy { + border-top: 1px solid #e4e4e7; + margin-top: 25px; + padding-top: 25px; +} + +.subcopy p { + font-size: 14px; +} + +/* Footer */ + +.footer { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; + margin: 0 auto; + padding: 0; + text-align: center; + width: 570px; +} + +.footer p { + color: #a1a1aa; + font-size: 12px; + text-align: center; +} + +.footer a { + color: #a1a1aa; + text-decoration: underline; +} + +/* Tables */ + +.table table { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + margin: 30px auto; + width: 100%; +} + +.table th { + border-bottom: 1px solid #e4e4e7; + margin: 0; + padding-bottom: 8px; +} + +.table td { + color: #52525b; + font-size: 15px; + line-height: 18px; + margin: 0; + padding: 10px 0; +} + +.content-cell { + max-width: 100vw; + padding: 32px; +} + +/* Buttons */ + +.action { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + margin: 30px auto; + padding: 0; + text-align: center; + width: 100%; + float: unset; +} + +.button { + -webkit-text-size-adjust: none; + border-radius: 4px; + color: #fff; + display: inline-block; + overflow: hidden; + text-decoration: none; +} + +.button-blue, +.button-primary { + background-color: #18181b; + border-bottom: 8px solid #18181b; + border-left: 18px solid #18181b; + border-right: 18px solid #18181b; + border-top: 8px solid #18181b; +} + +.button-green, +.button-success { + background-color: #16a34a; + border-bottom: 8px solid #16a34a; + border-left: 18px solid #16a34a; + border-right: 18px solid #16a34a; + border-top: 8px solid #16a34a; +} + +.button-red, +.button-error { + background-color: #dc2626; + border-bottom: 8px solid #dc2626; + border-left: 18px solid #dc2626; + border-right: 18px solid #dc2626; + border-top: 8px solid #dc2626; +} + +/* Panels */ + +.panel { + border-left: #18181b solid 4px; + margin: 21px 0; +} + +.panel-content { + background-color: #fafafa; + color: #52525b; + padding: 16px; +} + +.panel-content p { + color: #52525b; +} + +.panel-item { + padding: 0; +} + +.panel-item p:last-of-type { + margin-bottom: 0; + padding-bottom: 0; +} + +/* Utilities */ + +.break-all { + word-break: break-all; +} diff --git a/resources/views/vendor/mail/html/themes/flightsgoneby.css b/resources/views/vendor/mail/html/themes/flightsgoneby.css new file mode 100644 index 0000000..c237f00 --- /dev/null +++ b/resources/views/vendor/mail/html/themes/flightsgoneby.css @@ -0,0 +1,52 @@ +/* Body */ +body { + background-color: #f4f6fb; + color: #4a5568; +} + +/* Header */ +.header { + background-color: rgb(0, 12, 41); + padding: 32px 24px; + text-align: center; + border-radius: 8px 8px 0 0; +} + +/* Content wrapper */ +.wrapper { + background-color: #ffffff; + border: 1px solid #e2e8f0; + border-top: none; + border-radius: 0 0 8px 8px; +} + +.content-cell { + padding: 32px; +} + +/* Button — outlined so it reads on light or dark backgrounds */ +.button-blue, +.button-primary { + background-color: transparent; + border: 2px solid #38bdf8; + border-radius: 6px; + color: #0c4a6e !important; + display: inline-block; + font-weight: 600; + padding: 12px 24px; + text-decoration: none; +} + +/* Footer */ +.footer { + background-color: rgb(0, 12, 41); + color: #94a3b8; + padding: 24px; + border-radius: 8px; + margin-top: 24px; +} + +.footer p { + color: #94a3b8; + font-size: 12px; +} diff --git a/resources/views/vendor/mail/text/button.blade.php b/resources/views/vendor/mail/text/button.blade.php new file mode 100644 index 0000000..97444eb --- /dev/null +++ b/resources/views/vendor/mail/text/button.blade.php @@ -0,0 +1 @@ +{{ $slot }}: {{ $url }} diff --git a/resources/views/vendor/mail/text/footer.blade.php b/resources/views/vendor/mail/text/footer.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/text/footer.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/text/header.blade.php b/resources/views/vendor/mail/text/header.blade.php new file mode 100644 index 0000000..97444eb --- /dev/null +++ b/resources/views/vendor/mail/text/header.blade.php @@ -0,0 +1 @@ +{{ $slot }}: {{ $url }} diff --git a/resources/views/vendor/mail/text/layout.blade.php b/resources/views/vendor/mail/text/layout.blade.php new file mode 100644 index 0000000..ec58e83 --- /dev/null +++ b/resources/views/vendor/mail/text/layout.blade.php @@ -0,0 +1,9 @@ +{!! strip_tags($header ?? '') !!} + +{!! strip_tags($slot) !!} +@isset($subcopy) + +{!! strip_tags($subcopy) !!} +@endisset + +{!! strip_tags($footer ?? '') !!} diff --git a/resources/views/vendor/mail/text/message.blade.php b/resources/views/vendor/mail/text/message.blade.php new file mode 100644 index 0000000..80bce21 --- /dev/null +++ b/resources/views/vendor/mail/text/message.blade.php @@ -0,0 +1,27 @@ + + {{-- Header --}} + + + {{ config('app.name') }} + + + + {{-- Body --}} + {{ $slot }} + + {{-- Subcopy --}} + @isset($subcopy) + + + {{ $subcopy }} + + + @endisset + + {{-- Footer --}} + + + © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') + + + diff --git a/resources/views/vendor/mail/text/panel.blade.php b/resources/views/vendor/mail/text/panel.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/text/panel.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/text/subcopy.blade.php b/resources/views/vendor/mail/text/subcopy.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/text/subcopy.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/resources/views/vendor/mail/text/table.blade.php b/resources/views/vendor/mail/text/table.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/resources/views/vendor/mail/text/table.blade.php @@ -0,0 +1 @@ +{{ $slot }}