From c085df9eed8cd819773795170a4ff554333ad2f9 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Sun, 19 Apr 2015 12:56:58 +0200 Subject: [PATCH] Implemented the /thumbnail/PACKAGE url Returns a 160x120 thumbnail image if possible Returns a dummy image and a 404 status code otherwise. --- app/controllers/packages_controller.rb | 31 ++++++++++++++++++ config/routes.rb | 1 + .../images/dummy/no-screenshots-available.png | Bin 0 -> 7618 bytes 3 files changed, 32 insertions(+) create mode 100644 public/images/dummy/no-screenshots-available.png diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb index 23c24f8..ae0836c 100644 --- a/app/controllers/packages_controller.rb +++ b/app/controllers/packages_controller.rb @@ -68,4 +68,35 @@ class PackagesController < ApplicationController redirect_to package_path end + + # Returns a 160x120 thumbnail image if posssible. + # If the package is not found it returns a dummy image along with status 404. + # If the package is found but has no screenshots then it also returns a + # dummy image along with status 404. + def thumbnail + @package = Package.find_by(name: params[:name]) + unless @package + thumbnail404 + return + end + @screenshot = @package.screenshots.first + unless @screenshot.image.path + thumbnail404 + return + end + + # Send the thumbnail + # TODO: Make sure it uses X-Sendfile correctly in production + send_file @screenshot.image.path(:thumb), type: "image/png", disposition: 'inline' + end + + private + + # Send a dummy thumbnail reading "No screenshot available. Sorry." + def thumbnail404 + send_file Rails.root.join('public/images/dummy/no-screenshots-available.png'), + type: "image/png", + disposition: 'inline', + status: 404 + end end diff --git a/config/routes.rb b/config/routes.rb index 1f65a4b..46b523c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,6 +19,7 @@ Debshots::Application.routes.draw do post 'upload_image/:name' => 'packages#upload_image', as: :upload_image get 'delete_screenshot/:name/:id' => 'packages#delete_screenshot', as: :delete_screenshot get 'about' => 'welcome#about' + get 'thumbnail/:name' => 'packages#thumbnail', as: :thumbnail_image # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/public/images/dummy/no-screenshots-available.png b/public/images/dummy/no-screenshots-available.png new file mode 100644 index 0000000000000000000000000000000000000000..3141c184baa258a0ccef2287603ed98a11a60f8e GIT binary patch literal 7618 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 F{tshr;(!1E literal 0 HcmV?d00001