require 'sinatra' require 'sequel' DB = Sequel.connect(ENV.fetch('DATABASE_URL')) before do headers 'Access-Control-Allow-Origin' => '*' end get '/initial-data' do latest_vote = with_policy_ids(DB[:votes].order(:date).last) latest_vote_with_events = latest_vote.merge( voteEvents: vote_events_for(latest_vote), ) # XXX Doing this like this slows this request from ~200ms to ~500ms on my # machine locally, due to needing a separate query to get the policy IDs for # every vote. Working out how to do this in a single query would probably be # a big improvement. votes = DB[:votes].map {|vote| with_policy_ids(vote)}.to_a { latestVote: latest_vote_with_events, votes: votes, policies: DB[:policies].to_a, }.to_json end get '/vote-events/:vote_id' do |vote_id| vote = DB[:votes][{id: vote_id}] vote_events_for(vote).to_json end def vote_events_for(vote) DB[:vote_events].where( vote_id: vote[:id] ).join( :people, person_id: :person_id, date: vote[:date] ).to_a end def with_policy_ids(vote) vote.merge(policyIds: policy_ids_for(vote)) end def policy_ids_for(vote) DB[:votes_policies].where(vote_id: vote[:id]).map(:policy_id) end