18. require 'rubygems'
require 'bundler/setup'
require 'sequel'
require 'dotenv'
require 'rake'
env = ENV['RACK_ENV'] || 'development'
namespace :db do
desc 'Run migrations'
task :migrate, [:version] do |_t, args|
::Dotenv.load(".env", ".env.#{env}")
::Sequel.extension :migration
db = ::Sequel.connect(::ENV.fetch('DATABASE_URL'))
if args[:version]
puts "Migrating to version #{args[:version]}"
::Sequel::Migrator.run(db, 'db/migrations', target: args[:version].to_i)
else
puts 'Migrating to latest'
::Sequel::Migrator.run(db, 'db/migrations')
end
end
end
Rakefile
19. ::Sequel.migration do
transaction
up do
create_table :companies do
primary_key :id
String :company_id, null: false, index: true
String :name, null: false
String :einvoice_address, null: false
String :einvoice_operator, null: false
end
end
down do
drop_table :companies
end
end
db/migrations/001_create_companies.rb
20. class CompanyUpdaterWorker
include ::Sidekiq::Worker
sidekiq_options unique: :while_executing
URL = "http://verkkolasku.tieke.fi/ExporVLOsoiteToExcel.aspx?type=csv"
def perform
path = ::Tempfile.new('vlo').path
if http_download_uri(::URI.parse(URL), path)
::NetvisorSpreadsheets::CompaniesFillerService.new(path).import
end
end
def http_download_uri(uri, filename)
begin
::Net::HTTP.new(uri.host, uri.port).start do |http|
http.request(Net::HTTP::Get.new(uri.request_uri)) do |response|
::File.open(filename, 'wb') do |io|
response.read_body { |chunk| io.write(chunk) }
end
end
end
rescue Exception => e
return false
end
true
end
end
companies_updater_worker.rb
21. companies_filler_service.rb
class CompanyUpdaterWorker
include ::Sidekiq::Worker
sidekiq_options unique: :while_executing
URL = "http://verkkolasku.tieke.fi/ExporVLOsoiteToExcel.aspx?type=csv"
def perform
path = ::Tempfile.new('vlo').path
if http_download_uri(::URI.parse(URL), path)
::NetvisorSpreadsheets::CompaniesFillerService.new(path).import
end
end
def http_download_uri(uri, filename)
begin
::Net::HTTP.new(uri.host, uri.port).start do |http|
http.request(Net::HTTP::Get.new(uri.request_uri)) do |response|
::File.open(filename, 'wb') do |io|
response.read_body { |chunk| io.write(chunk) }
end
end
end
rescue Exception => e
return false
end
true
end
end
22. require 'sinatra/base'
require 'sinatra/json'
module NetvisorSpreadsheets
class Server < Sinatra::Base
configure :production, :development do
enable :logging
set :json_encoder, :to_json
end
get '/' do
if params['company_id'] && params['company_id'].length > 0
json ::NetvisorSpreadsheets::CompanyFinderService.find(params['company_id'])
else
400
end
end
end
end
server.rb
23.
24. What we get?
• Only 40Mb RAM
• 1 second app load
• Fast deployment