require 'net/http' require 'uri' require 'fileutils' require 'zip/zip' class Admin::TemplateStoreController < OrbitBackendController @@store_domain = STORE_CONFIG[:store_settings]["url"] def index @store = @@store_domain @design_ids = Design.all.map{|d| d.template_store_id} @templates = JSON.parse(get_templates) end def show @store = @@store_domain @design_ids = Design.all.map{|d| d.template_store_id} @template = JSON.parse(get_template(params[:id])) rescue nil end def download_theme url = @@store_domain + params["url"] url_base = url.split('/')[2] url_path = '/'+url.split('/')[3..-1].join('/') Net::HTTP.start(url_base) do |http| open("public/#{params['slug']}.zip", "wb") do |file| http.get(url_path) do |str| file.write(str) end end end upload_package("#{params['slug']}.zip", params["id"]) File.delete("public/#{params['slug']}.zip") render :json => {"success"=>true,"url"=>@@store_domain + params["url"]}.to_json end protected def upload_package(package_name,template_store_id) temp_file = Tempfile.new("temp_file") original_file = File.open("#{Rails.root}/public/#{package_name}") temp_file.write(original_file.read.force_encoding('UTF-8')) temp_file.rewind filename = File.basename(original_file,".zip") unzip_design(temp_file, filename, template_store_id) temp_file.close end def unzip_design(file, zip_name, template_store_id) Zip::ZipFile.open(file) { |zip_file| design = Design.new.from_json(zip_file.read("#{zip_name}/info.json")) design.template_store_id = template_store_id Dir.mktmpdir('f_path') { |dir| themes_entries = [] javascripts_entries = [] images_entries = [] zip_file.entries.each do |entry| case (path = entry.to_s) when /\A(#{zip_name})\/(default\.css)\z/ #for default css design.build_css_default(:file => get_temp_file(zip_file, dir, entry)) when /\A(#{zip_name})\/(reset\.css)\z/ #for reset css design.build_css_reset(:file => get_temp_file(zip_file, dir, entry)) when /\A(#{zip_name})\/(layout\.html)\z/ #for layout html design.build_layout(:file => get_temp_file(zip_file, dir, entry)) when /\A(#{zip_name})\/(themes)\/.*(\.css)\z/ #for themes css themes_entries << entry when /\A(#{zip_name})\/(javascripts)\/.*(\.js)\z/ #for js javascripts_entries << entry when /\A(#{zip_name})\/(images)\/.*((\.jpg)|(\.png)|(\.gif))\z/ #for img images_entries << entry end end ['themes', 'javascripts', 'images'].each do |type| eval("#{type}_entries").each do |entry| eval("design.#{type}").build(:file => get_temp_file(zip_file, dir, entry)) end end } design.save } end def get_temp_file(zip_file, dir, entry) filename = File.basename(entry.to_s) temp_file = File.new(dir + '/' + filename, 'w+') temp_file.write (zip_file.read entry ).force_encoding('UTF-8') temp_file end def get_template(id) uri = URI.parse("#{@@store_domain}/api/templates/#{id}") http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Get.new(uri.request_uri) response = http.request(request) response.body end def get_templates uri = URI.parse("#{@@store_domain}/api/templates") http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Get.new(uri.request_uri) response = http.request(request) response.body end end