diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 281849b..918655a 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -1,70 +1,74 @@ shouldReport($e)) { return; } if ($this->shouldReportToSentry()) { $this->reportToSentry($e); } - $this->log->error((string)$e); + $log = $this->container->make(LoggerInterface::class); + $log->error((string)$e); } /** * Determines if the error handler should report to Sentry * * @return bool */ protected function shouldReportToSentry () : bool { return Raven::isConfigured() && Config::get('app.env') !== 'testing'; } /** * Reports the exception to Sentry * * @param Exception $e The exception to report */ protected function reportToSentry (Exception $e) : void { Raven::captureException($e); } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index bbf747b..c8f026a 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -1,30 +1,50 @@ [ + \Nasqueron\Notifications\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \Nasqueron\Notifications\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + 'throttle:60,1', + 'bindings', + ], ]; /** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 782bb46..a46d0e2 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -1,31 +1,30 @@ subscribe += Config::get('app.listeners'); } /** * Register any other events for your application. * - * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ - public function boot(DispatcherContract $events) { + public function boot() { $this->subscribeListeners(); - parent::boot($events); + parent::boot(); } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 41ac555..3df3dde 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -1,44 +1,43 @@ group(['namespace' => $this->namespace], function ($router) { require app_path('Http/routes.php'); }); } } diff --git a/composer.json b/composer.json index d62f8ad..8071da8 100644 --- a/composer.json +++ b/composer.json @@ -1,60 +1,60 @@ { "name": "nasqueron/notifications", "description": "Nasqueron notifications center", "keywords": [ "nasqueron", "activemq", "AMQP", "notifications" ], "license": "BSD-2-Clause", "type": "project", "require": { "php": ">=7.1.0", - "laravel/framework": "5.2.*", + "laravel/framework": "5.3.*", "guzzlehttp/guzzle": "^6.2", "keruald/dockerhub": "^0.0.3", "keruald/github": "^0.2.1", "keruald/broker": "^0.4.1", "keruald/mailgun": "^0.0.1", "netresearch/jsonmapper": "^1.1.1", "sentry/sentry": "^0.13.0" }, "require-dev": { "phan/phan": "^0.12.3", "fzaninotto/faker": "~1.4", "mockery/mockery": "0.9.*", "pdepend/pdepend": "^2.4.1", "phploc/phploc": "^3.0.1", "phpmd/phpmd" : "@stable", - "phpunit/phpunit": "~4.0", + "phpunit/phpunit": "~5.4", "phpspec/phpspec": "~2.1", "sebastian/phpcpd": "^2.0.4", "squizlabs/php_codesniffer": "2.*", "symfony/css-selector": "~3.0", "symfony/dom-crawler": "~3.0" }, "autoload": { "psr-4": { "Nasqueron\\Notifications\\": "app/", "Nasqueron\\Notifications\\Tests\\": "tests/" } }, "scripts": { "post-root-package-install": [ "php -r \"copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ "php artisan key:generate" ], "phpmd": [ "vendor/bin/phpmd app/ xml ruleset.xml" ], "test": [ "phpunit --no-coverage" ] }, "config": { "preferred-install": "dist" } } diff --git a/config/app.php b/config/app.php index c8c9b15..c7226aa 100644 --- a/config/app.php +++ b/config/app.php @@ -1,270 +1,282 @@ 'Notifications', + /* |-------------------------------------------------------------------------- | Application Environment |-------------------------------------------------------------------------- | | This value determines the "environment" your application is currently | running in. This may determine how you prefer to configure various | services your application utilizes. Set this in your ".env" file. | */ 'env' => env('APP_ENV', 'production'), /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stack traces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => env('APP_DEBUG', false), /* |-------------------------------------------------------------------------- | Application URL |-------------------------------------------------------------------------- | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of | your application so that it is used when running Artisan tasks. | */ 'url' => 'http://localhost', /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. We have gone | ahead and set this to a sensible default for you out of the box. | */ 'timezone' => 'UTC', /* |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by the translation service provider. You are free to set this value | to any of the locales which will be supported by the application. | */ 'locale' => 'en', /* |-------------------------------------------------------------------------- | Application Fallback Locale |-------------------------------------------------------------------------- | | The fallback locale determines the locale to use when the current one | is not available. You may change the value to correspond to any of | the language folders that are provided through your application. | */ 'fallback_locale' => 'en', /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | | This key is used by the Illuminate encrypter service and should be set | to a random, 32 character string, otherwise these encrypted strings | will not be safe. Please do this before deploying an application! | */ 'key' => env('APP_KEY'), 'cipher' => 'AES-256-CBC', /* |-------------------------------------------------------------------------- | Logging Configuration |-------------------------------------------------------------------------- | | Here you may configure the log settings for your application. Out of | the box, Laravel uses the Monolog PHP logging library. This gives | you a variety of powerful log handlers / formatters to utilize. | | Available Settings: "single", "daily", "syslog", "errorlog" | */ 'log' => env('APP_LOG', 'single'), /* |-------------------------------------------------------------------------- | Features |-------------------------------------------------------------------------- | | This array contains the features provided by the notifications center. | | It allows to toggle a feature on the fly, with a boolean to enable it. | */ 'features' => [ // Enable the API entry point at the /gate URL 'Gate' => true, // Enable the configuration report entry point at the /config URL 'GetConfig' => true, // Send a response to inform the caller of the different actions done. // If disabled, send an empty 200 response instead. 'ActionsReport' => true, ], /* |-------------------------------------------------------------------------- | Autoloaded Service Providers |-------------------------------------------------------------------------- | | The service providers listed here will be automatically loaded on the | request to your application. Feel free to add your own services to | this array to grant expanded functionality to your applications. | */ 'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, Illuminate\Cookie\CookieServiceProvider::class, Illuminate\Database\DatabaseServiceProvider::class, Illuminate\Encryption\EncryptionServiceProvider::class, Illuminate\Filesystem\FilesystemServiceProvider::class, Illuminate\Foundation\Providers\FoundationServiceProvider::class, Illuminate\Hashing\HashServiceProvider::class, Illuminate\Mail\MailServiceProvider::class, Illuminate\Pagination\PaginationServiceProvider::class, Illuminate\Pipeline\PipelineServiceProvider::class, Illuminate\Queue\QueueServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class, Illuminate\Session\SessionServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, /* * Application Service Providers... */ Nasqueron\Notifications\Providers\AppServiceProvider::class, Nasqueron\Notifications\Providers\BrokerServiceProvider::class, Nasqueron\Notifications\Providers\DockerHubServiceProvider::class, Nasqueron\Notifications\Providers\EventServiceProvider::class, Nasqueron\Notifications\Providers\MailgunServiceProvider::class, Nasqueron\Notifications\Providers\PhabricatorAPIServiceProvider::class, Nasqueron\Notifications\Providers\PhabricatorProjectsMapServiceProvider::class, Nasqueron\Notifications\Providers\ReportServiceProvider::class, Nasqueron\Notifications\Providers\RouteServiceProvider::class, Nasqueron\Notifications\Providers\SentryServiceProvider::class, Nasqueron\Notifications\Providers\ServicesServiceProvider::class ], /* |-------------------------------------------------------------------------- | Events listeners |-------------------------------------------------------------------------- | | The events listeners listed here will be automatically loaded on the | request to your application. | */ 'listeners' => [ Nasqueron\Notifications\Listeners\AMQPEventListener::class, Nasqueron\Notifications\Listeners\DockerHubListener::class, Nasqueron\Notifications\Listeners\LastPayloadSaver::class, Nasqueron\Notifications\Listeners\NotificationListener::class, Nasqueron\Notifications\Listeners\PhabricatorListener::class, ], /* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don't hinder performance. | */ 'aliases' => [ /* * Laravel Framework aliases... */ 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Input' => Illuminate\Support\Facades\Input::class, 'Inspiring' => Illuminate\Foundation\Inspiring::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, 'Request' => Illuminate\Support\Facades\Request::class, 'Response' => Illuminate\Support\Facades\Response::class, 'Route' => Illuminate\Support\Facades\Route::class, 'Schema' => Illuminate\Support\Facades\Schema::class, 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, /* * App aliases... */ 'Broker' => Nasqueron\Notifications\Facades\Broker::class, 'DockerHub' => Nasqueron\Notifications\Facades\DockerHub::class, 'Mailgun' => Nasqueron\Notifications\Facades\Mailgun::class, 'PhabricatorAPI' => Nasqueron\Notifications\Facades\PhabricatorAPI::class, 'ProjectsMap' => Nasqueron\Notifications\Facades\ProjectsMap::class, 'Raven' => Nasqueron\Notifications\Facades\Raven::class, 'Report' => Nasqueron\Notifications\Facades\Report::class, 'Services' => Nasqueron\Notifications\Facades\Services::class, ], ]; diff --git a/tests/Exceptions/HandlerTest.php b/tests/Exceptions/HandlerTest.php index 07e7e47..895f66c 100644 --- a/tests/Exceptions/HandlerTest.php +++ b/tests/Exceptions/HandlerTest.php @@ -1,54 +1,53 @@ handler = new Handler($logger); + $this->handler = new Handler(app()); $this->mockRavenClient(); } protected function mockRavenClient () { // Inject into our container a mock of Raven_Client $this->ravenClientMock = Mockery::mock('Raven_Client'); $this->app->instance('raven', $this->ravenClientMock); // Environment shouldn't be 'testing' and DSN should be defined, // so Handler::report will call Raven to report to Sentry Config::set('app.env', 'testing-raven'); Config::set('services.sentry.dsn', 'mock'); } public function testRavenReport () { $this->ravenClientMock->shouldReceive('captureException')->once(); $this->handler->report(new \Exception); } public function testExceptionInDontReportArray () { $this->ravenClientMock->shouldReceive('captureException')->never(); $this->handler->report(new AuthorizationException); } }