From 24cb32ceea0c08ef6c347f986850509712056b73 Mon Sep 17 00:00:00 2001 From: An Phan Date: Thu, 28 Jan 2016 13:35:51 +0800 Subject: [PATCH] Serve static assets via CDN if possible --- app/Application.php | 23 ++++++++-- app/Http/Controllers/API/DataController.php | 2 +- resources/views/index.blade.php | 8 ++-- tests/ApplicationTest.php | 47 +++++++++++++++++++++ tests/blobs/github-tags.json | 29 +++++++++++++ tests/blobs/rev-manifest.json | 4 ++ 6 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 tests/ApplicationTest.php create mode 100644 tests/blobs/github-tags.json create mode 100644 tests/blobs/rev-manifest.json diff --git a/app/Application.php b/app/Application.php index b8d6c232..8c6df1dd 100644 --- a/app/Application.php +++ b/app/Application.php @@ -35,24 +35,41 @@ class Application extends IlluminateApplication * This is a copycat of L5's Elixir, but catered to our directory structure. * * @param string $file + * @param string $manifestFile * * @return string */ - public function rev($file) + public function rev($file, $manifestFile = null) { static $manifest = null; + $manifestFile = $manifestFile ?: $this->publicPath().'/public/build/rev-manifest.json'; + if (is_null($manifest)) { - $manifest = json_decode(file_get_contents($this->publicPath().'/public/build/rev-manifest.json'), true); + $manifest = json_decode(file_get_contents($manifestFile), true); } if (isset($manifest[$file])) { - return "/public/build/{$manifest[$file]}"; + return $this->staticUrl("public/build/{$manifest[$file]}"); } throw new InvalidArgumentException("File {$file} not defined in asset manifest."); } + /** + * Get a URL for static file requests. + * If this installation of Koel has a CDN_URL configured, use it as the base. + * Otherwise, just use a relative '/'. + * + * @param string The additional resource name/path. + * + * @return string + */ + public function staticUrl($name = null) + { + return trim(env('CDN_URL'), '/ ').'/'.trim(ltrim($name, '/')); + } + /** * Get the latest version number of Koel from Github. * diff --git a/app/Http/Controllers/API/DataController.php b/app/Http/Controllers/API/DataController.php index 23cda522..5c05bbc2 100644 --- a/app/Http/Controllers/API/DataController.php +++ b/app/Http/Controllers/API/DataController.php @@ -33,7 +33,7 @@ class DataController extends Controller 'users' => auth()->user()->is_admin ? User::all() : [], 'currentUser' => auth()->user(), 'useLastfm' => env('LASTFM_API_KEY') && env('LASTFM_API_SECRET'), - 'cdnUrl' => trim(env('CDN_URL'), '/ '), + 'cdnUrl' => app()->staticUrl(), 'currentVersion' => Application::VERSION, 'latestVersion' => auth()->user()->is_admin ? app()->getLatestVersion() : Application::VERSION, ]); diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index 573f1a17..e36c89c4 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/tests/ApplicationTest.php b/tests/ApplicationTest.php new file mode 100644 index 00000000..715be208 --- /dev/null +++ b/tests/ApplicationTest.php @@ -0,0 +1,47 @@ +assertEquals(App::staticUrl(), '/'); + $this->assertEquals(App::staticUrl('foo.css '), '/foo.css'); + } + + public function testStaticUrlWithCDN() + { + putenv('CDN_URL=http://cdn.bar'); + + $this->assertEquals(App::staticUrl(), 'http://cdn.bar/'); + $this->assertEquals(App::staticUrl('foo.css '), 'http://cdn.bar/foo.css'); + } + + public function testRev() + { + putenv('CDN_URL'); + + $manifestFile = dirname(__FILE__) . '/blobs/rev-manifest.json'; + $this->assertEquals(App::rev('foo.css', $manifestFile), '/public/build/foo00.css'); + + putenv('CDN_URL=http://cdn.bar'); + $this->assertEquals(App::rev('bar.js', $manifestFile), 'http://cdn.bar/public/build/bar00.js'); + } + + public function testGetLatestVersion() + { + $mock = new MockHandler([ + new Response(200, [], file_get_contents(dirname(__FILE__) . '/blobs/github-tags.json')), + ]); + + $client = new Client(['handler' => HandlerStack::create($mock)]); + + $this->assertEquals('v1.1.2', App::getLatestVersion($client)); + } +} diff --git a/tests/blobs/github-tags.json b/tests/blobs/github-tags.json new file mode 100644 index 00000000..3ab02605 --- /dev/null +++ b/tests/blobs/github-tags.json @@ -0,0 +1,29 @@ +[ + { + "name": "v1.1.2", + "zipball_url": "https://api.github.com/repos/phanan/koel/zipball/v1.1.2", + "tarball_url": "https://api.github.com/repos/phanan/koel/tarball/v1.1.2", + "commit": { + "sha": "e1279ba5c6b07fbddf65fa2300c6515512a87b17", + "url": "https://api.github.com/repos/phanan/koel/commits/e1279ba5c6b07fbddf65fa2300c6515512a87b17" + } + }, + { + "name": "v1.1.1", + "zipball_url": "https://api.github.com/repos/phanan/koel/zipball/v1.1.1", + "tarball_url": "https://api.github.com/repos/phanan/koel/tarball/v1.1.1", + "commit": { + "sha": "3bbb4375e7d1ffbe852bdf9d9952dbdcaf2d6658", + "url": "https://api.github.com/repos/phanan/koel/commits/3bbb4375e7d1ffbe852bdf9d9952dbdcaf2d6658" + } + }, + { + "name": "1.0.0-beta", + "zipball_url": "https://api.github.com/repos/phanan/koel/zipball/1.0.0-beta", + "tarball_url": "https://api.github.com/repos/phanan/koel/tarball/1.0.0-beta", + "commit": { + "sha": "e536ff6d35248eab627e0e41dfb7fd969a77c8be", + "url": "https://api.github.com/repos/phanan/koel/commits/e536ff6d35248eab627e0e41dfb7fd969a77c8be" + } + } +] diff --git a/tests/blobs/rev-manifest.json b/tests/blobs/rev-manifest.json new file mode 100644 index 00000000..1e95170a --- /dev/null +++ b/tests/blobs/rev-manifest.json @@ -0,0 +1,4 @@ +{ + "foo.css": "foo00.css", + "bar.js": "bar00.js" +}