app->singleton(RegisterResponseContract::class, RegisterResponse::class); $this->app->bind(BankingProviderInterface::class, function ($app) { return new EnableBankingProvider( config('services.enablebanking.app_id'), base_path(config('services.enablebanking.private_key_path')), ); }); $this->app->bind(DiscordWebhook::class, function () { return new DiscordWebhook(config('services.discord.webhook_url')); }); $this->app->bind(TransactionMatcher::class, UncategorizedTransactionMatcher::class); $this->app->bind(RuleSuggestionGenerator::class, LaravelAiRuleSuggestionGenerator::class); } /** * Bootstrap any application services. */ public function boot(): void { Event::listen(TransactionCreated::class, ApplyAutomationRules::class); Event::listen(TransactionCreated::class, AssignTransactionToBudget::class); Event::listen(TransactionUpdated::class, AssignTransactionToBudget::class); Event::listen(TransactionDeleted::class, UnassignTransactionFromBudget::class); Event::listen(WebhookReceived::class, PostStripeEventToDiscord::class); Event::listen(Login::class, UpdateLastLoggedInAt::class); RateLimiter::for('emails', function (object $job): Limit { return Limit::perSecond(30); }); } }