class PreviewController < ApplicationController before_action :require_member! def title return render_bad_request('URL は必須です.') if params[:url].blank? render json: { title: Preview::ThumbnailFetcher.title(params[:url]) } rescue Preview::UrlSafety::UnsafeUrl => e render_preview_error(e.message, :unprocessable_entity) rescue Preview::HttpFetcher::FetchTimeout => e render_preview_error(e.message, :gateway_timeout) rescue Preview::HttpFetcher::FetchFailed => e render_preview_error(e.message, :bad_gateway) end def thumbnail return render_bad_request('URL は必須です.') if params[:url].blank? image = MiniMagick::Image.read(Preview::ThumbnailFetcher.fetch(params[:url])) image.auto_orient image.resize '180x180>' image.format 'png' send_data image.to_blob, type: 'image/png', disposition: 'inline' rescue Preview::UrlSafety::UnsafeUrl => e render_preview_error(e.message, :unprocessable_entity) rescue Preview::Screenshot::Busy => e render_preview_error(e.message, :too_many_requests) rescue Preview::Screenshot::TimedOut, Preview::HttpFetcher::FetchTimeout => e render_preview_error(e.message, :gateway_timeout) rescue Preview::HttpFetcher::FetchFailed => e render_preview_error(e.message, :bad_gateway) rescue Preview::Screenshot::Unavailable, MiniMagick::Error => e render_preview_error(e.message, :unprocessable_entity) end private def require_member! return head :unauthorized unless current_user return if current_user.gte_member? head :forbidden end def render_preview_error(message, status) render json: { type: status.to_s, message:, errors: { }, base_errors: [message] }, status: end end