From 0ccb5e289c622e193a07cdb298727cd5d2cff3d8 Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Fri, 2 Jan 2015 00:18:19 +0000 Subject: [PATCH 1/5] Namespaced models and refactored filters --- app/config/app.php | 3 +- app/database/seeds/ComponentTableSeeder.php | 1 + app/database/seeds/IncidentTableSeeder.php | 1 + app/database/seeds/SettingsTableSeeder.php | 1 + app/database/seeds/UsersTableSeeder.php | 1 + app/filters.php | 66 ------------------- app/filters/CORSFilter.php | 11 ---- app/routes.php | 8 --- app/routes/api.php | 2 +- app/routes/app.php | 6 +- app/routes/auth.php | 4 +- app/routes/dashboard.php | 2 +- app/start/global.php | 11 ++-- app/view-composers.php | 2 + bootstrap/start.php | 3 +- composer.json | 9 +-- composer.lock | 2 +- phpunit.xml | 4 +- .../Commands/OneClickDeployCommand.php | 2 +- .../Http/After}/AllowedDomainsFilter.php | 9 ++- src/Http/After/CorsFilter.php | 17 +++++ src/Http/Before/AuthBasicFilter.php | 13 ++++ src/Http/Before/AuthFilter.php | 23 +++++++ src/Http/Before/CsrfFilter.php | 17 +++++ src/Http/Before/GuestFilter.php | 16 +++++ .../Http/Before}/HasSettingFilter.php | 10 ++- .../Http/Before}/IsSetupFilter.php | 10 ++- .../Http/Before}/LoginThrottlingFilter.php | 7 +- .../Controllers/Api/ComponentController.php | 10 +-- .../Controllers/Api/IncidentController.php | 8 +-- .../Controllers/Api/MetricController.php | 8 +-- .../Controllers/Api/MetricPointController.php | 6 +- src/{ => Http}/Controllers/AuthController.php | 2 +- .../Controllers/DashAPIController.php | 8 +-- .../Controllers/DashComponentController.php | 10 +-- .../Controllers/DashIncidentController.php | 8 +-- .../Controllers/DashSettingsController.php | 4 +- .../Controllers/DashUserController.php | 2 +- .../Controllers/DashboardController.php | 4 +- src/{ => Http}/Controllers/HomeController.php | 8 +-- src/{ => Http}/Controllers/RssController.php | 6 +- .../Controllers/SetupController.php | 6 +- {app/models => src/Models}/Component.php | 4 +- {app/models => src/Models}/Incident.php | 4 +- .../Models}/IncidentTemplate.php | 2 + {app/models => src/Models}/Metric.php | 4 +- {app/models => src/Models}/MetricPoint.php | 4 +- {app/models => src/Models}/Service.php | 2 + {app/models => src/Models}/Setting.php | 2 + {app/models => src/Models}/Subscriber.php | 2 + {app/models => src/Models}/User.php | 2 + {app/models => src/Models}/WebHook.php | 12 ++-- .../models => src/Models}/WebHookResponse.php | 2 + src/Providers/ConsoleServiceProvider.php | 6 +- src/Providers/RoutingServiceProvider.php | 34 ++++++++++ .../Component/EloquentComponentRepository.php | 6 +- .../Incident/EloquentIncidentRepository.php | 6 +- .../Metric/EloquentMetricRepository.php | 6 +- .../EloquentMetricPointRepository.php | 6 +- src/Transformers/ComponentTransformer.php | 9 ++- src/Transformers/IncidentTransformer.php | 9 ++- src/Transformers/MetricPointTransformer.php | 9 ++- src/Transformers/MetricTransformer.php | 9 ++- {app => src}/helpers.php | 8 ++- .../Api/ComponentControllerTest.php | 4 +- {app/tests => tests}/TestCase.php | 2 +- 66 files changed, 310 insertions(+), 195 deletions(-) delete mode 100644 app/filters.php delete mode 100644 app/filters/CORSFilter.php delete mode 100644 app/routes.php rename src/{ => Console}/Commands/OneClickDeployCommand.php (97%) rename {app/filters => src/Http/After}/AllowedDomainsFilter.php (67%) create mode 100644 src/Http/After/CorsFilter.php create mode 100644 src/Http/Before/AuthBasicFilter.php create mode 100644 src/Http/Before/AuthFilter.php create mode 100644 src/Http/Before/CsrfFilter.php create mode 100644 src/Http/Before/GuestFilter.php rename {app/filters => src/Http/Before}/HasSettingFilter.php (53%) rename {app/filters => src/Http/Before}/IsSetupFilter.php (53%) rename {app/filters => src/Http/Before}/LoginThrottlingFilter.php (67%) rename src/{ => Http}/Controllers/Api/ComponentController.php (87%) rename src/{ => Http}/Controllers/Api/IncidentController.php (88%) rename src/{ => Http}/Controllers/Api/MetricController.php (88%) rename src/{ => Http}/Controllers/Api/MetricPointController.php (89%) rename src/{ => Http}/Controllers/AuthController.php (96%) rename src/{ => Http}/Controllers/DashAPIController.php (83%) rename src/{ => Http}/Controllers/DashComponentController.php (89%) rename src/{ => Http}/Controllers/DashIncidentController.php (91%) rename src/{ => Http}/Controllers/DashSettingsController.php (98%) rename src/{ => Http}/Controllers/DashUserController.php (94%) rename src/{ => Http}/Controllers/DashboardController.php (92%) rename src/{ => Http}/Controllers/HomeController.php (87%) rename src/{ => Http}/Controllers/RssController.php (91%) rename src/{ => Http}/Controllers/SetupController.php (95%) rename {app/models => src/Models}/Component.php (94%) rename {app/models => src/Models}/Incident.php (95%) rename {app/models => src/Models}/IncidentTemplate.php (95%) rename {app/models => src/Models}/Metric.php (91%) rename {app/models => src/Models}/MetricPoint.php (68%) rename {app/models => src/Models}/Service.php (96%) rename {app/models => src/Models}/Setting.php (95%) rename {app/models => src/Models}/Subscriber.php (93%) rename {app/models => src/Models}/User.php (97%) rename {app/models => src/Models}/WebHook.php (89%) rename {app/models => src/Models}/WebHookResponse.php (90%) rename {app => src}/helpers.php (83%) rename {app/tests => tests}/Controllers/Api/ComponentControllerTest.php (80%) rename {app/tests => tests}/TestCase.php (83%) diff --git a/app/config/app.php b/app/config/app.php index 3e08dfab..08a47e6f 100644 --- a/app/config/app.php +++ b/app/config/app.php @@ -157,17 +157,16 @@ return [ 'aliases' => [ - 'API' => 'Dingo\Api\Facade\API', 'App' => 'Illuminate\Support\Facades\App', 'Auth' => 'Illuminate\Support\Facades\Auth', 'Form' => 'Illuminate\Support\Facades\Form', - 'HTML' => 'Illuminate\Support\Facades\HTML', 'Input' => 'Illuminate\Support\Facades\Input', 'Redirect' => 'Illuminate\Support\Facades\Redirect', 'Request' => 'Illuminate\Support\Facades\Request', 'Response' => 'Illuminate\Support\Facades\Response', 'Route' => 'Illuminate\Support\Facades\Route', 'Session' => 'Illuminate\Support\Facades\Session', + 'Setting' => 'CachetHQ\Cachet\Models\Setting', 'Str' => 'Illuminate\Support\Str', ], diff --git a/app/database/seeds/ComponentTableSeeder.php b/app/database/seeds/ComponentTableSeeder.php index d65eb63b..3bddf05e 100644 --- a/app/database/seeds/ComponentTableSeeder.php +++ b/app/database/seeds/ComponentTableSeeder.php @@ -1,5 +1,6 @@ headers->set('Access-Control-Allow-Origin', '*'); - - return $response; - } -} diff --git a/app/routes.php b/app/routes.php deleted file mode 100644 index 7b941a91..00000000 --- a/app/routes.php +++ /dev/null @@ -1,8 +0,0 @@ - 'allowed_domains', 'namespace' => 'CachetHQ\Cachet\Controllers\Api', 'version' => 'v1'], function () { +Route::api(['after' => 'allowed_domains', 'namespace' => 'CachetHQ\Cachet\Http\Controllers\Api', 'version' => 'v1'], function () { Route::get('components', 'ComponentController@getComponents'); Route::get('components/{id}', 'ComponentController@getComponent'); Route::get('components/{id}/incidents', 'ComponentController@getComponentIncidents'); diff --git a/app/routes/app.php b/app/routes/app.php index 0705560c..496cab35 100644 --- a/app/routes/app.php +++ b/app/routes/app.php @@ -1,16 +1,16 @@ 'has_setting:app_name', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { +Route::group(['before' => 'has_setting:app_name', 'namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () { Route::get('/', ['as' => 'status-page', 'uses' => 'HomeController@showIndex']); Route::get('/incident/{incident}', 'HomeController@showIncident'); }); // Setup route. -Route::group(['before' => 'is_setup', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { +Route::group(['before' => 'is_setup', 'namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () { Route::controller('/setup', 'SetupController'); }); -Route::group(['namespace' => 'CachetHQ\Cachet\Controllers'], function () { +Route::group(['namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () { Route::get('/rss', 'RssController@feedAction'); }); diff --git a/app/routes/auth.php b/app/routes/auth.php index bc5eb71e..768af167 100644 --- a/app/routes/auth.php +++ b/app/routes/auth.php @@ -1,10 +1,10 @@ 'has_setting:app_name', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { +Route::group(['before' => 'has_setting:app_name', 'namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () { Route::get('/auth/login', ['before' => 'guest', 'as' => 'login', 'uses' => 'AuthController@showLogin']); Route::post('/auth/login', ['before' => 'guest|csrf|login_throttling', 'as' => 'logout', 'uses' => 'AuthController@postLogin']); }); -Route::group(['before' => 'auth', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { +Route::group(['before' => 'auth', 'namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () { Route::get('/auth/logout', ['as' => 'logout', 'uses' => 'AuthController@logoutAction']); }); diff --git a/app/routes/dashboard.php b/app/routes/dashboard.php index 96c8dc46..449730fe 100644 --- a/app/routes/dashboard.php +++ b/app/routes/dashboard.php @@ -1,6 +1,6 @@ 'auth', 'prefix' => 'dashboard', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { +Route::group(['before' => 'auth', 'prefix' => 'dashboard', 'namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () { // Dashboard Route::get('/', ['as' => 'dashboard', 'uses' => 'DashboardController@showDashboard']); diff --git a/app/start/global.php b/app/start/global.php index 42b3e59e..2d046af7 100644 --- a/app/start/global.php +++ b/app/start/global.php @@ -1,5 +1,6 @@ bindInstallPaths(require __DIR__.'/paths.php'); | */ -$framework = $app['path.base']. - '/vendor/laravel/framework/src'; +$framework = $app['path.base'].'/vendor/laravel/framework/src'; require $framework.'/Illuminate/Foundation/start.php'; diff --git a/composer.json b/composer.json index b2a16a1a..cc0c4316 100644 --- a/composer.json +++ b/composer.json @@ -28,9 +28,10 @@ "autoload": { "classmap": [ "app/database/migrations", - "app/database/seeds", - "app/filters", - "app/models" + "app/database/seeds" + ], + "files": [ + "src/helpers.php" ], "psr-4": { "CachetHQ\\Cachet\\": "src/" @@ -38,7 +39,7 @@ }, "autoload-dev": { "classmap": [ - "app/tests/TestCase.php" + "tests/TestCase.php" ] }, "extra": { diff --git a/composer.lock b/composer.lock index 435b5478..11dc9fd5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "af0ee6e5bc07e350732bc7c907e3b2ae", + "hash": "bb692ec0057ca30fa36edd005963b3cb", "packages": [ { "name": "classpreloader/classpreloader", diff --git a/phpunit.xml b/phpunit.xml index b60b43d4..0065cf7e 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,14 +15,12 @@ > - ./app/tests/ + ./tests ./src - ./app/filters - ./app/models diff --git a/src/Commands/OneClickDeployCommand.php b/src/Console/Commands/OneClickDeployCommand.php similarity index 97% rename from src/Commands/OneClickDeployCommand.php rename to src/Console/Commands/OneClickDeployCommand.php index 1621eb60..78a1dfc5 100644 --- a/src/Commands/OneClickDeployCommand.php +++ b/src/Console/Commands/OneClickDeployCommand.php @@ -1,6 +1,6 @@ headers->set('Access-Control-Allow-Origin', '*'); + + return $response; + } +} diff --git a/src/Http/Before/AuthBasicFilter.php b/src/Http/Before/AuthBasicFilter.php new file mode 100644 index 00000000..599f6223 --- /dev/null +++ b/src/Http/Before/AuthBasicFilter.php @@ -0,0 +1,13 @@ +ajax()) { + return Response::make('Unauthorized', 401); + } else { + return Redirect::guest('auth/login'); + } + } + } +} diff --git a/src/Http/Before/CsrfFilter.php b/src/Http/Before/CsrfFilter.php new file mode 100644 index 00000000..50bfa83f --- /dev/null +++ b/src/Http/Before/CsrfFilter.php @@ -0,0 +1,17 @@ +first(); diff --git a/app/filters/IsSetupFilter.php b/src/Http/Before/IsSetupFilter.php similarity index 53% rename from app/filters/IsSetupFilter.php rename to src/Http/Before/IsSetupFilter.php index 3eb44886..b8f1a2a9 100644 --- a/app/filters/IsSetupFilter.php +++ b/src/Http/Before/IsSetupFilter.php @@ -1,8 +1,16 @@ first(); diff --git a/app/filters/LoginThrottlingFilter.php b/src/Http/Before/LoginThrottlingFilter.php similarity index 67% rename from app/filters/LoginThrottlingFilter.php rename to src/Http/Before/LoginThrottlingFilter.php index 80b3dc86..5b3a6e48 100644 --- a/app/filters/LoginThrottlingFilter.php +++ b/src/Http/Before/LoginThrottlingFilter.php @@ -1,10 +1,15 @@ hasMany('Incident', 'component_id', 'id'); + return $this->hasMany('CachetHQ\Cachet\Models\Incident', 'component_id', 'id'); } /** diff --git a/app/models/Incident.php b/src/Models/Incident.php similarity index 95% rename from app/models/Incident.php rename to src/Models/Incident.php index 8753f723..0c1996bc 100644 --- a/app/models/Incident.php +++ b/src/Models/Incident.php @@ -1,5 +1,7 @@ belongsTo('Component', 'component_id', 'id'); + return $this->belongsTo('CachetHQ\Cachet\Models\Component', 'component_id', 'id'); } /** diff --git a/app/models/IncidentTemplate.php b/src/Models/IncidentTemplate.php similarity index 95% rename from app/models/IncidentTemplate.php rename to src/Models/IncidentTemplate.php index 137b2f25..8aad1502 100644 --- a/app/models/IncidentTemplate.php +++ b/src/Models/IncidentTemplate.php @@ -1,5 +1,7 @@ hasMany('MetricPoint', 'metric_id', 'id'); + return $this->hasMany('CachetHQ\Cachet\Models\MetricPoint', 'metric_id', 'id'); } /** diff --git a/app/models/MetricPoint.php b/src/Models/MetricPoint.php similarity index 68% rename from app/models/MetricPoint.php rename to src/Models/MetricPoint.php index 463f10e5..863ac57e 100644 --- a/app/models/MetricPoint.php +++ b/src/Models/MetricPoint.php @@ -1,5 +1,7 @@ belongsTo('Metric', 'id', 'metric_id'); + return $this->belongsTo('CachetHQ\Cachet\Models\Metric', 'id', 'metric_id'); } } diff --git a/app/models/Service.php b/src/Models/Service.php similarity index 96% rename from app/models/Service.php rename to src/Models/Service.php index dc58ba70..d3e233af 100644 --- a/app/models/Service.php +++ b/src/Models/Service.php @@ -1,5 +1,7 @@ commands('CachetHQ\Cachet\Commands\OneClickDeployCommand'); + $this->commands('CachetHQ\Cachet\Console\Commands\OneClickDeployCommand'); } /** @@ -24,7 +24,7 @@ class ConsoleServiceProvider extends ServiceProvider */ public function register() { - $this->app->singleton('CachetHQ\Cachet\Commands\OneClickDeployCommand', function ($app) { + $this->app->singleton('CachetHQ\Cachet\Console\Commands\OneClickDeployCommand', function ($app) { return new OneClickDeployCommand($app->environment('heroku')); }); } diff --git a/src/Providers/RoutingServiceProvider.php b/src/Providers/RoutingServiceProvider.php index 97011fd3..32219fb7 100644 --- a/src/Providers/RoutingServiceProvider.php +++ b/src/Providers/RoutingServiceProvider.php @@ -12,6 +12,40 @@ class RoutingServiceProvider extends ServiceProvider * @return void */ public function boot() + { + $this->registerFilters(); + $this->registerBindings(); + $this->registerRoutes(); + } + + protected function registerFilters() + { + // Laravel's before filters + $this->app->router->filter('auth', 'CachetHQ\Cachet\Http\Before\AuthFilter'); + $this->app->router->filter('auth.basic', 'CachetHQ\Cachet\Http\Before\AuthBasicFilter'); + $this->app->router->filter('guest', 'CachetHQ\Cachet\Http\Before\GuestFilter'); + $this->app->router->filter('csrf', 'CachetHQ\Cachet\Http\Before\CsrfFilter'); + + // Cachet's before filters + $this->app->router->filter('is_setup', 'CachetHQ\Cachet\Http\Before\IsSetupFilter'); + $this->app->router->filter('has_setting', 'CachetHQ\Cachet\Http\Before\HasSettingFilter'); + $this->app->router->filter('login_throttling', 'CachetHQ\Cachet\Http\Before\LoginThrottlingFilter'); + + // Cachet's after filters + $this->app->router->filter('allowed_domains', 'CachetHQ\Cachet\Http\After\AllowedDomainsFilter'); + $this->app->router->filter('cors', 'CachetHQ\Cachet\Http\After\CorsFilter'); + } + + protected function registerBindings() + { + $this->app->router->model('component', 'CachetHQ\Cachet\Models\Component'); + $this->app->router->model('incident', 'CachetHQ\Cachet\Models\Incident'); + $this->app->router->model('incident_template', 'CachetHQ\Cachet\Models\IncidentTemplate'); + $this->app->router->model('setting', 'CachetHQ\Cachet\Models\Setting'); + $this->app->router->model('user', 'CachetHQ\Cachet\Models\User'); + } + + protected function registerRoutes() { $files = glob(app_path('routes').'/*.php'); diff --git a/src/Repositories/Component/EloquentComponentRepository.php b/src/Repositories/Component/EloquentComponentRepository.php index e443f0e1..7420fff6 100644 --- a/src/Repositories/Component/EloquentComponentRepository.php +++ b/src/Repositories/Component/EloquentComponentRepository.php @@ -2,22 +2,22 @@ namespace CachetHQ\Cachet\Repositories\Component; +use CachetHQ\Cachet\Models\Component; use CachetHQ\Cachet\Repositories\EloquentRepository; -use Component; class EloquentComponentRepository extends EloquentRepository implements ComponentRepository { /** * The eloquent model instance. * - * @var \Component + * @var \CachetHQ\Cachet\Models\Component */ protected $model; /** * Create a new eloquent component repository instance. * - * @param \Component $model + * @param \CachetHQ\Cachet\Models\Component $model * * @return void */ diff --git a/src/Repositories/Incident/EloquentIncidentRepository.php b/src/Repositories/Incident/EloquentIncidentRepository.php index 38b77120..f5bcf30a 100644 --- a/src/Repositories/Incident/EloquentIncidentRepository.php +++ b/src/Repositories/Incident/EloquentIncidentRepository.php @@ -2,22 +2,22 @@ namespace CachetHQ\Cachet\Repositories\Incident; +use CachetHQ\Cachet\Models\Incident; use CachetHQ\Cachet\Repositories\EloquentRepository; -use Incident; class EloquentIncidentRepository extends EloquentRepository implements IncidentRepository { /** * The eloquent model instance. * - * @var \Incident + * @var \CachetHQ\Cachet\Models\Incident */ protected $model; /** * Create a new eloquent incident repository instance. * - * @param \Incident $model + * @param \CachetHQ\Cachet\Models\Incident $model * * @return void */ diff --git a/src/Repositories/Metric/EloquentMetricRepository.php b/src/Repositories/Metric/EloquentMetricRepository.php index 961d5da2..c72ab0f5 100644 --- a/src/Repositories/Metric/EloquentMetricRepository.php +++ b/src/Repositories/Metric/EloquentMetricRepository.php @@ -2,22 +2,22 @@ namespace CachetHQ\Cachet\Repositories\Metric; +use CachetHQ\Cachet\Models\Metric; use CachetHQ\Cachet\Repositories\EloquentRepository; -use Metric; class EloquentMetricRepository extends EloquentRepository implements MetricRepository { /** * The eloquent model instance. * - * @var \Metric + * @var \CachetHQ\Cachet\Models\Metric */ protected $model; /** * Create a new eloquent metric repository instance. * - * @param \Metric $model + * @param \CachetHQ\Cachet\Models\Metric $model * * @return void */ diff --git a/src/Repositories/MetricPoint/EloquentMetricPointRepository.php b/src/Repositories/MetricPoint/EloquentMetricPointRepository.php index 17d54779..3118f9b6 100644 --- a/src/Repositories/MetricPoint/EloquentMetricPointRepository.php +++ b/src/Repositories/MetricPoint/EloquentMetricPointRepository.php @@ -2,22 +2,22 @@ namespace CachetHQ\Cachet\Repositories\MetricPoint; +use CachetHQ\Cachet\Models\MetricPoint; use CachetHQ\Cachet\Repositories\EloquentRepository; -use MetricPoint; class EloquentMetricPointRepository extends EloquentRepository implements MetricPointRepository { /** * The eloquent model instance. * - * @var \MetricPoint + * @var \CachetHQ\Cachet\Models\MetricPoint */ protected $model; /** * Create a new eloquent metric point repository instance. * - * @param \MetricPoint $model + * @param \CachetHQ\Cachet\Models\MetricPoint $model * * @return void */ diff --git a/src/Transformers/ComponentTransformer.php b/src/Transformers/ComponentTransformer.php index b67984a6..4f18f93f 100644 --- a/src/Transformers/ComponentTransformer.php +++ b/src/Transformers/ComponentTransformer.php @@ -2,11 +2,18 @@ namespace CachetHQ\Cachet\Transformers; -use Component; +use CachetHQ\Cachet\Models\Component; use League\Fractal\TransformerAbstract; class ComponentTransformer extends TransformerAbstract { + /** + * Transform a component model into an array. + * + * @param \CachetHQ\Cachet\Models\Component $component + * + * @return array + */ public function transform(Component $component) { return [ diff --git a/src/Transformers/IncidentTransformer.php b/src/Transformers/IncidentTransformer.php index 50bf7c82..1c89da5a 100644 --- a/src/Transformers/IncidentTransformer.php +++ b/src/Transformers/IncidentTransformer.php @@ -2,11 +2,18 @@ namespace CachetHQ\Cachet\Transformers; -use Incident; +use CachetHQ\Cachet\Models\Incident; use League\Fractal\TransformerAbstract; class IncidentTransformer extends TransformerAbstract { + /** + * Transform an incident model into an array. + * + * @param \CachetHQ\Cachet\Models\Incident $incident + * + * @return array + */ public function transform(Incident $incident) { $component = $incident->component; diff --git a/src/Transformers/MetricPointTransformer.php b/src/Transformers/MetricPointTransformer.php index def60b3b..b7b6ab1a 100644 --- a/src/Transformers/MetricPointTransformer.php +++ b/src/Transformers/MetricPointTransformer.php @@ -2,11 +2,18 @@ namespace CachetHQ\Cachet\Transformers; +use CachetHQ\Cachet\Models\MetricPoint; use League\Fractal\TransformerAbstract; -use MetricPoint; class MetricPointTransformer extends TransformerAbstract { + /** + * Transform a metric point model into an array. + * + * @param \CachetHQ\Cachet\Models\MetricPoint $metricPoint + * + * @return array + */ public function transform(MetricPoint $metricPoint) { return [ diff --git a/src/Transformers/MetricTransformer.php b/src/Transformers/MetricTransformer.php index caef7f60..a9fc879a 100644 --- a/src/Transformers/MetricTransformer.php +++ b/src/Transformers/MetricTransformer.php @@ -2,11 +2,18 @@ namespace CachetHQ\Cachet\Transformers; +use CachetHQ\Cachet\Models\Metric; use League\Fractal\TransformerAbstract; -use Metric; class MetricTransformer extends TransformerAbstract { + /** + * Transform a metric model into an array. + * + * @param \CachetHQ\Cachet\Models\Metric $metric + * + * @return array + */ public function transform(Metric $metric) { return [ diff --git a/app/helpers.php b/src/helpers.php similarity index 83% rename from app/helpers.php rename to src/helpers.php index a7a5e9e4..689ef843 100644 --- a/app/helpers.php +++ b/src/helpers.php @@ -1,6 +1,8 @@ repo->shouldReceive('all')->once()->andReturn('foo'); - $controller = new CachetHQ\Cachet\Controllers\Api\ComponentController($this->repo); + $controller = new CachetHQ\Cachet\Http\Controllers\Api\ComponentController($this->repo); $response = $controller->getComponents(); $this->assertEquals('foo', $response); @@ -27,7 +27,7 @@ class ComponentControllerTest extends TestCase { $this->repo->shouldReceive('findOrFail')->with(1)->once()->andReturn('foo'); - $controller = new CachetHQ\Cachet\Controllers\Api\ComponentController($this->repo); + $controller = new CachetHQ\Cachet\Http\Controllers\Api\ComponentController($this->repo); $response = $controller->getComponent(1); $this->assertEquals('foo', $response); diff --git a/app/tests/TestCase.php b/tests/TestCase.php similarity index 83% rename from app/tests/TestCase.php rename to tests/TestCase.php index 76f47391..3e9f0ac6 100644 --- a/app/tests/TestCase.php +++ b/tests/TestCase.php @@ -13,6 +13,6 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase $testEnvironment = 'testing'; - return require __DIR__.'/../../bootstrap/start.php'; + return require __DIR__.'/../bootstrap/start.php'; } } From ef98408a424795ad36d5fc1b77f7443bf98d6742 Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Fri, 2 Jan 2015 00:53:23 +0000 Subject: [PATCH 2/5] Tweaks and fixes --- .gitattributes | 4 +++- app/{view-composers.php => composers.php} | 0 app/start/global.php | 2 +- src/Models/Incident.php | 2 ++ src/Models/IncidentTemplate.php | 2 +- src/Models/Setting.php | 1 + src/Models/WebHook.php | 5 +++-- src/helpers.php | 2 +- 8 files changed, 12 insertions(+), 6 deletions(-) rename app/{view-composers.php => composers.php} (100%) diff --git a/.gitattributes b/.gitattributes index 0ecc7e75..643457da 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +1,10 @@ * text=auto +/docs export-ignore /tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore /phpunit.xml export-ignore -/README.md export-ignore /CONTRIBUTING.md export-ignore +/INSTALL.md export-ignore +/README.md export-ignore diff --git a/app/view-composers.php b/app/composers.php similarity index 100% rename from app/view-composers.php rename to app/composers.php diff --git a/app/start/global.php b/app/start/global.php index 2d046af7..fffabad6 100644 --- a/app/start/global.php +++ b/app/start/global.php @@ -71,4 +71,4 @@ App::down(function () { | */ -require app_path('view-composers.php'); +require app_path('composers.php'); diff --git a/src/Models/Incident.php b/src/Models/Incident.php index 0c1996bc..97ebd2ad 100644 --- a/src/Models/Incident.php +++ b/src/Models/Incident.php @@ -78,6 +78,8 @@ class Incident extends Model implements TransformableInterface return 'ion ion-eye'; case 4: return 'ion ion-checkmark'; + default: + return ''; } } diff --git a/src/Models/IncidentTemplate.php b/src/Models/IncidentTemplate.php index 8aad1502..2bea1b8d 100644 --- a/src/Models/IncidentTemplate.php +++ b/src/Models/IncidentTemplate.php @@ -3,7 +3,7 @@ namespace CachetHQ\Cachet\Models; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Str; +use Illuminate\Support\Str; use Watson\Validating\ValidatingTrait; class IncidentTemplate extends Model diff --git a/src/Models/Setting.php b/src/Models/Setting.php index ee9e9f4a..712cc67a 100644 --- a/src/Models/Setting.php +++ b/src/Models/Setting.php @@ -2,6 +2,7 @@ namespace CachetHQ\Cachet\Models; +use ErrorException; use Illuminate\Database\Eloquent\Model; class Setting extends Model diff --git a/src/Models/WebHook.php b/src/Models/WebHook.php index 4b52bf66..366130a0 100644 --- a/src/Models/WebHook.php +++ b/src/Models/WebHook.php @@ -2,6 +2,7 @@ namespace CachetHQ\Cachet\Models; +use Exception; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; use Illuminate\Database\Eloquent\Builder; @@ -52,11 +53,11 @@ class WebHook extends Model * Fires the actual web hook event. * * @param string $eventType The event to send X-Cachet-Event - * @param mixed $data Data to send to the Web Hook + * @param string $data Data to send to the Web Hook * * @return \CachetHQ\Cachet\Models\WebHookResponse */ - public function fire($eventType, $data = null) + public function fire($eventType, $data) { $startTime = microtime(true); diff --git a/src/helpers.php b/src/helpers.php index 689ef843..20e7479d 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -14,7 +14,7 @@ if (!function_exists('elixir')) { { static $manifest = null; - if (is_null($manifest)) { + if ($manifest === null) { $manifest = json_decode(file_get_contents(public_path().'/build/rev-manifest.json'), true); } From deb4aae0d475b4cda644a4308663a31f7108228e Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Fri, 2 Jan 2015 00:53:36 +0000 Subject: [PATCH 3/5] Removed an unused filter --- src/Http/Before/AuthBasicFilter.php | 13 ------------- src/Providers/RoutingServiceProvider.php | 1 - 2 files changed, 14 deletions(-) delete mode 100644 src/Http/Before/AuthBasicFilter.php diff --git a/src/Http/Before/AuthBasicFilter.php b/src/Http/Before/AuthBasicFilter.php deleted file mode 100644 index 599f6223..00000000 --- a/src/Http/Before/AuthBasicFilter.php +++ /dev/null @@ -1,13 +0,0 @@ -app->router->filter('auth', 'CachetHQ\Cachet\Http\Before\AuthFilter'); - $this->app->router->filter('auth.basic', 'CachetHQ\Cachet\Http\Before\AuthBasicFilter'); $this->app->router->filter('guest', 'CachetHQ\Cachet\Http\Before\GuestFilter'); $this->app->router->filter('csrf', 'CachetHQ\Cachet\Http\Before\CsrfFilter'); From 4d6de70ba80635c81f853b441271b2c96f950254 Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Fri, 2 Jan 2015 00:54:16 +0000 Subject: [PATCH 4/5] Fully documented the filters --- src/Http/After/AllowedDomainsFilter.php | 9 +++++++++ src/Http/After/CorsFilter.php | 9 +++++++++ src/Http/Before/AuthFilter.php | 10 ++++++++++ src/Http/Before/CsrfFilter.php | 11 +++++++++++ src/Http/Before/GuestFilter.php | 10 ++++++++++ src/Http/Before/HasSettingFilter.php | 15 ++++++++++++++- src/Http/Before/IsSetupFilter.php | 14 +++++++++++++- src/Http/Before/LoginThrottlingFilter.php | 21 +++++++++++++++++---- 8 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/Http/After/AllowedDomainsFilter.php b/src/Http/After/AllowedDomainsFilter.php index 497dddb9..61e6609a 100644 --- a/src/Http/After/AllowedDomainsFilter.php +++ b/src/Http/After/AllowedDomainsFilter.php @@ -9,6 +9,15 @@ use Symfony\Component\HttpFoundation\Response; class AllowedDomainsFilter { + /** + * Run the allowed domains filter. + * + * @param \Illuminate\Routing\Route $route + * @param \Illuminate\Http\Request $request + * @param \Symfony\Component\HttpFoundation\Response $response + * + * @return \Symfony\Component\HttpFoundation\Response + */ public function filter(Route $route, Request $request, Response $response) { // Always allow our own domain. diff --git a/src/Http/After/CorsFilter.php b/src/Http/After/CorsFilter.php index 0cd561d4..77e90233 100644 --- a/src/Http/After/CorsFilter.php +++ b/src/Http/After/CorsFilter.php @@ -8,6 +8,15 @@ use Symfony\Component\HttpFoundation\Response; class CorsFilter { + /** + * Run the cors filter. + * + * @param \Illuminate\Routing\Route $route + * @param \Illuminate\Http\Request $request + * @param \Symfony\Component\HttpFoundation\Response $response + * + * @return \Symfony\Component\HttpFoundation\Response + */ public function filter(Route $route, Request $request, Response $response) { $response->headers->set('Access-Control-Allow-Origin', '*'); diff --git a/src/Http/Before/AuthFilter.php b/src/Http/Before/AuthFilter.php index 5524b33d..75f6345d 100644 --- a/src/Http/Before/AuthFilter.php +++ b/src/Http/Before/AuthFilter.php @@ -10,6 +10,16 @@ use Illuminate\Support\Facades\Response; class AuthFilter { + /** + * Run the auth filter. + * + * We're verifying that the current user is logged in to Cachet. + * + * @param \Illuminate\Routing\Route $route + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\Response|null + */ public function filter(Route $route, Request $request) { if (Auth::guest()) { diff --git a/src/Http/Before/CsrfFilter.php b/src/Http/Before/CsrfFilter.php index 50bfa83f..48cc06ef 100644 --- a/src/Http/Before/CsrfFilter.php +++ b/src/Http/Before/CsrfFilter.php @@ -8,6 +8,17 @@ use Illuminate\Support\Facades\Session; class CsrfFilter { + /** + * Run the csrf filter. + * + * We're protecting Cachet against cross-site request forgery attacks. If + * our csrf token in the session does not match the one given sent to us in + * this request, then we'll bail. + * + * @throws \Illuminate\Session\TokenMismatchException + * + * @return void + */ public function filter() { if (Session::token() !== Input::get('_token')) { diff --git a/src/Http/Before/GuestFilter.php b/src/Http/Before/GuestFilter.php index b320abe8..3cf19e88 100644 --- a/src/Http/Before/GuestFilter.php +++ b/src/Http/Before/GuestFilter.php @@ -7,6 +7,16 @@ use Illuminate\Support\Facades\Redirect; class GuestFilter { + /** + * Run the guest filter. + * + * We're checking if the current user is logged in to Cachet, and if + * they're not, then we're redirecting them to the home page. + * + * @throws \Illuminate\Session\TokenMismatchException + * + * @return \Illuminate\Http\Response|null + */ public function filter() { if (Auth::check()) { diff --git a/src/Http/Before/HasSettingFilter.php b/src/Http/Before/HasSettingFilter.php index 97302afe..79609387 100644 --- a/src/Http/Before/HasSettingFilter.php +++ b/src/Http/Before/HasSettingFilter.php @@ -10,11 +10,24 @@ use Illuminate\Support\Facades\Redirect; class HasSettingFilter { + /** + * Run the has setting filter. + * + * We're verifying that the given setting exists in our database. If it + * doesn't, then we're sending the user to the setup page so that they can + * complete the installation of Cachet on their server. + * + * @param \Illuminate\Routing\Route $route + * @param \Illuminate\Http\Request $request + * @param string $settingName + * + * @return \Illuminate\Http\Response|null + */ public function filter(Route $route, Request $request, $settingName) { try { $setting = Setting::where('name', $settingName)->first(); - if (!$setting->value) { + if (!$setting || !$setting->value) { return Redirect::to('setup'); } } catch (Exception $e) { diff --git a/src/Http/Before/IsSetupFilter.php b/src/Http/Before/IsSetupFilter.php index b8f1a2a9..f3f77fc2 100644 --- a/src/Http/Before/IsSetupFilter.php +++ b/src/Http/Before/IsSetupFilter.php @@ -10,11 +10,23 @@ use Illuminate\Support\Facades\Redirect; class IsSetupFilter { + /** + * Run the is setup filter. + * + * We're verifying that Cachet is correctly setup. If it is, they we're + * sending the user to the dashboard so they can use Cachet. + * + * @param \Illuminate\Routing\Route $route + * @param \Illuminate\Http\Request $request + * @param string $settingName + * + * @return \Illuminate\Http\Response|null + */ public function filter(Route $route, Request $request) { try { $setting = Setting::where('name', 'app_name')->first(); - if ($setting->value) { + if ($setting && $setting->value) { return Redirect::to('/dashboard'); } } catch (Exception $e) { diff --git a/src/Http/Before/LoginThrottlingFilter.php b/src/Http/Before/LoginThrottlingFilter.php index 5b3a6e48..4b783b6d 100644 --- a/src/Http/Before/LoginThrottlingFilter.php +++ b/src/Http/Before/LoginThrottlingFilter.php @@ -9,13 +9,26 @@ use Illuminate\Support\Facades\Redirect; class LoginThrottlingFilter { + /** + * Run the login throttling filter. + * + * We're verifying that the user is not attempting to brute force Cachet's + * login system. If the user has reached the rate limit, then we're sending + * them away, otherwise, we do nothing, and allow them to continue. + * + * Note that this filter is not responsible for incrementing the hit count. + * Another part of Cachet will increment the hit count for the given route + * only if validation passes, and the user did not successfully login. + * + * @param \Illuminate\Routing\Route $route + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\Response|null + */ public function filter(Route $route, Request $request) { - // check if we've reached the rate limit, but don't hit the throttle yet - // we can hit the throttle later on in the if validation passes if (!Throttle::check($request, 10, 10)) { - return Redirect::back() - ->with('error', 'You have made too many login requests.'); + return Redirect::back()->with('error', 'You have made too many login requests.'); } } } From f8a6dfc9f86a94e378fdf4ae141d26ef6a8a87ec Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Fri, 2 Jan 2015 01:01:45 +0000 Subject: [PATCH 5/5] Fixed 2 docblocks --- src/Console/Commands/OneClickDeployCommand.php | 2 +- src/Http/Before/IsSetupFilter.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Console/Commands/OneClickDeployCommand.php b/src/Console/Commands/OneClickDeployCommand.php index 78a1dfc5..fbd0d7ca 100644 --- a/src/Console/Commands/OneClickDeployCommand.php +++ b/src/Console/Commands/OneClickDeployCommand.php @@ -59,7 +59,7 @@ class OneClickDeployCommand extends Command /** * Run the migrations. * - * @return int|null + * @return int */ protected function runMigrations() { diff --git a/src/Http/Before/IsSetupFilter.php b/src/Http/Before/IsSetupFilter.php index f3f77fc2..06f1b2d9 100644 --- a/src/Http/Before/IsSetupFilter.php +++ b/src/Http/Before/IsSetupFilter.php @@ -18,7 +18,6 @@ class IsSetupFilter * * @param \Illuminate\Routing\Route $route * @param \Illuminate\Http\Request $request - * @param string $settingName * * @return \Illuminate\Http\Response|null */