diff --git a/app/Handlers/Events/APIEventHandler.php b/app/Handlers/Events/APIEventHandler.php index bbfdd150bd..400c0fdca1 100644 --- a/app/Handlers/Events/APIEventHandler.php +++ b/app/Handlers/Events/APIEventHandler.php @@ -26,7 +26,10 @@ namespace FireflyIII\Handlers\Events; use Exception; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Mail\AccessTokenCreatedMail; +use FireflyIII\Notifications\Admin\TestNotification; +use FireflyIII\Notifications\User\NewAccessToken; use FireflyIII\Repositories\User\UserRepositoryInterface; +use Illuminate\Support\Facades\Notification; use Laravel\Passport\Events\AccessTokenCreated; use Log; use Mail; @@ -42,45 +45,18 @@ class APIEventHandler * * @param AccessTokenCreated $event * - * @return bool * @throws FireflyException - * @deprecated */ - public function accessTokenCreated(AccessTokenCreated $event): bool + public function accessTokenCreated(AccessTokenCreated $event): void { + Log::debug(__METHOD__); /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); $user = $repository->find((int) $event->userId); + if (null !== $user) { - $email = $user->email; - - // if user is demo user, send to owner: - if ($user->hasRole('demo')) { - $email = config('firefly.site_owner'); - } - - // see if user has alternative email address: - $pref = app('preferences')->getForUser($user, 'remote_guard_alt_email'); - if (null !== $pref) { - $email = (string) (is_array($pref->data) ? $email : $pref->data); - } - - Log::debug(sprintf('Now in APIEventHandler::accessTokenCreated. Email is %s', $email)); - try { - Log::debug('Trying to send message...'); - Mail::to($email)->send(new AccessTokenCreatedMail); - - } catch (Exception $e) { // @phpstan-ignore-line - Log::debug('Send message failed! :('); - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - Session::flash('error', 'Possible email error: ' . $e->getMessage()); - } - - Log::debug('If no error above this line, message was sent.'); + Notification::send($user, new NewAccessToken); } - - return true; } } diff --git a/app/Handlers/Events/AdminEventHandler.php b/app/Handlers/Events/AdminEventHandler.php index f158b96f4d..ffa5094deb 100644 --- a/app/Handlers/Events/AdminEventHandler.php +++ b/app/Handlers/Events/AdminEventHandler.php @@ -45,17 +45,15 @@ class AdminEventHandler * * @return bool */ - public function sendTestMessage(AdminRequestedTestMessage $event): bool + public function sendTestMessage(AdminRequestedTestMessage $event): void { /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); - // do some validation. + if (!$repository->hasRole($event->user, 'owner')) { - return true; + return; } Notification::send($event->user, new TestNotification($event->user->email)); - - return true; } } diff --git a/app/Handlers/Events/AutomationHandler.php b/app/Handlers/Events/AutomationHandler.php index 4ec1d9725f..4b048c126c 100644 --- a/app/Handlers/Events/AutomationHandler.php +++ b/app/Handlers/Events/AutomationHandler.php @@ -27,7 +27,12 @@ use Exception; use FireflyIII\Events\RequestedReportOnJournals; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Mail\ReportNewJournalsMail; +use FireflyIII\Models\TransactionGroup; +use FireflyIII\Notifications\User\NewAccessToken; +use FireflyIII\Notifications\User\TransactionCreation; use FireflyIII\Repositories\User\UserRepositoryInterface; +use FireflyIII\Transformers\TransactionGroupTransformer; +use Illuminate\Support\Facades\Notification; use Log; use Mail; @@ -41,36 +46,31 @@ class AutomationHandler * Respond to the creation of X journals. * * @param RequestedReportOnJournals $event - * - * @return bool - * @deprecated */ - public function reportJournals(RequestedReportOnJournals $event): bool + public function reportJournals(RequestedReportOnJournals $event): void { + Log::debug('In reportJournals.'); $sendReport = config('firefly.send_report_journals'); - if (false === $sendReport) { - return true; + return; } - Log::debug('In reportJournals.'); /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); $user = $repository->find($event->userId); - if (null !== $user && 0 !== $event->groups->count()) { - try { - Log::debug('Trying to mail...'); - Mail::to($user->email)->send(new ReportNewJournalsMail($event->groups)); - - } catch (Exception $e) { // @phpstan-ignore-line - Log::debug('Send message failed! :('); - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - } - - Log::debug('Done!'); + if (null === $user || 0 === $event->groups->count()) { + return; } - return true; + // transform groups into array: + /** @var TransactionGroupTransformer $transformer */ + $transformer = app(TransactionGroupTransformer::class); + $groups = []; + /** @var TransactionGroup $group */ + foreach ($event->groups as $group) { + $groups[] = $transformer->transformObject($group); + } + + Notification::send($user, new TransactionCreation($groups)); } } diff --git a/app/Handlers/Events/BillEventHandler.php b/app/Handlers/Events/BillEventHandler.php index 8c275137c7..d13bce080e 100644 --- a/app/Handlers/Events/BillEventHandler.php +++ b/app/Handlers/Events/BillEventHandler.php @@ -39,8 +39,6 @@ class BillEventHandler /** * @param WarnUserAboutBill $event * @return void - * @throws \FireflyIII\Exceptions\FireflyException - * @deprecated */ public function warnAboutBill(WarnUserAboutBill $event): void { diff --git a/app/Handlers/Events/UserEventHandler.php b/app/Handlers/Events/UserEventHandler.php index aea2e8a5c1..96d5fab0ff 100644 --- a/app/Handlers/Events/UserEventHandler.php +++ b/app/Handlers/Events/UserEventHandler.php @@ -33,16 +33,18 @@ use FireflyIII\Events\RequestedNewPassword; use FireflyIII\Events\UserChangedEmail; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Mail\ConfirmEmailChangeMail; -use FireflyIII\Mail\NewIPAddressWarningMail; use FireflyIII\Mail\RegisteredUser as RegisteredUserMail; use FireflyIII\Mail\RequestedNewPassword as RequestedNewPasswordMail; use FireflyIII\Mail\UndoEmailChangeMail; use FireflyIII\Models\GroupMembership; use FireflyIII\Models\UserGroup; use FireflyIII\Models\UserRole; +use FireflyIII\Notifications\User\UserLogin; +use FireflyIII\Notifications\User\UserNewPassword; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; use Illuminate\Auth\Events\Login; +use Illuminate\Support\Facades\Notification; use Log; use Mail; @@ -62,7 +64,7 @@ class UserEventHandler * * @return bool */ - public function attachUserRole(RegisteredUser $event): bool + public function attachUserRole(RegisteredUser $event): void { /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); @@ -72,19 +74,16 @@ class UserEventHandler Log::debug('User count is one, attach role.'); $repository->attachRole($event->user, 'owner'); } - - return true; } /** * @param RegisteredUser $event * @return bool */ - public function createExchangeRates(RegisteredUser $event): bool { + public function createExchangeRates(RegisteredUser $event): void + { $seeder = new ExchangeRateSeeder; $seeder->run(); - - return true; } /** @@ -94,7 +93,7 @@ class UserEventHandler * * @return bool */ - public function checkSingleUserIsAdmin(Login $event): bool + public function checkSingleUserIsAdmin(Login $event): void { /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); @@ -117,8 +116,6 @@ class UserEventHandler // give user the role $repository->attachRole($user, 'owner'); } - - return true; } /** @@ -127,7 +124,7 @@ class UserEventHandler * @return bool * @throws FireflyException */ - public function createGroupMembership(RegisteredUser $event): bool + public function createGroupMembership(RegisteredUser $event): void { $user = $event->user; $groupExists = true; @@ -160,8 +157,6 @@ class UserEventHandler ); $user->user_group_id = $group->id; $user->save(); - - return true; } /** @@ -172,7 +167,7 @@ class UserEventHandler * @return bool * @throws FireflyException */ - public function demoUserBackToEnglish(Login $event): bool + public function demoUserBackToEnglish(Login $event): void { /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); @@ -185,15 +180,12 @@ class UserEventHandler app('preferences')->setForUser($user, 'locale', 'equal'); app('preferences')->mark(); } - - return true; } /** * @param DetectedNewIPAddress $event * * @throws FireflyException - * @deprecated */ public function notifyNewIPAddress(DetectedNewIPAddress $event): void { @@ -207,21 +199,10 @@ class UserEventHandler $list = app('preferences')->getForUser($user, 'login_ip_history', [])->data; - // see if user has alternative email address: - $pref = app('preferences')->getForUser($user, 'remote_guard_alt_email'); - if (null !== $pref) { - $email = $pref->data; - } - /** @var array $entry */ foreach ($list as $index => $entry) { if (false === $entry['notified']) { - try { - Mail::to($email)->send(new NewIPAddressWarningMail($ipAddress)); - - } catch (Exception $e) { // @phpstan-ignore-line - Log::error($e->getMessage()); - } + Notification::send($user, new UserLogin($ipAddress)); } $list[$index]['notified'] = true; } @@ -230,41 +211,38 @@ class UserEventHandler } /** - * Send email to confirm email change. + * Send email to confirm email change. Will not be made into a notification, because + * this requires some custom fields from the user and not just the "user" object. * * @param UserChangedEmail $event * - * @return bool * @throws FireflyException - * @deprecated */ - public function sendEmailChangeConfirmMail(UserChangedEmail $event): bool + public function sendEmailChangeConfirmMail(UserChangedEmail $event): void { $newEmail = $event->newEmail; $oldEmail = $event->oldEmail; $user = $event->user; $token = app('preferences')->getForUser($user, 'email_change_confirm_token', 'invalid'); $url = route('profile.confirm-email-change', [$token->data]); + try { Mail::to($newEmail)->send(new ConfirmEmailChangeMail($newEmail, $oldEmail, $url)); } catch (Exception $e) { // @phpstan-ignore-line Log::error($e->getMessage()); } - - return true; } /** - * Send email to be able to undo email change. + * Send email to be able to undo email change. Will not be made into a notification, because + * this requires some custom fields from the user and not just the "user" object. * * @param UserChangedEmail $event * - * @return bool * @throws FireflyException - * @deprecated */ - public function sendEmailChangeUndoMail(UserChangedEmail $event): bool + public function sendEmailChangeUndoMail(UserChangedEmail $event): void { $newEmail = $event->newEmail; $oldEmail = $event->oldEmail; @@ -278,53 +256,36 @@ class UserEventHandler } catch (Exception $e) { // @phpstan-ignore-line Log::error($e->getMessage()); } - - return true; } /** * Send a new password to the user. - * @deprecated * @param RequestedNewPassword $event - * - * @return bool */ - public function sendNewPassword(RequestedNewPassword $event): bool + public function sendNewPassword(RequestedNewPassword $event): void { - $email = $event->user->email; - $ipAddress = $event->ipAddress; - $token = $event->token; - - $url = route('password.reset', [$token]); - - // send email. - try { - Mail::to($email)->send(new RequestedNewPasswordMail($url, $ipAddress)); - - } catch (Exception $e) { // @phpstan-ignore-line - Log::error($e->getMessage()); - } - - return true; + Notification::send($event->user, new UserNewPassword(route('password.reset', [$event->token]))); } /** * This method will send the user a registration mail, welcoming him or her to Firefly III. * This message is only sent when the configuration of Firefly III says so. * + * TODO this is an admin setting not a variable. Fix that first. + * * @param RegisteredUser $event * * @return bool - * @deprecated * @throws FireflyException + * @deprecated */ - public function sendRegistrationMail(RegisteredUser $event): bool + public function sendRegistrationMail(RegisteredUser $event): void { $sendMail = config('firefly.send_registration_mail'); if ($sendMail) { // get the email address - $email = $event->user->email; - $url = route('index'); + $email = $event->user->email; + $url = route('index'); // see if user has alternative email address: $pref = app('preferences')->getForUser($event->user, 'remote_guard_alt_email'); @@ -341,8 +302,6 @@ class UserEventHandler } } - - return true; } /** @@ -355,7 +314,7 @@ class UserEventHandler $user = $event->user; /** @var array $preference */ - if($user->hasRole('demo')) { + if ($user->hasRole('demo')) { Log::debug('Do not log demo user logins'); return; } diff --git a/app/Jobs/CreateRecurringTransactions.php b/app/Jobs/CreateRecurringTransactions.php index f9ea125eab..3078879c27 100644 --- a/app/Jobs/CreateRecurringTransactions.php +++ b/app/Jobs/CreateRecurringTransactions.php @@ -380,13 +380,19 @@ class CreateRecurringTransactions implements ShouldQueue // create transaction array and send to factory. $groupTitle = null; - if ($recurrence->recurrenceTransactions->count() > 1) { + $count = $recurrence->recurrenceTransactions->count(); + if ($count > 1) { /** @var RecurrenceTransaction $first */ $first = $recurrence->recurrenceTransactions()->first(); $groupTitle = $first->description; } + if(0 === $count) { + Log::error('No transactions to be created in this recurrence. Cannot continue.'); + + return null; + } $array = [ 'user' => $recurrence->user_id, diff --git a/app/Notifications/User/NewAccessToken.php b/app/Notifications/User/NewAccessToken.php index fe0969443b..30ead2627f 100644 --- a/app/Notifications/User/NewAccessToken.php +++ b/app/Notifications/User/NewAccessToken.php @@ -30,16 +30,13 @@ class NewAccessToken extends Notification { use Queueable; - private string $address; - /** * Create a new notification instance. * * @return void */ - public function __construct(string $address) + public function __construct() { - $this->address = $address; } /** @@ -62,8 +59,8 @@ class NewAccessToken extends Notification public function toMail($notifiable) { return (new MailMessage) - ->markdown('emails.admin-test', ['email' => $this->address]) - ->subject((string) trans('email.admin_test_subject')); + ->markdown('emails.token-created') + ->subject((string) trans('email.access_token_created_subject')); } /** diff --git a/app/Notifications/User/TransactionCreation.php b/app/Notifications/User/TransactionCreation.php index a276ab1397..d197b674e8 100644 --- a/app/Notifications/User/TransactionCreation.php +++ b/app/Notifications/User/TransactionCreation.php @@ -22,7 +22,61 @@ declare(strict_types=1); namespace FireflyIII\Notifications\User; -class TransactionCreation -{ +use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; +use Illuminate\Support\Collection; +class TransactionCreation extends Notification +{ + use Queueable; + + private array $collection; + + /** + * Create a new notification instance. + * + * @return void + */ + public function __construct(array $collection) + { + $this->collection = $collection; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage) + ->markdown('emails.report-new-journals', ['transformed' => $this->collection]) + ->subject((string) trans_choice('email.new_journals_subject', count($this->collection))); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } } diff --git a/app/Notifications/User/UserLogin.php b/app/Notifications/User/UserLogin.php index 2ef8758af0..382c02cff5 100644 --- a/app/Notifications/User/UserLogin.php +++ b/app/Notifications/User/UserLogin.php @@ -22,7 +22,73 @@ declare(strict_types=1); namespace FireflyIII\Notifications\User; -class UserLogin -{ +use Exception; +use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; +class UserLogin extends Notification +{ + use Queueable; + + private string $ip; + + /** + * Create a new notification instance. + * + * @return void + */ + public function __construct(string $ip) + { + $this->ip = $ip; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $time = now(config('app.timezone'))->isoFormat((string) trans('config.date_time_js')); + $host = ''; + try { + $hostName = gethostbyaddr($this->ip); + } catch (Exception $e) { + $hostName = $this->ip; + } + if ($hostName !== $this->ip) { + $host = $hostName; + } + + return (new MailMessage) + ->markdown('emails.new-ip', ['time' => $time, 'ipAddress' => $this->ip, 'host' => $host]) + ->subject((string) trans('email.login_from_new_ip')); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } } + diff --git a/app/Notifications/User/UserNewEmail.php b/app/Notifications/User/UserNewEmail.php deleted file mode 100644 index dcb702a742..0000000000 --- a/app/Notifications/User/UserNewEmail.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace FireflyIII\Notifications\User; - -class UserNewEmail -{ - -} diff --git a/app/Notifications/User/UserNewEmailUndo.php b/app/Notifications/User/UserNewEmailUndo.php deleted file mode 100644 index f474d1174d..0000000000 --- a/app/Notifications/User/UserNewEmailUndo.php +++ /dev/null @@ -1,28 +0,0 @@ -. - */ - -namespace FireflyIII\Notifications\User; - -class UserNewEmailUndo -{ - -} diff --git a/app/Notifications/User/UserNewPassword.php b/app/Notifications/User/UserNewPassword.php index 1322e112d3..831669176c 100644 --- a/app/Notifications/User/UserNewPassword.php +++ b/app/Notifications/User/UserNewPassword.php @@ -22,7 +22,60 @@ declare(strict_types=1); namespace FireflyIII\Notifications\User; -class UserNewPassword -{ +use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; +class UserNewPassword extends Notification +{ + use Queueable; + + private string $url; + + /** + * Create a new notification instance. + * + * @return void + */ + public function __construct(string $url) + { + $this->url = $url; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage) + ->markdown('emails.password', ['url' => $this->url]) + ->subject((string) trans('email.reset_pw_subject')); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 7930b77611..1b9e3c2f33 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -159,7 +159,7 @@ class EventServiceProvider extends ServiceProvider } /** - * + * TODO needs a dedicated method. */ protected function registerBudgetEvents(): void { @@ -206,13 +206,10 @@ class EventServiceProvider extends ServiceProvider } /** - * + * TODO needs a dedicated (static) method. */ protected function registerCreateEvents(): void { - - - // in case of repeated piggy banks and/or other problems. PiggyBank::created( static function (PiggyBank $piggyBank) { $repetition = new PiggyBankRepetition; @@ -223,40 +220,6 @@ class EventServiceProvider extends ServiceProvider $repetition->save(); } ); - Client::created( - static function (Client $oauthClient) { - /** @var UserRepositoryInterface $repository */ - $repository = app(UserRepositoryInterface::class); - $user = $repository->find((int) $oauthClient->user_id); - if (null === $user) { - Log::info('OAuth client generated but no user associated.'); - - return; - } - // HERE WE ARE - Notification::send($event->user, new TestNotification($event->user->email)); - - $email = $user->email; - - // see if user has alternative email address: - $pref = app('preferences')->getForUser($user, 'remote_guard_alt_email'); - if (null !== $pref) { - $email = $pref->data; - } - - Log::debug(sprintf('Now in EventServiceProvider::registerCreateEvents. Email is %s', $email)); - try { - Log::debug('Trying to send message...'); - Mail::to($email)->send(new OAuthTokenCreatedMail($oauthClient)); - } catch (TypeError|Exception $e) { // @phpstan-ignore-line - Log::debug('Send message failed! :('); - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - Session::flash('error', 'Possible email error: ' . $e->getMessage()); - } - Log::debug('If no error above this line, message was sent.'); - } - ); } } diff --git a/app/User.php b/app/User.php index 71655a408d..bc8d2034be 100644 --- a/app/User.php +++ b/app/User.php @@ -566,6 +566,10 @@ class User extends Authenticatable if (null !== $pref) { $email = $pref->data; } + // if user is demo user, send to owner: + if ($this->hasRole('demo')) { + $email = config('firefly.site_owner'); + } return match ($driver) { 'database' => $this->notifications(), diff --git a/composer.json b/composer.json index a5faa0292f..424b3d660f 100644 --- a/composer.json +++ b/composer.json @@ -100,10 +100,10 @@ "pragmarx/google2fa": "^8.0", "predis/predis": "^2.0", "psr/log": "<4", - "ramsey/uuid": "^4.4", + "ramsey/uuid": "^4.5", "rcrowe/twigbridge": "^0.14", - "spatie/data-transfer-object": "^3.8", - "spatie/laravel-ignition": "^1.4", + "spatie/data-transfer-object": "^3.9", + "spatie/laravel-ignition": "^1.5", "symfony/http-client": "^6.0", "symfony/mailgun-mailer": "^6.0" }, diff --git a/composer.lock b/composer.lock index e9309aaf70..30245e2427 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": "9f9d24b848eb536353b6ffd489b6411d", + "content-hash": "773f4b8dc111cdbdbdc38a66c6f3a3f9", "packages": [ { "name": "bacon/bacon-qr-code", @@ -1855,16 +1855,16 @@ }, { "name": "laravel/framework", - "version": "v9.29.0", + "version": "v9.30.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "585da0913e907fd54941260860ae3d7d4be8e8cb" + "reference": "9533f7926f31939f25a620fbbf545318c18c943f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/585da0913e907fd54941260860ae3d7d4be8e8cb", - "reference": "585da0913e907fd54941260860ae3d7d4be8e8cb", + "url": "https://api.github.com/repos/laravel/framework/zipball/9533f7926f31939f25a620fbbf545318c18c943f", + "reference": "9533f7926f31939f25a620fbbf545318c18c943f", "shasum": "" }, "require": { @@ -1941,12 +1941,15 @@ "illuminate/view": "self.version" }, "require-dev": { + "ably/ably-php": "^1.0", "aws/aws-sdk-php": "^3.198.1", "doctrine/dbal": "^2.13.3|^3.1.4", "fakerphp/faker": "^1.9.2", "guzzlehttp/guzzle": "^7.2", "league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.4.4", "orchestra/testbench-core": "^7.1", @@ -1954,7 +1957,8 @@ "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^9.5.8", "predis/predis": "^1.1.9|^2.0", - "symfony/cache": "^6.0" + "symfony/cache": "^6.0", + "symfony/uid": "^6.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -1974,6 +1978,8 @@ "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", "mockery/mockery": "Required to use mocking (^1.4.4).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", @@ -1987,7 +1993,8 @@ "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "symfony/uid": "Required to generate ULIDs for Eloquent (^6.0)." }, "type": "library", "extra": { @@ -2031,20 +2038,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-09-09T18:21:21+00:00" + "time": "2022-09-15T13:15:47+00:00" }, { "name": "laravel/passport", - "version": "v11.1.0", + "version": "v11.2.0", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "89cc1976a25e2fa53ba8a3773e101189149852fa" + "reference": "fb2a4029c6cf4df1ce0cf79ddbb874508f7a73e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/89cc1976a25e2fa53ba8a3773e101189149852fa", - "reference": "89cc1976a25e2fa53ba8a3773e101189149852fa", + "url": "https://api.github.com/repos/laravel/passport/zipball/fb2a4029c6cf4df1ce0cf79ddbb874508f7a73e9", + "reference": "fb2a4029c6cf4df1ce0cf79ddbb874508f7a73e9", "shasum": "" }, "require": { @@ -2108,7 +2115,7 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2022-09-05T14:35:34+00:00" + "time": "2022-09-07T13:14:45+00:00" }, { "name": "laravel/sanctum", @@ -2237,16 +2244,16 @@ }, { "name": "laravel/ui", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "c43d29941ee8f41547572968123eadbd81392841" + "reference": "9aa6930c8ae98b2465594d7f14f4ac131bfd6a99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/c43d29941ee8f41547572968123eadbd81392841", - "reference": "c43d29941ee8f41547572968123eadbd81392841", + "url": "https://api.github.com/repos/laravel/ui/zipball/9aa6930c8ae98b2465594d7f14f4ac131bfd6a99", + "reference": "9aa6930c8ae98b2465594d7f14f4ac131bfd6a99", "shasum": "" }, "require": { @@ -2292,9 +2299,9 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v4.0.1" + "source": "https://github.com/laravel/ui/tree/v4.0.2" }, - "time": "2022-09-06T14:48:07+00:00" + "time": "2022-09-09T18:20:35+00:00" }, { "name": "laravelcollective/html", @@ -2831,16 +2838,16 @@ }, { "name": "league/flysystem", - "version": "3.3.0", + "version": "3.5.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "d8295793b3e2f91aa39e1feb2d5bfce772891ae2" + "reference": "f14993c6e394450ac4649da35264df0544d0234e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d8295793b3e2f91aa39e1feb2d5bfce772891ae2", - "reference": "d8295793b3e2f91aa39e1feb2d5bfce772891ae2", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f14993c6e394450ac4649da35264df0544d0234e", + "reference": "f14993c6e394450ac4649da35264df0544d0234e", "shasum": "" }, "require": { @@ -2902,7 +2909,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.3.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.5.1" }, "funding": [ { @@ -2918,7 +2925,7 @@ "type": "tidelift" } ], - "time": "2022-09-09T11:11:42+00:00" + "time": "2022-09-18T18:23:19+00:00" }, { "name": "league/fractal", @@ -3136,16 +3143,16 @@ }, { "name": "league/uri", - "version": "6.7.1", + "version": "6.7.2", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea" + "reference": "d3b50812dd51f3fbf176344cc2981db03d10fe06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", - "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/d3b50812dd51f3fbf176344cc2981db03d10fe06", + "reference": "d3b50812dd51f3fbf176344cc2981db03d10fe06", "shasum": "" }, "require": { @@ -3223,7 +3230,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri/issues", - "source": "https://github.com/thephpleague/uri/tree/6.7.1" + "source": "https://github.com/thephpleague/uri/tree/6.7.2" }, "funding": [ { @@ -3231,7 +3238,7 @@ "type": "github" } ], - "time": "2022-06-29T09:48:18+00:00" + "time": "2022-09-13T19:50:42+00:00" }, { "name": "league/uri-interfaces", @@ -3572,20 +3579,20 @@ }, { "name": "nette/utils", - "version": "v3.2.7", + "version": "v3.2.8", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99" + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/0af4e3de4df9f1543534beab255ccf459e7a2c99", - "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99", + "url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", "shasum": "" }, "require": { - "php": ">=7.2 <8.2" + "php": ">=7.2 <8.3" }, "conflict": { "nette/di": "<3.0.6" @@ -3651,9 +3658,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.7" + "source": "https://github.com/nette/utils/tree/v3.2.8" }, - "time": "2022-01-24T11:29:14+00:00" + "time": "2022-09-12T23:36:20+00:00" }, { "name": "nunomaduro/collision", @@ -5052,20 +5059,20 @@ }, { "name": "ramsey/uuid", - "version": "4.4.0", + "version": "4.5.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "373f7bacfcf3de038778ff27dcce5672ddbf4c8a" + "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/373f7bacfcf3de038778ff27dcce5672ddbf4c8a", - "reference": "373f7bacfcf3de038778ff27dcce5672ddbf4c8a", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d", + "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d", "shasum": "" }, "require": { - "brick/math": "^0.8 || ^0.9 || ^0.10", + "brick/math": "^0.8.8 || ^0.9 || ^0.10", "ext-ctype": "*", "ext-json": "*", "php": "^8.0", @@ -5086,12 +5093,13 @@ "php-mock/php-mock-mockery": "^1.3", "php-parallel-lint/php-parallel-lint": "^1.1", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", "phpunit/phpunit": "^8.5 || ^9", - "slevomat/coding-standard": "^7.0", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.9" }, @@ -5129,7 +5137,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.4.0" + "source": "https://github.com/ramsey/uuid/tree/4.5.1" }, "funding": [ { @@ -5141,7 +5149,7 @@ "type": "tidelift" } ], - "time": "2022-08-05T17:58:37+00:00" + "time": "2022-09-16T03:22:46+00:00" }, { "name": "rcrowe/twigbridge", @@ -5283,16 +5291,16 @@ }, { "name": "spatie/data-transfer-object", - "version": "3.8.1", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/spatie/data-transfer-object.git", - "reference": "83c04ce0bbcb2f143782d45b5b285022fc2f8721" + "reference": "1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/83c04ce0bbcb2f143782d45b5b285022fc2f8721", - "reference": "83c04ce0bbcb2f143782d45b5b285022fc2f8721", + "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8", + "reference": "1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8", "shasum": "" }, "require": { @@ -5330,7 +5338,7 @@ ], "support": { "issues": "https://github.com/spatie/data-transfer-object/issues", - "source": "https://github.com/spatie/data-transfer-object/tree/3.8.1" + "source": "https://github.com/spatie/data-transfer-object/tree/3.9.1" }, "funding": [ { @@ -5342,7 +5350,7 @@ "type": "github" } ], - "time": "2022-06-02T20:28:47+00:00" + "time": "2022-09-16T13:34:38+00:00" }, { "name": "spatie/flare-client-php", @@ -5490,27 +5498,27 @@ }, { "name": "spatie/laravel-ignition", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "29deea5d9cf921590184be6956e657c4f4566440" + "reference": "192962f4d84526f6868c512530c00633e3165749" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/29deea5d9cf921590184be6956e657c4f4566440", - "reference": "29deea5d9cf921590184be6956e657c4f4566440", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/192962f4d84526f6868c512530c00633e3165749", + "reference": "192962f4d84526f6868c512530c00633e3165749", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "illuminate/support": "^8.77|^9.0", + "illuminate/support": "^8.77|^9.27", "monolog/monolog": "^2.3", "php": "^8.0", "spatie/flare-client-php": "^1.0.1", - "spatie/ignition": "^1.2.4", + "spatie/ignition": "^1.4.1", "symfony/console": "^5.0|^6.0", "symfony/var-dumper": "^5.0|^6.0" }, @@ -5576,7 +5584,7 @@ "type": "github" } ], - "time": "2022-09-01T11:31:14+00:00" + "time": "2022-09-16T13:45:54+00:00" }, { "name": "stella-maris/clock", @@ -8030,16 +8038,16 @@ }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.4", + "version": "2.2.5", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c" + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c", - "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", "shasum": "" }, "require": { @@ -8077,9 +8085,9 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" }, - "time": "2021-12-08T09:12:39+00:00" + "time": "2022-09-12T13:28:28+00:00" }, { "name": "twig/twig",