diff --git a/app/Http/Controllers/Api/Web/ProfilerController.php b/app/Http/Controllers/Api/Web/ProfilerController.php deleted file mode 100644 index 1e420549..00000000 --- a/app/Http/Controllers/Api/Web/ProfilerController.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace Poniverse\Ponyfm\Http\Controllers\Api\Web; - -use Poniverse\Ponyfm\Http\Controllers\Controller; -use Poniverse\Ponyfm\ProfileRequest; -use Cache; -use Config; -use Response; - -class ProfilerController extends Controller -{ - public function getRequest($id) - { - if (!Config::get('app.debug')) { - return; - } - - $key = 'profiler-request-' . $id; - $request = Cache::get($key); - if (!$request) { - exit(); - } - - Cache::forget($key); - - return Response::json(['request' => ProfileRequest::load($request)->toArray()], 200); - } -} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 2559c0a4..fcb5d192 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -37,7 +37,6 @@ class Kernel extends HttpKernel \Illuminate\View\Middleware\ShareErrorsFromSession::class, \Poniverse\Ponyfm\Http\Middleware\VerifyCsrfToken::class, \Poniverse\Ponyfm\Http\Middleware\DisabledAccountCheck::class, - \Poniverse\Ponyfm\Http\Middleware\Profiler::class, ]; /** diff --git a/app/Http/Middleware/Profiler.php b/app/Http/Middleware/Profiler.php deleted file mode 100644 index c8222b07..00000000 --- a/app/Http/Middleware/Profiler.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace Poniverse\Ponyfm\Http\Middleware; - -use Closure; -use Cache; -use Config; -use DB; -use Log; -use Poniverse\Ponyfm\ProfileRequest; -use Symfony\Component\HttpFoundation\Response; - -class Profiler -{ - /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed - */ - public function handle($request, Closure $next) - { - // Profiling magic time! - if (Config::get('app.debug')) { - DB::enableQueryLog(); - $profiler = ProfileRequest::create(); - - try { - $response = $next($request); - } catch (\Exception $e) { - $response = \Response::make([ - 'message' => $e->getMessage(), - 'lineNumber' => $e->getLine(), - 'exception' => $e->getTrace() - ], method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500); - $profiler->log('error', $e->__toString(), []); - } - - $response = $this->processResponse($profiler, $response); - - Log::listen(function($level, $message, $context) use ($profiler, $request) { - $profiler->log($level, $message, $context); - }); - - } else { - // Process the request the usual, boring way. - $response = $next($request); - } - - return $response; - } - - - protected function processResponse(ProfileRequest $profiler, Response $response) { - $profiler->recordQueries(); - - Cache::put('profiler-request-'.$profiler->getId(), $profiler->toString(), 2); - return $response->header('X-Request-Id', $profiler->getId()); - } -} diff --git a/app/Http/routes.php b/app/Http/routes.php index 60242b0c..f232a0f9 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -29,10 +29,6 @@ | */ -if (Config::get('app.debug')) { - Route::get('/api/web/profiler/{id}', 'Api\Web\ProfilerController@getRequest'); -} - Route::get('/dashboard', 'TracksController@getIndex'); Route::get('/tracks', ['as' => 'tracks.discover', 'uses' => 'TracksController@getIndex']); Route::get('/tracks/popular', 'TracksController@getIndex'); diff --git a/app/Library/Assets.php b/app/Library/Assets.php index 626bf55a..3c2dde35 100644 --- a/app/Library/Assets.php +++ b/app/Library/Assets.php @@ -126,7 +126,6 @@ class Assets "styles/base/jquery-ui.css", "styles/base/colorbox.css", "styles/app.less", - "styles/profiler.less" ]; } else { if ($area == 'embed') { diff --git a/app/Models/Genre.php b/app/Models/Genre.php index 967bf7b3..0569e539 100644 --- a/app/Models/Genre.php +++ b/app/Models/Genre.php @@ -40,6 +40,8 @@ use Venturecraft\Revisionable\RevisionableTrait; * @property-read mixed $url * @property-write mixed $title * @property-read \Illuminate\Database\Eloquent\Collection|\Venturecraft\Revisionable\Revision[] $revisionHistory + * @property \Carbon\Carbon $created_at + * @property \Carbon\Carbon $updated_at */ class Genre extends Model { diff --git a/app/ProfileRequest.php b/app/ProfileRequest.php deleted file mode 100644 index a134e0dc..00000000 --- a/app/ProfileRequest.php +++ /dev/null @@ -1,101 +0,0 @@ -. - */ - -namespace Poniverse\Ponyfm; - -use DB; - -class ProfileRequest -{ - private $_id = null; - private $_data = null; - - public static function load($data) - { - $req = new ProfileRequest(); - $req->_data = json_decode($data); - - return $req; - } - - /** - * @return ProfileRequest - */ - public static function create() - { - $req = new ProfileRequest(); - $req->_id = uniqid(); - - return $req; - } - - private function __construct() - { - $this->_data = ['log' => []]; - } - - public function toArray() - { - return $this->_data; - } - - public function toString() - { - return json_encode($this->_data); - } - - public function getId() - { - return $this->_id; - } - - public function recordQueries() - { - $this->_data['queries'] = []; - - foreach (DB::getQueryLog() as $query) { - if (starts_with($query['query'], 'select * from `cache` where')) { - continue; - } - - if (starts_with($query['query'], 'delete from `cache` where')) { - continue; - } - - if (starts_with($query['query'], 'insert into `cache`')) { - continue; - } - - $this->_data['queries'][] = $query; - } - } - - /** - * @param string $level - * @param string $message - */ - public function log($level, $message, $context) - { - $this->_data['log'][] = [ - 'level' => $level, - 'message' => $message - ]; - } -} diff --git a/composer.json b/composer.json index bae0215b..3ac3ffbd 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,9 @@ "doctrine/dbal": "^2.5", "venturecraft/revisionable": "^1.23", "pda/pheanstalk": "~3.0", - "cviebrock/laravel-elasticsearch": "^1.0" + "cviebrock/laravel-elasticsearch": "^1.0", + "barryvdh/laravel-debugbar": "^2.1", + "predis/predis": "^1.0" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index f7ef8573..e4f495c5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,63 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "0deb7713636ee82aadee47da3a9217cc", - "content-hash": "9dea148233d815e53eb636413f2bcaed", + "hash": "a12fe5f5687e21aac441868ccc882fa2", + "content-hash": "95039400d11d1851dabe46e4c0456965", "packages": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "974fd16e328ca851a081449100d9509af59cf0ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/974fd16e328ca851a081449100d9509af59cf0ff", + "reference": "974fd16e328ca851a081449100d9509af59cf0ff", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.0.17|5.1.*|5.2.*", + "maximebf/debugbar": "~1.11.0", + "php": ">=5.4.0", + "symfony/finder": "~2.6|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "time": "2015-12-22 06:22:38" + }, { "name": "barryvdh/laravel-ide-helper", "version": "v2.1.2", @@ -1543,6 +1597,67 @@ ], "time": "2015-12-19 20:16:43" }, + { + "name": "maximebf/debugbar", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "07741d84d39d10f00551c94284cdefcc69703e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/07741d84d39d10f00551c94284cdefcc69703e77", + "reference": "07741d84d39d10f00551c94284cdefcc69703e77", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "^1.0", + "symfony/var-dumper": "^2.6|^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "time": "2015-12-10 09:50:24" + }, { "name": "monolog/monolog", "version": "1.17.2", @@ -1909,6 +2024,56 @@ ], "time": "2015-02-03 12:10:50" }, + { + "name": "predis/predis", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/nrk/predis.git", + "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nrk/predis/zipball/84060b9034d756b4d79641667d7f9efe1aeb8e04", + "reference": "84060b9034d756b4d79641667d7f9efe1aeb8e04", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net" + } + ], + "description": "Flexible and feature-complete PHP client library for Redis", + "homepage": "http://github.com/nrk/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "time": "2015-07-30 18:34:15" + }, { "name": "psr/http-message", "version": "1.0", diff --git a/config/app.php b/config/app.php index 119b1bf4..65f0e0f4 100644 --- a/config/app.php +++ b/config/app.php @@ -148,6 +148,7 @@ return [ Intouch\LaravelNewrelic\NewrelicServiceProvider::class, Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, Cviebrock\LaravelElasticsearch\ServiceProvider::class, + Barryvdh\Debugbar\ServiceProvider::class, ], diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100644 index 00000000..4b942c51 --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,169 @@ + null, + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | DebugBar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + */ + 'storage' => array( + 'enabled' => true, + 'driver' => 'redis', // redis, file, pdo + 'path' => storage_path() . '/debugbar', // For file driver + 'connection' => null, // Leave null for default connection (Redis/PDO) + ), + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => true, + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + */ + + 'capture_ajax' => true, + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => false, + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => array( + 'phpinfo' => true, // Php version + 'messages' => true, // Messages + 'time' => true, // Time Datalogger + 'memory' => true, // Memory usage + 'exceptions' => true, // Exception displayer + 'log' => true, // Logs from Monolog (merged in messages if enabled) + 'db' => true, // Show database (PDO) queries and bindings + 'views' => true, // Views with their data + 'route' => true, // Current route information + 'laravel' => false, // Laravel version and environment + 'events' => false, // All events fired + 'default_request' => false, // Regular or special Symfony request logger + 'symfony_request' => true, // Only one can be enabled.. + 'mail' => true, // Catch mail messages + 'logs' => false, // Add the latest log messages + 'files' => false, // Show the included files + 'config' => false, // Display config settings + 'auth' => false, // Display Laravel authentication status + 'gate' => false, // Display Laravel Gate checks + 'session' => true, // Display session data + ), + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => array( + 'auth' => array( + 'show_name' => false, // Also show the users name/email in the debugbar + ), + 'db' => array( + 'with_params' => true, // Render SQL with the parameters substituted + 'timeline' => false, // Add the queries to the timeline + 'backtrace' => false, // EXPERIMENTAL: Use a backtrace to find the origin of the query in your files. + 'explain' => array( // EXPERIMENTAL: Show EXPLAIN output on queries + 'enabled' => false, + 'types' => array('SELECT'), // array('SELECT', 'INSERT', 'UPDATE', 'DELETE'); for MySQL 5.6.3+ + ), + 'hints' => true, // Show hints for common mistakes + ), + 'mail' => array( + 'full_log' => false + ), + 'views' => array( + 'data' => false, //Note: Can slow down the application, because the data can be quite large.. + ), + 'route' => array( + 'label' => true // show complete route on bar + ), + 'logs' => array( + 'file' => null + ), + ), + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before
, by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => true, + + /* + |-------------------------------------------------------------------------- + | DebugBar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by DebugBar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => '_debugbar', + +); diff --git a/gulpfile.js b/gulpfile.js index 385f804d..02446315 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -55,8 +55,6 @@ gulp.task("scripts-app", function () { ]; if (!argv.production) { - paths.push("resources/assets/scripts/debug/**/*.{coffee,js}"); - // we also want to add the embed stuff, since we're in development mode // we want to watch embed files and re-compile them. However, we want // to leave this path out in production so that embed files are not bloating @@ -132,9 +130,6 @@ gulp.task("styles-app", function () { ]; if (!argv.production) { - includedStyles.push("resources/assets/styles/profiler.less"); - includedStyles.push("resources/assets/styles/prettify.css"); - // we also want to add the embed stuff, since we're in development mode // we want to watch embed files and re-compile them. However, we want // to leave this path out in production so that embed files are not bloating diff --git a/resources/assets/scripts/debug/prettify.js b/resources/assets/scripts/debug/prettify.js deleted file mode 100644 index eef5ad7e..00000000 --- a/resources/assets/scripts/debug/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c